diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -12658,6 +12658,18 @@ getSCEV(Cmp->getOperand(1)), RewriteMap); } + // Also collect information from assumptions dominating the loop. + for (auto &AssumeVH : AC.assumptions()) { + if (!AssumeVH) + continue; + auto *AssumeI = cast(AssumeVH); + auto *Cmp = dyn_cast(AssumeI->getOperand(0)); + if (!Cmp || !DT.dominates(AssumeI, L->getHeader())) + continue; + CollectCondition(Cmp->getPredicate(), getSCEV(Cmp->getOperand(0)), + getSCEV(Cmp->getOperand(1)), RewriteMap); + } + if (RewriteMap.empty()) return Expr; return SCEVParameterRewriter::rewrite(Expr, *this, RewriteMap); diff --git a/llvm/test/Analysis/ScalarEvolution/max-backedge-taken-count-guard-info.ll b/llvm/test/Analysis/ScalarEvolution/max-backedge-taken-count-guard-info.ll --- a/llvm/test/Analysis/ScalarEvolution/max-backedge-taken-count-guard-info.ll +++ b/llvm/test/Analysis/ScalarEvolution/max-backedge-taken-count-guard-info.ll @@ -278,7 +278,7 @@ define void @test_guard_and_assume(i32* nocapture readonly %data, i64 %count) { ; CHECK-LABEL: @test_guard_and_assume ; CHECK: Loop %loop: backedge-taken count is (-1 + %count) -; CHECK-NEXT: Loop %loop: max backedge-taken count is -2 +; CHECK-NEXT: Loop %loop: max backedge-taken count is 3 ; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (-1 + %count) ; entry: