blob: 9a080b34743f9197f5efe0652ecfb4f8e7a2eeee [file] [log] [blame]
Dan Gohman51aaf022010-01-26 04:40:18 +00001; RUN: opt -analyze -scalar-evolution -S < %s | FileCheck %s
2
3; Every combination of
4; - starting at 0, 1, or %x
5; - steping by 1 or 2
6; - stopping at %n or %n*2
7; - using nsw, or not
8
9; Some of these represent missed opportunities.
10
11; CHECK: Determining loop execution counts for: @foo
12; CHECK: Loop %loop: backedge-taken count is (-1 + %n)
13; CHECK: Loop %loop: max backedge-taken count is 6
14define void @foo(i4 %n) {
15entry:
16 %s = icmp sgt i4 %n, 0
17 br i1 %s, label %loop, label %exit
18loop:
19 %i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
20 %i.next = add i4 %i, 1
21 %t = icmp slt i4 %i.next, %n
22 br i1 %t, label %loop, label %exit
23exit:
24 ret void
25}
26
27; CHECK: Determining loop execution counts for: @step2
Andrew Trick768b9172013-10-18 23:43:53 +000028; CHECK: Loop %loop: Unpredictable backedge-taken count.
29; CHECK: Loop %loop: Unpredictable max backedge-taken count.
Dan Gohman51aaf022010-01-26 04:40:18 +000030define void @step2(i4 %n) {
31entry:
32 %s = icmp sgt i4 %n, 0
33 br i1 %s, label %loop, label %exit
34loop:
35 %i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
36 %i.next = add i4 %i, 2
37 %t = icmp slt i4 %i.next, %n
38 br i1 %t, label %loop, label %exit
39exit:
40 ret void
41}
42
43; CHECK: Determining loop execution counts for: @start1
44; CHECK: Loop %loop: backedge-taken count is (-2 + (2 smax %n))
45; CHECK: Loop %loop: max backedge-taken count is 5
46define void @start1(i4 %n) {
47entry:
48 %s = icmp sgt i4 %n, 0
49 br i1 %s, label %loop, label %exit
50loop:
51 %i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
52 %i.next = add i4 %i, 1
53 %t = icmp slt i4 %i.next, %n
54 br i1 %t, label %loop, label %exit
55exit:
56 ret void
57}
58
59; CHECK: Determining loop execution counts for: @start1_step2
Andrew Trick768b9172013-10-18 23:43:53 +000060; CHECK: Loop %loop: Unpredictable backedge-taken count.
61; CHECK: Loop %loop: Unpredictable max backedge-taken count.
Dan Gohman51aaf022010-01-26 04:40:18 +000062define void @start1_step2(i4 %n) {
63entry:
64 %s = icmp sgt i4 %n, 0
65 br i1 %s, label %loop, label %exit
66loop:
67 %i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
68 %i.next = add i4 %i, 2
69 %t = icmp slt i4 %i.next, %n
70 br i1 %t, label %loop, label %exit
71exit:
72 ret void
73}
74
75; CHECK: Determining loop execution counts for: @startx
76; CHECK: Loop %loop: backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax %n))
77; CHECK: Loop %loop: max backedge-taken count is -1
78define void @startx(i4 %n, i4 %x) {
79entry:
80 %s = icmp sgt i4 %n, 0
81 br i1 %s, label %loop, label %exit
82loop:
83 %i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
84 %i.next = add i4 %i, 1
85 %t = icmp slt i4 %i.next, %n
86 br i1 %t, label %loop, label %exit
87exit:
88 ret void
89}
90
91; CHECK: Determining loop execution counts for: @startx_step2
Andrew Trick768b9172013-10-18 23:43:53 +000092; CHECK: Loop %loop: Unpredictable backedge-taken count.
93; CHECK: Loop %loop: Unpredictable max backedge-taken count.
Dan Gohman51aaf022010-01-26 04:40:18 +000094define void @startx_step2(i4 %n, i4 %x) {
95entry:
96 %s = icmp sgt i4 %n, 0
97 br i1 %s, label %loop, label %exit
98loop:
99 %i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
100 %i.next = add i4 %i, 2
101 %t = icmp slt i4 %i.next, %n
102 br i1 %t, label %loop, label %exit
103exit:
104 ret void
105}
106
107; CHECK: Determining loop execution counts for: @nsw
108; CHECK: Loop %loop: backedge-taken count is (-1 + %n)
109; CHECK: Loop %loop: max backedge-taken count is 6
110define void @nsw(i4 %n) {
111entry:
112 %s = icmp sgt i4 %n, 0
113 br i1 %s, label %loop, label %exit
114loop:
115 %i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
116 %i.next = add nsw i4 %i, 1
117 %t = icmp slt i4 %i.next, %n
118 br i1 %t, label %loop, label %exit
119exit:
120 ret void
121}
122
Andrew Trick768b9172013-10-18 23:43:53 +0000123; If %n is INT4_MAX, %i.next will wrap. The nsw bit says that the
124; result is undefined. Therefore, after the loop's second iteration,
125; we are free to assume that the loop exits. This is valid because:
126; (a) %i.next is a poison value after the second iteration, which can
127; also be considered an undef value.
128; (b) the return instruction enacts a side effect that is control
129; dependent on the poison value.
130;
131; CHECK-LABEL: nsw_step2
Dan Gohman51aaf022010-01-26 04:40:18 +0000132; CHECK: Determining loop execution counts for: @nsw_step2
Andrew Trick768b9172013-10-18 23:43:53 +0000133; CHECK: Loop %loop: backedge-taken count is ((-1 + %n) /u 2)
134; CHECK: Loop %loop: max backedge-taken count is 2
Dan Gohman51aaf022010-01-26 04:40:18 +0000135define void @nsw_step2(i4 %n) {
136entry:
137 %s = icmp sgt i4 %n, 0
138 br i1 %s, label %loop, label %exit
139loop:
140 %i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
141 %i.next = add nsw i4 %i, 2
142 %t = icmp slt i4 %i.next, %n
143 br i1 %t, label %loop, label %exit
144exit:
145 ret void
146}
147
Andrew Trick768b9172013-10-18 23:43:53 +0000148; CHECK-LABEL: nsw_start1
Dan Gohman51aaf022010-01-26 04:40:18 +0000149; CHECK: Determining loop execution counts for: @nsw_start1
150; CHECK: Loop %loop: backedge-taken count is (-2 + (2 smax %n))
151; CHECK: Loop %loop: max backedge-taken count is 5
152define void @nsw_start1(i4 %n) {
153entry:
154 %s = icmp sgt i4 %n, 0
155 br i1 %s, label %loop, label %exit
156loop:
157 %i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
158 %i.next = add nsw i4 %i, 1
159 %t = icmp slt i4 %i.next, %n
160 br i1 %t, label %loop, label %exit
161exit:
162 ret void
163}
164
165; CHECK: Determining loop execution counts for: @nsw_start1_step2
Andrew Trick768b9172013-10-18 23:43:53 +0000166; CHECK: Loop %loop: backedge-taken count is ((-2 + (3 smax %n)) /u 2)
167; CHECK: Loop %loop: max backedge-taken count is 2
Dan Gohman51aaf022010-01-26 04:40:18 +0000168define void @nsw_start1_step2(i4 %n) {
169entry:
170 %s = icmp sgt i4 %n, 0
171 br i1 %s, label %loop, label %exit
172loop:
173 %i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
174 %i.next = add nsw i4 %i, 2
175 %t = icmp slt i4 %i.next, %n
176 br i1 %t, label %loop, label %exit
177exit:
178 ret void
179}
180
181; CHECK: Determining loop execution counts for: @nsw_startx
182; CHECK: Loop %loop: backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax %n))
183; CHECK: Loop %loop: max backedge-taken count is -1
184define void @nsw_startx(i4 %n, i4 %x) {
185entry:
186 %s = icmp sgt i4 %n, 0
187 br i1 %s, label %loop, label %exit
188loop:
189 %i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
190 %i.next = add nsw i4 %i, 1
191 %t = icmp slt i4 %i.next, %n
192 br i1 %t, label %loop, label %exit
193exit:
194 ret void
195}
196
197; CHECK: Determining loop execution counts for: @nsw_startx_step2
Andrew Trick768b9172013-10-18 23:43:53 +0000198; CHECK: Loop %loop: backedge-taken count is ((-1 + (-1 * %x) + ((2 + %x) smax %n)) /u 2)
199; CHECK: Loop %loop: max backedge-taken count is 7
Dan Gohman51aaf022010-01-26 04:40:18 +0000200define void @nsw_startx_step2(i4 %n, i4 %x) {
201entry:
202 %s = icmp sgt i4 %n, 0
203 br i1 %s, label %loop, label %exit
204loop:
205 %i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
206 %i.next = add nsw i4 %i, 2
207 %t = icmp slt i4 %i.next, %n
208 br i1 %t, label %loop, label %exit
209exit:
210 ret void
211}
212
213; CHECK: Determining loop execution counts for: @even
214; CHECK: Loop %loop: backedge-taken count is (-1 + (2 * %n))
215; CHECK: Loop %loop: max backedge-taken count is 5
216define void @even(i4 %n) {
217entry:
218 %m = shl i4 %n, 1
219 %s = icmp sgt i4 %m, 0
220 br i1 %s, label %loop, label %exit
221loop:
222 %i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
223 %i.next = add i4 %i, 1
224 %t = icmp slt i4 %i.next, %m
225 br i1 %t, label %loop, label %exit
226exit:
227 ret void
228}
229
230; CHECK: Determining loop execution counts for: @even_step2
Andrew Trick34e2f0c2013-11-06 02:08:26 +0000231; CHECK: Loop %loop: backedge-taken count is ((-1 + (2 * %n)) /u 2)
Dan Gohman51aaf022010-01-26 04:40:18 +0000232; CHECK: Loop %loop: max backedge-taken count is 2
233define void @even_step2(i4 %n) {
234entry:
235 %m = shl i4 %n, 1
236 %s = icmp sgt i4 %m, 0
237 br i1 %s, label %loop, label %exit
238loop:
239 %i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
240 %i.next = add i4 %i, 2
241 %t = icmp slt i4 %i.next, %m
242 br i1 %t, label %loop, label %exit
243exit:
244 ret void
245}
246
247; CHECK: Determining loop execution counts for: @even_start1
248; CHECK: Loop %loop: backedge-taken count is (-2 + (2 smax (2 * %n)))
249; CHECK: Loop %loop: max backedge-taken count is 4
250define void @even_start1(i4 %n) {
251entry:
252 %m = shl i4 %n, 1
253 %s = icmp sgt i4 %m, 0
254 br i1 %s, label %loop, label %exit
255loop:
256 %i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
257 %i.next = add i4 %i, 1
258 %t = icmp slt i4 %i.next, %m
259 br i1 %t, label %loop, label %exit
260exit:
261 ret void
262}
263
264; CHECK: Determining loop execution counts for: @even_start1_step2
Andrew Trick34e2f0c2013-11-06 02:08:26 +0000265; CHECK: Loop %loop: backedge-taken count is ((-2 + (3 smax (2 * %n))) /u 2)
Dan Gohman51aaf022010-01-26 04:40:18 +0000266; CHECK: Loop %loop: max backedge-taken count is 2
267define void @even_start1_step2(i4 %n) {
268entry:
269 %m = shl i4 %n, 1
270 %s = icmp sgt i4 %m, 0
271 br i1 %s, label %loop, label %exit
272loop:
273 %i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
274 %i.next = add i4 %i, 2
275 %t = icmp slt i4 %i.next, %m
276 br i1 %t, label %loop, label %exit
277exit:
278 ret void
279}
280
281; CHECK: Determining loop execution counts for: @even_startx
282; CHECK: Loop %loop: backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax (2 * %n)))
Andrew Trick34e2f0c2013-11-06 02:08:26 +0000283; CHECK: Loop %loop: max backedge-taken count is -2
Dan Gohman51aaf022010-01-26 04:40:18 +0000284define void @even_startx(i4 %n, i4 %x) {
285entry:
286 %m = shl i4 %n, 1
287 %s = icmp sgt i4 %m, 0
288 br i1 %s, label %loop, label %exit
289loop:
290 %i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
291 %i.next = add i4 %i, 1
292 %t = icmp slt i4 %i.next, %m
293 br i1 %t, label %loop, label %exit
294exit:
295 ret void
296}
297
298; CHECK: Determining loop execution counts for: @even_startx_step2
Andrew Trick34e2f0c2013-11-06 02:08:26 +0000299; CHECK: Loop %loop: backedge-taken count is ((-1 + (-1 * %x) + ((2 + %x) smax (2 * %n))) /u 2)
Dan Gohman51aaf022010-01-26 04:40:18 +0000300; CHECK: Loop %loop: max backedge-taken count is 7
301define void @even_startx_step2(i4 %n, i4 %x) {
302entry:
303 %m = shl i4 %n, 1
304 %s = icmp sgt i4 %m, 0
305 br i1 %s, label %loop, label %exit
306loop:
307 %i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
308 %i.next = add i4 %i, 2
309 %t = icmp slt i4 %i.next, %m
310 br i1 %t, label %loop, label %exit
311exit:
312 ret void
313}
314
315; CHECK: Determining loop execution counts for: @even_nsw
316; CHECK: Loop %loop: backedge-taken count is (-1 + (2 * %n))
317; CHECK: Loop %loop: max backedge-taken count is 5
318define void @even_nsw(i4 %n) {
319entry:
320 %m = shl i4 %n, 1
321 %s = icmp sgt i4 %m, 0
322 br i1 %s, label %loop, label %exit
323loop:
324 %i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
325 %i.next = add nsw i4 %i, 1
326 %t = icmp slt i4 %i.next, %m
327 br i1 %t, label %loop, label %exit
328exit:
329 ret void
330}
331
332; CHECK: Determining loop execution counts for: @even_nsw_step2
333; CHECK: Loop %loop: backedge-taken count is ((-1 + (2 * %n)) /u 2)
334; CHECK: Loop %loop: max backedge-taken count is 2
335define void @even_nsw_step2(i4 %n) {
336entry:
337 %m = shl i4 %n, 1
338 %s = icmp sgt i4 %m, 0
339 br i1 %s, label %loop, label %exit
340loop:
341 %i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
342 %i.next = add nsw i4 %i, 2
343 %t = icmp slt i4 %i.next, %m
344 br i1 %t, label %loop, label %exit
345exit:
346 ret void
347}
348
349; CHECK: Determining loop execution counts for: @even_nsw_start1
350; CHECK: Loop %loop: backedge-taken count is (-2 + (2 smax (2 * %n)))
351; CHECK: Loop %loop: max backedge-taken count is 4
352define void @even_nsw_start1(i4 %n) {
353entry:
354 %m = shl i4 %n, 1
355 %s = icmp sgt i4 %m, 0
356 br i1 %s, label %loop, label %exit
357loop:
358 %i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
359 %i.next = add nsw i4 %i, 1
360 %t = icmp slt i4 %i.next, %m
361 br i1 %t, label %loop, label %exit
362exit:
363 ret void
364}
365
366; CHECK: Determining loop execution counts for: @even_nsw_start1_step2
367; CHECK: Loop %loop: backedge-taken count is ((-2 + (3 smax (2 * %n))) /u 2)
368; CHECK: Loop %loop: max backedge-taken count is 2
369define void @even_nsw_start1_step2(i4 %n) {
370entry:
371 %m = shl i4 %n, 1
372 %s = icmp sgt i4 %m, 0
373 br i1 %s, label %loop, label %exit
374loop:
375 %i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
376 %i.next = add nsw i4 %i, 2
377 %t = icmp slt i4 %i.next, %m
378 br i1 %t, label %loop, label %exit
379exit:
380 ret void
381}
382
383; CHECK: Determining loop execution counts for: @even_nsw_startx
384; CHECK: Loop %loop: backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax (2 * %n)))
Andrew Trick34e2f0c2013-11-06 02:08:26 +0000385; CHECK: Loop %loop: max backedge-taken count is -2
Dan Gohman51aaf022010-01-26 04:40:18 +0000386define void @even_nsw_startx(i4 %n, i4 %x) {
387entry:
388 %m = shl i4 %n, 1
389 %s = icmp sgt i4 %m, 0
390 br i1 %s, label %loop, label %exit
391loop:
392 %i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
393 %i.next = add nsw i4 %i, 1
394 %t = icmp slt i4 %i.next, %m
395 br i1 %t, label %loop, label %exit
396exit:
397 ret void
398}
399
400; CHECK: Determining loop execution counts for: @even_nsw_startx_step2
401; CHECK: Loop %loop: backedge-taken count is ((-1 + (-1 * %x) + ((2 + %x) smax (2 * %n))) /u 2)
402; CHECK: Loop %loop: max backedge-taken count is 7
403define void @even_nsw_startx_step2(i4 %n, i4 %x) {
404entry:
405 %m = shl i4 %n, 1
406 %s = icmp sgt i4 %m, 0
407 br i1 %s, label %loop, label %exit
408loop:
409 %i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
410 %i.next = add nsw i4 %i, 2
411 %t = icmp slt i4 %i.next, %m
412 br i1 %t, label %loop, label %exit
413exit:
414 ret void
415}