xref: /llvm-project/llvm/test/CodeGen/AArch64/GlobalISel/regbank-assert-zext.mir (revision 02769f2b3fdebb5066d7a973b171d2873a804560)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple=aarch64 -run-pass=regbankselect -verify-machineinstrs %s -o - | FileCheck %s
3#
4# Verify register banks for G_ASSERT_ZEXT.
5#
6
7...
8---
9name:            gpr
10alignment:       4
11legalized:       true
12tracksRegLiveness: true
13body:             |
14  bb.0:
15    liveins: $w0, $w1
16
17    ; G_ASSERT_ZEXT should end up on a GPR.
18
19    ; CHECK-LABEL: name: gpr
20    ; CHECK: liveins: $w0, $w1
21    ; CHECK-NEXT: {{  $}}
22    ; CHECK-NEXT: %copy:gpr(s32) = COPY $w0
23    ; CHECK-NEXT: %copy_assert_zext:gpr(s32) = G_ASSERT_ZEXT %copy, 16
24    ; CHECK-NEXT: $w1 = COPY %copy_assert_zext(s32)
25    ; CHECK-NEXT: RET_ReallyLR implicit $w1
26    %copy:_(s32) = COPY $w0
27    %copy_assert_zext:_(s32) = G_ASSERT_ZEXT %copy(s32), 16
28    $w1 = COPY %copy_assert_zext(s32)
29    RET_ReallyLR implicit $w1
30
31...
32---
33name:            gpr_vector
34alignment:       4
35legalized:       true
36tracksRegLiveness: true
37body:             |
38  bb.0:
39    liveins: $x0, $x1
40
41    ; G_ASSERT_ZEXT should end up on a GPR.
42
43    ; CHECK-LABEL: name: gpr_vector
44    ; CHECK: liveins: $x0, $x1
45    ; CHECK-NEXT: {{  $}}
46    ; CHECK-NEXT: %copy:gpr(<2 x s32>) = COPY $x0
47    ; CHECK-NEXT: %copy_assert_zext:gpr(<2 x s32>) = G_ASSERT_ZEXT %copy, 16
48    ; CHECK-NEXT: $x1 = COPY %copy_assert_zext(<2 x s32>)
49    ; CHECK-NEXT: RET_ReallyLR implicit $x1
50    %copy:_(<2 x s32>) = COPY $x0
51    %copy_assert_zext:_(<2 x s32>) = G_ASSERT_ZEXT %copy(<2 x s32>), 16
52    $x1 = COPY %copy_assert_zext(<2 x s32>)
53    RET_ReallyLR implicit $x1
54
55...
56---
57name:            fpr
58alignment:       4
59legalized:       true
60tracksRegLiveness: true
61body:             |
62  bb.0:
63    liveins: $s0, $s1
64
65    ; G_ASSERT_ZEXT should end up on a FPR.
66
67    ; CHECK-LABEL: name: fpr
68    ; CHECK: liveins: $s0, $s1
69    ; CHECK-NEXT: {{  $}}
70    ; CHECK-NEXT: %copy:fpr(s32) = COPY $s0
71    ; CHECK-NEXT: %copy_assert_zext:fpr(s32) = G_ASSERT_ZEXT %copy, 16
72    ; CHECK-NEXT: $s1 = COPY %copy_assert_zext(s32)
73    ; CHECK-NEXT: RET_ReallyLR implicit $s1
74    %copy:_(s32) = COPY $s0
75    %copy_assert_zext:_(s32) = G_ASSERT_ZEXT %copy(s32), 16
76    $s1 = COPY %copy_assert_zext(s32)
77    RET_ReallyLR implicit $s1
78
79...
80---
81name:            fpr_vector
82alignment:       4
83legalized:       true
84tracksRegLiveness: true
85body:             |
86  bb.0:
87    liveins: $d0, $d1
88
89    ; G_ASSERT_ZEXT should end up on a FPR.
90
91    ; CHECK-LABEL: name: fpr_vector
92    ; CHECK: liveins: $d0, $d1
93    ; CHECK-NEXT: {{  $}}
94    ; CHECK-NEXT: %copy:fpr(<2 x s32>) = COPY $d0
95    ; CHECK-NEXT: %copy_assert_zext:fpr(<2 x s32>) = G_ASSERT_ZEXT %copy, 16
96    ; CHECK-NEXT: $d1 = COPY %copy_assert_zext(<2 x s32>)
97    ; CHECK-NEXT: RET_ReallyLR implicit $d1
98    %copy:_(<2 x s32>) = COPY $d0
99    %copy_assert_zext:_(<2 x s32>) = G_ASSERT_ZEXT %copy(<2 x s32>), 16
100    $d1 = COPY %copy_assert_zext(<2 x s32>)
101    RET_ReallyLR implicit $d1
102
103...
104---
105name:            in_between_cross_bank_copy
106alignment:       4
107legalized:       true
108tracksRegLiveness: true
109body:             |
110  bb.0:
111    liveins: $s0, $w1
112
113    ; CHECK-LABEL: name: in_between_cross_bank_copy
114    ; CHECK: liveins: $s0, $w1
115    ; CHECK-NEXT: {{  $}}
116    ; CHECK-NEXT: %copy:fpr(s32) = COPY $s0
117    ; CHECK-NEXT: %copy_assert_zext:fpr(s32) = G_ASSERT_ZEXT %copy, 16
118    ; CHECK-NEXT: $w1 = COPY %copy_assert_zext(s32)
119    ; CHECK-NEXT: RET_ReallyLR implicit $w1
120    %copy:_(s32) = COPY $s0
121    %copy_assert_zext:_(s32) = G_ASSERT_ZEXT %copy(s32), 16
122    $w1 = COPY %copy_assert_zext(s32)
123    RET_ReallyLR implicit $w1
124
125...
126---
127name:            fpr_feeding_store
128alignment:       4
129legalized:       true
130tracksRegLiveness: true
131body:             |
132  bb.0:
133    liveins: $x0, $s0, $s1
134
135    ; The G_ASSERT_ZEXT should end up on a FPR, and there should be no copy
136    ; between it and the G_STORE.
137
138    ; CHECK-LABEL: name: fpr_feeding_store
139    ; CHECK: liveins: $x0, $s0, $s1
140    ; CHECK-NEXT: {{  $}}
141    ; CHECK-NEXT: %ptr:gpr(p0) = COPY $x0
142    ; CHECK-NEXT: %copy:fpr(s32) = COPY $s0
143    ; CHECK-NEXT: %copy_assert_zext:fpr(s32) = G_ASSERT_ZEXT %copy, 16
144    ; CHECK-NEXT: G_STORE %copy_assert_zext(s32), %ptr(p0) :: (store (s32))
145    ; CHECK-NEXT: RET_ReallyLR
146    %ptr:_(p0) = COPY $x0
147    %copy:_(s32) = COPY $s0
148    %copy_assert_zext:_(s32) = G_ASSERT_ZEXT %copy(s32), 16
149    G_STORE %copy_assert_zext(s32), %ptr(p0) :: (store (s32))
150    RET_ReallyLR
151
152...
153---
154name:            fpr_feeding_select
155alignment:       4
156legalized:       true
157tracksRegLiveness: true
158machineFunctionInfo: {}
159body:             |
160  bb.0:
161    liveins: $d0, $x1, $w0
162
163    ; G_ASSERT_ZEXT and G_SELECT should both end up on FPRs.
164
165    ; CHECK-LABEL: name: fpr_feeding_select
166    ; CHECK: liveins: $d0, $x1, $w0
167    ; CHECK-NEXT: {{  $}}
168    ; CHECK-NEXT: %w0:gpr(s32) = COPY $w0
169    ; CHECK-NEXT: %fpr:fpr(s64) = COPY $d0
170    ; CHECK-NEXT: %fpr_assert_zext:fpr(s64) = G_ASSERT_ZEXT %fpr, 32
171    ; CHECK-NEXT: %gpr:gpr(s64) = COPY $x1
172    ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr(s64) = COPY %gpr(s64)
173    ; CHECK-NEXT: %select:fpr(s64) = G_SELECT %w0(s32), %fpr_assert_zext, [[COPY]]
174    ; CHECK-NEXT: $d0 = COPY %select(s64)
175    ; CHECK-NEXT: RET_ReallyLR implicit $d0
176    %w0:_(s32) = COPY $w0
177    %fpr:_(s64) = COPY $d0
178    %fpr_assert_zext:_(s64) = G_ASSERT_ZEXT %fpr, 32
179    %gpr:_(s64) = COPY $x1
180    %select:_(s64) = G_SELECT %w0, %fpr_assert_zext, %gpr
181    $d0 = COPY %select(s64)
182    RET_ReallyLR implicit $d0
183
184...
185---
186name:            fpr_feeding_phi
187alignment:       4
188legalized:       true
189tracksRegLiveness: true
190body:             |
191  ; CHECK-LABEL: name: fpr_feeding_phi
192  ; CHECK: bb.0:
193  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
194  ; CHECK-NEXT:   liveins: $s0, $w1
195  ; CHECK-NEXT: {{  $}}
196  ; CHECK-NEXT:   %copy1:fpr(s32) = COPY $s0
197  ; CHECK-NEXT:   %copy2:gpr(s32) = COPY $w1
198  ; CHECK-NEXT:   %copy_assert_zext:fpr(s32) = G_ASSERT_ZEXT %copy1, 16
199  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr(s32) = COPY %copy1(s32)
200  ; CHECK-NEXT:   %cmp:gpr(s32) = G_ICMP intpred(eq), [[COPY]](s32), %copy2
201  ; CHECK-NEXT:   G_BRCOND %cmp(s32), %bb.1
202  ; CHECK-NEXT:   G_BR %bb.1
203  ; CHECK-NEXT: {{  $}}
204  ; CHECK-NEXT: bb.1:
205  ; CHECK-NEXT:   successors: %bb.2(0x80000000)
206  ; CHECK-NEXT: {{  $}}
207  ; CHECK-NEXT:   %bb1_val:gpr(s32) = COPY %copy2(s32)
208  ; CHECK-NEXT:   G_BR %bb.2
209  ; CHECK-NEXT: {{  $}}
210  ; CHECK-NEXT: bb.2:
211  ; CHECK-NEXT:   successors: %bb.0(0x80000000)
212  ; CHECK-NEXT: {{  $}}
213  ; CHECK-NEXT:   %phi:fpr(s32) = G_PHI %copy_assert_zext(s32), %bb.0, %bb1_val(s32), %bb.1
214  ; CHECK-NEXT:   G_BR %bb.0
215  bb.0:
216    successors: %bb.1, %bb.2
217    liveins: $s0, $w1
218    %copy1:_(s32) = COPY $s0
219    %copy2:_(s32) = COPY $w1
220
221    ; This should produce a FPR.
222    %copy_assert_zext:_(s32) = G_ASSERT_ZEXT %copy1(s32), 16
223
224    %cmp:_(s32) = G_ICMP intpred(eq), %copy1, %copy2
225    G_BRCOND %cmp, %bb.1
226    G_BR %bb.1
227  bb.1:
228    successors: %bb.2
229    %bb1_val:_(s32) = COPY %copy2
230    G_BR %bb.2
231  bb.2:
232    successors: %bb.0
233    ; This should produce a FPR.
234    %phi:_(s32) = G_PHI %copy_assert_zext, %bb.0, %bb1_val, %bb.1
235    G_BR %bb.0
236
237...
238---
239name:            fed_by_fpr_phi
240alignment:       4
241legalized:       true
242tracksRegLiveness: true
243body:             |
244  ; CHECK-LABEL: name: fed_by_fpr_phi
245  ; CHECK: bb.0:
246  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
247  ; CHECK-NEXT:   liveins: $s0, $s1
248  ; CHECK-NEXT: {{  $}}
249  ; CHECK-NEXT:   %copy1:fpr(s32) = COPY $s0
250  ; CHECK-NEXT:   %copy2:fpr(s32) = COPY $s1
251  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr(s32) = COPY %copy1(s32)
252  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:gpr(s32) = COPY %copy2(s32)
253  ; CHECK-NEXT:   %cmp:gpr(s32) = G_ICMP intpred(eq), [[COPY]](s32), [[COPY1]]
254  ; CHECK-NEXT:   G_BRCOND %cmp(s32), %bb.1
255  ; CHECK-NEXT:   G_BR %bb.1
256  ; CHECK-NEXT: {{  $}}
257  ; CHECK-NEXT: bb.1:
258  ; CHECK-NEXT:   successors: %bb.2(0x80000000)
259  ; CHECK-NEXT: {{  $}}
260  ; CHECK-NEXT:   %bb1_val:gpr(s32) = COPY %copy2(s32)
261  ; CHECK-NEXT:   G_BR %bb.2
262  ; CHECK-NEXT: {{  $}}
263  ; CHECK-NEXT: bb.2:
264  ; CHECK-NEXT:   successors: %bb.0(0x80000000)
265  ; CHECK-NEXT: {{  $}}
266  ; CHECK-NEXT:   %phi:fpr(s32) = G_PHI %copy1(s32), %bb.0, %bb1_val(s32), %bb.1
267  ; CHECK-NEXT:   %assert_zext:fpr(s32) = G_ASSERT_ZEXT %phi, 16
268  ; CHECK-NEXT:   G_BR %bb.0
269  bb.0:
270    successors: %bb.1, %bb.2
271    liveins: $s0, $s1
272    %copy1:_(s32) = COPY $s0
273    %copy2:_(s32) = COPY $s1
274    %cmp:_(s32) = G_ICMP intpred(eq), %copy1, %copy2
275    G_BRCOND %cmp, %bb.1
276    G_BR %bb.1
277  bb.1:
278    successors: %bb.2
279    %bb1_val:_(s32) = COPY %copy2
280    G_BR %bb.2
281  bb.2:
282    successors: %bb.0
283    ; The G_PHI and G_ASSERT_ZEXT should both end up on FPRs.
284    %phi:_(s32) = G_PHI %copy1, %bb.0, %bb1_val, %bb.1
285    %assert_zext:_(s32) = G_ASSERT_ZEXT %phi(s32), 16
286    G_BR %bb.0
287
288...
289---
290name:            different_blocks_gpr
291alignment:       4
292legalized:       true
293tracksRegLiveness: true
294body:             |
295  ; CHECK-LABEL: name: different_blocks_gpr
296  ; CHECK: bb.0:
297  ; CHECK-NEXT:   successors: %bb.1(0x80000000)
298  ; CHECK-NEXT:   liveins: $w0, $w1
299  ; CHECK-NEXT: {{  $}}
300  ; CHECK-NEXT:   %copy:gpr(s32) = COPY $w0
301  ; CHECK-NEXT:   G_BR %bb.1
302  ; CHECK-NEXT: {{  $}}
303  ; CHECK-NEXT: bb.1:
304  ; CHECK-NEXT:   %copy_assert_zext:gpr(s32) = G_ASSERT_ZEXT %copy, 16
305  ; CHECK-NEXT:   $w1 = COPY %copy_assert_zext(s32)
306  ; CHECK-NEXT:   RET_ReallyLR implicit $w1
307  bb.0:
308    successors: %bb.1
309    liveins: $w0, $w1
310    %copy:_(s32) = COPY $w0
311    G_BR %bb.1
312  bb.1:
313    ; The G_ASSERT_ZEXT should end up on a GPR.
314    %copy_assert_zext:_(s32) = G_ASSERT_ZEXT %copy(s32), 16
315    $w1 = COPY %copy_assert_zext
316    RET_ReallyLR implicit $w1
317
318...
319---
320name:            different_blocks_fpr
321alignment:       4
322legalized:       true
323tracksRegLiveness: true
324body:             |
325  ; CHECK-LABEL: name: different_blocks_fpr
326  ; CHECK: bb.0:
327  ; CHECK-NEXT:   successors: %bb.1(0x80000000)
328  ; CHECK-NEXT:   liveins: $s0, $s1
329  ; CHECK-NEXT: {{  $}}
330  ; CHECK-NEXT:   %copy:fpr(s32) = COPY $s0
331  ; CHECK-NEXT:   G_BR %bb.1
332  ; CHECK-NEXT: {{  $}}
333  ; CHECK-NEXT: bb.1:
334  ; CHECK-NEXT:   %copy_assert_zext:fpr(s32) = G_ASSERT_ZEXT %copy, 16
335  ; CHECK-NEXT:   $s1 = COPY %copy_assert_zext(s32)
336  ; CHECK-NEXT:   RET_ReallyLR implicit $s1
337  bb.0:
338    successors: %bb.1
339    liveins: $s0, $s1
340    %copy:_(s32) = COPY $s0
341    G_BR %bb.1
342  bb.1:
343    ; The G_ASSERT_ZEXT should end up on a FPR.
344    %copy_assert_zext:_(s32) = G_ASSERT_ZEXT %copy(s32), 16
345    $s1 = COPY %copy_assert_zext
346    RET_ReallyLR implicit $s1
347
348
349...
350---
351name:            different_blocks_fpr_backedge
352alignment:       4
353legalized:       true
354tracksRegLiveness: true
355body:             |
356  ; CHECK-LABEL: name: different_blocks_fpr_backedge
357  ; CHECK: bb.0:
358  ; CHECK-NEXT:   successors: %bb.1(0x80000000)
359  ; CHECK-NEXT:   liveins: $s0, $s1
360  ; CHECK-NEXT: {{  $}}
361  ; CHECK-NEXT:   %copy:fpr(s32) = COPY $s0
362  ; CHECK-NEXT:   G_BR %bb.1
363  ; CHECK-NEXT: {{  $}}
364  ; CHECK-NEXT: bb.1:
365  ; CHECK-NEXT:   successors: %bb.2(0x80000000)
366  ; CHECK-NEXT: {{  $}}
367  ; CHECK-NEXT:   %copy_assert_zext1:fpr(s32) = G_ASSERT_ZEXT %copy, 16
368  ; CHECK-NEXT:   G_BR %bb.2
369  ; CHECK-NEXT: {{  $}}
370  ; CHECK-NEXT: bb.2:
371  ; CHECK-NEXT:   successors: %bb.0(0x80000000)
372  ; CHECK-NEXT: {{  $}}
373  ; CHECK-NEXT:   %copy_assert_zext2:fpr(s32) = G_ASSERT_ZEXT %copy_assert_zext1, 16
374  ; CHECK-NEXT:   %copy_assert_zext3:fpr(s32) = G_ASSERT_ZEXT %copy_assert_zext2, 16
375  ; CHECK-NEXT:   G_BR %bb.0
376  bb.0:
377    successors: %bb.1
378    liveins: $s0, $s1
379    %copy:_(s32) = COPY $s0
380    G_BR %bb.1
381  bb.1:
382    successors: %bb.2
383    ; All of the G_ASSERT_ZEXTs should end up on FPRs.
384    %copy_assert_zext1:_(s32) = G_ASSERT_ZEXT %copy(s32), 16
385    G_BR %bb.2
386  bb.2:
387    successors: %bb.0
388    %copy_assert_zext2:_(s32) = G_ASSERT_ZEXT %copy_assert_zext1(s32), 16
389    %copy_assert_zext3:_(s32) = G_ASSERT_ZEXT %copy_assert_zext2(s32), 16
390    G_BR %bb.0
391