diff options
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() {  | 
