[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / GlobalISel / select-cmp.mir
blob2ff1fcba56156faf5cc452c7f04b1baa2cea4b09
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=x86_64-linux-gnu -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK
4 --- |
5   define i32 @test_icmp_eq_i8(i8 %a, i8 %b) {
6     %r = icmp eq i8 %a, %b
7     %res = zext i1 %r to i32
8     ret i32 %res
9   }
11   define i32 @test_icmp_eq_i16(i16 %a, i16 %b) {
12     %r = icmp eq i16 %a, %b
13     %res = zext i1 %r to i32
14     ret i32 %res
15   }
17   define i32 @test_icmp_eq_i64(i64 %a, i64 %b) {
18     %r = icmp eq i64 %a, %b
19     %res = zext i1 %r to i32
20     ret i32 %res
21   }
23   define i32 @test_icmp_eq_i32(i32 %a, i32 %b) {
24     %r = icmp eq i32 %a, %b
25     %res = zext i1 %r to i32
26     ret i32 %res
27   }
29   define i32 @test_icmp_ne_i32(i32 %a, i32 %b) {
30     %r = icmp ne i32 %a, %b
31     %res = zext i1 %r to i32
32     ret i32 %res
33   }
35   define i32 @test_icmp_ugt_i32(i32 %a, i32 %b) {
36     %r = icmp ugt i32 %a, %b
37     %res = zext i1 %r to i32
38     ret i32 %res
39   }
41   define i32 @test_icmp_uge_i32(i32 %a, i32 %b) {
42     %r = icmp uge i32 %a, %b
43     %res = zext i1 %r to i32
44     ret i32 %res
45   }
47   define i32 @test_icmp_ult_i32(i32 %a, i32 %b) {
48     %r = icmp ult i32 %a, %b
49     %res = zext i1 %r to i32
50     ret i32 %res
51   }
53   define i32 @test_icmp_ule_i32(i32 %a, i32 %b) {
54     %r = icmp ule i32 %a, %b
55     %res = zext i1 %r to i32
56     ret i32 %res
57   }
59   define i32 @test_icmp_sgt_i32(i32 %a, i32 %b) {
60     %r = icmp sgt i32 %a, %b
61     %res = zext i1 %r to i32
62     ret i32 %res
63   }
65   define i32 @test_icmp_sge_i32(i32 %a, i32 %b) {
66     %r = icmp sge i32 %a, %b
67     %res = zext i1 %r to i32
68     ret i32 %res
69   }
71   define i32 @test_icmp_slt_i32(i32 %a, i32 %b) {
72     %r = icmp slt i32 %a, %b
73     %res = zext i1 %r to i32
74     ret i32 %res
75   }
77   define i32 @test_icmp_sle_i32(i32 %a, i32 %b) {
78     %r = icmp sle i32 %a, %b
79     %res = zext i1 %r to i32
80     ret i32 %res
81   }
83 ...
84 ---
85 name:            test_icmp_eq_i8
86 alignment:       16
87 legalized:       true
88 regBankSelected: true
89 registers:
90   - { id: 0, class: gpr }
91   - { id: 1, class: gpr }
92   - { id: 2, class: gpr }
93   - { id: 3, class: gpr }
94 body:             |
95   bb.1 (%ir-block.0):
96     liveins: $edi, $esi
98     ; CHECK-LABEL: name: test_icmp_eq_i8
99     ; CHECK: [[COPY:%[0-9]+]]:gr8 = COPY $dil
100     ; CHECK: [[COPY1:%[0-9]+]]:gr8 = COPY $sil
101     ; CHECK: CMP8rr [[COPY]], [[COPY1]], implicit-def $eflags
102     ; CHECK: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 4, implicit $eflags
103     ; CHECK: [[SUBREG_TO_REG:%[0-9]+]]:gr32 = SUBREG_TO_REG 0, [[SETCCr]], %subreg.sub_8bit
104     ; CHECK: [[AND32ri8_:%[0-9]+]]:gr32 = AND32ri8 [[SUBREG_TO_REG]], 1, implicit-def $eflags
105     ; CHECK: $eax = COPY [[AND32ri8_]]
106     ; CHECK: RET 0, implicit $eax
107     %0(s8) = COPY $dil
108     %1(s8) = COPY $sil
109     %2(s1) = G_ICMP intpred(eq), %0(s8), %1
110     %3(s32) = G_ZEXT %2(s1)
111     $eax = COPY %3(s32)
112     RET 0, implicit $eax
116 name:            test_icmp_eq_i16
117 alignment:       16
118 legalized:       true
119 regBankSelected: true
120 registers:
121   - { id: 0, class: gpr }
122   - { id: 1, class: gpr }
123   - { id: 2, class: gpr }
124   - { id: 3, class: gpr }
125 body:             |
126   bb.1 (%ir-block.0):
127     liveins: $edi, $esi
129     ; CHECK-LABEL: name: test_icmp_eq_i16
130     ; CHECK: [[COPY:%[0-9]+]]:gr16 = COPY $di
131     ; CHECK: [[COPY1:%[0-9]+]]:gr16 = COPY $si
132     ; CHECK: CMP16rr [[COPY]], [[COPY1]], implicit-def $eflags
133     ; CHECK: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 4, implicit $eflags
134     ; CHECK: [[SUBREG_TO_REG:%[0-9]+]]:gr32 = SUBREG_TO_REG 0, [[SETCCr]], %subreg.sub_8bit
135     ; CHECK: [[AND32ri8_:%[0-9]+]]:gr32 = AND32ri8 [[SUBREG_TO_REG]], 1, implicit-def $eflags
136     ; CHECK: $eax = COPY [[AND32ri8_]]
137     ; CHECK: RET 0, implicit $eax
138     %0(s16) = COPY $di
139     %1(s16) = COPY $si
140     %2(s1) = G_ICMP intpred(eq), %0(s16), %1
141     %3(s32) = G_ZEXT %2(s1)
142     $eax = COPY %3(s32)
143     RET 0, implicit $eax
147 name:            test_icmp_eq_i64
148 alignment:       16
149 legalized:       true
150 regBankSelected: true
151 registers:
152   - { id: 0, class: gpr }
153   - { id: 1, class: gpr }
154   - { id: 2, class: gpr }
155   - { id: 3, class: gpr }
156 body:             |
157   bb.1 (%ir-block.0):
158     liveins: $rdi, $rsi
160     ; CHECK-LABEL: name: test_icmp_eq_i64
161     ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rdi
162     ; CHECK: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi
163     ; CHECK: CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags
164     ; CHECK: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 4, implicit $eflags
165     ; CHECK: [[SUBREG_TO_REG:%[0-9]+]]:gr32 = SUBREG_TO_REG 0, [[SETCCr]], %subreg.sub_8bit
166     ; CHECK: [[AND32ri8_:%[0-9]+]]:gr32 = AND32ri8 [[SUBREG_TO_REG]], 1, implicit-def $eflags
167     ; CHECK: $eax = COPY [[AND32ri8_]]
168     ; CHECK: RET 0, implicit $eax
169     %0(s64) = COPY $rdi
170     %1(s64) = COPY $rsi
171     %2(s1) = G_ICMP intpred(eq), %0(s64), %1
172     %3(s32) = G_ZEXT %2(s1)
173     $eax = COPY %3(s32)
174     RET 0, implicit $eax
178 name:            test_icmp_eq_i32
179 alignment:       16
180 legalized:       true
181 regBankSelected: true
182 registers:
183   - { id: 0, class: gpr }
184   - { id: 1, class: gpr }
185   - { id: 2, class: gpr }
186   - { id: 3, class: gpr }
187 body:             |
188   bb.1 (%ir-block.0):
189     liveins: $edi, $esi
191     ; CHECK-LABEL: name: test_icmp_eq_i32
192     ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $edi
193     ; CHECK: [[COPY1:%[0-9]+]]:gr32 = COPY $esi
194     ; CHECK: CMP32rr [[COPY]], [[COPY1]], implicit-def $eflags
195     ; CHECK: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 4, implicit $eflags
196     ; CHECK: [[SUBREG_TO_REG:%[0-9]+]]:gr32 = SUBREG_TO_REG 0, [[SETCCr]], %subreg.sub_8bit
197     ; CHECK: [[AND32ri8_:%[0-9]+]]:gr32 = AND32ri8 [[SUBREG_TO_REG]], 1, implicit-def $eflags
198     ; CHECK: $eax = COPY [[AND32ri8_]]
199     ; CHECK: RET 0, implicit $eax
200     %0(s32) = COPY $edi
201     %1(s32) = COPY $esi
202     %2(s1) = G_ICMP intpred(eq), %0(s32), %1
203     %3(s32) = G_ZEXT %2(s1)
204     $eax = COPY %3(s32)
205     RET 0, implicit $eax
209 name:            test_icmp_ne_i32
210 alignment:       16
211 legalized:       true
212 regBankSelected: true
213 registers:
214   - { id: 0, class: gpr }
215   - { id: 1, class: gpr }
216   - { id: 2, class: gpr }
217   - { id: 3, class: gpr }
218 body:             |
219   bb.1 (%ir-block.0):
220     liveins: $edi, $esi
222     ; CHECK-LABEL: name: test_icmp_ne_i32
223     ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $edi
224     ; CHECK: [[COPY1:%[0-9]+]]:gr32 = COPY $esi
225     ; CHECK: CMP32rr [[COPY]], [[COPY1]], implicit-def $eflags
226     ; CHECK: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 5, implicit $eflags
227     ; CHECK: [[SUBREG_TO_REG:%[0-9]+]]:gr32 = SUBREG_TO_REG 0, [[SETCCr]], %subreg.sub_8bit
228     ; CHECK: [[AND32ri8_:%[0-9]+]]:gr32 = AND32ri8 [[SUBREG_TO_REG]], 1, implicit-def $eflags
229     ; CHECK: $eax = COPY [[AND32ri8_]]
230     ; CHECK: RET 0, implicit $eax
231     %0(s32) = COPY $edi
232     %1(s32) = COPY $esi
233     %2(s1) = G_ICMP intpred(ne), %0(s32), %1
234     %3(s32) = G_ZEXT %2(s1)
235     $eax = COPY %3(s32)
236     RET 0, implicit $eax
240 name:            test_icmp_ugt_i32
241 alignment:       16
242 legalized:       true
243 regBankSelected: true
244 registers:
245   - { id: 0, class: gpr }
246   - { id: 1, class: gpr }
247   - { id: 2, class: gpr }
248   - { id: 3, class: gpr }
249 body:             |
250   bb.1 (%ir-block.0):
251     liveins: $edi, $esi
253     ; CHECK-LABEL: name: test_icmp_ugt_i32
254     ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $edi
255     ; CHECK: [[COPY1:%[0-9]+]]:gr32 = COPY $esi
256     ; CHECK: CMP32rr [[COPY]], [[COPY1]], implicit-def $eflags
257     ; CHECK: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags
258     ; CHECK: [[SUBREG_TO_REG:%[0-9]+]]:gr32 = SUBREG_TO_REG 0, [[SETCCr]], %subreg.sub_8bit
259     ; CHECK: [[AND32ri8_:%[0-9]+]]:gr32 = AND32ri8 [[SUBREG_TO_REG]], 1, implicit-def $eflags
260     ; CHECK: $eax = COPY [[AND32ri8_]]
261     ; CHECK: RET 0, implicit $eax
262     %0(s32) = COPY $edi
263     %1(s32) = COPY $esi
264     %2(s1) = G_ICMP intpred(ugt), %0(s32), %1
265     %3(s32) = G_ZEXT %2(s1)
266     $eax = COPY %3(s32)
267     RET 0, implicit $eax
271 name:            test_icmp_uge_i32
272 alignment:       16
273 legalized:       true
274 regBankSelected: true
275 registers:
276   - { id: 0, class: gpr }
277   - { id: 1, class: gpr }
278   - { id: 2, class: gpr }
279   - { id: 3, class: gpr }
280 body:             |
281   bb.1 (%ir-block.0):
282     liveins: $edi, $esi
284     ; CHECK-LABEL: name: test_icmp_uge_i32
285     ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $edi
286     ; CHECK: [[COPY1:%[0-9]+]]:gr32 = COPY $esi
287     ; CHECK: CMP32rr [[COPY]], [[COPY1]], implicit-def $eflags
288     ; CHECK: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 3, implicit $eflags
289     ; CHECK: [[SUBREG_TO_REG:%[0-9]+]]:gr32 = SUBREG_TO_REG 0, [[SETCCr]], %subreg.sub_8bit
290     ; CHECK: [[AND32ri8_:%[0-9]+]]:gr32 = AND32ri8 [[SUBREG_TO_REG]], 1, implicit-def $eflags
291     ; CHECK: $eax = COPY [[AND32ri8_]]
292     ; CHECK: RET 0, implicit $eax
293     %0(s32) = COPY $edi
294     %1(s32) = COPY $esi
295     %2(s1) = G_ICMP intpred(uge), %0(s32), %1
296     %3(s32) = G_ZEXT %2(s1)
297     $eax = COPY %3(s32)
298     RET 0, implicit $eax
302 name:            test_icmp_ult_i32
303 alignment:       16
304 legalized:       true
305 regBankSelected: true
306 registers:
307   - { id: 0, class: gpr }
308   - { id: 1, class: gpr }
309   - { id: 2, class: gpr }
310   - { id: 3, class: gpr }
311 body:             |
312   bb.1 (%ir-block.0):
313     liveins: $edi, $esi
315     ; CHECK-LABEL: name: test_icmp_ult_i32
316     ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $edi
317     ; CHECK: [[COPY1:%[0-9]+]]:gr32 = COPY $esi
318     ; CHECK: CMP32rr [[COPY]], [[COPY1]], implicit-def $eflags
319     ; CHECK: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags
320     ; CHECK: [[SUBREG_TO_REG:%[0-9]+]]:gr32 = SUBREG_TO_REG 0, [[SETCCr]], %subreg.sub_8bit
321     ; CHECK: [[AND32ri8_:%[0-9]+]]:gr32 = AND32ri8 [[SUBREG_TO_REG]], 1, implicit-def $eflags
322     ; CHECK: $eax = COPY [[AND32ri8_]]
323     ; CHECK: RET 0, implicit $eax
324     %0(s32) = COPY $edi
325     %1(s32) = COPY $esi
326     %2(s1) = G_ICMP intpred(ult), %0(s32), %1
327     %3(s32) = G_ZEXT %2(s1)
328     $eax = COPY %3(s32)
329     RET 0, implicit $eax
333 name:            test_icmp_ule_i32
334 alignment:       16
335 legalized:       true
336 regBankSelected: true
337 registers:
338   - { id: 0, class: gpr }
339   - { id: 1, class: gpr }
340   - { id: 2, class: gpr }
341   - { id: 3, class: gpr }
342 body:             |
343   bb.1 (%ir-block.0):
344     liveins: $edi, $esi
346     ; CHECK-LABEL: name: test_icmp_ule_i32
347     ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $edi
348     ; CHECK: [[COPY1:%[0-9]+]]:gr32 = COPY $esi
349     ; CHECK: CMP32rr [[COPY]], [[COPY1]], implicit-def $eflags
350     ; CHECK: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 6, implicit $eflags
351     ; CHECK: [[SUBREG_TO_REG:%[0-9]+]]:gr32 = SUBREG_TO_REG 0, [[SETCCr]], %subreg.sub_8bit
352     ; CHECK: [[AND32ri8_:%[0-9]+]]:gr32 = AND32ri8 [[SUBREG_TO_REG]], 1, implicit-def $eflags
353     ; CHECK: $eax = COPY [[AND32ri8_]]
354     ; CHECK: RET 0, implicit $eax
355     %0(s32) = COPY $edi
356     %1(s32) = COPY $esi
357     %2(s1) = G_ICMP intpred(ule), %0(s32), %1
358     %3(s32) = G_ZEXT %2(s1)
359     $eax = COPY %3(s32)
360     RET 0, implicit $eax
364 name:            test_icmp_sgt_i32
365 alignment:       16
366 legalized:       true
367 regBankSelected: true
368 registers:
369   - { id: 0, class: gpr }
370   - { id: 1, class: gpr }
371   - { id: 2, class: gpr }
372   - { id: 3, class: gpr }
373 body:             |
374   bb.1 (%ir-block.0):
375     liveins: $edi, $esi
377     ; CHECK-LABEL: name: test_icmp_sgt_i32
378     ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $edi
379     ; CHECK: [[COPY1:%[0-9]+]]:gr32 = COPY $esi
380     ; CHECK: CMP32rr [[COPY]], [[COPY1]], implicit-def $eflags
381     ; CHECK: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 15, implicit $eflags
382     ; CHECK: [[SUBREG_TO_REG:%[0-9]+]]:gr32 = SUBREG_TO_REG 0, [[SETCCr]], %subreg.sub_8bit
383     ; CHECK: [[AND32ri8_:%[0-9]+]]:gr32 = AND32ri8 [[SUBREG_TO_REG]], 1, implicit-def $eflags
384     ; CHECK: $eax = COPY [[AND32ri8_]]
385     ; CHECK: RET 0, implicit $eax
386     %0(s32) = COPY $edi
387     %1(s32) = COPY $esi
388     %2(s1) = G_ICMP intpred(sgt), %0(s32), %1
389     %3(s32) = G_ZEXT %2(s1)
390     $eax = COPY %3(s32)
391     RET 0, implicit $eax
395 name:            test_icmp_sge_i32
396 alignment:       16
397 legalized:       true
398 regBankSelected: true
399 registers:
400   - { id: 0, class: gpr }
401   - { id: 1, class: gpr }
402   - { id: 2, class: gpr }
403   - { id: 3, class: gpr }
404 body:             |
405   bb.1 (%ir-block.0):
406     liveins: $edi, $esi
408     ; CHECK-LABEL: name: test_icmp_sge_i32
409     ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $edi
410     ; CHECK: [[COPY1:%[0-9]+]]:gr32 = COPY $esi
411     ; CHECK: CMP32rr [[COPY]], [[COPY1]], implicit-def $eflags
412     ; CHECK: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 13, implicit $eflags
413     ; CHECK: [[SUBREG_TO_REG:%[0-9]+]]:gr32 = SUBREG_TO_REG 0, [[SETCCr]], %subreg.sub_8bit
414     ; CHECK: [[AND32ri8_:%[0-9]+]]:gr32 = AND32ri8 [[SUBREG_TO_REG]], 1, implicit-def $eflags
415     ; CHECK: $eax = COPY [[AND32ri8_]]
416     ; CHECK: RET 0, implicit $eax
417     %0(s32) = COPY $edi
418     %1(s32) = COPY $esi
419     %2(s1) = G_ICMP intpred(sge), %0(s32), %1
420     %3(s32) = G_ZEXT %2(s1)
421     $eax = COPY %3(s32)
422     RET 0, implicit $eax
426 name:            test_icmp_slt_i32
427 alignment:       16
428 legalized:       true
429 regBankSelected: true
430 registers:
431   - { id: 0, class: gpr }
432   - { id: 1, class: gpr }
433   - { id: 2, class: gpr }
434   - { id: 3, class: gpr }
435 body:             |
436   bb.1 (%ir-block.0):
437     liveins: $edi, $esi
439     ; CHECK-LABEL: name: test_icmp_slt_i32
440     ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $edi
441     ; CHECK: [[COPY1:%[0-9]+]]:gr32 = COPY $esi
442     ; CHECK: CMP32rr [[COPY]], [[COPY1]], implicit-def $eflags
443     ; CHECK: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 12, implicit $eflags
444     ; CHECK: [[SUBREG_TO_REG:%[0-9]+]]:gr32 = SUBREG_TO_REG 0, [[SETCCr]], %subreg.sub_8bit
445     ; CHECK: [[AND32ri8_:%[0-9]+]]:gr32 = AND32ri8 [[SUBREG_TO_REG]], 1, implicit-def $eflags
446     ; CHECK: $eax = COPY [[AND32ri8_]]
447     ; CHECK: RET 0, implicit $eax
448     %0(s32) = COPY $edi
449     %1(s32) = COPY $esi
450     %2(s1) = G_ICMP intpred(slt), %0(s32), %1
451     %3(s32) = G_ZEXT %2(s1)
452     $eax = COPY %3(s32)
453     RET 0, implicit $eax
457 name:            test_icmp_sle_i32
458 alignment:       16
459 legalized:       true
460 regBankSelected: true
461 registers:
462   - { id: 0, class: gpr }
463   - { id: 1, class: gpr }
464   - { id: 2, class: gpr }
465   - { id: 3, class: gpr }
466 body:             |
467   bb.1 (%ir-block.0):
468     liveins: $edi, $esi
470     ; CHECK-LABEL: name: test_icmp_sle_i32
471     ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $edi
472     ; CHECK: [[COPY1:%[0-9]+]]:gr32 = COPY $esi
473     ; CHECK: CMP32rr [[COPY]], [[COPY1]], implicit-def $eflags
474     ; CHECK: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 14, implicit $eflags
475     ; CHECK: [[SUBREG_TO_REG:%[0-9]+]]:gr32 = SUBREG_TO_REG 0, [[SETCCr]], %subreg.sub_8bit
476     ; CHECK: [[AND32ri8_:%[0-9]+]]:gr32 = AND32ri8 [[SUBREG_TO_REG]], 1, implicit-def $eflags
477     ; CHECK: $eax = COPY [[AND32ri8_]]
478     ; CHECK: RET 0, implicit $eax
479     %0(s32) = COPY $edi
480     %1(s32) = COPY $esi
481     %2(s1) = G_ICMP intpred(sle), %0(s32), %1
482     %3(s32) = G_ZEXT %2(s1)
483     $eax = COPY %3(s32)
484     RET 0, implicit $eax