diff options
Diffstat (limited to 'llvm/lib/Analysis/AssumptionCache.cpp')
-rw-r--r-- | llvm/lib/Analysis/AssumptionCache.cpp | 32 |
1 files changed, 11 insertions, 21 deletions
diff --git a/llvm/lib/Analysis/AssumptionCache.cpp b/llvm/lib/Analysis/AssumptionCache.cpp index 81b2667..3139b3e 100644 --- a/llvm/lib/Analysis/AssumptionCache.cpp +++ b/llvm/lib/Analysis/AssumptionCache.cpp @@ -92,29 +92,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, *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, |