diff options
| author | Serguei Katkov <serguei.katkov@azul.com> | 2018-02-07 09:10:08 +0000 |
|---|---|---|
| committer | Serguei Katkov <serguei.katkov@azul.com> | 2018-02-07 09:10:08 +0000 |
| commit | 69246ca7879d81dc3f07d52f768f7550519fbcb6 (patch) | |
| tree | ab1a878266b6212eb1df1ddf6820cfe8c8126045 /llvm/lib | |
| parent | 27ae7ae7740a89e24f9a670037c6a534884428e9 (diff) | |
| download | bcm5719-llvm-69246ca7879d81dc3f07d52f768f7550519fbcb6.tar.gz bcm5719-llvm-69246ca7879d81dc3f07d52f768f7550519fbcb6.zip | |
Revert [SCEV] Make isLoopEntryGuardedByCond a bit smarter
Revert rL324453 commit which causes buildbot failures.
Differential Revision: https://reviews.llvm.org/D42835
llvm-svn: 324462
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Analysis/ScalarEvolution.cpp | 62 | ||||
| -rw-r--r-- | llvm/lib/IR/Instructions.cpp | 14 |
2 files changed, 5 insertions, 71 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 8f5e0bc51df..f44bb8d447e 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -9073,59 +9073,6 @@ ScalarEvolution::isLoopEntryGuardedByCond(const Loop *L, if (isKnownPredicateViaConstantRanges(Pred, LHS, RHS)) return true; - // If we cannot prove strict comparison (e.g. a > b), maybe we can prove - // the facts (a >= b && a != b) separately. A typical situation is when the - // non-strict comparison is known from ranges and non-equality is known from - // dominating predicates. If we are proving strict comparison, we always try - // to prove non-equality and non-strict comparison separately. - auto NonStrictPredicate = ICmpInst::getNonStrictPredicate(Pred); - const bool ProvingStrictComparison = (Pred != NonStrictPredicate); - bool ProvedNonStrictComparison = false; - bool ProvedNonEquality = false; - - if (ProvingStrictComparison) { - ProvedNonStrictComparison = - isKnownPredicateViaConstantRanges(NonStrictPredicate, LHS, RHS); - ProvedNonEquality = - isKnownPredicateViaConstantRanges(ICmpInst::ICMP_NE, LHS, RHS); - assert((!ProvedNonStrictComparison || !ProvedNonEquality) && - "Why we were unable to prove (Pred, LHS, RHS) via constant ranges?"); - } - - // Try to prove (Pred, LHS, RHS) using isImpliedViaGuard. - auto ProveViaGuard = [&](BasicBlock *Block) { - if (isImpliedViaGuard(Block, Pred, LHS, RHS)) - return true; - if (ProvingStrictComparison) { - if (!ProvedNonStrictComparison) - ProvedNonStrictComparison = - isImpliedViaGuard(Block, NonStrictPredicate, LHS, RHS); - if (!ProvedNonEquality) - ProvedNonEquality = - isImpliedViaGuard(Block, ICmpInst::ICMP_NE, LHS, RHS); - if (ProvedNonStrictComparison && ProvedNonEquality) - return true; - } - return false; - }; - - // Try to prove (Pred, LHS, RHS) using isImpliedCond. - auto ProveViaCond = [&](Value *Condition, bool Inverse) { - if (isImpliedCond(Pred, LHS, RHS, Condition, Inverse)) - return true; - if (ProvingStrictComparison) { - if (!ProvedNonStrictComparison) - ProvedNonStrictComparison = - isImpliedCond(NonStrictPredicate, LHS, RHS, Condition, Inverse); - if (!ProvedNonEquality) - ProvedNonEquality = - isImpliedCond(ICmpInst::ICMP_NE, LHS, RHS, Condition, Inverse); - if (ProvedNonStrictComparison && ProvedNonEquality) - return true; - } - return false; - }; - // Starting at the loop predecessor, climb up the predecessor chain, as long // as there are predecessors that can be found that have unique successors // leading to the original header. @@ -9134,7 +9081,7 @@ ScalarEvolution::isLoopEntryGuardedByCond(const Loop *L, Pair.first; Pair = getPredecessorWithUniqueSuccessorForBB(Pair.first)) { - if (ProveViaGuard(Pair.first)) + if (isImpliedViaGuard(Pair.first, Pred, LHS, RHS)) return true; BranchInst *LoopEntryPredicate = @@ -9143,8 +9090,9 @@ ScalarEvolution::isLoopEntryGuardedByCond(const Loop *L, LoopEntryPredicate->isUnconditional()) continue; - if (ProveViaCond(LoopEntryPredicate->getCondition(), - LoopEntryPredicate->getSuccessor(0) != Pair.second)) + if (isImpliedCond(Pred, LHS, RHS, + LoopEntryPredicate->getCondition(), + LoopEntryPredicate->getSuccessor(0) != Pair.second)) return true; } @@ -9156,7 +9104,7 @@ ScalarEvolution::isLoopEntryGuardedByCond(const Loop *L, if (!DT.dominates(CI, L->getHeader())) continue; - if (ProveViaCond(CI->getArgOperand(0), false)) + if (isImpliedCond(Pred, LHS, RHS, CI->getArgOperand(0), false)) return true; } diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp index 7fa4b06c566..490fcbce743 100644 --- a/llvm/lib/IR/Instructions.cpp +++ b/llvm/lib/IR/Instructions.cpp @@ -3467,20 +3467,6 @@ CmpInst::Predicate CmpInst::getSwappedPredicate(Predicate pred) { } } -CmpInst::Predicate CmpInst::getNonStrictPredicate(Predicate pred) { - switch (pred) { - case ICMP_SGT: return ICMP_SGE; - case ICMP_SLT: return ICMP_SLE; - case ICMP_UGT: return ICMP_UGE; - case ICMP_ULT: return ICMP_ULE; - case FCMP_OGT: return FCMP_OGE; - case FCMP_OLT: return FCMP_OLE; - case FCMP_UGT: return FCMP_UGE; - case FCMP_ULT: return FCMP_ULE; - default: return pred; - } -} - CmpInst::Predicate CmpInst::getSignedPredicate(Predicate pred) { assert(CmpInst::isUnsigned(pred) && "Call only with signed predicates!"); |

