1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -march=amdgcn -mcpu=fiji -run-pass=regbankselect %s -verify-machineinstrs -o - -regbankselect-fast | FileCheck %s
3# RUN: llc -march=amdgcn -mcpu=fiji -run-pass=regbankselect %s -verify-machineinstrs -o - -regbankselect-greedy | FileCheck %s
4
5---
6name: and_s1_sgpr_sgpr
7legalized: true
8
9body: |
10  bb.0:
11    liveins: $sgpr0, $sgpr1
12    ; CHECK-LABEL: name: and_s1_sgpr_sgpr
13    ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
14    ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1
15    ; CHECK: [[TRUNC:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY]](s32)
16    ; CHECK: [[TRUNC1:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY1]](s32)
17    ; CHECK: [[ANYEXT:%[0-9]+]]:sgpr(s32) = G_ANYEXT [[TRUNC]](s1)
18    ; CHECK: [[ANYEXT1:%[0-9]+]]:sgpr(s32) = G_ANYEXT [[TRUNC1]](s1)
19    ; CHECK: [[AND:%[0-9]+]]:sgpr(s32) = G_AND [[ANYEXT]], [[ANYEXT1]]
20    ; CHECK: [[TRUNC2:%[0-9]+]]:sgpr(s1) = G_TRUNC [[AND]](s32)
21    %0:_(s32) = COPY $sgpr0
22    %1:_(s32) = COPY $sgpr1
23    %2:_(s1) = G_TRUNC %0
24    %3:_(s1) = G_TRUNC %1
25    %4:_(s1) = G_AND %2, %3
26...
27
28---
29name: and_s1_scc_scc
30legalized: true
31
32body: |
33  bb.0:
34    liveins: $sgpr0, $sgpr1
35    ; CHECK-LABEL: name: and_s1_scc_scc
36    ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
37    ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1
38    ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0
39    ; CHECK: [[ICMP:%[0-9]+]]:sgpr(s32) = G_ICMP intpred(eq), [[COPY]](s32), [[C]]
40    ; CHECK: [[TRUNC:%[0-9]+]]:sgpr(s1) = G_TRUNC [[ICMP]](s32)
41    ; CHECK: [[ICMP1:%[0-9]+]]:sgpr(s32) = G_ICMP intpred(eq), [[COPY1]](s32), [[C]]
42    ; CHECK: [[TRUNC1:%[0-9]+]]:sgpr(s1) = G_TRUNC [[ICMP1]](s32)
43    ; CHECK: [[ANYEXT:%[0-9]+]]:sgpr(s32) = G_ANYEXT [[TRUNC]](s1)
44    ; CHECK: [[ANYEXT1:%[0-9]+]]:sgpr(s32) = G_ANYEXT [[TRUNC1]](s1)
45    ; CHECK: [[AND:%[0-9]+]]:sgpr(s32) = G_AND [[ANYEXT]], [[ANYEXT1]]
46    ; CHECK: [[TRUNC2:%[0-9]+]]:sgpr(s1) = G_TRUNC [[AND]](s32)
47    %0:_(s32) = COPY $sgpr0
48    %1:_(s32) = COPY $sgpr1
49    %2:_(s32) = G_CONSTANT i32 0
50    %3:_(s1) = G_ICMP intpred(eq), %0, %2
51    %4:_(s1) = G_ICMP intpred(eq), %1, %2
52    %5:_(s1) = G_AND %3, %4
53...
54
55---
56name: and_s1_vgpr_vgpr
57legalized: true
58
59body: |
60  bb.0:
61    liveins: $vgpr0, $vgpr1
62    ; CHECK-LABEL: name: and_s1_vgpr_vgpr
63    ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
64    ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
65    ; CHECK: [[TRUNC:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY]](s32)
66    ; CHECK: [[TRUNC1:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY1]](s32)
67    ; CHECK: [[ANYEXT:%[0-9]+]]:vgpr(s32) = G_ANYEXT [[TRUNC]](s1)
68    ; CHECK: [[ANYEXT1:%[0-9]+]]:vgpr(s32) = G_ANYEXT [[TRUNC1]](s1)
69    ; CHECK: [[AND:%[0-9]+]]:vgpr(s32) = G_AND [[ANYEXT]], [[ANYEXT1]]
70    ; CHECK: [[TRUNC2:%[0-9]+]]:vgpr(s1) = G_TRUNC [[AND]](s32)
71    %0:_(s32) = COPY $vgpr0
72    %1:_(s32) = COPY $vgpr1
73    %2:_(s1) = G_TRUNC %0
74    %3:_(s1) = G_TRUNC %1
75    %4:_(s1) = G_AND %2, %3
76...
77
78---
79name: and_s1_vcc_vcc
80legalized: true
81
82body: |
83  bb.0:
84    liveins: $vgpr0, $vgpr1
85    ; CHECK-LABEL: name: and_s1_vcc_vcc
86    ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
87    ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
88    ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0
89    ; CHECK: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32)
90    ; CHECK: [[ICMP:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY]](s32), [[COPY2]]
91    ; CHECK: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32)
92    ; CHECK: [[ICMP1:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY1]](s32), [[COPY3]]
93    ; CHECK: [[AND:%[0-9]+]]:vcc(s1) = G_AND [[ICMP]], [[ICMP1]]
94    %0:_(s32) = COPY $vgpr0
95    %1:_(s32) = COPY $vgpr1
96    %2:_(s32) = G_CONSTANT i32 0
97    %3:_(s1) = G_ICMP intpred(eq), %0, %2
98    %4:_(s1) = G_ICMP intpred(eq), %1, %2
99    %5:_(s1) = G_AND %3, %4
100...
101
102---
103name: and_s1_sgpr_vgpr
104legalized: true
105
106body: |
107  bb.0:
108    liveins: $sgpr0, $vgpr0
109    ; CHECK-LABEL: name: and_s1_sgpr_vgpr
110    ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
111    ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
112    ; CHECK: [[TRUNC:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY]](s32)
113    ; CHECK: [[TRUNC1:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY1]](s32)
114    ; CHECK: [[ANYEXT:%[0-9]+]]:vgpr(s32) = G_ANYEXT [[TRUNC]](s1)
115    ; CHECK: [[ANYEXT1:%[0-9]+]]:vgpr(s32) = G_ANYEXT [[TRUNC1]](s1)
116    ; CHECK: [[AND:%[0-9]+]]:vgpr(s32) = G_AND [[ANYEXT]], [[ANYEXT1]]
117    ; CHECK: [[TRUNC2:%[0-9]+]]:vgpr(s1) = G_TRUNC [[AND]](s32)
118    %0:_(s32) = COPY $sgpr0
119    %1:_(s32) = COPY $vgpr0
120    %2:_(s1) = G_TRUNC %0
121    %3:_(s1) = G_TRUNC %1
122    %4:_(s1) = G_AND %2, %3
123...
124
125---
126name: and_s1_vgpr_sgpr
127legalized: true
128
129body: |
130  bb.0:
131    liveins: $vgpr0, $vgpr0
132    ; CHECK-LABEL: name: and_s1_vgpr_sgpr
133    ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
134    ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
135    ; CHECK: [[TRUNC:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY]](s32)
136    ; CHECK: [[TRUNC1:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY1]](s32)
137    ; CHECK: [[ANYEXT:%[0-9]+]]:vgpr(s32) = G_ANYEXT [[TRUNC]](s1)
138    ; CHECK: [[ANYEXT1:%[0-9]+]]:vgpr(s32) = G_ANYEXT [[TRUNC1]](s1)
139    ; CHECK: [[AND:%[0-9]+]]:vgpr(s32) = G_AND [[ANYEXT]], [[ANYEXT1]]
140    ; CHECK: [[TRUNC2:%[0-9]+]]:vgpr(s1) = G_TRUNC [[AND]](s32)
141    %0:_(s32) = COPY $vgpr0
142    %1:_(s32) = COPY $sgpr0
143    %2:_(s1) = G_TRUNC %0
144    %3:_(s1) = G_TRUNC %1
145    %4:_(s1) = G_AND %2, %3
146...
147
148# FIXME: Should just change the result bank of the scc compare.
149---
150name: and_s1_scc_vcc
151legalized: true
152
153body: |
154  bb.0:
155    liveins: $sgpr0, $vgpr0
156    ; CHECK-LABEL: name: and_s1_scc_vcc
157    ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
158    ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
159    ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0
160    ; CHECK: [[ICMP:%[0-9]+]]:sgpr(s32) = G_ICMP intpred(eq), [[COPY]](s32), [[C]]
161    ; CHECK: [[TRUNC:%[0-9]+]]:sgpr(s1) = G_TRUNC [[ICMP]](s32)
162    ; CHECK: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32)
163    ; CHECK: [[ICMP1:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY1]](s32), [[COPY2]]
164    ; CHECK: [[COPY3:%[0-9]+]]:vcc(s1) = COPY [[TRUNC]](s1)
165    ; CHECK: [[AND:%[0-9]+]]:vcc(s1) = G_AND [[COPY3]], [[ICMP1]]
166    %0:_(s32) = COPY $sgpr0
167    %1:_(s32) = COPY $vgpr0
168    %2:_(s32) = G_CONSTANT i32 0
169    %3:_(s1) = G_ICMP intpred(eq), %0, %2
170    %4:_(s1) = G_ICMP intpred(eq), %1, %2
171    %5:_(s1) = G_AND %3, %4
172...
173
174---
175name: and_s1_vcc_scc
176legalized: true
177
178body: |
179  bb.0:
180    liveins: $vgpr0, $vgpr1
181    ; CHECK-LABEL: name: and_s1_vcc_scc
182    ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
183    ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
184    ; CHECK: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0
185    ; CHECK: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32)
186    ; CHECK: [[ICMP:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY]](s32), [[COPY2]]
187    ; CHECK: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32)
188    ; CHECK: [[ICMP1:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY1]](s32), [[COPY3]]
189    ; CHECK: [[AND:%[0-9]+]]:vcc(s1) = G_AND [[ICMP]], [[ICMP1]]
190    %0:_(s32) = COPY $vgpr0
191    %1:_(s32) = COPY $vgpr1
192    %2:_(s32) = G_CONSTANT i32 0
193    %3:_(s1) = G_ICMP intpred(eq), %0, %2
194    %4:_(s1) = G_ICMP intpred(eq), %1, %2
195    %5:_(s1) = G_AND %3, %4
196...
197
198
199# Test with a known result bank
200# ---
201# name: and_s1_vcc_sgpr_sgpr
202# legalized: true
203
204# body: |
205#   bb.0:
206#     liveins: $sgpr0, $sgpr1
207
208#     %0:_(s32) = COPY $sgpr0
209#     %1:_(s32) = COPY $sgpr1
210#     %2:_(s1) = G_TRUNC %0
211#     %3:_(s1) = G_TRUNC %1
212#     %4:vcc(s1) = G_AND %2, %3
213# ...
214
215# ---
216# name: and_s1_vcc_vgpr_vgpr
217# legalized: true
218
219# body: |
220#   bb.0:
221#     liveins: $vgpr0, $vgpr1
222
223#     %0:_(s32) = COPY $vgpr0
224#     %1:_(s32) = COPY $vgpr1
225#     %2:_(s1) = G_TRUNC %0
226#     %3:_(s1) = G_TRUNC %1
227#     %4:vcc(s1) = G_AND %2, %3
228# ...
229
230# ---
231# name: and_s1_vcc_vgpr_sgpr
232# legalized: true
233
234# body: |
235#   bb.0:
236#     liveins: $vgpr0, $sgpr0
237#     %0:_(s32) = COPY $vgpr0
238#     %1:_(s32) = COPY $sgpr0
239#     %2:_(s1) = G_TRUNC %0
240#     %3:_(s1) = G_TRUNC %1
241#     %4:vcc(s1) = G_AND %2, %3
242# ...
243
244# ---
245# name: and_s1_vcc_sgpr_vgpr
246# legalized: true
247
248# body: |
249#   bb.0:
250#     liveins: $vgpr0, $sgpr0
251#     %0:_(s32) = COPY $sgpr0
252#     %1:_(s32) = COPY $vgpr0
253#     %2:_(s1) = G_TRUNC %0
254#     %3:_(s1) = G_TRUNC %1
255#     %4:vcc(s1) = G_AND %2, %3
256# ...
257
258---
259name: and_s1_vgpr_sgpr_sgpr
260legalized: true
261
262body: |
263  bb.0:
264    liveins: $sgpr0, $sgpr1
265    ; CHECK-LABEL: name: and_s1_vgpr_sgpr_sgpr
266    ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
267    ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1
268    ; CHECK: [[TRUNC:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY]](s32)
269    ; CHECK: [[TRUNC1:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY1]](s32)
270    ; CHECK: [[ANYEXT:%[0-9]+]]:vgpr(s32) = G_ANYEXT [[TRUNC]](s1)
271    ; CHECK: [[ANYEXT1:%[0-9]+]]:vgpr(s32) = G_ANYEXT [[TRUNC1]](s1)
272    ; CHECK: [[AND:%[0-9]+]]:vgpr(s32) = G_AND [[ANYEXT]], [[ANYEXT1]]
273    ; CHECK: [[TRUNC2:%[0-9]+]]:vgpr(s1) = G_TRUNC [[AND]](s32)
274    %0:_(s32) = COPY $sgpr0
275    %1:_(s32) = COPY $sgpr1
276    %2:_(s1) = G_TRUNC %0
277    %3:_(s1) = G_TRUNC %1
278    %4:vgpr(s1) = G_AND %2, %3
279...
280
281---
282name: and_s1_sgpr_sgpr_sgpr
283legalized: true
284
285body: |
286  bb.0:
287    liveins: $sgpr0, $sgpr1
288    ; CHECK-LABEL: name: and_s1_sgpr_sgpr_sgpr
289    ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
290    ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1
291    ; CHECK: [[TRUNC:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY]](s32)
292    ; CHECK: [[TRUNC1:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY1]](s32)
293    ; CHECK: [[ANYEXT:%[0-9]+]]:sgpr(s32) = G_ANYEXT [[TRUNC]](s1)
294    ; CHECK: [[ANYEXT1:%[0-9]+]]:sgpr(s32) = G_ANYEXT [[TRUNC1]](s1)
295    ; CHECK: [[AND:%[0-9]+]]:sgpr(s32) = G_AND [[ANYEXT]], [[ANYEXT1]]
296    ; CHECK: [[TRUNC2:%[0-9]+]]:sgpr(s1) = G_TRUNC [[AND]](s32)
297    %0:_(s32) = COPY $sgpr0
298    %1:_(s32) = COPY $sgpr1
299    %2:_(s1) = G_TRUNC %0
300    %3:_(s1) = G_TRUNC %1
301    %4:sgpr(s1) = G_AND %2, %3
302...
303