1- ; RUN: opt -disable-output "-passes=print<scalar-evolution>" < %s 2>&1 | FileCheck %s
1+ ; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
2+ ; RUN: opt -disable-output -passes='print<scalar-evolution>' %s 2>&1 | FileCheck %s
3+
4+ ; Check that assumes/guards guarding the backedge are taken into account
5+ ; when inferring no-wrap flags.
26
37declare void @llvm.experimental.guard (i1 , ...)
48declare void @llvm.assume (i1 )
59
610define void @s_0 (i32 %n , ptr %cond ) {
7- ; CHECK-LABEL: Classifying expressions for: @s_0
11+ ; CHECK-LABEL: 's_0'
12+ ; CHECK-NEXT: Classifying expressions for: @s_0
13+ ; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
14+ ; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
15+ ; CHECK-NEXT: %iv.inc = add i32 %iv, 1
16+ ; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
17+ ; CHECK-NEXT: %iv.sext = sext i32 %iv to i64
18+ ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,-9223372036854775808) S: [0,-9223372036854775808) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
19+ ; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 1
20+ ; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
21+ ; CHECK-NEXT: Determining loop execution counts for: @s_0
22+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
23+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
24+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
25+ ;
826entry:
927 br label %loop
1028
1129loop:
1230 %iv = phi i32 [ 0 , %entry ], [ %iv.inc , %loop ]
1331 %iv.inc = add i32 %iv , 1
1432 %iv.sext = sext i32 %iv to i64
15- ; CHECK: %iv.sext = sext i32 %iv to i64
16- ; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop>
1733 %cmp = icmp slt i32 %iv , %n
1834 call void (i1 , ...) @llvm.experimental.guard (i1 %cmp ) [ "deopt" () ]
1935 %c = load volatile i1 , ptr %cond
@@ -24,16 +40,28 @@ leave:
2440}
2541
2642define void @s_1 (ptr %cond ) {
27- ; CHECK-LABEL: Classifying expressions for: @s_1
43+ ; CHECK-LABEL: 's_1'
44+ ; CHECK-NEXT: Classifying expressions for: @s_1
45+ ; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
46+ ; CHECK-NEXT: --> {0,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
47+ ; CHECK-NEXT: %iv.inc = add i32 %iv, 3
48+ ; CHECK-NEXT: --> {3,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
49+ ; CHECK-NEXT: %iv.sext = sext i32 %iv to i64
50+ ; CHECK-NEXT: --> {0,+,3}<nuw><nsw><%loop> U: [0,-9223372036854775808) S: [0,-9223372036854775808) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
51+ ; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 1
52+ ; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
53+ ; CHECK-NEXT: Determining loop execution counts for: @s_1
54+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
55+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
56+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
57+ ;
2858entry:
2959 br label %loop
3060
3161loop:
3262 %iv = phi i32 [ 0 , %entry ], [ %iv.inc , %loop ]
3363 %iv.inc = add i32 %iv , 3
3464 %iv.sext = sext i32 %iv to i64
35- ; CHECK: %iv.sext = sext i32 %iv to i64
36- ; CHECK-NEXT: --> {0,+,3}<nuw><nsw><%loop>
3765 %cmp = icmp slt i32 %iv , 10000
3866 call void (i1 , ...) @llvm.experimental.guard (i1 %cmp ) [ "deopt" () ]
3967 %c = load volatile i1 , ptr %cond
@@ -44,7 +72,21 @@ leave:
4472}
4573
4674define void @s_2 (ptr %cond ) {
47- ; CHECK-LABEL: Classifying expressions for: @s_2
75+ ; CHECK-LABEL: 's_2'
76+ ; CHECK-NEXT: Classifying expressions for: @s_2
77+ ; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
78+ ; CHECK-NEXT: --> {0,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
79+ ; CHECK-NEXT: %iv.inc = add i32 %iv, 3
80+ ; CHECK-NEXT: --> {3,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
81+ ; CHECK-NEXT: %iv.sext = sext i32 %iv to i64
82+ ; CHECK-NEXT: --> {0,+,3}<nuw><nsw><%loop> U: [0,-9223372036854775808) S: [0,-9223372036854775808) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
83+ ; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 1
84+ ; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
85+ ; CHECK-NEXT: Determining loop execution counts for: @s_2
86+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
87+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
88+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
89+ ;
4890entry:
4991 br label %loop
5092
5395 %iv.inc = add i32 %iv , 3
5496 %iv.sext = sext i32 %iv to i64
5597 %cmp = icmp slt i32 %iv , 10000
56- ; CHECK: %iv.sext = sext i32 %iv to i64
57- ; CHECK-NEXT: --> {0,+,3}<nuw><nsw><%loop>
5898 call void @llvm.assume (i1 %cmp )
5999 %c = load volatile i1 , ptr %cond
60100 br i1 %c , label %loop , label %leave
@@ -64,7 +104,25 @@ leave:
64104}
65105
66106define void @s_3 (i32 %start , ptr %cond ) {
67- ; CHECK-LABEL: Classifying expressions for: @s_3
107+ ; CHECK-LABEL: 's_3'
108+ ; CHECK-NEXT: Classifying expressions for: @s_3
109+ ; CHECK-NEXT: %iv = phi i32 [ %start, %entry ], [ %iv.inc, %be ]
110+ ; CHECK-NEXT: --> {%start,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
111+ ; CHECK-NEXT: %iv.inc = add i32 %iv, 3
112+ ; CHECK-NEXT: --> {(3 + %start),+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
113+ ; CHECK-NEXT: %iv.inc.sext = sext i32 %iv.inc to i64
114+ ; CHECK-NEXT: --> {(sext i32 (3 + %start) to i64),+,3}<nsw><%loop> U: [-2147483648,4294977296) S: [-2147483648,4294977296) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
115+ ; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 1
116+ ; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
117+ ; CHECK-NEXT: Determining loop execution counts for: @s_3
118+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
119+ ; CHECK-NEXT: exit count for loop: ((((-1 * (1 umin ((-1 * %start) + (10000 smax %start))))<nuw><nsw> + (-1 * %start) + (10000 smax %start)) /u 3) + (1 umin ((-1 * %start) + (10000 smax %start))))
120+ ; CHECK-NEXT: exit count for be: ***COULDNOTCOMPUTE***
121+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 715831216
122+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((((-1 * (1 umin ((-1 * %start) + (10000 smax %start))))<nuw><nsw> + (-1 * %start) + (10000 smax %start)) /u 3) + (1 umin ((-1 * %start) + (10000 smax %start))))
123+ ; CHECK-NEXT: symbolic max exit count for loop: ((((-1 * (1 umin ((-1 * %start) + (10000 smax %start))))<nuw><nsw> + (-1 * %start) + (10000 smax %start)) /u 3) + (1 umin ((-1 * %start) + (10000 smax %start))))
124+ ; CHECK-NEXT: symbolic max exit count for be: ***COULDNOTCOMPUTE***
125+ ;
68126entry:
69127 br label %loop
70128
76134be:
77135 %iv.inc = add i32 %iv , 3
78136 %iv.inc.sext = sext i32 %iv.inc to i64
79- ; CHECK: %iv.inc.sext = sext i32 %iv.inc to i64
80- ; CHECK-NEXT: --> {(sext i32 (3 + %start) to i64),+,3}<nsw><%loop>
81137 %c = load volatile i1 , ptr %cond
82138 br i1 %c , label %loop , label %leave
83139
@@ -86,7 +142,25 @@ leave:
86142}
87143
88144define void @s_4 (i32 %start , ptr %cond ) {
89- ; CHECK-LABEL: Classifying expressions for: @s_4
145+ ; CHECK-LABEL: 's_4'
146+ ; CHECK-NEXT: Classifying expressions for: @s_4
147+ ; CHECK-NEXT: %iv = phi i32 [ %start, %entry ], [ %iv.inc, %be ]
148+ ; CHECK-NEXT: --> {%start,+,-3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
149+ ; CHECK-NEXT: %iv.inc = add i32 %iv, -3
150+ ; CHECK-NEXT: --> {(-3 + %start),+,-3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
151+ ; CHECK-NEXT: %iv.inc.sext = sext i32 %iv.inc to i64
152+ ; CHECK-NEXT: --> {(sext i32 (-3 + %start) to i64),+,-3}<nsw><%loop> U: [-4294968296,2147483648) S: [-4294968296,2147483648) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
153+ ; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 1
154+ ; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
155+ ; CHECK-NEXT: Determining loop execution counts for: @s_4
156+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
157+ ; CHECK-NEXT: exit count for loop: ((2 + (-1 * (-1000 smin %start)) + %start) /u 3)
158+ ; CHECK-NEXT: exit count for be: ***COULDNOTCOMPUTE***
159+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 715828216
160+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((2 + (-1 * (-1000 smin %start)) + %start) /u 3)
161+ ; CHECK-NEXT: symbolic max exit count for loop: ((2 + (-1 * (-1000 smin %start)) + %start) /u 3)
162+ ; CHECK-NEXT: symbolic max exit count for be: ***COULDNOTCOMPUTE***
163+ ;
90164entry:
91165 br label %loop
92166
98172be:
99173 %iv.inc = add i32 %iv , -3
100174 %iv.inc.sext = sext i32 %iv.inc to i64
101- ; CHECK: %iv.inc.sext = sext i32 %iv.inc to i64
102- ; CHECK-NEXT: --> {(sext i32 (-3 + %start) to i64),+,-3}<nsw><%loop>
103175 %c = load volatile i1 , ptr %cond
104176 br i1 %c , label %loop , label %leave
105177
@@ -108,16 +180,28 @@ leave:
108180}
109181
110182define void @u_0 (i32 %n , ptr %cond ) {
111- ; CHECK-LABEL: Classifying expressions for: @u_0
183+ ; CHECK-LABEL: 'u_0'
184+ ; CHECK-NEXT: Classifying expressions for: @u_0
185+ ; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
186+ ; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
187+ ; CHECK-NEXT: %iv.inc = add i32 %iv, 1
188+ ; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
189+ ; CHECK-NEXT: %iv.zext = zext i32 %iv to i64
190+ ; CHECK-NEXT: --> {0,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
191+ ; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 1
192+ ; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
193+ ; CHECK-NEXT: Determining loop execution counts for: @u_0
194+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
195+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
196+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
197+ ;
112198entry:
113199 br label %loop
114200
115201loop:
116202 %iv = phi i32 [ 0 , %entry ], [ %iv.inc , %loop ]
117203 %iv.inc = add i32 %iv , 1
118204 %iv.zext = zext i32 %iv to i64
119- ; CHECK: %iv.zext = zext i32 %iv to i64
120- ; CHECK-NEXT: --> {0,+,1}<nuw><%loop>
121205 %cmp = icmp ult i32 %iv , %n
122206 call void (i1 , ...) @llvm.experimental.guard (i1 %cmp ) [ "deopt" () ]
123207 %c = load volatile i1 , ptr %cond
@@ -128,16 +212,28 @@ leave:
128212}
129213
130214define void @u_1 (ptr %cond ) {
131- ; CHECK-LABEL: Classifying expressions for: @u_1
215+ ; CHECK-LABEL: 'u_1'
216+ ; CHECK-NEXT: Classifying expressions for: @u_1
217+ ; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
218+ ; CHECK-NEXT: --> {0,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
219+ ; CHECK-NEXT: %iv.inc = add i32 %iv, 3
220+ ; CHECK-NEXT: --> {3,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
221+ ; CHECK-NEXT: %iv.zext = zext i32 %iv to i64
222+ ; CHECK-NEXT: --> {0,+,3}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
223+ ; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 1
224+ ; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
225+ ; CHECK-NEXT: Determining loop execution counts for: @u_1
226+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
227+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
228+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
229+ ;
132230entry:
133231 br label %loop
134232
135233loop:
136234 %iv = phi i32 [ 0 , %entry ], [ %iv.inc , %loop ]
137235 %iv.inc = add i32 %iv , 3
138236 %iv.zext = zext i32 %iv to i64
139- ; CHECK: %iv.zext = zext i32 %iv to i64
140- ; CHECK-NEXT: --> {0,+,3}<nuw><%loop>
141237 %cmp = icmp ult i32 %iv , 10000
142238 call void (i1 , ...) @llvm.experimental.guard (i1 %cmp ) [ "deopt" () ]
143239 %c = load volatile i1 , ptr %cond
@@ -148,7 +244,21 @@ leave:
148244}
149245
150246define void @u_2 (ptr %cond ) {
151- ; CHECK-LABEL: Classifying expressions for: @u_2
247+ ; CHECK-LABEL: 'u_2'
248+ ; CHECK-NEXT: Classifying expressions for: @u_2
249+ ; CHECK-NEXT: %iv = phi i32 [ 30000, %entry ], [ %iv.inc, %loop ]
250+ ; CHECK-NEXT: --> {30000,+,-2}<%loop> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
251+ ; CHECK-NEXT: %iv.inc = add i32 %iv, -2
252+ ; CHECK-NEXT: --> {29998,+,-2}<%loop> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
253+ ; CHECK-NEXT: %iv.zext = zext i32 %iv to i64
254+ ; CHECK-NEXT: --> {30000,+,-2}<nw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
255+ ; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 1
256+ ; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
257+ ; CHECK-NEXT: Determining loop execution counts for: @u_2
258+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
259+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
260+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
261+ ;
152262entry:
153263 br label %loop
154264
@@ -157,8 +267,6 @@ loop:
157267 %iv.inc = add i32 %iv , -2
158268 %iv.zext = zext i32 %iv to i64
159269 %cmp = icmp ugt i32 %iv.inc , -10000
160- ; CHECK: %iv.zext = zext i32 %iv to i64
161- ; CHECK-NEXT: --> {30000,+,-2}<nw><%loop>
162270 call void @llvm.assume (i1 %cmp )
163271 %c = load volatile i1 , ptr %cond
164272 br i1 %c , label %loop , label %leave
@@ -168,7 +276,25 @@ leave:
168276}
169277
170278define void @u_3 (i32 %start , ptr %cond ) {
171- ; CHECK-LABEL: Classifying expressions for: @u_3
279+ ; CHECK-LABEL: 'u_3'
280+ ; CHECK-NEXT: Classifying expressions for: @u_3
281+ ; CHECK-NEXT: %iv = phi i32 [ %start, %entry ], [ %iv.inc, %be ]
282+ ; CHECK-NEXT: --> {%start,+,3}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
283+ ; CHECK-NEXT: %iv.inc = add i32 %iv, 3
284+ ; CHECK-NEXT: --> {(3 + %start),+,3}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
285+ ; CHECK-NEXT: %iv.inc.zext = zext i32 %iv.inc to i64
286+ ; CHECK-NEXT: --> {(zext i32 (3 + %start) to i64),+,3}<nuw><%loop> U: [0,4294977298) S: [0,4294977298) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
287+ ; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 1
288+ ; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
289+ ; CHECK-NEXT: Determining loop execution counts for: @u_3
290+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
291+ ; CHECK-NEXT: exit count for loop: ((((-1 * (1 umin ((-1 * %start) + (10000 umax %start))))<nuw><nsw> + (-1 * %start) + (10000 umax %start)) /u 3) + (1 umin ((-1 * %start) + (10000 umax %start))))
292+ ; CHECK-NEXT: exit count for be: ***COULDNOTCOMPUTE***
293+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 3334
294+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((((-1 * (1 umin ((-1 * %start) + (10000 umax %start))))<nuw><nsw> + (-1 * %start) + (10000 umax %start)) /u 3) + (1 umin ((-1 * %start) + (10000 umax %start))))
295+ ; CHECK-NEXT: symbolic max exit count for loop: ((((-1 * (1 umin ((-1 * %start) + (10000 umax %start))))<nuw><nsw> + (-1 * %start) + (10000 umax %start)) /u 3) + (1 umin ((-1 * %start) + (10000 umax %start))))
296+ ; CHECK-NEXT: symbolic max exit count for be: ***COULDNOTCOMPUTE***
297+ ;
172298entry:
173299 br label %loop
174300
@@ -180,8 +306,6 @@ loop:
180306be:
181307 %iv.inc = add i32 %iv , 3
182308 %iv.inc.zext = zext i32 %iv.inc to i64
183- ; CHECK: %iv.inc.zext = zext i32 %iv.inc to i64
184- ; CHECK-NEXT: --> {(zext i32 (3 + %start) to i64),+,3}<nuw><%loop>
185309 %c = load volatile i1 , ptr %cond
186310 br i1 %c , label %loop , label %leave
187311
0 commit comments