mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[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
This commit is contained in:
parent
01960a7ab2
commit
8bc2e95e00
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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}<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
|
||||
|
Loading…
Reference in New Issue
Block a user