[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / NVPTX / combine-min-max.ll
blob72d21407a2b6705292441e15c1646443781e6a38
1 ; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 -O2 | FileCheck %s
2 ; RUN: %if ptxas %{ llc < %s -march=nvptx64 -mcpu=sm_20 -O2 | %ptxas-verify %}
4 ; *************************************
5 ; * Cases with no min/max
7 define i32 @ab_eq_i32(i32 %a, i32 %b) {
8 ; CHECK-LABEL: @ab_eq_i32
9 ; CHECK-NOT: min
10 ; CHECK-NOT: max
11   %cmp = icmp eq i32 %a, %b
12   %sel = select i1 %cmp, i32 %a, i32 %b
13   ret i32 %sel
16 define i64 @ab_ne_i64(i64 %a, i64 %b) {
17 ; CHECK-LABEL: @ab_ne_i64
18 ; CHECK-NOT: min
19 ; CHECK-NOT: max
20   %cmp = icmp ne i64 %a, %b
21   %sel = select i1 %cmp, i64 %b, i64 %a
22   ret i64 %sel
25 ; *************************************
26 ; * All variations with i16
28 ; *** ab, unsigned, i16
29 define i16 @ab_ugt_i16(i16 %a, i16 %b) {
30 ; CHECK-LABEL: @ab_ugt_i16
31 ; CHECK: max.u16
32   %cmp = icmp ugt i16 %a, %b
33   %sel = select i1 %cmp, i16 %a, i16 %b
34   ret i16 %sel
37 define i16 @ab_uge_i16(i16 %a, i16 %b) {
38 ; CHECK-LABEL: @ab_uge_i16
39 ; CHECK: max.u16
40   %cmp = icmp uge i16 %a, %b
41   %sel = select i1 %cmp, i16 %a, i16 %b
42   ret i16 %sel
45 define i16 @ab_ult_i16(i16 %a, i16 %b) {
46 ; CHECK-LABEL: @ab_ult_i16
47 ; CHECK: min.u16
48   %cmp = icmp ult i16 %a, %b
49   %sel = select i1 %cmp, i16 %a, i16 %b
50   ret i16 %sel
53 define i16 @ab_ule_i16(i16 %a, i16 %b) {
54 ; CHECK-LABEL: @ab_ule_i16
55 ; CHECK: min.u16
56   %cmp = icmp ule i16 %a, %b
57   %sel = select i1 %cmp, i16 %a, i16 %b
58   ret i16 %sel
61 ; *** ab, signed, i16
62 define i16 @ab_sgt_i16(i16 %a, i16 %b) {
63 ; CHECK-LABEL: @ab_sgt_i16
64 ; CHECK: max.s16
65   %cmp = icmp sgt i16 %a, %b
66   %sel = select i1 %cmp, i16 %a, i16 %b
67   ret i16 %sel
70 define i16 @ab_sge_i16(i16 %a, i16 %b) {
71 ; CHECK-LABEL: @ab_sge_i16
72 ; CHECK: max.s16
73   %cmp = icmp sge i16 %a, %b
74   %sel = select i1 %cmp, i16 %a, i16 %b
75   ret i16 %sel
78 define i16 @ab_slt_i16(i16 %a, i16 %b) {
79 ; CHECK-LABEL: @ab_slt_i16
80 ; CHECK: min.s16
81   %cmp = icmp slt i16 %a, %b
82   %sel = select i1 %cmp, i16 %a, i16 %b
83   ret i16 %sel
86 define i16 @ab_sle_i16(i16 %a, i16 %b) {
87 ; CHECK-LABEL: @ab_sle_i16
88 ; CHECK: min.s16
89   %cmp = icmp sle i16 %a, %b
90   %sel = select i1 %cmp, i16 %a, i16 %b
91   ret i16 %sel
94 ; *** ba, unsigned, i16
95 define i16 @ba_ugt_i16(i16 %a, i16 %b) {
96 ; CHECK-LABEL: @ba_ugt_i16
97 ; CHECK: min.u16
98   %cmp = icmp ugt i16 %a, %b
99   %sel = select i1 %cmp, i16 %b, i16 %a
100   ret i16 %sel
103 define i16 @ba_uge_i16(i16 %a, i16 %b) {
104 ; CHECK-LABEL: @ba_uge_i16
105 ; CHECK: min.u16
106   %cmp = icmp uge i16 %a, %b
107   %sel = select i1 %cmp, i16 %b, i16 %a
108   ret i16 %sel
111 define i16 @ba_ult_i16(i16 %a, i16 %b) {
112 ; CHECK-LABEL: @ba_ult_i16
113 ; CHECK: max.u16
114   %cmp = icmp ult i16 %a, %b
115   %sel = select i1 %cmp, i16 %b, i16 %a
116   ret i16 %sel
119 define i16 @ba_ule_i16(i16 %a, i16 %b) {
120 ; CHECK-LABEL: @ba_ule_i16
121 ; CHECK: max.u16
122   %cmp = icmp ule i16 %a, %b
123   %sel = select i1 %cmp, i16 %b, i16 %a
124   ret i16 %sel
127 ; *** ba, signed, i16
128 define i16 @ba_sgt_i16(i16 %a, i16 %b) {
129 ; CHECK-LABEL: @ba_sgt_i16
130 ; CHECK: min.s16
131   %cmp = icmp sgt i16 %a, %b
132   %sel = select i1 %cmp, i16 %b, i16 %a
133   ret i16 %sel
136 define i16 @ba_sge_i16(i16 %a, i16 %b) {
137 ; CHECK-LABEL: @ba_sge_i16
138 ; CHECK: min.s16
139   %cmp = icmp sge i16 %a, %b
140   %sel = select i1 %cmp, i16 %b, i16 %a
141   ret i16 %sel
144 define i16 @ba_slt_i16(i16 %a, i16 %b) {
145 ; CHECK-LABEL: @ba_slt_i16
146 ; CHECK: max.s16
147   %cmp = icmp slt i16 %a, %b
148   %sel = select i1 %cmp, i16 %b, i16 %a
149   ret i16 %sel
152 define i16 @ba_sle_i16(i16 %a, i16 %b) {
153 ; CHECK-LABEL: @ba_sle_i16
154 ; CHECK: max.s16
155   %cmp = icmp sle i16 %a, %b
156   %sel = select i1 %cmp, i16 %b, i16 %a
157   ret i16 %sel
160 ; *************************************
161 ; * All variations with i32
163 ; *** ab, unsigned, i32
164 define i32 @ab_ugt_i32(i32 %a, i32 %b) {
165 ; CHECK-LABEL: @ab_ugt_i32
166 ; CHECK: max.u32
167   %cmp = icmp ugt i32 %a, %b
168   %sel = select i1 %cmp, i32 %a, i32 %b
169   ret i32 %sel
172 define i32 @ab_uge_i32(i32 %a, i32 %b) {
173 ; CHECK-LABEL: @ab_uge_i32
174 ; CHECK: max.u32
175   %cmp = icmp uge i32 %a, %b
176   %sel = select i1 %cmp, i32 %a, i32 %b
177   ret i32 %sel
180 define i32 @ab_ult_i32(i32 %a, i32 %b) {
181 ; CHECK-LABEL: @ab_ult_i32
182 ; CHECK: min.u32
183   %cmp = icmp ult i32 %a, %b
184   %sel = select i1 %cmp, i32 %a, i32 %b
185   ret i32 %sel
188 define i32 @ab_ule_i32(i32 %a, i32 %b) {
189 ; CHECK-LABEL: @ab_ule_i32
190 ; CHECK: min.u32
191   %cmp = icmp ule i32 %a, %b
192   %sel = select i1 %cmp, i32 %a, i32 %b
193   ret i32 %sel
196 ; *** ab, signed, i32
197 define i32 @ab_sgt_i32(i32 %a, i32 %b) {
198 ; CHECK-LABEL: @ab_sgt_i32
199 ; CHECK: max.s32
200   %cmp = icmp sgt i32 %a, %b
201   %sel = select i1 %cmp, i32 %a, i32 %b
202   ret i32 %sel
205 define i32 @ab_sge_i32(i32 %a, i32 %b) {
206 ; CHECK-LABEL: @ab_sge_i32
207 ; CHECK: max.s32
208   %cmp = icmp sge i32 %a, %b
209   %sel = select i1 %cmp, i32 %a, i32 %b
210   ret i32 %sel
213 define i32 @ab_slt_i32(i32 %a, i32 %b) {
214 ; CHECK-LABEL: @ab_slt_i32
215 ; CHECK: min.s32
216   %cmp = icmp slt i32 %a, %b
217   %sel = select i1 %cmp, i32 %a, i32 %b
218   ret i32 %sel
221 define i32 @ab_sle_i32(i32 %a, i32 %b) {
222 ; CHECK-LABEL: @ab_sle_i32
223 ; CHECK: min.s32
224   %cmp = icmp sle i32 %a, %b
225   %sel = select i1 %cmp, i32 %a, i32 %b
226   ret i32 %sel
229 ; *** ba, unsigned, i32
230 define i32 @ba_ugt_i32(i32 %a, i32 %b) {
231 ; CHECK-LABEL: @ba_ugt_i32
232 ; CHECK: min.u32
233   %cmp = icmp ugt i32 %a, %b
234   %sel = select i1 %cmp, i32 %b, i32 %a
235   ret i32 %sel
238 define i32 @ba_uge_i32(i32 %a, i32 %b) {
239 ; CHECK-LABEL: @ba_uge_i32
240 ; CHECK: min.u32
241   %cmp = icmp uge i32 %a, %b
242   %sel = select i1 %cmp, i32 %b, i32 %a
243   ret i32 %sel
246 define i32 @ba_ult_i32(i32 %a, i32 %b) {
247 ; CHECK-LABEL: @ba_ult_i32
248 ; CHECK: max.u32
249   %cmp = icmp ult i32 %a, %b
250   %sel = select i1 %cmp, i32 %b, i32 %a
251   ret i32 %sel
254 define i32 @ba_ule_i32(i32 %a, i32 %b) {
255 ; CHECK-LABEL: @ba_ule_i32
256 ; CHECK: max.u32
257   %cmp = icmp ule i32 %a, %b
258   %sel = select i1 %cmp, i32 %b, i32 %a
259   ret i32 %sel
262 ; *** ba, signed, i32
263 define i32 @ba_sgt_i32(i32 %a, i32 %b) {
264 ; CHECK-LABEL: @ba_sgt_i32
265 ; CHECK: min.s32
266   %cmp = icmp sgt i32 %a, %b
267   %sel = select i1 %cmp, i32 %b, i32 %a
268   ret i32 %sel
271 define i32 @ba_sge_i32(i32 %a, i32 %b) {
272 ; CHECK-LABEL: @ba_sge_i32
273 ; CHECK: min.s32
274   %cmp = icmp sge i32 %a, %b
275   %sel = select i1 %cmp, i32 %b, i32 %a
276   ret i32 %sel
279 define i32 @ba_slt_i32(i32 %a, i32 %b) {
280 ; CHECK-LABEL: @ba_slt_i32
281 ; CHECK: max.s32
282   %cmp = icmp slt i32 %a, %b
283   %sel = select i1 %cmp, i32 %b, i32 %a
284   ret i32 %sel
287 define i32 @ba_sle_i32(i32 %a, i32 %b) {
288 ; CHECK-LABEL: @ba_sle_i32
289 ; CHECK: max.s32
290   %cmp = icmp sle i32 %a, %b
291   %sel = select i1 %cmp, i32 %b, i32 %a
292   ret i32 %sel
295 ; *************************************
296 ; * All variations with i64
298 ; *** ab, unsigned, i64
299 define i64 @ab_ugt_i64(i64 %a, i64 %b) {
300 ; CHECK-LABEL: @ab_ugt_i64
301 ; CHECK: max.u64
302   %cmp = icmp ugt i64 %a, %b
303   %sel = select i1 %cmp, i64 %a, i64 %b
304   ret i64 %sel
307 define i64 @ab_uge_i64(i64 %a, i64 %b) {
308 ; CHECK-LABEL: @ab_uge_i64
309 ; CHECK: max.u64
310   %cmp = icmp uge i64 %a, %b
311   %sel = select i1 %cmp, i64 %a, i64 %b
312   ret i64 %sel
315 define i64 @ab_ult_i64(i64 %a, i64 %b) {
316 ; CHECK-LABEL: @ab_ult_i64
317 ; CHECK: min.u64
318   %cmp = icmp ult i64 %a, %b
319   %sel = select i1 %cmp, i64 %a, i64 %b
320   ret i64 %sel
323 define i64 @ab_ule_i64(i64 %a, i64 %b) {
324 ; CHECK-LABEL: @ab_ule_i64
325 ; CHECK: min.u64
326   %cmp = icmp ule i64 %a, %b
327   %sel = select i1 %cmp, i64 %a, i64 %b
328   ret i64 %sel
331 ; *** ab, signed, i64
332 define i64 @ab_sgt_i64(i64 %a, i64 %b) {
333 ; CHECK-LABEL: @ab_sgt_i64
334 ; CHECK: max.s64
335   %cmp = icmp sgt i64 %a, %b
336   %sel = select i1 %cmp, i64 %a, i64 %b
337   ret i64 %sel
340 define i64 @ab_sge_i64(i64 %a, i64 %b) {
341 ; CHECK-LABEL: @ab_sge_i64
342 ; CHECK: max.s64
343   %cmp = icmp sge i64 %a, %b
344   %sel = select i1 %cmp, i64 %a, i64 %b
345   ret i64 %sel
348 define i64 @ab_slt_i64(i64 %a, i64 %b) {
349 ; CHECK-LABEL: @ab_slt_i64
350 ; CHECK: min.s64
351   %cmp = icmp slt i64 %a, %b
352   %sel = select i1 %cmp, i64 %a, i64 %b
353   ret i64 %sel
356 define i64 @ab_sle_i64(i64 %a, i64 %b) {
357 ; CHECK-LABEL: @ab_sle_i64
358 ; CHECK: min.s64
359   %cmp = icmp sle i64 %a, %b
360   %sel = select i1 %cmp, i64 %a, i64 %b
361   ret i64 %sel
364 ; *** ba, unsigned, i64
365 define i64 @ba_ugt_i64(i64 %a, i64 %b) {
366 ; CHECK-LABEL: @ba_ugt_i64
367 ; CHECK: min.u64
368   %cmp = icmp ugt i64 %a, %b
369   %sel = select i1 %cmp, i64 %b, i64 %a
370   ret i64 %sel
373 define i64 @ba_uge_i64(i64 %a, i64 %b) {
374 ; CHECK-LABEL: @ba_uge_i64
375 ; CHECK: min.u64
376   %cmp = icmp uge i64 %a, %b
377   %sel = select i1 %cmp, i64 %b, i64 %a
378   ret i64 %sel
381 define i64 @ba_ult_i64(i64 %a, i64 %b) {
382 ; CHECK-LABEL: @ba_ult_i64
383 ; CHECK: max.u64
384   %cmp = icmp ult i64 %a, %b
385   %sel = select i1 %cmp, i64 %b, i64 %a
386   ret i64 %sel
389 define i64 @ba_ule_i64(i64 %a, i64 %b) {
390 ; CHECK-LABEL: @ba_ule_i64
391 ; CHECK: max.u64
392   %cmp = icmp ule i64 %a, %b
393   %sel = select i1 %cmp, i64 %b, i64 %a
394   ret i64 %sel
397 ; *** ba, signed, i64
398 define i64 @ba_sgt_i64(i64 %a, i64 %b) {
399 ; CHECK-LABEL: @ba_sgt_i64
400 ; CHECK: min.s64
401   %cmp = icmp sgt i64 %a, %b
402   %sel = select i1 %cmp, i64 %b, i64 %a
403   ret i64 %sel
406 define i64 @ba_sge_i64(i64 %a, i64 %b) {
407 ; CHECK-LABEL: @ba_sge_i64
408 ; CHECK: min.s64
409   %cmp = icmp sge i64 %a, %b
410   %sel = select i1 %cmp, i64 %b, i64 %a
411   ret i64 %sel
414 define i64 @ba_slt_i64(i64 %a, i64 %b) {
415 ; CHECK-LABEL: @ba_slt_i64
416 ; CHECK: max.s64
417   %cmp = icmp slt i64 %a, %b
418   %sel = select i1 %cmp, i64 %b, i64 %a
419   ret i64 %sel
422 define i64 @ba_sle_i64(i64 %a, i64 %b) {
423 ; CHECK-LABEL: @ba_sle_i64
424 ; CHECK: max.s64
425   %cmp = icmp sle i64 %a, %b
426   %sel = select i1 %cmp, i64 %b, i64 %a
427   ret i64 %sel