diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 451ae73dbd601..580fe112fcd7b 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -12910,7 +12910,11 @@ ScalarEvolution::howManyLessThans(const SCEV *LHS, const SCEV *RHS, if (!BECount) { auto canProveRHSGreaterThanEqualStart = [&]() { auto CondGE = IsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE; - if (isLoopEntryGuardedByCond(L, CondGE, OrigRHS, OrigStart)) + const SCEV *GuardedRHS = applyLoopGuards(OrigRHS, L); + const SCEV *GuardedStart = applyLoopGuards(OrigStart, L); + + if (isLoopEntryGuardedByCond(L, CondGE, OrigRHS, OrigStart) || + isKnownPredicate(CondGE, GuardedRHS, GuardedStart)) return true; // (RHS > Start - 1) implies RHS >= Start. diff --git a/llvm/test/Analysis/ScalarEvolution/trip-count.ll b/llvm/test/Analysis/ScalarEvolution/trip-count.ll index 22e49ebdbf4db..36b42c62dd394 100644 --- a/llvm/test/Analysis/ScalarEvolution/trip-count.ll +++ b/llvm/test/Analysis/ScalarEvolution/trip-count.ll @@ -127,10 +127,10 @@ leave: define void @non_zero_from_loop_guard(i16 %n) { ; CHECK-LABEL: 'non_zero_from_loop_guard' ; CHECK-NEXT: Determining loop execution counts for: @non_zero_from_loop_guard -; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + (1 umax (%n /u 2))) +; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + (%n /u 2)) ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 32766 -; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + (1 umax (%n /u 2))) -; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (-1 + (1 umax (%n /u 2))) +; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + (%n /u 2)) +; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (-1 + (%n /u 2)) ; CHECK-NEXT: Predicates: ; CHECK-NEXT: Loop %loop: Trip multiple is 1 ;