Skip to content

Commit 28e6568

Browse files
committed
[Analysis] Share findAffectedValues between DomConditionCache and AssumptionCache; NFC
1 parent 6c53b96 commit 28e6568

File tree

2 files changed

+72
-88
lines changed

2 files changed

+72
-88
lines changed

llvm/include/llvm/Analysis/ConditionCacheUtil.h

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ findValuesAffectedByCondition(Value *Cond, bool IsAssume,
3333
addValueAffectedByCondition(V, InsertAffected);
3434
};
3535

36-
assert(!IsAssume);
3736
SmallVector<Value *, 8> Worklist;
3837
SmallPtrSet<Value *, 8> Visited;
3938
Worklist.push_back(Cond);
@@ -43,35 +42,67 @@ findValuesAffectedByCondition(Value *Cond, bool IsAssume,
4342
continue;
4443

4544
CmpInst::Predicate Pred;
46-
Value *A, *B;
47-
if (match(V, m_LogicalOp(m_Value(A), m_Value(B)))) {
45+
Value *A, *B, *X;
46+
47+
if (IsAssume)
48+
AddAffected(V);
49+
50+
if (IsAssume && match(V, m_Not(m_Value(X))))
51+
AddAffected(X);
52+
if (!IsAssume && match(V, m_LogicalOp(m_Value(A), m_Value(B)))) {
4853
Worklist.push_back(A);
4954
Worklist.push_back(B);
50-
} else if (match(V, m_ICmp(Pred, m_Value(A), m_Constant()))) {
51-
AddAffected(A);
55+
} else if (match(V, m_Cmp(Pred, m_Value(A), m_Value(B))) &&
56+
(IsAssume || isa<ICmpInst>(V))) {
57+
if (IsAssume || match(B, m_Constant())) {
58+
AddAffected(A);
59+
if (IsAssume)
60+
AddAffected(B);
61+
62+
if (IsAssume ? (Pred == ICmpInst::ICMP_EQ)
63+
: ICmpInst::isEquality(Pred)) {
64+
if (match(B, m_ConstantInt())) {
65+
// (X & C) or (X | C) or (X ^ C).
66+
// (X << C) or (X >>_s C) or (X >>_u C).
67+
if (match(A, m_BitwiseLogic(m_Value(X), m_ConstantInt())) ||
68+
match(A, m_Shift(m_Value(X), m_ConstantInt())))
69+
AddAffected(X);
70+
}
71+
} else {
72+
if (Pred == ICmpInst::ICMP_NE)
73+
if (match(A, m_And(m_Value(X), m_Power2())) && match(B, m_Zero()))
74+
AddAffected(X);
75+
76+
if (!IsAssume || Pred == ICmpInst::ICMP_ULT) {
77+
// Handle (A + C1) u< C2, which is the canonical form of
78+
// A > C3 && A < C4.
79+
if (match(A, m_Add(m_Value(X), m_ConstantInt())) &&
80+
match(B, m_ConstantInt()))
81+
AddAffected(X);
82+
}
83+
if (!IsAssume) {
84+
// Handle icmp slt/sgt (bitcast X to int), 0/-1, which is supported
85+
// by computeKnownFPClass().
86+
if ((Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGT) &&
87+
match(A, m_ElementWiseBitCast(m_Value(X))))
88+
InsertAffected(X);
89+
}
5290

53-
if (ICmpInst::isEquality(Pred)) {
54-
Value *X;
55-
// (X & C) or (X | C) or (X ^ C).
56-
// (X << C) or (X >>_s C) or (X >>_u C).
57-
if (match(A, m_BitwiseLogic(m_Value(X), m_ConstantInt())) ||
58-
match(A, m_Shift(m_Value(X), m_ConstantInt())))
59-
AddAffected(X);
60-
} else {
61-
Value *X;
62-
// Handle (A + C1) u< C2, which is the canonical form of
63-
// A > C3 && A < C4.
64-
if (match(A, m_Add(m_Value(X), m_ConstantInt())))
65-
AddAffected(X);
66-
// Handle icmp slt/sgt (bitcast X to int), 0/-1, which is supported by
67-
// computeKnownFPClass().
68-
if ((Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGT) &&
69-
match(A, m_ElementWiseBitCast(m_Value(X))))
70-
InsertAffected(X);
91+
if (IsAssume && CmpInst::isFPPredicate(Pred)) {
92+
// fcmp fneg(x), y
93+
// fcmp fabs(x), y
94+
// fcmp fneg(fabs(x)), y
95+
if (match(A, m_FNeg(m_Value(A))))
96+
AddAffected(A);
97+
if (match(A, m_FAbs(m_Value(A))))
98+
AddAffected(A);
99+
}
100+
}
71101
}
72-
} else if (match(Cond, m_CombineOr(m_FCmp(Pred, m_Value(A), m_Constant()),
73-
m_Intrinsic<Intrinsic::is_fpclass>(
74-
m_Value(A), m_Constant())))) {
102+
} else if ((!IsAssume &&
103+
match(Cond, m_FCmp(Pred, m_Value(A), m_Constant()))) ||
104+
match(Cond, m_Intrinsic<Intrinsic::is_fpclass>(m_Value(A),
105+
m_Value(B)))) {
75106
// Handle patterns that computeKnownFPClass() support.
76107
AddAffected(A);
77108
}

llvm/lib/Analysis/AssumptionCache.cpp

Lines changed: 15 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "llvm/ADT/SmallPtrSet.h"
1717
#include "llvm/ADT/SmallVector.h"
1818
#include "llvm/Analysis/AssumeBundleQueries.h"
19+
#include "llvm/Analysis/ConditionCacheUtil.h"
1920
#include "llvm/Analysis/TargetTransformInfo.h"
2021
#include "llvm/Analysis/ValueTracking.h"
2122
#include "llvm/IR/BasicBlock.h"
@@ -61,85 +62,37 @@ findAffectedValues(CallBase *CI, TargetTransformInfo *TTI,
6162
// Note: This code must be kept in-sync with the code in
6263
// computeKnownBitsFromAssume in ValueTracking.
6364

64-
auto AddAffected = [&Affected](Value *V, unsigned Idx =
65-
AssumptionCache::ExprResultIdx) {
66-
if (isa<Argument>(V) || isa<GlobalValue>(V)) {
67-
Affected.push_back({V, Idx});
68-
} else if (auto *I = dyn_cast<Instruction>(V)) {
69-
Affected.push_back({I, Idx});
70-
71-
// Peek through unary operators to find the source of the condition.
72-
Value *Op;
73-
if (match(I, m_PtrToInt(m_Value(Op)))) {
74-
if (isa<Instruction>(Op) || isa<Argument>(Op))
75-
Affected.push_back({Op, Idx});
76-
}
77-
}
65+
auto InsertAffected = [&Affected](Value *V) {
66+
Affected.push_back({V, AssumptionCache::ExprResultIdx});
7867
};
7968

8069
for (unsigned Idx = 0; Idx != CI->getNumOperandBundles(); Idx++) {
70+
auto AddAffectedBundleVal = [&Affected](Value *V, unsigned Idx) {
71+
if (isa<Argument>(V) || isa<GlobalValue>(V) || isa<Instruction>(V)) {
72+
Affected.push_back({V, Idx});
73+
}
74+
};
8175
OperandBundleUse Bundle = CI->getOperandBundleAt(Idx);
8276
if (Bundle.getTagName() == "separate_storage") {
8377
assert(Bundle.Inputs.size() == 2 &&
8478
"separate_storage must have two args");
85-
AddAffected(getUnderlyingObject(Bundle.Inputs[0]), Idx);
86-
AddAffected(getUnderlyingObject(Bundle.Inputs[1]), Idx);
79+
AddAffectedBundleVal(getUnderlyingObject(Bundle.Inputs[0]), Idx);
80+
AddAffectedBundleVal(getUnderlyingObject(Bundle.Inputs[1]), Idx);
8781
} else if (Bundle.Inputs.size() > ABA_WasOn &&
8882
Bundle.getTagName() != IgnoreBundleTag)
89-
AddAffected(Bundle.Inputs[ABA_WasOn], Idx);
83+
AddAffectedBundleVal(Bundle.Inputs[ABA_WasOn], Idx);
9084
}
9185

92-
Value *Cond = CI->getArgOperand(0), *A, *B;
93-
AddAffected(Cond);
94-
if (match(Cond, m_Not(m_Value(A))))
95-
AddAffected(A);
96-
97-
CmpInst::Predicate Pred;
98-
if (match(Cond, m_Cmp(Pred, m_Value(A), m_Value(B)))) {
99-
AddAffected(A);
100-
AddAffected(B);
101-
102-
if (Pred == ICmpInst::ICMP_EQ) {
103-
if (match(B, m_ConstantInt())) {
104-
Value *X;
105-
// (X & C) or (X | C) or (X ^ C).
106-
// (X << C) or (X >>_s C) or (X >>_u C).
107-
if (match(A, m_BitwiseLogic(m_Value(X), m_ConstantInt())) ||
108-
match(A, m_Shift(m_Value(X), m_ConstantInt())))
109-
AddAffected(X);
110-
}
111-
} else if (Pred == ICmpInst::ICMP_NE) {
112-
Value *X;
113-
// Handle (X & pow2 != 0).
114-
if (match(A, m_And(m_Value(X), m_Power2())) && match(B, m_Zero()))
115-
AddAffected(X);
116-
} else if (Pred == ICmpInst::ICMP_ULT) {
117-
Value *X;
118-
// Handle (A + C1) u< C2, which is the canonical form of A > C3 && A < C4,
119-
// and recognized by LVI at least.
120-
if (match(A, m_Add(m_Value(X), m_ConstantInt())) &&
121-
match(B, m_ConstantInt()))
122-
AddAffected(X);
123-
} else if (CmpInst::isFPPredicate(Pred)) {
124-
// fcmp fneg(x), y
125-
// fcmp fabs(x), y
126-
// fcmp fneg(fabs(x)), y
127-
if (match(A, m_FNeg(m_Value(A))))
128-
AddAffected(A);
129-
if (match(A, m_FAbs(m_Value(A))))
130-
AddAffected(A);
131-
}
132-
} else if (match(Cond, m_Intrinsic<Intrinsic::is_fpclass>(m_Value(A),
133-
m_Value(B)))) {
134-
AddAffected(A);
135-
}
86+
Value *Cond = CI->getArgOperand(0);
87+
findValuesAffectedByCondition(Cond, /*IsAssume*/ true, InsertAffected);
13688

13789
if (TTI) {
13890
const Value *Ptr;
13991
unsigned AS;
14092
std::tie(Ptr, AS) = TTI->getPredicatedAddrSpace(Cond);
14193
if (Ptr)
142-
AddAffected(const_cast<Value *>(Ptr->stripInBoundsOffsets()));
94+
addValueAffectedByCondition(
95+
const_cast<Value *>(Ptr->stripInBoundsOffsets()), InsertAffected);
14396
}
14497
}
14598

0 commit comments

Comments
 (0)