• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt < %s -indvars -S | FileCheck %s
2; RUN: opt -lcssa -loop-simplify -S < %s | opt -S -passes='require<targetir>,require<scalar-evolution>,require<domtree>,loop(indvars)'
3
4;; --- signed ---
5
6define void @min.signed.1(i32* %a, i32 %a_len, i32 %n) {
7; CHECK-LABEL: @min.signed.1
8 entry:
9  %smin.cmp = icmp slt i32 %a_len, %n
10  %smin = select i1 %smin.cmp, i32 %a_len, i32 %n
11  %entry.cond = icmp slt i32 0, %smin
12  br i1 %entry.cond, label %loop, label %exit
13
14 loop:
15  %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
16  %idx.inc = add i32 %idx, 1
17  %in.bounds = icmp slt i32 %idx, %a_len
18  br i1 %in.bounds, label %ok, label %latch
19; CHECK: br i1 true, label %ok, label %latch
20
21 ok:
22  %addr = getelementptr i32, i32* %a, i32 %idx
23  store i32 %idx, i32* %addr
24  br label %latch
25
26 latch:
27  %be.cond = icmp slt i32 %idx.inc, %smin
28  br i1 %be.cond, label %loop, label %exit
29
30 exit:
31  ret void
32}
33
34define void @min.signed.2(i32* %a, i32 %a_len, i32 %n) {
35; CHECK-LABEL: @min.signed.2
36 entry:
37  %smin.cmp = icmp slt i32 %a_len, %n
38  %smin = select i1 %smin.cmp, i32 %a_len, i32 %n
39  %entry.cond = icmp slt i32 0, %smin
40  br i1 %entry.cond, label %loop, label %exit
41
42 loop:
43  %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
44  %idx.inc = add i32 %idx, 1
45  %in.bounds = icmp sgt i32 %a_len, %idx
46  br i1 %in.bounds, label %ok, label %latch
47; CHECK: br i1 true, label %ok, label %latch
48
49 ok:
50  %addr = getelementptr i32, i32* %a, i32 %idx
51  store i32 %idx, i32* %addr
52  br label %latch
53
54 latch:
55  %be.cond = icmp slt i32 %idx.inc, %smin
56  br i1 %be.cond, label %loop, label %exit
57
58 exit:
59  ret void
60}
61
62define void @min.signed.3(i32* %a, i32 %n) {
63; CHECK-LABEL: @min.signed.3
64 entry:
65  %smin.cmp = icmp slt i32 42, %n
66  %smin = select i1 %smin.cmp, i32 42, i32 %n
67  %entry.cond = icmp slt i32 0, %smin
68  br i1 %entry.cond, label %loop, label %exit
69
70 loop:
71  %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
72  %idx.inc = add i32 %idx, 1
73  %in.bounds = icmp slt i32 %idx, 42
74  br i1 %in.bounds, label %ok, label %latch
75; CHECK: br i1 true, label %ok, label %latch
76
77 ok:
78  %addr = getelementptr i32, i32* %a, i32 %idx
79  store i32 %idx, i32* %addr
80  br label %latch
81
82 latch:
83  %be.cond = icmp slt i32 %idx.inc, %smin
84  br i1 %be.cond, label %loop, label %exit
85
86 exit:
87  ret void
88}
89
90define void @min.signed.4(i32* %a, i32 %n) {
91; CHECK-LABEL: @min.signed.4
92 entry:
93  %smin.cmp = icmp slt i32 42, %n
94  %smin = select i1 %smin.cmp, i32 42, i32 %n
95  %entry.cond = icmp slt i32 0, %smin
96  br i1 %entry.cond, label %loop, label %exit
97
98 loop:
99  %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
100  %idx.inc = add i32 %idx, 1
101  %in.bounds = icmp sgt i32 42, %idx
102  br i1 %in.bounds, label %ok, label %latch
103; CHECK: br i1 true, label %ok, label %latch
104
105 ok:
106  %addr = getelementptr i32, i32* %a, i32 %idx
107  store i32 %idx, i32* %addr
108  br label %latch
109
110 latch:
111  %be.cond = icmp slt i32 %idx.inc, %smin
112  br i1 %be.cond, label %loop, label %exit
113
114 exit:
115  ret void
116}
117
118define void @max.signed.1(i32* %a, i32 %a_len, i32 %n) {
119; CHECK-LABEL: @max.signed.1
120 entry:
121  %smax.cmp = icmp sgt i32 %a_len, %n
122  %smax = select i1 %smax.cmp, i32 %a_len, i32 %n
123  %entry.cond = icmp sgt i32 0, %smax
124  br i1 %entry.cond, label %loop, label %exit
125
126 loop:
127  %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
128  %idx.inc = add i32 %idx, 1
129  %in.bounds = icmp sgt i32 %idx, %a_len
130  br i1 %in.bounds, label %ok, label %latch
131; CHECK: br i1 true, label %ok, label %latch
132
133 ok:
134  %addr = getelementptr i32, i32* %a, i32 %idx
135  store i32 %idx, i32* %addr
136  br label %latch
137
138 latch:
139  %be.cond = icmp sgt i32 %idx.inc, %smax
140  br i1 %be.cond, label %loop, label %exit
141
142 exit:
143  ret void
144}
145
146define void @max.signed.2(i32* %a, i32 %a_len, i32 %n) {
147; CHECK-LABEL: @max.signed.2
148 entry:
149  %smax.cmp = icmp sgt i32 %a_len, %n
150  %smax = select i1 %smax.cmp, i32 %a_len, i32 %n
151  %entry.cond = icmp sgt i32 0, %smax
152  br i1 %entry.cond, label %loop, label %exit
153
154 loop:
155  %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
156  %idx.inc = add i32 %idx, 1
157  %in.bounds = icmp slt i32 %a_len, %idx
158  br i1 %in.bounds, label %ok, label %latch
159; CHECK: br i1 true, label %ok, label %latch
160
161 ok:
162  %addr = getelementptr i32, i32* %a, i32 %idx
163  store i32 %idx, i32* %addr
164  br label %latch
165
166 latch:
167  %be.cond = icmp sgt i32 %idx.inc, %smax
168  br i1 %be.cond, label %loop, label %exit
169
170 exit:
171  ret void
172}
173
174define void @max.signed.3(i32* %a, i32 %n, i32 %init) {
175; CHECK-LABEL: @max.signed.3
176 entry:
177  %smax.cmp = icmp sgt i32 42, %n
178  %smax = select i1 %smax.cmp, i32 42, i32 %n
179  %entry.cond = icmp sgt i32 %init, %smax
180  br i1 %entry.cond, label %loop, label %exit
181
182 loop:
183  %idx = phi i32 [ %init, %entry ], [ %idx.inc, %latch ]
184  %idx.inc = add i32 %idx, 1
185  %in.bounds = icmp sgt i32 %idx, 42
186  br i1 %in.bounds, label %ok, label %latch
187; CHECK: br i1 true, label %ok, label %latch
188
189 ok:
190  %addr = getelementptr i32, i32* %a, i32 %idx
191  store i32 %idx, i32* %addr
192  br label %latch
193
194 latch:
195  %be.cond = icmp sgt i32 %idx.inc, %smax
196  br i1 %be.cond, label %loop, label %exit
197
198 exit:
199  ret void
200}
201
202define void @max.signed.4(i32* %a, i32 %n, i32 %init) {
203; CHECK-LABEL: @max.signed.4
204 entry:
205  %smax.cmp = icmp sgt i32 42, %n
206  %smax = select i1 %smax.cmp, i32 42, i32 %n
207  %entry.cond = icmp sgt i32 %init, %smax
208  br i1 %entry.cond, label %loop, label %exit
209
210 loop:
211  %idx = phi i32 [ %init, %entry ], [ %idx.inc, %latch ]
212  %idx.inc = add i32 %idx, 1
213  %in.bounds = icmp slt i32 42, %idx
214  br i1 %in.bounds, label %ok, label %latch
215; CHECK: br i1 true, label %ok, label %latch
216
217 ok:
218  %addr = getelementptr i32, i32* %a, i32 %idx
219  store i32 %idx, i32* %addr
220  br label %latch
221
222 latch:
223  %be.cond = icmp sgt i32 %idx.inc, %smax
224  br i1 %be.cond, label %loop, label %exit
225
226 exit:
227  ret void
228}
229
230;; --- unsigned ---
231
232define void @min.unsigned.1(i32* %a, i32 %a_len, i32 %n) {
233; CHECK-LABEL: @min.unsigned.1
234 entry:
235  %umin.cmp = icmp ult i32 %a_len, %n
236  %umin = select i1 %umin.cmp, i32 %a_len, i32 %n
237  %entry.cond = icmp ult i32 5, %umin
238  br i1 %entry.cond, label %loop, label %exit
239
240 loop:
241  %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
242  %idx.inc = add i32 %idx, 1
243  %in.bounds = icmp ult i32 %idx, %a_len
244  br i1 %in.bounds, label %ok, label %latch
245; CHECK: br i1 true, label %ok, label %latch
246
247 ok:
248  %addr = getelementptr i32, i32* %a, i32 %idx
249  store i32 %idx, i32* %addr
250  br label %latch
251
252 latch:
253  %be.cond = icmp ult i32 %idx.inc, %umin
254  br i1 %be.cond, label %loop, label %exit
255
256 exit:
257  ret void
258}
259
260define void @min.unsigned.2(i32* %a, i32 %a_len, i32 %n) {
261; CHECK-LABEL: @min.unsigned.2
262 entry:
263  %umin.cmp = icmp ult i32 %a_len, %n
264  %umin = select i1 %umin.cmp, i32 %a_len, i32 %n
265  %entry.cond = icmp ult i32 5, %umin
266  br i1 %entry.cond, label %loop, label %exit
267
268 loop:
269  %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
270  %idx.inc = add i32 %idx, 1
271  %in.bounds = icmp ugt i32 %a_len, %idx
272  br i1 %in.bounds, label %ok, label %latch
273; CHECK: br i1 true, label %ok, label %latch
274
275 ok:
276  %addr = getelementptr i32, i32* %a, i32 %idx
277  store i32 %idx, i32* %addr
278  br label %latch
279
280 latch:
281  %be.cond = icmp ult i32 %idx.inc, %umin
282  br i1 %be.cond, label %loop, label %exit
283
284 exit:
285  ret void
286}
287
288define void @min.unsigned.3(i32* %a, i32 %n) {
289; CHECK-LABEL: @min.unsigned.3
290 entry:
291  %umin.cmp = icmp ult i32 42, %n
292  %umin = select i1 %umin.cmp, i32 42, i32 %n
293  %entry.cond = icmp ult i32 5, %umin
294  br i1 %entry.cond, label %loop, label %exit
295
296 loop:
297  %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
298  %idx.inc = add i32 %idx, 1
299  %in.bounds = icmp ult i32 %idx, 42
300  br i1 %in.bounds, label %ok, label %latch
301; CHECK: br i1 true, label %ok, label %latch
302
303 ok:
304  %addr = getelementptr i32, i32* %a, i32 %idx
305  store i32 %idx, i32* %addr
306  br label %latch
307
308 latch:
309  %be.cond = icmp ult i32 %idx.inc, %umin
310  br i1 %be.cond, label %loop, label %exit
311
312 exit:
313  ret void
314}
315
316define void @min.unsigned.4(i32* %a, i32 %n) {
317; CHECK-LABEL: @min.unsigned.4
318 entry:
319  %umin.cmp = icmp ult i32 42, %n
320  %umin = select i1 %umin.cmp, i32 42, i32 %n
321  %entry.cond = icmp ult i32 5, %umin
322  br i1 %entry.cond, label %loop, label %exit
323
324 loop:
325  %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
326  %idx.inc = add i32 %idx, 1
327  %in.bounds = icmp ugt i32 42, %idx
328  br i1 %in.bounds, label %ok, label %latch
329; CHECK: br i1 true, label %ok, label %latch
330
331 ok:
332  %addr = getelementptr i32, i32* %a, i32 %idx
333  store i32 %idx, i32* %addr
334  br label %latch
335
336 latch:
337  %be.cond = icmp ult i32 %idx.inc, %umin
338  br i1 %be.cond, label %loop, label %exit
339
340 exit:
341  ret void
342}
343
344define void @max.unsigned.1(i32* %a, i32 %a_len, i32 %n) {
345; CHECK-LABEL: @max.unsigned.1
346 entry:
347  %umax.cmp = icmp ugt i32 %a_len, %n
348  %umax = select i1 %umax.cmp, i32 %a_len, i32 %n
349  %entry.cond = icmp ugt i32 5, %umax
350  br i1 %entry.cond, label %loop, label %exit
351
352 loop:
353  %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
354  %idx.inc = add i32 %idx, 1
355  %in.bounds = icmp ugt i32 %idx, %a_len
356  br i1 %in.bounds, label %ok, label %latch
357; CHECK: br i1 true, label %ok, label %latch
358
359 ok:
360  %addr = getelementptr i32, i32* %a, i32 %idx
361  store i32 %idx, i32* %addr
362  br label %latch
363
364 latch:
365  %be.cond = icmp ugt i32 %idx.inc, %umax
366  br i1 %be.cond, label %loop, label %exit
367
368 exit:
369  ret void
370}
371
372define void @max.unsigned.2(i32* %a, i32 %a_len, i32 %n) {
373; CHECK-LABEL: @max.unsigned.2
374 entry:
375  %umax.cmp = icmp ugt i32 %a_len, %n
376  %umax = select i1 %umax.cmp, i32 %a_len, i32 %n
377  %entry.cond = icmp ugt i32 5, %umax
378  br i1 %entry.cond, label %loop, label %exit
379
380 loop:
381  %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
382  %idx.inc = add i32 %idx, 1
383  %in.bounds = icmp ult i32 %a_len, %idx
384  br i1 %in.bounds, label %ok, label %latch
385; CHECK: br i1 true, label %ok, label %latch
386
387 ok:
388  %addr = getelementptr i32, i32* %a, i32 %idx
389  store i32 %idx, i32* %addr
390  br label %latch
391
392 latch:
393  %be.cond = icmp ugt i32 %idx.inc, %umax
394  br i1 %be.cond, label %loop, label %exit
395
396 exit:
397  ret void
398}
399
400define void @max.unsigned.3(i32* %a, i32 %n, i32 %init) {
401; CHECK-LABEL: @max.unsigned.3
402 entry:
403  %umax.cmp = icmp ugt i32 42, %n
404  %umax = select i1 %umax.cmp, i32 42, i32 %n
405  %entry.cond = icmp ugt i32 %init, %umax
406  br i1 %entry.cond, label %loop, label %exit
407
408 loop:
409  %idx = phi i32 [ %init, %entry ], [ %idx.inc, %latch ]
410  %idx.inc = add i32 %idx, 1
411  %in.bounds = icmp ugt i32 %idx, 42
412  br i1 %in.bounds, label %ok, label %latch
413; CHECK: br i1 true, label %ok, label %latch
414
415 ok:
416  %addr = getelementptr i32, i32* %a, i32 %idx
417  store i32 %idx, i32* %addr
418  br label %latch
419
420 latch:
421  %be.cond = icmp ugt i32 %idx.inc, %umax
422  br i1 %be.cond, label %loop, label %exit
423
424 exit:
425  ret void
426}
427
428define void @max.unsigned.4(i32* %a, i32 %n, i32 %init) {
429; CHECK-LABEL: @max.unsigned.4
430 entry:
431  %umax.cmp = icmp ugt i32 42, %n
432  %umax = select i1 %umax.cmp, i32 42, i32 %n
433  %entry.cond = icmp ugt i32 %init, %umax
434  br i1 %entry.cond, label %loop, label %exit
435
436 loop:
437  %idx = phi i32 [ %init, %entry ], [ %idx.inc, %latch ]
438  %idx.inc = add i32 %idx, 1
439  %in.bounds = icmp ult i32 42, %idx
440  br i1 %in.bounds, label %ok, label %latch
441; CHECK: br i1 true, label %ok, label %latch
442
443 ok:
444  %addr = getelementptr i32, i32* %a, i32 %idx
445  store i32 %idx, i32* %addr
446  br label %latch
447
448 latch:
449  %be.cond = icmp ugt i32 %idx.inc, %umax
450  br i1 %be.cond, label %loop, label %exit
451
452 exit:
453  ret void
454}
455