Skip to content

Commit e4e88ce

Browse files
committed
[ValueTracking] Handle signbit idiom in computeKnownFPClassFromCond
1 parent 6a53e1b commit e4e88ce

File tree

3 files changed

+19
-3
lines changed

3 files changed

+19
-3
lines changed

llvm/lib/Analysis/DomConditionCache.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ static void findAffectedValues(Value *Cond,
6666
// A > C3 && A < C4.
6767
if (match(A, m_Add(m_Value(X), m_ConstantInt())))
6868
AddAffected(X);
69+
// Handle icmp slt/sgt (bitcast X to int), 0/-1
70+
if (match(A, m_ElementWiseBitCast(m_Value(X))) &&
71+
(Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGT))
72+
Affected.push_back(X);
6973
}
7074
} else if (match(Cond, m_CombineOr(m_FCmp(Pred, m_Value(A), m_Constant()),
7175
m_Intrinsic<Intrinsic::is_fpclass>(

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4272,7 +4272,7 @@ static void computeKnownFPClassFromCond(const Value *V, Value *Cond,
42724272
Value *LHS;
42734273
uint64_t ClassVal = 0;
42744274
const APFloat *CRHS;
4275-
// TODO: handle sign-bit check idiom
4275+
const APInt *RHS;
42764276
if (match(Cond, m_FCmp(Pred, m_Value(LHS), m_APFloat(CRHS)))) {
42774277
auto [CmpVal, MaskIfTrue, MaskIfFalse] = fcmpImpliesClass(
42784278
Pred, *CxtI->getParent()->getParent(), LHS, *CRHS, LHS != V);
@@ -4282,6 +4282,19 @@ static void computeKnownFPClassFromCond(const Value *V, Value *Cond,
42824282
m_Value(LHS), m_ConstantInt(ClassVal)))) {
42834283
FPClassTest Mask = static_cast<FPClassTest>(ClassVal);
42844284
KnownFromContext.knownNot(CondIsTrue ? ~Mask : Mask);
4285+
} else if (match(Cond, m_ICmp(Pred, m_ElementWiseBitCast(m_Value(LHS)),
4286+
m_APInt(RHS)))) {
4287+
bool TrueIfSigned;
4288+
if (Pred == ICmpInst::ICMP_SLT && RHS->isZero())
4289+
TrueIfSigned = true;
4290+
else if (Pred == ICmpInst::ICMP_SGT && RHS->isAllOnes())
4291+
TrueIfSigned = false;
4292+
else
4293+
return;
4294+
if (TrueIfSigned == CondIsTrue)
4295+
KnownFromContext.signBitMustBeOne();
4296+
else
4297+
KnownFromContext.signBitMustBeZero();
42854298
}
42864299
}
42874300

llvm/test/Transforms/InstCombine/fpclass-from-dom-cond.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -336,8 +336,7 @@ define float @test_signbit_check(float %x, i1 %cond) {
336336
; CHECK-NEXT: br label [[IF_END]]
337337
; CHECK: if.end:
338338
; CHECK-NEXT: [[VALUE:%.*]] = phi float [ [[FNEG]], [[IF_THEN1]] ], [ [[X]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ]
339-
; CHECK-NEXT: [[RET:%.*]] = call float @llvm.fabs.f32(float [[VALUE]])
340-
; CHECK-NEXT: ret float [[RET]]
339+
; CHECK-NEXT: ret float [[VALUE]]
341340
;
342341
%i32 = bitcast float %x to i32
343342
%cmp = icmp slt i32 %i32, 0

0 commit comments

Comments
 (0)