forked from OSchip/llvm-project
[ScalarEvolution] Fix pointer/int confusion in howManyLessThans.
In general, howManyLessThans doesn't really want to work with pointers at all; the result is an integer, and the operands of the icmp are effectively integers. However, isLoopEntryGuardedByCond doesn't like extra ptrtoint casts, so the arguments to isLoopEntryGuardedByCond need to be computed without those casts. Somehow, the values got mixed up with the recent howManyLessThans improvements; fix the confused values, and add a better comment to explain what's happening. Differential Revision: https://reviews.llvm.org/D109465
This commit is contained in:
parent
89837a0e1b
commit
8f792707c4
|
@ -11778,7 +11778,9 @@ ScalarEvolution::howManyLessThans(const SCEV *LHS, const SCEV *RHS,
|
|||
const SCEV *Start = IV->getStart();
|
||||
|
||||
// Preserve pointer-typed Start/RHS to pass to isLoopEntryGuardedByCond.
|
||||
// Use integer-typed versions for actual computation.
|
||||
// If we convert to integers, isLoopEntryGuardedByCond will miss some cases.
|
||||
// Use integer-typed versions for actual computation; we can't subtract
|
||||
// pointers in general.
|
||||
const SCEV *OrigStart = Start;
|
||||
const SCEV *OrigRHS = RHS;
|
||||
if (Start->getType()->isPointerTy()) {
|
||||
|
@ -11809,10 +11811,10 @@ ScalarEvolution::howManyLessThans(const SCEV *LHS, const SCEV *RHS,
|
|||
// is End and so the result is as above, and if not max(End,Start) is Start
|
||||
// so we get a backedge count of zero.
|
||||
const SCEV *BECount = nullptr;
|
||||
auto *StartMinusStride = getMinusSCEV(OrigStart, Stride);
|
||||
auto *OrigStartMinusStride = getMinusSCEV(OrigStart, Stride);
|
||||
// Can we prove (max(RHS,Start) > Start - Stride?
|
||||
if (isLoopEntryGuardedByCond(L, Cond, StartMinusStride, Start) &&
|
||||
isLoopEntryGuardedByCond(L, Cond, StartMinusStride, RHS)) {
|
||||
if (isLoopEntryGuardedByCond(L, Cond, OrigStartMinusStride, OrigStart) &&
|
||||
isLoopEntryGuardedByCond(L, Cond, OrigStartMinusStride, OrigRHS)) {
|
||||
// In this case, we can use a refined formula for computing backedge taken
|
||||
// count. The general formula remains:
|
||||
// "End-Start /uceiling Stride" where "End = max(RHS,Start)"
|
||||
|
@ -11833,10 +11835,8 @@ ScalarEvolution::howManyLessThans(const SCEV *LHS, const SCEV *RHS,
|
|||
// Our preconditions trivially imply no overflow in that form.
|
||||
const SCEV *MinusOne = getMinusOne(Stride->getType());
|
||||
const SCEV *Numerator =
|
||||
getMinusSCEV(getAddExpr(RHS, MinusOne), StartMinusStride);
|
||||
if (!isa<SCEVCouldNotCompute>(Numerator)) {
|
||||
BECount = getUDivExpr(Numerator, Stride);
|
||||
}
|
||||
getMinusSCEV(getAddExpr(RHS, MinusOne), getMinusSCEV(Start, Stride));
|
||||
BECount = getUDivExpr(Numerator, Stride);
|
||||
}
|
||||
|
||||
const SCEV *BECountIfBackedgeTaken = nullptr;
|
||||
|
|
|
@ -127,13 +127,13 @@ define void @pointer_iv_nowrap_guard(i32* %startptr, i32* %endptr) local_unnamed
|
|||
; CHECK-NEXT: %init = getelementptr inbounds i32, i32* %startptr, i64 2000
|
||||
; CHECK-NEXT: --> (8000 + %startptr)<nuw> U: [8000,0) S: [8000,0)
|
||||
; CHECK-NEXT: %iv = phi i32* [ %init, %entry ], [ %iv.next, %loop ]
|
||||
; CHECK-NEXT: --> {(8000 + %startptr)<nuw>,+,4}<nuw><%loop> U: [8000,0) S: [8000,0) Exits: (8000 + (4 * ((-8001 + (-1 * (ptrtoint i32* %startptr to i64)) + ((8004 + (ptrtoint i32* %startptr to i64))<nuw> umax (ptrtoint i32* %endptr to i64))) /u 4))<nuw> + %startptr) LoopDispositions: { %loop: Computable }
|
||||
; CHECK-NEXT: --> {(8000 + %startptr)<nuw>,+,4}<nuw><%loop> U: [8000,0) S: [8000,0) Exits: (8000 + (4 * ((-8001 + (-1 * (ptrtoint i32* %startptr to i64)) + (ptrtoint i32* %endptr to i64)) /u 4))<nuw> + %startptr) LoopDispositions: { %loop: Computable }
|
||||
; CHECK-NEXT: %iv.next = getelementptr inbounds i32, i32* %iv, i64 1
|
||||
; CHECK-NEXT: --> {(8004 + %startptr)<nuw>,+,4}<nuw><%loop> U: [8004,0) S: [8004,0) Exits: (8004 + (4 * ((-8001 + (-1 * (ptrtoint i32* %startptr to i64)) + ((8004 + (ptrtoint i32* %startptr to i64))<nuw> umax (ptrtoint i32* %endptr to i64))) /u 4))<nuw> + %startptr) LoopDispositions: { %loop: Computable }
|
||||
; CHECK-NEXT: --> {(8004 + %startptr)<nuw>,+,4}<nuw><%loop> U: [8004,0) S: [8004,0) Exits: (8004 + (4 * ((-8001 + (-1 * (ptrtoint i32* %startptr to i64)) + (ptrtoint i32* %endptr to i64)) /u 4))<nuw> + %startptr) LoopDispositions: { %loop: Computable }
|
||||
; CHECK-NEXT: Determining loop execution counts for: @pointer_iv_nowrap_guard
|
||||
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-8001 + (-1 * (ptrtoint i32* %startptr to i64)) + ((8004 + (ptrtoint i32* %startptr to i64))<nuw> umax (ptrtoint i32* %endptr to i64))) /u 4)
|
||||
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-8001 + (-1 * (ptrtoint i32* %startptr to i64)) + (ptrtoint i32* %endptr to i64)) /u 4)
|
||||
; CHECK-NEXT: Loop %loop: max backedge-taken count is 4611686018427385902
|
||||
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-8001 + (-1 * (ptrtoint i32* %startptr to i64)) + ((8004 + (ptrtoint i32* %startptr to i64))<nuw> umax (ptrtoint i32* %endptr to i64))) /u 4)
|
||||
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-8001 + (-1 * (ptrtoint i32* %startptr to i64)) + (ptrtoint i32* %endptr to i64)) /u 4)
|
||||
; CHECK-NEXT: Predicates:
|
||||
; CHECK: Loop %loop: Trip multiple is 1
|
||||
;
|
||||
|
|
Loading…
Reference in New Issue