diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index 46e7c9d72b6..b3ab693acac 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/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/test/Transforms/IndVarSimplify/loop-invariant-conditions.ll b/test/Transforms/IndVarSimplify/loop-invariant-conditions.ll index 30249828107..0ce4baacedd 100644 --- a/test/Transforms/IndVarSimplify/loop-invariant-conditions.ll +++ b/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}