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