diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2023-12-18 20:30:12 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2024-04-19 21:12:03 +0000 |
| commit | c9157d925c489f07ba9c0b2ce47e5149b75969a5 (patch) | |
| tree | 08bc4a3d9cad3f9ebffa558ddf140b9d9257b219 /contrib/llvm-project/llvm/lib/Analysis/AssumptionCache.cpp | |
| parent | 2a66844f606a35d68ad8a8061f4bea204274b3bc (diff) | |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Analysis/AssumptionCache.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Analysis/AssumptionCache.cpp | 47 |
1 files changed, 16 insertions, 31 deletions
diff --git a/contrib/llvm-project/llvm/lib/Analysis/AssumptionCache.cpp b/contrib/llvm-project/llvm/lib/Analysis/AssumptionCache.cpp index b439dc1e6a76..fb3a6f8de2d6 100644 --- a/contrib/llvm-project/llvm/lib/Analysis/AssumptionCache.cpp +++ b/contrib/llvm-project/llvm/lib/Analysis/AssumptionCache.cpp @@ -62,15 +62,14 @@ findAffectedValues(CallBase *CI, TargetTransformInfo *TTI, auto AddAffected = [&Affected](Value *V, unsigned Idx = AssumptionCache::ExprResultIdx) { - if (isa<Argument>(V)) { + if (isa<Argument>(V) || isa<GlobalValue>(V)) { Affected.push_back({V, Idx}); } else if (auto *I = dyn_cast<Instruction>(V)) { Affected.push_back({I, Idx}); // Peek through unary operators to find the source of the condition. Value *Op; - if (match(I, m_BitCast(m_Value(Op))) || - match(I, m_PtrToInt(m_Value(Op))) || match(I, m_Not(m_Value(Op)))) { + if (match(I, m_PtrToInt(m_Value(Op)))) { if (isa<Instruction>(Op) || isa<Argument>(Op)) Affected.push_back({Op, Idx}); } @@ -85,6 +84,8 @@ findAffectedValues(CallBase *CI, TargetTransformInfo *TTI, Value *Cond = CI->getArgOperand(0), *A, *B; AddAffected(Cond); + if (match(Cond, m_Not(m_Value(A)))) + AddAffected(A); CmpInst::Predicate Pred; if (match(Cond, m_Cmp(Pred, m_Value(A), m_Value(B)))) { @@ -92,35 +93,19 @@ findAffectedValues(CallBase *CI, TargetTransformInfo *TTI, AddAffected(B); if (Pred == ICmpInst::ICMP_EQ) { - // For equality comparisons, we handle the case of bit inversion. - auto AddAffectedFromEq = [&AddAffected](Value *V) { - Value *A; - if (match(V, m_Not(m_Value(A)))) { - AddAffected(A); - V = A; - } - - Value *B; - // (A & B) or (A | B) or (A ^ B). - if (match(V, m_BitwiseLogic(m_Value(A), m_Value(B)))) { - AddAffected(A); - AddAffected(B); - // (A << C) or (A >>_s C) or (A >>_u C) where C is some constant. - } else if (match(V, m_Shift(m_Value(A), m_ConstantInt()))) { - AddAffected(A); - } - }; - - AddAffectedFromEq(A); - AddAffectedFromEq(B); + if (match(B, m_ConstantInt())) { + Value *X; + // (X & C) or (X | C) or (X ^ C). + // (X << C) or (X >>_s C) or (X >>_u C). + if (match(A, m_BitwiseLogic(m_Value(X), m_ConstantInt())) || + match(A, m_Shift(m_Value(X), m_ConstantInt()))) + AddAffected(X); + } } else if (Pred == ICmpInst::ICMP_NE) { - Value *X, *Y; - // Handle (a & b != 0). If a/b is a power of 2 we can use this - // information. - if (match(A, m_And(m_Value(X), m_Value(Y))) && match(B, m_Zero())) { + Value *X; + // Handle (X & pow2 != 0). + if (match(A, m_And(m_Value(X), m_Power2())) && match(B, m_Zero())) AddAffected(X); - AddAffected(Y); - } } else if (Pred == ICmpInst::ICMP_ULT) { Value *X; // Handle (A + C1) u< C2, which is the canonical form of A > C3 && A < C4, @@ -188,7 +173,7 @@ void AssumptionCache::unregisterAssumption(AssumeInst *CI) { AffectedValues.erase(AVI); } - erase_value(AssumeHandles, CI); + llvm::erase(AssumeHandles, CI); } void AssumptionCache::AffectedValueCallbackVH::deleted() { |
