xref: /llvm-project/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-icmp.mir (revision 9e9907f1cfa424366fba58d9520f9305b537cec9)
1# RUN: llc -mtriple=amdgcn -mcpu=hawaii -run-pass=instruction-select -verify-machineinstrs -o - %s | FileCheck -check-prefix=GCN -DVCCRC=sreg_64_xexec %s
2# RUN: llc -mtriple=amdgcn -mcpu=fiji -run-pass=instruction-select -verify-machineinstrs -o - %s | FileCheck -check-prefix=GCN -DVCCRC=sreg_64_xexec %s
3# RUN: llc -mtriple=amdgcn -mcpu=gfx1010 -run-pass=instruction-select -verify-machineinstrs -o - %s | FileCheck -check-prefix=GCN -DVCCRC=sreg_32_xm0_xexec %s
4# RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -run-pass=instruction-select -verify-machineinstrs -o - %s | FileCheck -check-prefix=GCN -DVCCRC=sreg_32_xm0_xexec %s
5
6---
7name:            icmp_s32_s_mix
8legalized:       true
9regBankSelected: true
10
11# GCN: name: icmp_s32_s_mix
12# GCN: [[SGPR0:%[0-9]+]]:sreg_32 = COPY $sgpr0
13# GCN: [[SGPR1:%[0-9]+]]:sreg_32 = COPY $sgpr1
14# GCN: [[SGPR2:%[0-9]+]]:sreg_32 = COPY $sgpr2
15# GCN: [[SGPR3:%[0-9]+]]:sreg_32 = COPY $sgpr3
16# GCN: [[SGPR4:%[0-9]+]]:sreg_32 = COPY $sgpr4
17# GCN: [[SGPR5:%[0-9]+]]:sreg_32 = COPY $sgpr5
18# GCN: [[SGPR6:%[0-9]+]]:sreg_32 = COPY $sgpr6
19# GCN: [[SGPR7:%[0-9]+]]:sreg_32 = COPY $sgpr7
20# GCN: S_CMP_LG_U32 [[SGPR0]], [[SGPR1]], implicit-def $scc
21# GCN-NEXT: [[COND0:%[0-9]+]]:sreg_32 = COPY $scc
22# GCN: S_CMP_LG_U32 [[SGPR4]], [[SGPR5]], implicit-def $scc
23# GCN-NEXT: [[COND1:%[0-9]+]]:sreg_32 = COPY $scc
24# GCN: $scc = COPY [[COND0]]
25# GCN-NEXT: S_CSELECT_B32 [[SGPR6]], [[SGPR7]], implicit $scc
26# GCN: $scc = COPY [[COND1]]
27# GCN-NEXT: S_CSELECT_B32 [[SGPR2]], [[SGPR3]], implicit $scc
28
29body: |
30  bb.0:
31    liveins:  $vgpr0_vgpr1, $sgpr0, $sgpr1, $sgpr2, $sgpr3, $sgpr4, $sgpr5, $sgpr6, $sgpr7
32
33    %0:vgpr(p1) = COPY $vgpr0_vgpr1
34    %1:sgpr(s32) = COPY $sgpr0
35    %2:sgpr(s32) = COPY $sgpr1
36    %3:sgpr(s32) = COPY $sgpr2
37    %4:sgpr(s32) = COPY $sgpr3
38    %5:sgpr(s32) = COPY $sgpr4
39    %6:sgpr(s32) = COPY $sgpr5
40    %7:sgpr(s32) = COPY $sgpr6
41    %8:sgpr(s32) = COPY $sgpr7
42    %9:sgpr(s32) = G_ICMP intpred(ne), %1, %2
43    %10:sgpr(s32) = G_ICMP intpred(ne), %5, %6
44    %11:sgpr(s32) = G_SELECT %9, %7, %8
45    %12:sgpr(s32) = G_SELECT %10, %3, %4
46    %13:vgpr(s32) = COPY %11
47    G_STORE %13, %0 :: (volatile store (s32), addrspace 1)
48    %14:vgpr(s32) = COPY %12
49    G_STORE %14, %0 :: (volatile store (s32), addrspace 1)
50
51...
52---
53name:            icmp_s32_salu
54legalized:       true
55regBankSelected: true
56
57# GCN-LABEL: name: icmp_s32_salu
58# GCN: S_CMP_LG_U32
59# GCN: S_CMP_EQ_U32
60# GCN: S_CMP_GT_I32
61# GCN: S_CMP_GE_I32
62# GCN: S_CMP_LT_I32
63# GCN: S_CMP_LE_I32
64# GCN: S_CMP_GT_U32
65# GCN: S_CMP_GE_U32
66# GCN: S_CMP_LT_U32
67# GCN: S_CMP_LE_U32
68
69body: |
70  bb.0:
71    liveins: $vgpr0_vgpr1, $sgpr0, $sgpr1, $sgpr2, $sgpr3
72
73    %0:vgpr(p1) = COPY $vgpr0_vgpr1
74    %1:sgpr(s32) = COPY $sgpr0
75    %2:sgpr(s32) = COPY $sgpr1
76    %3:sgpr(s32) = COPY $sgpr2
77    %4:sgpr(s32) = COPY $sgpr3
78    %5:sgpr(s32) = G_ICMP intpred(ne), %1, %2
79    %6:sgpr(s32) = G_ICMP intpred(eq), %1, %2
80    %7:sgpr(s32) = G_ICMP intpred(sgt), %1, %2
81    %8:sgpr(s32) = G_ICMP intpred(sge), %1, %2
82    %9:sgpr(s32) = G_ICMP intpred(slt), %1, %2
83    %10:sgpr(s32) = G_ICMP intpred(sle), %1, %2
84    %11:sgpr(s32) = G_ICMP intpred(ugt), %1, %2
85    %12:sgpr(s32) = G_ICMP intpred(uge), %1, %2
86    %13:sgpr(s32) = G_ICMP intpred(ult), %1, %2
87    %14:sgpr(s32) = G_ICMP intpred(ule), %1, %2
88    %15:sgpr(s32) = G_SELECT %5, %3, %4
89    %16:sgpr(s32) = G_SELECT %6, %3, %4
90    %17:sgpr(s32) = G_SELECT %7, %3, %4
91    %18:sgpr(s32) = G_SELECT %8, %3, %4
92    %19:sgpr(s32) = G_SELECT %9, %3, %4
93    %20:sgpr(s32) = G_SELECT %10, %3, %4
94    %21:sgpr(s32) = G_SELECT %11, %3, %4
95    %22:sgpr(s32) = G_SELECT %12, %3, %4
96    %23:sgpr(s32) = G_SELECT %13, %3, %4
97    %24:sgpr(s32) = G_SELECT %14, %3, %4
98    %25:vgpr(s32) = COPY %15
99    G_STORE %25, %0 :: (volatile store (s32), addrspace 1)
100    %26:vgpr(s32) = COPY %16
101    G_STORE %26, %0 :: (volatile store (s32), addrspace 1)
102    %27:vgpr(s32) = COPY %17
103    G_STORE %27, %0 :: (volatile store (s32), addrspace 1)
104    %28:vgpr(s32) = COPY %18
105    G_STORE %28, %0 :: (volatile store (s32), addrspace 1)
106    %29:vgpr(s32) = COPY %19
107    G_STORE %29, %0 :: (volatile store (s32), addrspace 1)
108    %30:vgpr(s32) = COPY %20
109    G_STORE %30, %0 :: (volatile store (s32), addrspace 1)
110    %31:vgpr(s32) = COPY %21
111    G_STORE %31, %0 :: (volatile store (s32), addrspace 1)
112    %32:vgpr(s32) = COPY %22
113    G_STORE %32, %0 :: (volatile store (s32), addrspace 1)
114    %33:vgpr(s32) = COPY %23
115    G_STORE %33, %0 :: (volatile store (s32), addrspace 1)
116    %34:vgpr(s32) = COPY %24
117    G_STORE %34, %0 :: (volatile store (s32), addrspace 1)
118
119...
120---
121name:            icmp_s32_v_mix
122legalized:       true
123regBankSelected: true
124
125# GCN-LABEL: name: icmp_s32_v_mix
126# GCN: [[VGPR2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
127# GCN: [[VGPR3:%[0-9]+]]:vgpr_32 = COPY $vgpr3
128# GCN: [[VGPR4:%[0-9]+]]:vgpr_32 = COPY $vgpr4
129# GCN: [[VGPR5:%[0-9]+]]:vgpr_32 = COPY $vgpr5
130# GCN: [[VGPR6:%[0-9]+]]:vgpr_32 = COPY $vgpr6
131# GCN: [[VGPR7:%[0-9]+]]:vgpr_32 = COPY $vgpr7
132# GCN: [[VGPR8:%[0-9]+]]:vgpr_32 = COPY $vgpr8
133# GCN: [[VGPR9:%[0-9]+]]:vgpr_32 = COPY $vgpr9
134# GCN: [[COND0:%[0-9]+]]:[[VCCRC]] = V_CMP_NE_U32_e64 [[VGPR2]], [[VGPR3]]
135# GCN: [[COND1:%[0-9]+]]:[[VCCRC]] = V_CMP_NE_U32_e64 [[VGPR6]], [[VGPR7]]
136# GCN: V_CNDMASK_B32_e64 0, [[VGPR9]], 0, [[VGPR8]], [[COND0]]
137# GCN: V_CNDMASK_B32_e64 0, [[VGPR5]], 0, [[VGPR4]], [[COND1]]
138
139body: |
140  bb.0:
141    liveins: $vgpr0_vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5, $vgpr6, $vgpr7, $vgpr8, $vgpr9
142
143    %0:vgpr(p1) = COPY $vgpr0_vgpr1
144    %1:vgpr(s32) = COPY $vgpr2
145    %2:vgpr(s32) = COPY $vgpr3
146    %3:vgpr(s32) = COPY $vgpr4
147    %4:vgpr(s32) = COPY $vgpr5
148    %5:vgpr(s32) = COPY $vgpr6
149    %6:vgpr(s32) = COPY $vgpr7
150    %7:vgpr(s32) = COPY $vgpr8
151    %8:vgpr(s32) = COPY $vgpr9
152    %9:vcc(s1) = G_ICMP intpred(ne), %1, %2
153    %10:vcc(s1) = G_ICMP intpred(ne), %5, %6
154    %11:vgpr(s32) = G_SELECT %9, %7, %8
155    %12:vgpr(s32) = G_SELECT %10, %3, %4
156    G_STORE %11, %0 :: (volatile store (s32), addrspace 1)
157    G_STORE %12, %0 :: (volatile store (s32), addrspace 1)
158...
159---
160name:            icmp_s32_valu
161legalized:       true
162regBankSelected: true
163
164# GCN-LABEL: name: icmp_s32_valu
165# GCN: V_CMP_NE_U32_e64
166# GCN: V_CMP_EQ_U32_e64
167# GCN: V_CMP_GT_I32_e64
168# GCN: V_CMP_GE_I32_e64
169# GCN: V_CMP_LT_I32_e64
170# GCN: V_CMP_LE_I32_e64
171# GCN: V_CMP_GT_U32_e64
172# GCN: V_CMP_GE_U32_e64
173# GCN: V_CMP_LT_U32_e64
174# GCN: V_CMP_LE_U32_e64
175
176body: |
177  bb.0:
178    liveins: $vgpr0_vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5
179
180    %0:vgpr(p1) = COPY $vgpr0_vgpr1
181    %1:vgpr(s32) = COPY $vgpr2
182    %2:vgpr(s32) = COPY $vgpr3
183    %3:vgpr(s32) = COPY $vgpr4
184    %4:vgpr(s32) = COPY $vgpr5
185    %5:vcc(s1) = G_ICMP intpred(ne), %1, %2
186    %6:vcc(s1) = G_ICMP intpred(eq), %1, %2
187    %7:vcc(s1) = G_ICMP intpred(sgt), %1, %2
188    %8:vcc(s1) = G_ICMP intpred(sge), %1, %2
189    %9:vcc(s1) = G_ICMP intpred(slt), %1, %2
190    %10:vcc(s1) = G_ICMP intpred(sle), %1, %2
191    %11:vcc(s1) = G_ICMP intpred(ugt), %1, %2
192    %12:vcc(s1) = G_ICMP intpred(uge), %1, %2
193    %13:vcc(s1) = G_ICMP intpred(ult), %1, %2
194    %14:vcc(s1) = G_ICMP intpred(ule), %1, %2
195    %15:vgpr(s32) = G_SELECT %5, %3, %4
196    %16:vgpr(s32) = G_SELECT %6, %3, %4
197    %17:vgpr(s32) = G_SELECT %7, %3, %4
198    %18:vgpr(s32) = G_SELECT %8, %3, %4
199    %19:vgpr(s32) = G_SELECT %9, %3, %4
200    %20:vgpr(s32) = G_SELECT %10, %3, %4
201    %21:vgpr(s32) = G_SELECT %11, %3, %4
202    %22:vgpr(s32) = G_SELECT %12, %3, %4
203    %23:vgpr(s32) = G_SELECT %13, %3, %4
204    %24:vgpr(s32) = G_SELECT %14, %3, %4
205    G_STORE %15, %0 :: (volatile store (s32), addrspace 1)
206    G_STORE %16, %0 :: (volatile store (s32), addrspace 1)
207    G_STORE %17, %0 :: (volatile store (s32), addrspace 1)
208    G_STORE %18, %0 :: (volatile store (s32), addrspace 1)
209    G_STORE %19, %0 :: (volatile store (s32), addrspace 1)
210    G_STORE %20, %0 :: (volatile store (s32), addrspace 1)
211    G_STORE %21, %0 :: (volatile store (s32), addrspace 1)
212    G_STORE %22, %0 :: (volatile store (s32), addrspace 1)
213    G_STORE %23, %0 :: (volatile store (s32), addrspace 1)
214    G_STORE %24, %0 :: (volatile store (s32), addrspace 1)
215...
216---
217
218name:            icmp_s32_vv
219legalized:       true
220regBankSelected: true
221
222# GCN-LABEL: name: icmp_s32_vv
223# GCN: [[VGPR2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
224# GCN: [[VGPR3:%[0-9]+]]:vgpr_32 = COPY $vgpr3
225# GCN: V_CMP_NE_U32_e64 [[VGPR2]], [[VGPR3]]
226
227body: |
228  bb.0:
229    liveins:  $vgpr0_vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5
230
231    %0:vgpr(p1) = COPY $vgpr0_vgpr1
232    %1:vgpr(s32) = COPY $vgpr2
233    %2:vgpr(s32) = COPY $vgpr3
234    %3:vgpr(s32) = COPY $vgpr4
235    %4:vgpr(s32) = COPY $vgpr5
236    %5:vcc(s1) = G_ICMP intpred(ne), %1, %2
237    %6:vgpr(s32) = G_SELECT %5, %3, %4
238    G_STORE %6, %0 :: (store (s32), addrspace 1)
239...
240---
241
242name:            icmp_s32_vs
243legalized:       true
244regBankSelected: true
245
246# GCN-LABEL: name: icmp_s32_vs
247# GCN: [[VGPR2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
248# GCN: [[SGPR0:%[0-9]+]]:sreg_32 = COPY $sgpr0
249# GCN: V_CMP_NE_U32_e64 [[VGPR2]], [[SGPR0]]
250
251body: |
252  bb.0:
253    liveins:  $vgpr0_vgpr1, $vgpr2, $vgpr3, $vgpr4, $sgpr0
254
255    %0:vgpr(p1) = COPY $vgpr0_vgpr1
256    %1:vgpr(s32) = COPY $vgpr2
257    %2:vgpr(s32) = COPY $vgpr3
258    %3:vgpr(s32) = COPY $vgpr4
259    %4:sgpr(s32) = COPY $sgpr0
260    %5:vcc(s1) = G_ICMP intpred(ne), %1, %4
261    %6:vgpr(s32) = G_SELECT %5, %2, %3
262    G_STORE %6, %0 :: (store (s32), addrspace 1)
263...
264---
265
266name:            icmp_s32_sv
267legalized:       true
268regBankSelected: true
269
270# GCN-LABEL: name: icmp_s32_sv
271# GCN: [[VGPR2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
272# GCN: [[SGPR0:%[0-9]+]]:sreg_32 = COPY $sgpr0
273# GCN: V_CMP_NE_U32_e64 [[SGPR0]], [[VGPR2]]
274
275body: |
276  bb.0:
277    liveins:  $vgpr0_vgpr1, $vgpr2, $vgpr3, $vgpr4, $sgpr0
278
279    %0:vgpr(p1) = COPY $vgpr0_vgpr1
280    %1:vgpr(s32) = COPY $vgpr2
281    %2:vgpr(s32) = COPY $vgpr3
282    %3:vgpr(s32) = COPY $vgpr4
283    %4:sgpr(s32) = COPY $sgpr0
284    %5:vcc(s1) = G_ICMP intpred(ne), %4, %1
285    %6:vgpr(s32) = G_SELECT %5, %2, %3
286    G_STORE %6, %0 :: (store (s32), addrspace 1)
287...
288---
289
290name:            icmp_s32_or_vcc
291legalized:       true
292regBankSelected: true
293
294# GCN-LABEL: name: icmp_s32_or_vcc
295# GCN: [[VGPR2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
296# GCN: [[SGPR0:%[0-9]+]]:sreg_32 = COPY $sgpr0
297# GCN: V_CMP_NE_U32_e64 [[SGPR0]], [[VGPR2]]
298
299body: |
300  bb.0:
301    liveins:  $vgpr0_vgpr1, $vgpr2, $vgpr3, $vgpr4, $sgpr0
302
303    %0:vgpr(p1) = COPY $vgpr0_vgpr1
304    %1:vgpr(s32) = COPY $vgpr2
305    %2:vgpr(s32) = COPY $vgpr3
306    %3:vgpr(s32) = COPY $vgpr4
307    %4:sgpr(s32) = COPY $sgpr0
308    %5:vcc(s1) = G_ICMP intpred(ne), %4, %1
309    %6:vgpr(s32) = G_SELECT %5, %2, %3
310    G_STORE %6, %0 :: (store (s32), addrspace 1)
311...
312
313---
314
315name:            icmp_eq_ne_p3_ss
316legalized:       true
317regBankSelected: true
318
319# GCN-LABEL: name: icmp_eq_ne_p3_ss
320# GCN: S_CMP_EQ_U32 %0, %1, implicit-def $scc
321# GCN: S_CMP_LG_U32 %0, %1, implicit-def $scc
322
323body: |
324  bb.0:
325    liveins:  $sgpr0, $sgpr1
326
327    %0:sgpr(p3) = COPY $sgpr0
328    %1:sgpr(p3) = COPY $sgpr1
329    %2:sgpr(s32) = G_ICMP intpred(eq), %0, %1
330    %3:sgpr(s32) = G_ICMP intpred(ne), %0, %1
331    S_ENDPGM 0, implicit %2, implicit %3
332
333...
334
335---
336
337name:            icmp_eq_ne_p3_vv
338legalized:       true
339regBankSelected: true
340
341# GCN-LABEL: name: icmp_eq_ne_p3_vv
342# GCN: %2:[[VCCRC]] = V_CMP_EQ_U32_e64 %0, %1, implicit $exec
343# GCN: %3:[[VCCRC]] = V_CMP_NE_U32_e64 %0, %1, implicit $exec
344
345body: |
346  bb.0:
347    liveins:  $vgpr0, $vgpr1
348
349    %0:vgpr(p3) = COPY $vgpr0
350    %1:vgpr(p3) = COPY $vgpr1
351    %2:vcc(s1) = G_ICMP intpred(eq), %0, %1
352    %3:vcc(s1) = G_ICMP intpred(ne), %0, %1
353    %4:vgpr(s1) = COPY %2
354    %5:vgpr(s1) = COPY %3
355    %6:vgpr(s32) = G_SEXT %4
356    %7:vgpr(s32) = G_SEXT %5
357    S_ENDPGM 0, implicit %6, implicit %7
358
359...
360