summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kazantsev <max.kazantsev@azul.com>2018-02-15 07:09:00 +0000
committerMax Kazantsev <max.kazantsev@azul.com>2018-02-15 07:09:00 +0000
commitc5941d12f430ecb0efa458b3f4acd674807241ad (patch)
tree70f1659f3804614f3c3c67785269132f0ef68bfe
parent25f917341ee21d8605ddd5bb95755c49f7c4660a (diff)
downloadbcm5719-llvm-c5941d12f430ecb0efa458b3f4acd674807241ad.tar.gz
bcm5719-llvm-c5941d12f430ecb0efa458b3f4acd674807241ad.zip
[SCEV] Favor isKnownViaSimpleReasoning over constant ranges check
There is a more powerful but still simple function `isKnownViaSimpleReasoning ` that does constant range check and few more additional checks. We use it some places (e.g. when proving implications) and in some other places we only check constant ranges. Currently, indvar simplifier fails to remove the check in following loop: int inc = ...; for (int i = inc, j = inc - 1; i < 200; ++i, ++j) if (i > j) { ... } This patch replaces all usages of `isKnownPredicateViaConstantRanges` with `isKnownViaSimpleReasoning` to have smarter proofs. In particular, it fixes the case above. Reviewed-By: sanjoy Differential Revision: https://reviews.llvm.org/D43175 llvm-svn: 325214
-rw-r--r--llvm/lib/Analysis/ScalarEvolution.cpp12
-rw-r--r--llvm/test/Transforms/IndVarSimplify/loop-invariant-conditions.ll32
2 files changed, 38 insertions, 6 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 46e7c9d72b6..b3ab693acac 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -8693,8 +8693,8 @@ bool ScalarEvolution::isKnownPredicate(ICmpInst::Predicate Pred,
if (isKnownPredicateViaSplitting(Pred, LHS, RHS))
return true;
- // Otherwise see what can be done with known constant ranges.
- return isKnownPredicateViaConstantRanges(Pred, LHS, RHS);
+ // Otherwise see what can be done with some simple reasoning.
+ return isKnownViaSimpleReasoning(Pred, LHS, RHS);
}
bool ScalarEvolution::isMonotonicPredicate(const SCEVAddRecExpr *LHS,
@@ -8961,7 +8961,7 @@ ScalarEvolution::isLoopBackedgeGuardedByCond(const Loop *L,
// (interprocedural conditions notwithstanding).
if (!L) return true;
- if (isKnownPredicateViaConstantRanges(Pred, LHS, RHS))
+ if (isKnownViaSimpleReasoning(Pred, LHS, RHS))
return true;
BasicBlock *Latch = L->getLoopLatch();
@@ -9072,7 +9072,7 @@ ScalarEvolution::isLoopEntryGuardedByCond(const Loop *L,
assert(isAvailableAtLoopEntry(RHS, L) &&
"RHS is not available at Loop Entry");
- if (isKnownPredicateViaConstantRanges(Pred, LHS, RHS))
+ if (isKnownViaSimpleReasoning(Pred, LHS, RHS))
return true;
// If we cannot prove strict comparison (e.g. a > b), maybe we can prove
@@ -9087,9 +9087,9 @@ ScalarEvolution::isLoopEntryGuardedByCond(const Loop *L,
if (ProvingStrictComparison) {
ProvedNonStrictComparison =
- isKnownPredicateViaConstantRanges(NonStrictPredicate, LHS, RHS);
+ isKnownViaSimpleReasoning(NonStrictPredicate, LHS, RHS);
ProvedNonEquality =
- isKnownPredicateViaConstantRanges(ICmpInst::ICMP_NE, LHS, RHS);
+ isKnownViaSimpleReasoning(ICmpInst::ICMP_NE, LHS, RHS);
if (ProvedNonStrictComparison && ProvedNonEquality)
return true;
}
diff --git a/llvm/test/Transforms/IndVarSimplify/loop-invariant-conditions.ll b/llvm/test/Transforms/IndVarSimplify/loop-invariant-conditions.ll
index 30249828107..0ce4baacedd 100644
--- a/llvm/test/Transforms/IndVarSimplify/loop-invariant-conditions.ll
+++ b/llvm/test/Transforms/IndVarSimplify/loop-invariant-conditions.ll
@@ -355,6 +355,38 @@ exit:
ret void
}
+; check that we can prove that a recurrency is greater than another recurrency
+; in the same loop, with the same step, and with smaller starting value.
+define void @test12(i64* %inc_ptr) {
+; CHECK-LABEL: @test12
+entry:
+ %inc = load i64, i64* %inc_ptr, !range !0
+ %inc.minus.1 = sub i64 %inc, 1
+ br label %loop
+
+loop:
+ %iv = phi i64 [ %inc, %entry ], [ %iv.next, %backedge ]
+ %iv.minus.1 = phi i64 [ %inc.minus.1, %entry ], [ %iv.minus.1.next, %backedge ]
+ %iv.next = add i64 %iv, 1
+ %iv.minus.1.next = add i64 %iv.minus.1, 1
+ %brcond = icmp sgt i64 %iv.next, %iv.minus.1.next
+ ; CHECK: br i1 true, label %if.true, label %if.false
+ br i1 %brcond, label %if.true, label %if.false
+
+if.true:
+ br label %backedge
+
+if.false:
+ br label %backedge
+
+backedge:
+ %loopcond = icmp slt i64 %iv, 200
+ br i1 %loopcond, label %loop, label %exit
+
+exit:
+ ret void
+}
+
!1 = !{i64 -1, i64 100}
OpenPOWER on IntegriCloud