summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorSerguei Katkov <serguei.katkov@azul.com>2018-02-07 09:10:08 +0000
committerSerguei Katkov <serguei.katkov@azul.com>2018-02-07 09:10:08 +0000
commit69246ca7879d81dc3f07d52f768f7550519fbcb6 (patch)
treeab1a878266b6212eb1df1ddf6820cfe8c8126045 /llvm/lib
parent27ae7ae7740a89e24f9a670037c6a534884428e9 (diff)
downloadbcm5719-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.cpp62
-rw-r--r--llvm/lib/IR/Instructions.cpp14
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!");
OpenPOWER on IntegriCloud