From 8bc2e95e0066253ec95015d7c915d3f601c117aa Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Thu, 13 May 2021 09:32:41 +0100 Subject: [PATCH] [SCEV] Apply guards to max with non-unitary steps. We already apply loop-guards when computing the maximum with unitary steps. This extends the code to also do so when dealing with non-unitary steps. This allows us to infer a tighter maximum in some cases. Reviewed By: nikic Differential Revision: https://reviews.llvm.org/D102267 --- lib/Analysis/ScalarEvolution.cpp | 13 +++++++++---- .../max-backedge-taken-count-guard-info.ll | 6 +++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index 4555d35128c..6447c3d4dec 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -9262,10 +9262,15 @@ ScalarEvolution::howFarToZero(const SCEV *V, const Loop *L, bool ControlsExit, loopHasNoAbnormalExits(AddRec->getLoop())) { const SCEV *Exact = getUDivExpr(Distance, CountDown ? getNegativeSCEV(Step) : Step); - const SCEV *Max = - Exact == getCouldNotCompute() - ? Exact - : getConstant(getUnsignedRangeMax(Exact)); + const SCEV *Max = getCouldNotCompute(); + if (Exact != getCouldNotCompute()) { + APInt MaxInt = getUnsignedRangeMax(applyLoopGuards(Exact, L)); + APInt BaseMaxInt = getUnsignedRangeMax(Exact); + if (BaseMaxInt.ult(MaxInt)) + Max = getConstant(BaseMaxInt); + else + Max = getConstant(MaxInt); + } return ExitLimit(Exact, Max, false, Predicates); } diff --git a/test/Analysis/ScalarEvolution/max-backedge-taken-count-guard-info.ll b/test/Analysis/ScalarEvolution/max-backedge-taken-count-guard-info.ll index 3123811a132..bd10582cae8 100644 --- a/test/Analysis/ScalarEvolution/max-backedge-taken-count-guard-info.ll +++ b/test/Analysis/ScalarEvolution/max-backedge-taken-count-guard-info.ll @@ -200,14 +200,14 @@ define void @test_guard_ule_12_step2(i32* nocapture %a, i64 %N) { ; CHECK-LABEL: 'test_guard_ule_12_step2' ; CHECK-NEXT: Classifying expressions for: @test_guard_ule_12_step2 ; CHECK-NEXT: %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ] -; CHECK-NEXT: --> {0,+,2}<%loop> U: [0,-9223372036854775808) S: [0,9223372036854775807) Exits: (2 * (%N /u 2)) LoopDispositions: { %loop: Computable } +; CHECK-NEXT: --> {0,+,2}<%loop> U: [0,13) S: [0,13) Exits: (2 * (%N /u 2)) LoopDispositions: { %loop: Computable } ; CHECK-NEXT: %idx = getelementptr inbounds i32, i32* %a, i64 %iv ; CHECK-NEXT: --> {%a,+,8}<%loop> U: full-set S: full-set Exits: ((8 * (%N /u 2)) + %a) LoopDispositions: { %loop: Computable } ; CHECK-NEXT: %iv.next = add nuw nsw i64 %iv, 2 -; CHECK-NEXT: --> {2,+,2}<%loop> U: [2,-1) S: [-9223372036854775808,9223372036854775807) Exits: (2 + (2 * (%N /u 2))) LoopDispositions: { %loop: Computable } +; CHECK-NEXT: --> {2,+,2}<%loop> U: [2,15) S: [2,15) Exits: (2 + (2 * (%N /u 2))) LoopDispositions: { %loop: Computable } ; CHECK-NEXT: Determining loop execution counts for: @test_guard_ule_12_step2 ; CHECK-NEXT: Loop %loop: backedge-taken count is (%N /u 2) -; CHECK-NEXT: Loop %loop: max backedge-taken count is 9223372036854775807 +; CHECK-NEXT: Loop %loop: max backedge-taken count is 6 ; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%N /u 2) ; CHECK-NEXT: Predicates: ; CHECK: Loop %loop: Trip multiple is 1