[PATCH] D102267: [SCEV] Apply guards to max with non-unitary steps.
Florian Hahn via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed May 12 13:04:58 PDT 2021
fhahn updated this revision to Diff 344924.
fhahn added a comment.
Add test where applying guards pessimizes range (96c1fa2a041d <https://reviews.llvm.org/rG96c1fa2a041d352d2b6eb202f3c419323239514f>), replace assert with conditional assignment.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D102267/new/
https://reviews.llvm.org/D102267
Files:
llvm/lib/Analysis/ScalarEvolution.cpp
llvm/test/Analysis/ScalarEvolution/max-backedge-taken-count-guard-info.ll
Index: llvm/test/Analysis/ScalarEvolution/max-backedge-taken-count-guard-info.ll
===================================================================
--- llvm/test/Analysis/ScalarEvolution/max-backedge-taken-count-guard-info.ll
+++ llvm/test/Analysis/ScalarEvolution/max-backedge-taken-count-guard-info.ll
@@ -200,14 +200,14 @@
; 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}<nuw><nsw><%loop> U: [0,-9223372036854775808) S: [0,9223372036854775807) Exits: (2 * (%N /u 2))<nuw> LoopDispositions: { %loop: Computable }
+; CHECK-NEXT: --> {0,+,2}<nuw><nsw><%loop> U: [0,13) S: [0,13) Exits: (2 * (%N /u 2))<nuw> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %idx = getelementptr inbounds i32, i32* %a, i64 %iv
; CHECK-NEXT: --> {%a,+,8}<nuw><%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}<nuw><%loop> U: [2,-1) S: [-9223372036854775808,9223372036854775807) Exits: (2 + (2 * (%N /u 2))<nuw>) LoopDispositions: { %loop: Computable }
+; CHECK-NEXT: --> {2,+,2}<nuw><nsw><%loop> U: [2,15) S: [2,15) Exits: (2 + (2 * (%N /u 2))<nuw>) 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
Index: llvm/lib/Analysis/ScalarEvolution.cpp
===================================================================
--- llvm/lib/Analysis/ScalarEvolution.cpp
+++ llvm/lib/Analysis/ScalarEvolution.cpp
@@ -9262,10 +9262,15 @@
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);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D102267.344924.patch
Type: text/x-patch
Size: 2721 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210512/75deee2c/attachment.bin>
More information about the llvm-commits
mailing list