Skip to content

Commit ceb30f7

Browse files
committed
[Analysis] Unify most of the tracking between AssumptionCache and DomConditionCache
This helps cover some missing cases in both and hopefully serves as creating an easier framework for extending general condition based analysis.
1 parent 9cb04dc commit ceb30f7

File tree

3 files changed

+63
-59
lines changed

3 files changed

+63
-59
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 60 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -9126,6 +9126,14 @@ void findValuesAffectedByCondition(Value *Cond, bool IsAssume,
91269126
addValueAffectedByCondition(V, InsertAffected);
91279127
};
91289128

9129+
auto AddCmpOperands = [&AddAffected, IsAssume](Value *LHS, Value *RHS) {
9130+
if (IsAssume) {
9131+
AddAffected(LHS);
9132+
AddAffected(RHS);
9133+
} else if (match(RHS, m_Constant()))
9134+
AddAffected(LHS);
9135+
};
9136+
91299137
SmallVector<Value *, 8> Worklist;
91309138
SmallPtrSet<Value *, 8> Visited;
91319139
Worklist.push_back(Cond);
@@ -9137,65 +9145,62 @@ void findValuesAffectedByCondition(Value *Cond, bool IsAssume,
91379145
CmpInst::Predicate Pred;
91389146
Value *A, *B, *X;
91399147

9140-
if (IsAssume)
9148+
if (IsAssume) {
91419149
AddAffected(V);
9150+
if (match(V, m_Not(m_Value(X))))
9151+
AddAffected(X);
9152+
}
9153+
9154+
if (match(V, m_LogicalOp(m_Value(A), m_Value(B)))) {
9155+
// assume(A && B) is split to -> assume(A); assume(B);
9156+
// assume(!(A || B)) is split to -> assume(!A); assume(!B);
9157+
// Finally, assume(A || B) / assume(!(A && B)) generally don't provide
9158+
// enough information to be worth handling (intersection of information as
9159+
// opposed to union).
9160+
if (!IsAssume) {
9161+
Worklist.push_back(A);
9162+
Worklist.push_back(B);
9163+
}
9164+
} else if (match(V, m_ICmp(Pred, m_Value(A), m_Value(B)))) {
9165+
AddCmpOperands(A, B);
9166+
9167+
if (ICmpInst::isEquality(Pred)) {
9168+
if (match(B, m_ConstantInt())) {
9169+
// (X & C) or (X | C) or (X ^ C).
9170+
// (X << C) or (X >>_s C) or (X >>_u C).
9171+
if (match(A, m_BitwiseLogic(m_Value(X), m_ConstantInt())) ||
9172+
match(A, m_Shift(m_Value(X), m_ConstantInt())))
9173+
AddAffected(X);
9174+
}
9175+
} else {
9176+
// Handle (A + C1) u< C2, which is the canonical form of
9177+
// A > C3 && A < C4.
9178+
if (match(A, m_Add(m_Value(X), m_ConstantInt())) &&
9179+
match(B, m_ConstantInt()))
9180+
AddAffected(X);
9181+
9182+
// Handle icmp slt/sgt (bitcast X to int), 0/-1, which is supported
9183+
// by computeKnownFPClass().
9184+
if (match(A, m_ElementWiseBitCast(m_Value(X)))) {
9185+
if (Pred == ICmpInst::ICMP_SLT && match(B, m_Zero()))
9186+
InsertAffected(X);
9187+
else if (Pred == ICmpInst::ICMP_SGT && match(B, m_AllOnes()))
9188+
InsertAffected(X);
9189+
}
9190+
}
9191+
} else if (match(Cond, m_FCmp(Pred, m_Value(A), m_Value(B)))) {
9192+
AddCmpOperands(A, B);
91429193

9143-
if (IsAssume && match(V, m_Not(m_Value(X))))
9144-
AddAffected(X);
9145-
if (!IsAssume && match(V, m_LogicalOp(m_Value(A), m_Value(B)))) {
9146-
Worklist.push_back(A);
9147-
Worklist.push_back(B);
9148-
} else if (match(V, m_Cmp(Pred, m_Value(A), m_Value(B))) &&
9149-
(IsAssume || isa<ICmpInst>(V))) {
9150-
if (IsAssume || match(B, m_Constant())) {
9194+
// fcmp fneg(x), y
9195+
// fcmp fabs(x), y
9196+
// fcmp fneg(fabs(x)), y
9197+
if (match(A, m_FNeg(m_Value(A))))
9198+
AddAffected(A);
9199+
if (match(A, m_FAbs(m_Value(A))))
91519200
AddAffected(A);
9152-
if (IsAssume)
9153-
AddAffected(B);
9154-
9155-
if (IsAssume ? (Pred == ICmpInst::ICMP_EQ)
9156-
: ICmpInst::isEquality(Pred)) {
9157-
if (match(B, m_ConstantInt())) {
9158-
// (X & C) or (X | C) or (X ^ C).
9159-
// (X << C) or (X >>_s C) or (X >>_u C).
9160-
if (match(A, m_BitwiseLogic(m_Value(X), m_ConstantInt())) ||
9161-
match(A, m_Shift(m_Value(X), m_ConstantInt())))
9162-
AddAffected(X);
9163-
}
9164-
} else {
9165-
if (Pred == ICmpInst::ICMP_NE)
9166-
if (match(A, m_And(m_Value(X), m_Power2())) && match(B, m_Zero()))
9167-
AddAffected(X);
9168-
9169-
if (!IsAssume || Pred == ICmpInst::ICMP_ULT) {
9170-
// Handle (A + C1) u< C2, which is the canonical form of
9171-
// A > C3 && A < C4.
9172-
if (match(A, m_Add(m_Value(X), m_ConstantInt())) &&
9173-
match(B, m_ConstantInt()))
9174-
AddAffected(X);
9175-
}
9176-
if (!IsAssume) {
9177-
// Handle icmp slt/sgt (bitcast X to int), 0/-1, which is supported
9178-
// by computeKnownFPClass().
9179-
if ((Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGT) &&
9180-
match(A, m_ElementWiseBitCast(m_Value(X))))
9181-
InsertAffected(X);
9182-
}
91839201

9184-
if (IsAssume && CmpInst::isFPPredicate(Pred)) {
9185-
// fcmp fneg(x), y
9186-
// fcmp fabs(x), y
9187-
// fcmp fneg(fabs(x)), y
9188-
if (match(A, m_FNeg(m_Value(A))))
9189-
AddAffected(A);
9190-
if (match(A, m_FAbs(m_Value(A))))
9191-
AddAffected(A);
9192-
}
9193-
}
9194-
}
9195-
} else if ((!IsAssume &&
9196-
match(Cond, m_FCmp(Pred, m_Value(A), m_Constant()))) ||
9197-
match(Cond, m_Intrinsic<Intrinsic::is_fpclass>(m_Value(A),
9198-
m_Value(B)))) {
9202+
} else if (match(V, m_Intrinsic<Intrinsic::is_fpclass>(m_Value(A),
9203+
m_Value()))) {
91999204
// Handle patterns that computeKnownFPClass() support.
92009205
AddAffected(A);
92019206
}

llvm/test/Analysis/ValueTracking/numsignbits-from-assume.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ define i32 @computeNumSignBits_sub1(i32 %in) {
5151

5252
define i32 @computeNumSignBits_sub2(i32 %in) {
5353
; CHECK-LABEL: @computeNumSignBits_sub2(
54-
; CHECK-NEXT: [[SUB:%.*]] = add i32 [[IN:%.*]], -1
54+
; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[IN:%.*]], -1
5555
; CHECK-NEXT: [[COND:%.*]] = icmp ult i32 [[SUB]], 43
5656
; CHECK-NEXT: call void @llvm.assume(i1 [[COND]])
5757
; CHECK-NEXT: [[SH:%.*]] = shl nuw nsw i32 [[SUB]], 3

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,10 +185,9 @@ define i1 @test8(float %x) {
185185
; CHECK-NEXT: [[COND:%.*]] = fcmp oeq float [[ABS]], 0x7FF0000000000000
186186
; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
187187
; CHECK: if.then:
188-
; CHECK-NEXT: [[RET1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 575)
189-
; CHECK-NEXT: ret i1 [[RET1]]
188+
; CHECK-NEXT: ret i1 true
190189
; CHECK: if.else:
191-
; CHECK-NEXT: [[RET2:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 575)
190+
; CHECK-NEXT: [[RET2:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 59)
192191
; CHECK-NEXT: ret i1 [[RET2]]
193192
;
194193
%abs = call float @llvm.fabs.f32(float %x)

0 commit comments

Comments
 (0)