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)'
6 define void @min.signed.1(i32* %a, i32 %a_len, i32 %n) {
7 ; CHECK-LABEL: @min.signed.1
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
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
22 %addr = getelementptr i32, i32* %a, i32 %idx
23 store i32 %idx, i32* %addr
27 %be.cond = icmp slt i32 %idx.inc, %smin
28 br i1 %be.cond, label %loop, label %exit
34 define void @min.signed.2(i32* %a, i32 %a_len, i32 %n) {
35 ; CHECK-LABEL: @min.signed.2
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
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
50 %addr = getelementptr i32, i32* %a, i32 %idx
51 store i32 %idx, i32* %addr
55 %be.cond = icmp slt i32 %idx.inc, %smin
56 br i1 %be.cond, label %loop, label %exit
62 define void @min.signed.3(i32* %a, i32 %n) {
63 ; CHECK-LABEL: @min.signed.3
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
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
78 %addr = getelementptr i32, i32* %a, i32 %idx
79 store i32 %idx, i32* %addr
83 %be.cond = icmp slt i32 %idx.inc, %smin
84 br i1 %be.cond, label %loop, label %exit
90 define void @min.signed.4(i32* %a, i32 %n) {
91 ; CHECK-LABEL: @min.signed.4
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
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
106 %addr = getelementptr i32, i32* %a, i32 %idx
107 store i32 %idx, i32* %addr
111 %be.cond = icmp slt i32 %idx.inc, %smin
112 br i1 %be.cond, label %loop, label %exit
118 define void @max.signed.1(i32* %a, i32 %a_len, i32 %n) {
119 ; CHECK-LABEL: @max.signed.1
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
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
134 %addr = getelementptr i32, i32* %a, i32 %idx
135 store i32 %idx, i32* %addr
139 %be.cond = icmp sgt i32 %idx.inc, %smax
140 br i1 %be.cond, label %loop, label %exit
146 define void @max.signed.2(i32* %a, i32 %a_len, i32 %n) {
147 ; CHECK-LABEL: @max.signed.2
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
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
162 %addr = getelementptr i32, i32* %a, i32 %idx
163 store i32 %idx, i32* %addr
167 %be.cond = icmp sgt i32 %idx.inc, %smax
168 br i1 %be.cond, label %loop, label %exit
174 define void @max.signed.3(i32* %a, i32 %n, i32 %init) {
175 ; CHECK-LABEL: @max.signed.3
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
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
190 %addr = getelementptr i32, i32* %a, i32 %idx
191 store i32 %idx, i32* %addr
195 %be.cond = icmp sgt i32 %idx.inc, %smax
196 br i1 %be.cond, label %loop, label %exit
202 define void @max.signed.4(i32* %a, i32 %n, i32 %init) {
203 ; CHECK-LABEL: @max.signed.4
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
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
218 %addr = getelementptr i32, i32* %a, i32 %idx
219 store i32 %idx, i32* %addr
223 %be.cond = icmp sgt i32 %idx.inc, %smax
224 br i1 %be.cond, label %loop, label %exit
232 define void @min.unsigned.1(i32* %a, i32 %a_len, i32 %n) {
233 ; CHECK-LABEL: @min.unsigned.1
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
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
248 %addr = getelementptr i32, i32* %a, i32 %idx
249 store i32 %idx, i32* %addr
253 %be.cond = icmp ult i32 %idx.inc, %umin
254 br i1 %be.cond, label %loop, label %exit
260 define void @min.unsigned.2(i32* %a, i32 %a_len, i32 %n) {
261 ; CHECK-LABEL: @min.unsigned.2
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
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
276 %addr = getelementptr i32, i32* %a, i32 %idx
277 store i32 %idx, i32* %addr
281 %be.cond = icmp ult i32 %idx.inc, %umin
282 br i1 %be.cond, label %loop, label %exit
288 define void @min.unsigned.3(i32* %a, i32 %n) {
289 ; CHECK-LABEL: @min.unsigned.3
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
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
304 %addr = getelementptr i32, i32* %a, i32 %idx
305 store i32 %idx, i32* %addr
309 %be.cond = icmp ult i32 %idx.inc, %umin
310 br i1 %be.cond, label %loop, label %exit
316 define void @min.unsigned.4(i32* %a, i32 %n) {
317 ; CHECK-LABEL: @min.unsigned.4
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
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
332 %addr = getelementptr i32, i32* %a, i32 %idx
333 store i32 %idx, i32* %addr
337 %be.cond = icmp ult i32 %idx.inc, %umin
338 br i1 %be.cond, label %loop, label %exit
344 define void @max.unsigned.1(i32* %a, i32 %a_len, i32 %n) {
345 ; CHECK-LABEL: @max.unsigned.1
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
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
360 %addr = getelementptr i32, i32* %a, i32 %idx
361 store i32 %idx, i32* %addr
365 %be.cond = icmp ugt i32 %idx.inc, %umax
366 br i1 %be.cond, label %loop, label %exit
372 define void @max.unsigned.2(i32* %a, i32 %a_len, i32 %n) {
373 ; CHECK-LABEL: @max.unsigned.2
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
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
388 %addr = getelementptr i32, i32* %a, i32 %idx
389 store i32 %idx, i32* %addr
393 %be.cond = icmp ugt i32 %idx.inc, %umax
394 br i1 %be.cond, label %loop, label %exit
400 define void @max.unsigned.3(i32* %a, i32 %n, i32 %init) {
401 ; CHECK-LABEL: @max.unsigned.3
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
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
416 %addr = getelementptr i32, i32* %a, i32 %idx
417 store i32 %idx, i32* %addr
421 %be.cond = icmp ugt i32 %idx.inc, %umax
422 br i1 %be.cond, label %loop, label %exit
428 define void @max.unsigned.4(i32* %a, i32 %n, i32 %init) {
429 ; CHECK-LABEL: @max.unsigned.4
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
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
444 %addr = getelementptr i32, i32* %a, i32 %idx
445 store i32 %idx, i32* %addr
449 %be.cond = icmp ugt i32 %idx.inc, %umax
450 br i1 %be.cond, label %loop, label %exit