Skip to content

Commit 53cb8d8

Browse files
committed
[ValueTracking] Handle signbit idiom in computeKnownFPClassFromCond
1 parent 398c51a commit 53cb8d8

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
@@ -4233,7 +4233,7 @@ static void computeKnownFPClassFromCond(const Value *V, Value *Cond,
42334233
Value *LHS;
42344234
uint64_t ClassVal = 0;
42354235
const APFloat *CRHS;
4236-
// TODO: handle sign-bit check idiom
4236+
const APInt *RHS;
42374237
if (match(Cond, m_FCmp(Pred, m_Value(LHS), m_APFloat(CRHS)))) {
42384238
auto [CmpVal, MaskIfTrue, MaskIfFalse] = fcmpImpliesClass(
42394239
Pred, *CxtI->getParent()->getParent(), LHS, *CRHS, LHS != V);
@@ -4243,6 +4243,19 @@ static void computeKnownFPClassFromCond(const Value *V, Value *Cond,
42434243
m_Value(LHS), m_ConstantInt(ClassVal)))) {
42444244
FPClassTest Mask = static_cast<FPClassTest>(ClassVal);
42454245
KnownFromContext.knownNot(CondIsTrue ? ~Mask : Mask);
4246+
} else if (match(Cond, m_ICmp(Pred, m_ElementWiseBitCast(m_Value(LHS)),
4247+
m_APInt(RHS)))) {
4248+
bool TrueIfSigned;
4249+
if (Pred == ICmpInst::ICMP_SLT && RHS->isZero())
4250+
TrueIfSigned = true;
4251+
else if (Pred == ICmpInst::ICMP_SGT && RHS->isAllOnes())
4252+
TrueIfSigned = false;
4253+
else
4254+
return;
4255+
if (TrueIfSigned == CondIsTrue)
4256+
KnownFromContext.signBitMustBeOne();
4257+
else
4258+
KnownFromContext.signBitMustBeZero();
42464259
}
42474260
}
42484261

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)