Skip to content

Commit 36a708f

Browse files
committed
[Analysis] Share findAffectedValues between DomConditionCache and AssumptionCache; NFC
1 parent 69905f5 commit 36a708f

File tree

2 files changed

+70
-88
lines changed

2 files changed

+70
-88
lines changed

llvm/include/llvm/Analysis/ConditionCacheUtil.h

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ static void findValuesAffectedByCondition(
3232
addValueAffectedByCondition(V, InsertAffected);
3333
};
3434

35-
assert(!IsAssume);
3635
SmallVector<Value *, 8> Worklist;
3736
SmallPtrSet<Value *, 8> Visited;
3837
Worklist.push_back(Cond);
@@ -42,35 +41,67 @@ static void findValuesAffectedByCondition(
4241
continue;
4342

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

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

llvm/lib/Analysis/AssumptionCache.cpp

Lines changed: 13 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,35 @@ 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, int Idx) {
66+
Affected.push_back({V, Idx < 0 ? AssumptionCache::ExprResultIdx : Idx});
7867
};
7968

8069
for (unsigned Idx = 0; Idx != CI->getNumOperandBundles(); Idx++) {
8170
OperandBundleUse Bundle = CI->getOperandBundleAt(Idx);
8271
if (Bundle.getTagName() == "separate_storage") {
8372
assert(Bundle.Inputs.size() == 2 &&
8473
"separate_storage must have two args");
85-
AddAffected(getUnderlyingObject(Bundle.Inputs[0]), Idx);
86-
AddAffected(getUnderlyingObject(Bundle.Inputs[1]), Idx);
74+
addValueAffectedByCondition(getUnderlyingObject(Bundle.Inputs[0]),
75+
InsertAffected, Idx);
76+
addValueAffectedByCondition(getUnderlyingObject(Bundle.Inputs[1]),
77+
InsertAffected, Idx);
8778
} else if (Bundle.Inputs.size() > ABA_WasOn &&
8879
Bundle.getTagName() != IgnoreBundleTag)
89-
AddAffected(Bundle.Inputs[ABA_WasOn], Idx);
80+
addValueAffectedByCondition(Bundle.Inputs[ABA_WasOn], InsertAffected,
81+
Idx);
9082
}
9183

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-
}
84+
Value *Cond = CI->getArgOperand(0);
85+
findValuesAffectedByCondition(Cond, /*IsAssume*/ true, InsertAffected);
13686

13787
if (TTI) {
13888
const Value *Ptr;
13989
unsigned AS;
14090
std::tie(Ptr, AS) = TTI->getPredicatedAddrSpace(Cond);
14191
if (Ptr)
142-
AddAffected(const_cast<Value *>(Ptr->stripInBoundsOffsets()));
92+
addValueAffectedByCondition(
93+
const_cast<Value *>(Ptr->stripInBoundsOffsets()), InsertAffected);
14394
}
14495
}
14596

0 commit comments

Comments
 (0)