Index: llvm/trunk/lib/Analysis/ScalarEvolution.cpp =================================================================== --- llvm/trunk/lib/Analysis/ScalarEvolution.cpp +++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp @@ -8693,8 +8693,8 @@ 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 @@ // (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 @@ 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 @@ 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; } Index: llvm/trunk/test/Transforms/IndVarSimplify/loop-invariant-conditions.ll =================================================================== --- llvm/trunk/test/Transforms/IndVarSimplify/loop-invariant-conditions.ll +++ llvm/trunk/test/Transforms/IndVarSimplify/loop-invariant-conditions.ll @@ -355,6 +355,38 @@ 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}