Skip to content

Commit 83469ae

Browse files
mrdaybirdhiraditya
authored andcommitted
Check for RHSAddRec nowrap flags and add test
1 parent 3394ae0 commit 83469ae

File tree

2 files changed

+42
-5
lines changed

2 files changed

+42
-5
lines changed

llvm/lib/Analysis/ScalarEvolution.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13004,7 +13004,8 @@ ScalarEvolution::howManyLessThans(const SCEV *LHS, const SCEV *RHS,
1300413004
*BECountIfBackedgeTaken = nullptr;
1300513005
if (!isLoopInvariant(RHS, L)) {
1300613006
const auto *RHSAddRec = dyn_cast<SCEVAddRecExpr>(RHS);
13007-
if (RHSAddRec != nullptr && RHSAddRec->getLoop() == L) {
13007+
bool RHSNoWrap = RHSAddRec->getNoWrapFlags();
13008+
if (RHSAddRec != nullptr && RHSAddRec->getLoop() == L && RHSNoWrap) {
1300813009
// The structure of loop we are trying to calculate backedge count of:
1300913010
//
1301013011
// left = left_start

llvm/test/Analysis/ScalarEvolution/pr92560.ll

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ while.end:
3434
ret void
3535
}
3636

37-
define dso_local void @overflow(i32 noundef %n) local_unnamed_addr {
38-
; CHECK-LABEL: 'overflow'
39-
; CHECK-NEXT: Classifying expressions for: @overflow
37+
; Cannot find backedge-count because subtraction of strides is wrapping.
38+
define dso_local void @stride_overflow(i32 noundef %n) local_unnamed_addr {
39+
; CHECK-LABEL: 'stride_overflow'
40+
; CHECK-NEXT: Classifying expressions for: @stride_overflow
4041
; CHECK-NEXT: %right.06 = phi i32 [ %dec, %while.body ], [ %n, %entry ]
4142
; CHECK-NEXT: --> {%n,+,-1}<nsw><%while.body> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %while.body: Computable }
4243
; CHECK-NEXT: %left.05 = phi i32 [ %inc, %while.body ], [ 2147483647, %entry ]
@@ -45,7 +46,7 @@ define dso_local void @overflow(i32 noundef %n) local_unnamed_addr {
4546
; CHECK-NEXT: --> {-2,+,2147483647}<nuw><nsw><%while.body> U: [-2,-1) S: [-2,0) Exits: <<Unknown>> LoopDispositions: { %while.body: Computable }
4647
; CHECK-NEXT: %dec = add nsw i32 %right.06, -1
4748
; CHECK-NEXT: --> {(-1 + %n),+,-1}<nsw><%while.body> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %while.body: Computable }
48-
; CHECK-NEXT: Determining loop execution counts for: @overflow
49+
; CHECK-NEXT: Determining loop execution counts for: @stride_overflow
4950
; CHECK-NEXT: Loop %while.body: Unpredictable backedge-taken count.
5051
; CHECK-NEXT: Loop %while.body: constant max backedge-taken count is i32 1
5152
; CHECK-NEXT: Loop %while.body: symbolic max backedge-taken count is i32 1
@@ -66,4 +67,39 @@ while.end:
6667
ret void
6768
}
6869

70+
; Cannot find backedge-count because %conv110 is wrapping
71+
define dso_local void @rhs_wrapping() local_unnamed_addr {
72+
; CHECK-LABEL: 'rhs_wrapping'
73+
; CHECK-NEXT: Classifying expressions for: @rhs_wrapping
74+
; CHECK-NEXT: %a = alloca i8, align 1
75+
; CHECK-NEXT: --> %a U: full-set S: full-set
76+
; CHECK-NEXT: %conv110 = phi i32 [ 0, %entry ], [ %sext8, %while.body ]
77+
; CHECK-NEXT: --> {0,+,-1090519040}<%while.body> U: [0,-16777215) S: [-2147483648,2130706433) Exits: <<Unknown>> LoopDispositions: { %while.body: Computable }
78+
; CHECK-NEXT: %conv9 = phi i32 [ -2147483648, %entry ], [ %sext, %while.body ]
79+
; CHECK-NEXT: --> {-2147483648,+,16777216}<nsw><%while.body> U: [0,-16777215) S: [-2147483648,2113929217) Exits: <<Unknown>> LoopDispositions: { %while.body: Computable }
80+
; CHECK-NEXT: %sext = add nsw i32 %conv9, 16777216
81+
; CHECK-NEXT: --> {-2130706432,+,16777216}<nsw><%while.body> U: [0,-16777215) S: [-2130706432,2130706433) Exits: <<Unknown>> LoopDispositions: { %while.body: Computable }
82+
; CHECK-NEXT: %sext8 = add i32 %conv110, -1090519040
83+
; CHECK-NEXT: --> {-1090519040,+,-1090519040}<%while.body> U: [0,-16777215) S: [-2147483648,2130706433) Exits: <<Unknown>> LoopDispositions: { %while.body: Computable }
84+
; CHECK-NEXT: Determining loop execution counts for: @rhs_wrapping
85+
; CHECK-NEXT: Loop %while.body: Unpredictable backedge-taken count.
86+
; CHECK-NEXT: Loop %while.body: constant max backedge-taken count is i32 254
87+
; CHECK-NEXT: Loop %while.body: symbolic max backedge-taken count is i32 254
88+
;
89+
entry:
90+
%a = alloca i8, align 1
91+
br label %while.body
92+
93+
while.body:
94+
%conv110 = phi i32 [ 0, %entry ], [ %sext8, %while.body ]
95+
%conv9 = phi i32 [ -2147483648, %entry ], [ %sext, %while.body ]
96+
%sext = add nsw i32 %conv9, 16777216
97+
%sext8 = add i32 %conv110, -1090519040
98+
%cmp = icmp slt i32 %sext, %sext8
99+
br i1 %cmp, label %while.body, label %while.end
100+
101+
while.end:
102+
ret void
103+
}
104+
69105

0 commit comments

Comments
 (0)