Skip to content

Commit 6ee46ab

Browse files
committed
[Analysis] Share findAffectedValues between DomConditionCache and AssumptionCache; NFC
1 parent 3bc0ff2 commit 6ee46ab

File tree

2 files changed

+70
-86
lines changed

2 files changed

+70
-86
lines changed

llvm/lib/Analysis/AssumptionCache.cpp

Lines changed: 13 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -61,19 +61,13 @@ findAffectedValues(CallBase *CI, TargetTransformInfo *TTI,
6161
// Note: This code must be kept in-sync with the code in
6262
// computeKnownBitsFromAssume in ValueTracking.
6363

64-
auto AddAffected = [&Affected](Value *V, unsigned Idx =
65-
AssumptionCache::ExprResultIdx) {
66-
if (isa<Argument>(V) || isa<GlobalValue>(V)) {
64+
auto InsertAffected = [&Affected](Value *V) {
65+
Affected.push_back({V, AssumptionCache::ExprResultIdx});
66+
};
67+
68+
auto AddAffectedVal = [&Affected](Value *V, unsigned Idx) {
69+
if (isa<Argument>(V) || isa<GlobalValue>(V) || isa<Instruction>(V)) {
6770
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-
}
7771
}
7872
};
7973

@@ -82,64 +76,23 @@ findAffectedValues(CallBase *CI, TargetTransformInfo *TTI,
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+
AddAffectedVal(getUnderlyingObject(Bundle.Inputs[0]), Idx);
80+
AddAffectedVal(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+
AddAffectedVal(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+
AddAffectedVal(const_cast<Value *>(Ptr->stripInBoundsOffsets()),
95+
AssumptionCache::ExprResultIdx);
14396
}
14497
}
14598

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9124,7 +9124,6 @@ void llvm::findValuesAffectedByCondition(
91249124
addValueAffectedByCondition(V, InsertAffected);
91259125
};
91269126

9127-
assert(!IsAssume);
91289127
SmallVector<Value *, 8> Worklist;
91299128
SmallPtrSet<Value *, 8> Visited;
91309129
Worklist.push_back(Cond);
@@ -9134,35 +9133,67 @@ void llvm::findValuesAffectedByCondition(
91349133
continue;
91359134

91369135
CmpInst::Predicate Pred;
9137-
Value *A, *B;
9138-
if (match(V, m_LogicalOp(m_Value(A), m_Value(B)))) {
9136+
Value *A, *B, *X;
9137+
9138+
if (IsAssume)
9139+
AddAffected(V);
9140+
9141+
if (IsAssume && match(V, m_Not(m_Value(X))))
9142+
AddAffected(X);
9143+
if (!IsAssume && match(V, m_LogicalOp(m_Value(A), m_Value(B)))) {
91399144
Worklist.push_back(A);
91409145
Worklist.push_back(B);
9141-
} else if (match(V, m_ICmp(Pred, m_Value(A), m_Constant()))) {
9142-
AddAffected(A);
9146+
} else if (match(V, m_Cmp(Pred, m_Value(A), m_Value(B))) &&
9147+
(IsAssume || isa<ICmpInst>(V))) {
9148+
if (IsAssume || match(B, m_Constant())) {
9149+
AddAffected(A);
9150+
if (IsAssume)
9151+
AddAffected(B);
9152+
9153+
if (IsAssume ? (Pred == ICmpInst::ICMP_EQ)
9154+
: ICmpInst::isEquality(Pred)) {
9155+
if (match(B, m_ConstantInt())) {
9156+
// (X & C) or (X | C) or (X ^ C).
9157+
// (X << C) or (X >>_s C) or (X >>_u C).
9158+
if (match(A, m_BitwiseLogic(m_Value(X), m_ConstantInt())) ||
9159+
match(A, m_Shift(m_Value(X), m_ConstantInt())))
9160+
AddAffected(X);
9161+
}
9162+
} else {
9163+
if (Pred == ICmpInst::ICMP_NE)
9164+
if (match(A, m_And(m_Value(X), m_Power2())) && match(B, m_Zero()))
9165+
AddAffected(X);
9166+
9167+
if (!IsAssume || Pred == ICmpInst::ICMP_ULT) {
9168+
// Handle (A + C1) u< C2, which is the canonical form of
9169+
// A > C3 && A < C4.
9170+
if (match(A, m_Add(m_Value(X), m_ConstantInt())) &&
9171+
match(B, m_ConstantInt()))
9172+
AddAffected(X);
9173+
}
9174+
if (!IsAssume) {
9175+
// Handle icmp slt/sgt (bitcast X to int), 0/-1, which is supported
9176+
// by computeKnownFPClass().
9177+
if ((Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGT) &&
9178+
match(A, m_ElementWiseBitCast(m_Value(X))))
9179+
InsertAffected(X);
9180+
}
91439181

9144-
if (ICmpInst::isEquality(Pred)) {
9145-
Value *X;
9146-
// (X & C) or (X | C) or (X ^ C).
9147-
// (X << C) or (X >>_s C) or (X >>_u C).
9148-
if (match(A, m_BitwiseLogic(m_Value(X), m_ConstantInt())) ||
9149-
match(A, m_Shift(m_Value(X), m_ConstantInt())))
9150-
AddAffected(X);
9151-
} else {
9152-
Value *X;
9153-
// Handle (A + C1) u< C2, which is the canonical form of
9154-
// A > C3 && A < C4.
9155-
if (match(A, m_Add(m_Value(X), m_ConstantInt())))
9156-
AddAffected(X);
9157-
// Handle icmp slt/sgt (bitcast X to int), 0/-1, which is supported by
9158-
// computeKnownFPClass().
9159-
if ((Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGT) &&
9160-
match(A, m_ElementWiseBitCast(m_Value(X))))
9161-
InsertAffected(X);
9182+
if (IsAssume && CmpInst::isFPPredicate(Pred)) {
9183+
// fcmp fneg(x), y
9184+
// fcmp fabs(x), y
9185+
// fcmp fneg(fabs(x)), y
9186+
if (match(A, m_FNeg(m_Value(A))))
9187+
AddAffected(A);
9188+
if (match(A, m_FAbs(m_Value(A))))
9189+
AddAffected(A);
9190+
}
9191+
}
91629192
}
9163-
} else if (match(Cond, m_CombineOr(m_FCmp(Pred, m_Value(A), m_Constant()),
9164-
m_Intrinsic<Intrinsic::is_fpclass>(
9165-
m_Value(A), m_Constant())))) {
9193+
} else if ((!IsAssume &&
9194+
match(Cond, m_FCmp(Pred, m_Value(A), m_Constant()))) ||
9195+
match(Cond, m_Intrinsic<Intrinsic::is_fpclass>(m_Value(A),
9196+
m_Value(B)))) {
91669197
// Handle patterns that computeKnownFPClass() support.
91679198
AddAffected(A);
91689199
}

0 commit comments

Comments
 (0)