[PGO] make profile prefix even shorter and more readable
[oota-llvm.git] / test / Transforms / IndVarSimplify / backedge-on-min-max.ll
1 ; RUN: opt < %s -indvars -S | FileCheck %s
2
3 ;; --- signed ---
4
5 define 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
33 define 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
61 define 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
89 define 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
117 define 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
145 define 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
173 define 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
201 define 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
231 define 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
259 define 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
287 define 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
315 define 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
343 define 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
371 define 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
399 define 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
427 define 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 }