1 ; RUN: opt < %s -indvars -S | FileCheck %s
5 define void @min.signed.1(i32* %a, i32 %a_len, i32 %n) {
6 ; CHECK-LABEL: @min.signed.1
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
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
21 %addr = getelementptr i32, i32* %a, i32 %idx
22 store i32 %idx, i32* %addr
26 %be.cond = icmp slt i32 %idx.inc, %smin
27 br i1 %be.cond, label %loop, label %exit
33 define void @min.signed.2(i32* %a, i32 %a_len, i32 %n) {
34 ; CHECK-LABEL: @min.signed.2
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
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
49 %addr = getelementptr i32, i32* %a, i32 %idx
50 store i32 %idx, i32* %addr
54 %be.cond = icmp slt i32 %idx.inc, %smin
55 br i1 %be.cond, label %loop, label %exit
61 define void @min.signed.3(i32* %a, i32 %n) {
62 ; CHECK-LABEL: @min.signed.3
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
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
77 %addr = getelementptr i32, i32* %a, i32 %idx
78 store i32 %idx, i32* %addr
82 %be.cond = icmp slt i32 %idx.inc, %smin
83 br i1 %be.cond, label %loop, label %exit
89 define void @min.signed.4(i32* %a, i32 %n) {
90 ; CHECK-LABEL: @min.signed.4
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
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
105 %addr = getelementptr i32, i32* %a, i32 %idx
106 store i32 %idx, i32* %addr
110 %be.cond = icmp slt i32 %idx.inc, %smin
111 br i1 %be.cond, label %loop, label %exit
117 define void @max.signed.1(i32* %a, i32 %a_len, i32 %n) {
118 ; CHECK-LABEL: @max.signed.1
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
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
133 %addr = getelementptr i32, i32* %a, i32 %idx
134 store i32 %idx, i32* %addr
138 %be.cond = icmp sgt i32 %idx.inc, %smax
139 br i1 %be.cond, label %loop, label %exit
145 define void @max.signed.2(i32* %a, i32 %a_len, i32 %n) {
146 ; CHECK-LABEL: @max.signed.2
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
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
161 %addr = getelementptr i32, i32* %a, i32 %idx
162 store i32 %idx, i32* %addr
166 %be.cond = icmp sgt i32 %idx.inc, %smax
167 br i1 %be.cond, label %loop, label %exit
173 define void @max.signed.3(i32* %a, i32 %n, i32 %init) {
174 ; CHECK-LABEL: @max.signed.3
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
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
189 %addr = getelementptr i32, i32* %a, i32 %idx
190 store i32 %idx, i32* %addr
194 %be.cond = icmp sgt i32 %idx.inc, %smax
195 br i1 %be.cond, label %loop, label %exit
201 define void @max.signed.4(i32* %a, i32 %n, i32 %init) {
202 ; CHECK-LABEL: @max.signed.4
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
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
217 %addr = getelementptr i32, i32* %a, i32 %idx
218 store i32 %idx, i32* %addr
222 %be.cond = icmp sgt i32 %idx.inc, %smax
223 br i1 %be.cond, label %loop, label %exit
231 define void @min.unsigned.1(i32* %a, i32 %a_len, i32 %n) {
232 ; CHECK-LABEL: @min.unsigned.1
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
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
247 %addr = getelementptr i32, i32* %a, i32 %idx
248 store i32 %idx, i32* %addr
252 %be.cond = icmp ult i32 %idx.inc, %umin
253 br i1 %be.cond, label %loop, label %exit
259 define void @min.unsigned.2(i32* %a, i32 %a_len, i32 %n) {
260 ; CHECK-LABEL: @min.unsigned.2
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
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
275 %addr = getelementptr i32, i32* %a, i32 %idx
276 store i32 %idx, i32* %addr
280 %be.cond = icmp ult i32 %idx.inc, %umin
281 br i1 %be.cond, label %loop, label %exit
287 define void @min.unsigned.3(i32* %a, i32 %n) {
288 ; CHECK-LABEL: @min.unsigned.3
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
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
303 %addr = getelementptr i32, i32* %a, i32 %idx
304 store i32 %idx, i32* %addr
308 %be.cond = icmp ult i32 %idx.inc, %umin
309 br i1 %be.cond, label %loop, label %exit
315 define void @min.unsigned.4(i32* %a, i32 %n) {
316 ; CHECK-LABEL: @min.unsigned.4
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
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
331 %addr = getelementptr i32, i32* %a, i32 %idx
332 store i32 %idx, i32* %addr
336 %be.cond = icmp ult i32 %idx.inc, %umin
337 br i1 %be.cond, label %loop, label %exit
343 define void @max.unsigned.1(i32* %a, i32 %a_len, i32 %n) {
344 ; CHECK-LABEL: @max.unsigned.1
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
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
359 %addr = getelementptr i32, i32* %a, i32 %idx
360 store i32 %idx, i32* %addr
364 %be.cond = icmp ugt i32 %idx.inc, %umax
365 br i1 %be.cond, label %loop, label %exit
371 define void @max.unsigned.2(i32* %a, i32 %a_len, i32 %n) {
372 ; CHECK-LABEL: @max.unsigned.2
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
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
387 %addr = getelementptr i32, i32* %a, i32 %idx
388 store i32 %idx, i32* %addr
392 %be.cond = icmp ugt i32 %idx.inc, %umax
393 br i1 %be.cond, label %loop, label %exit
399 define void @max.unsigned.3(i32* %a, i32 %n, i32 %init) {
400 ; CHECK-LABEL: @max.unsigned.3
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
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
415 %addr = getelementptr i32, i32* %a, i32 %idx
416 store i32 %idx, i32* %addr
420 %be.cond = icmp ugt i32 %idx.inc, %umax
421 br i1 %be.cond, label %loop, label %exit
427 define void @max.unsigned.4(i32* %a, i32 %n, i32 %init) {
428 ; CHECK-LABEL: @max.unsigned.4
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
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
443 %addr = getelementptr i32, i32* %a, i32 %idx
444 store i32 %idx, i32* %addr
448 %be.cond = icmp ugt i32 %idx.inc, %umax
449 br i1 %be.cond, label %loop, label %exit