DAG: Handle AssertNoFPClass in computeKnownBits (#167289)
It's possible to determine the sign bit if the value is known one of the positive/negative classes and not-nan.
This commit is contained in:
parent
a3d00e1ae4
commit
fa98fcd02e
@ -4149,6 +4149,25 @@ KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
|
||||
Known.One.clearLowBits(LogOfAlign);
|
||||
break;
|
||||
}
|
||||
case ISD::AssertNoFPClass: {
|
||||
Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
|
||||
|
||||
FPClassTest NoFPClass =
|
||||
static_cast<FPClassTest>(Op.getConstantOperandVal(1));
|
||||
const FPClassTest NegativeTestMask = fcNan | fcNegative;
|
||||
if ((NoFPClass & NegativeTestMask) == NegativeTestMask) {
|
||||
// Cannot be negative.
|
||||
Known.makeNonNegative();
|
||||
}
|
||||
|
||||
const FPClassTest PositiveTestMask = fcNan | fcPositive;
|
||||
if ((NoFPClass & PositiveTestMask) == PositiveTestMask) {
|
||||
// Cannot be positive.
|
||||
Known.makeNegative();
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case ISD::FGETSIGN:
|
||||
// All bits are zero except the low bit.
|
||||
Known.Zero.setBitsFrom(1);
|
||||
|
||||
@ -5,7 +5,6 @@ define i32 @known_positive(float nofpclass(nan ninf nzero nsub nnorm) %signbit.z
|
||||
; CHECK-LABEL: known_positive:
|
||||
; CHECK: ; %bb.0:
|
||||
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
||||
; CHECK-NEXT: v_and_b32_e32 v0, 0x7fffffff, v0
|
||||
; CHECK-NEXT: s_setpc_b64 s[30:31]
|
||||
%cast = bitcast float %signbit.zero to i32
|
||||
%and = and i32 %cast, 2147483647
|
||||
@ -27,7 +26,6 @@ define i32 @known_negative(float nofpclass(nan pinf pzero psub pnorm) %signbit.o
|
||||
; CHECK-LABEL: known_negative:
|
||||
; CHECK: ; %bb.0:
|
||||
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
||||
; CHECK-NEXT: v_or_b32_e32 v0, 0x80000000, v0
|
||||
; CHECK-NEXT: s_setpc_b64 s[30:31]
|
||||
%cast = bitcast float %signbit.one to i32
|
||||
%or = or i32 %cast, -2147483648
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user