[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / regbank-fp-use-def.mir
blobeb768f3b16da36895e30347f791a229484073a2d
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -O0 -mtriple arm64-- -run-pass=regbankselect %s -o - | FileCheck %s
4 # Check that we correctly assign register banks based off of instructions which
5 # only use or only define FPRs.
7 # For example, G_SITOFP may take in a GPR, but only ever produces values on FPRs.
8 # Some instructions can have inputs/outputs on either FPRs or GPRs. If one of
9 # those instructions takes in the result of a G_SITOFP as a source, we should
10 # put that source on a FPR.
12 # Similarly, G_FPTOSI can only take in a value on a FPR. So, if the result of
13 # an instruction is consumed by a G_FPTOSI, we should put the instruction on
14 # FPRs.
16 ---
17 name:            load_only_uses_fp
18 legalized:       true
19 tracksRegLiveness: true
20 body: |
21   bb.0:
22     liveins: $x0
23     ; CHECK-LABEL: name: load_only_uses_fp
24     ; CHECK: liveins: $x0
25     ; CHECK-NEXT: {{  $}}
26     ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(p0) = COPY $x0
27     ; CHECK-NEXT: [[C:%[0-9]+]]:fpr(s32) = G_FCONSTANT float 2.000000e+00
28     ; CHECK-NEXT: [[LOAD:%[0-9]+]]:fpr(s32) = G_LOAD [[COPY]](p0) :: (load (s32))
29     ; CHECK-NEXT: [[FCMP:%[0-9]+]]:gpr(s32) = G_FCMP floatpred(uno), [[C]](s32), [[LOAD]]
30     ; CHECK-NEXT: $w0 = COPY [[FCMP]](s32)
31     ; CHECK-NEXT: RET_ReallyLR implicit $w0
32     %0:_(p0) = COPY $x0
33     %1:_(s32) = G_FCONSTANT float 2.0
34     %2:_(s32) = G_LOAD %0 :: (load (s32))
35     %3:_(s32) = G_FCMP floatpred(uno), %1, %2
36     $w0 = COPY %3(s32)
37     RET_ReallyLR implicit $w0
38 ...
39 ---
40 name:            unmerge_only_uses_fp
42 legalized:       true
43 tracksRegLiveness: true
44 body:             |
45   bb.0:
46     liveins: $x0
47     ; CHECK-LABEL: name: unmerge_only_uses_fp
48     ; CHECK: liveins: $x0
49     ; CHECK-NEXT: {{  $}}
50     ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(s64) = COPY $x0
51     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr(s64) = COPY [[COPY]](s64)
52     ; CHECK-NEXT: [[UV:%[0-9]+]]:fpr(s32), [[UV1:%[0-9]+]]:fpr(s32) = G_UNMERGE_VALUES [[COPY1]](s64)
53     ; CHECK-NEXT: [[FCMP:%[0-9]+]]:gpr(s32) = G_FCMP floatpred(uno), [[UV]](s32), [[UV1]]
54     ; CHECK-NEXT: $w0 = COPY [[FCMP]](s32)
55     ; CHECK-NEXT: RET_ReallyLR implicit $w0
56     %0:_(s64) = COPY $x0
57     %1:_(s32), %2:_(s32) = G_UNMERGE_VALUES %0(s64)
58     %3:_(s32) = G_FCMP floatpred(uno), %1, %2
59     $w0 = COPY %3(s32)
60     RET_ReallyLR implicit $w0
62 ...
63 ---
64 name:            store_defined_by_fp
65 legalized:       true
66 tracksRegLiveness: true
67 body: |
68   bb.0:
69     liveins: $x0, $w1
70     ; CHECK-LABEL: name: store_defined_by_fp
71     ; CHECK: liveins: $x0, $w1
72     ; CHECK-NEXT: {{  $}}
73     ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(p0) = COPY $x0
74     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr(s32) = COPY $w1
75     ; CHECK-NEXT: [[SITOFP:%[0-9]+]]:fpr(s32) = G_SITOFP [[COPY1]](s32)
76     ; CHECK-NEXT: G_STORE [[SITOFP]](s32), [[COPY]](p0) :: (store (s32))
77     %0:_(p0) = COPY $x0
78     %1:_(s32) = COPY $w1
79     %2:_(s32) = G_SITOFP %1
80     G_STORE %2, %0 :: (store (s32))
82 ...
83 ---
84 name:            select_defined_by_fp_using_fp
85 legalized:       true
86 tracksRegLiveness: true
87 body:             |
88   bb.0:
89     liveins: $w0, $w1, $w2
90     ; CHECK-LABEL: name: select_defined_by_fp_using_fp
91     ; CHECK: liveins: $w0, $w1, $w2
92     ; CHECK-NEXT: {{  $}}
93     ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0
94     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr(s32) = COPY $w1
95     ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr(s32) = COPY $w2
96     ; CHECK-NEXT: [[SITOFP:%[0-9]+]]:fpr(s32) = G_SITOFP [[COPY1]](s32)
97     ; CHECK-NEXT: [[COPY3:%[0-9]+]]:fpr(s32) = COPY [[COPY2]](s32)
98     ; CHECK-NEXT: [[SELECT:%[0-9]+]]:fpr(s32) = G_SELECT [[COPY2]](s32), [[COPY3]], [[SITOFP]]
99     ; CHECK-NEXT: [[FPTOSI:%[0-9]+]]:gpr(s32) = G_FPTOSI [[SELECT]](s32)
100     %0:_(s32) = COPY $w0
101     %2:_(s32) = COPY $w1
102     %3:_(s32) = COPY $w2
103     %4:_(s32) = G_SITOFP %2
104     %6:_(s32) = G_SELECT %3, %3, %4
105     %8:_(s32) = G_FPTOSI %6
109 name:            load_used_by_phi_fpr
110 legalized:       true
111 tracksRegLiveness: true
112 body:             |
113   ; CHECK-LABEL: name: load_used_by_phi_fpr
114   ; CHECK: bb.0:
115   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
116   ; CHECK-NEXT:   liveins: $x0, $s0, $s1, $w0, $w1
117   ; CHECK-NEXT: {{  $}}
118   ; CHECK-NEXT:   %cond_wide:gpr(s32) = COPY $w0
119   ; CHECK-NEXT:   %fpr_copy:fpr(s32) = COPY $s0
120   ; CHECK-NEXT:   %ptr:gpr(p0) = COPY $x0
121   ; CHECK-NEXT:   G_BRCOND %cond_wide(s32), %bb.1
122   ; CHECK-NEXT:   G_BR %bb.2
123   ; CHECK-NEXT: {{  $}}
124   ; CHECK-NEXT: bb.1:
125   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
126   ; CHECK-NEXT: {{  $}}
127   ; CHECK-NEXT:   %load:fpr(s32) = G_LOAD %ptr(p0) :: (load (s32))
128   ; CHECK-NEXT:   G_BR %bb.2
129   ; CHECK-NEXT: {{  $}}
130   ; CHECK-NEXT: bb.2:
131   ; CHECK-NEXT:   %phi:fpr(s32) = G_PHI %fpr_copy(s32), %bb.0, %load(s32), %bb.1
132   ; CHECK-NEXT:   $s0 = COPY %phi(s32)
133   ; CHECK-NEXT:   RET_ReallyLR implicit $s0
134   bb.0:
135     successors: %bb.1(0x40000000), %bb.2(0x40000000)
136     liveins: $x0, $s0, $s1, $w0, $w1
137     %cond_wide:_(s32) = COPY $w0
138     %fpr_copy:_(s32) = COPY $s0
139     %ptr:_(p0) = COPY $x0
140     G_BRCOND %cond_wide, %bb.1
141     G_BR %bb.2
142   bb.1:
143     successors: %bb.2
144     %load:_(s32) = G_LOAD %ptr(p0) :: (load (s32))
145     G_BR %bb.2
146   bb.2:
147     %phi:_(s32) = G_PHI %fpr_copy(s32), %bb.0, %load(s32), %bb.1
148     $s0 = COPY %phi(s32)
149     RET_ReallyLR implicit $s0
153 name:            load_used_by_phi_gpr
154 legalized:       true
155 tracksRegLiveness: true
156 body:             |
157   ; CHECK-LABEL: name: load_used_by_phi_gpr
158   ; CHECK: bb.0:
159   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
160   ; CHECK-NEXT:   liveins: $x0, $s0, $s1, $w0, $w1
161   ; CHECK-NEXT: {{  $}}
162   ; CHECK-NEXT:   %cond_wide:gpr(s32) = COPY $w0
163   ; CHECK-NEXT:   %gpr_copy:gpr(s32) = COPY $w1
164   ; CHECK-NEXT:   %ptr:gpr(p0) = COPY $x0
165   ; CHECK-NEXT:   G_BRCOND %cond_wide(s32), %bb.1
166   ; CHECK-NEXT:   G_BR %bb.2
167   ; CHECK-NEXT: {{  $}}
168   ; CHECK-NEXT: bb.1:
169   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
170   ; CHECK-NEXT: {{  $}}
171   ; CHECK-NEXT:   %load:gpr(s32) = G_LOAD %ptr(p0) :: (load (s32))
172   ; CHECK-NEXT:   G_BR %bb.2
173   ; CHECK-NEXT: {{  $}}
174   ; CHECK-NEXT: bb.2:
175   ; CHECK-NEXT:   %phi:gpr(s32) = G_PHI %gpr_copy(s32), %bb.0, %load(s32), %bb.1
176   ; CHECK-NEXT:   $s0 = COPY %phi(s32)
177   ; CHECK-NEXT:   RET_ReallyLR implicit $s0
178   bb.0:
179     successors: %bb.1(0x40000000), %bb.2(0x40000000)
180     liveins: $x0, $s0, $s1, $w0, $w1
181     %cond_wide:_(s32) = COPY $w0
182     %gpr_copy:_(s32) = COPY $w1
183     %ptr:_(p0) = COPY $x0
184     G_BRCOND %cond_wide, %bb.1
185     G_BR %bb.2
186   bb.1:
187     successors: %bb.2
188     %load:_(s32) = G_LOAD %ptr(p0) :: (load (s32))
189     G_BR %bb.2
190   bb.2:
191     %phi:_(s32) = G_PHI %gpr_copy(s32), %bb.0, %load(s32), %bb.1
192     $s0 = COPY %phi(s32)
193     RET_ReallyLR implicit $s0
197 name:            select_used_by_phi_fpr
198 legalized:       true
199 tracksRegLiveness: true
200 body:             |
201   ; CHECK-LABEL: name: select_used_by_phi_fpr
202   ; CHECK: bb.0:
203   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
204   ; CHECK-NEXT:   liveins: $s0, $s1, $w0, $w1
205   ; CHECK-NEXT: {{  $}}
206   ; CHECK-NEXT:   %cond_wide:gpr(s32) = COPY $w0
207   ; CHECK-NEXT:   %fpr_copy:fpr(s32) = COPY $s0
208   ; CHECK-NEXT:   %gpr_copy:gpr(s32) = COPY $w1
209   ; CHECK-NEXT:   G_BRCOND %cond_wide(s32), %bb.1
210   ; CHECK-NEXT:   G_BR %bb.2
211   ; CHECK-NEXT: {{  $}}
212   ; CHECK-NEXT: bb.1:
213   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
214   ; CHECK-NEXT: {{  $}}
215   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:fpr(s32) = COPY %gpr_copy(s32)
216   ; CHECK-NEXT:   %select:fpr(s32) = G_SELECT %cond_wide(s32), %fpr_copy, [[COPY]]
217   ; CHECK-NEXT:   G_BR %bb.2
218   ; CHECK-NEXT: {{  $}}
219   ; CHECK-NEXT: bb.2:
220   ; CHECK-NEXT:   %phi:fpr(s32) = G_PHI %fpr_copy(s32), %bb.0, %select(s32), %bb.1
221   ; CHECK-NEXT:   $w0 = COPY %phi(s32)
222   ; CHECK-NEXT:   RET_ReallyLR implicit $w0
223   ; The G_SELECT and G_PHI should end up with the same register bank.
224   ;
225   bb.0:
226     successors: %bb.1(0x40000000), %bb.2(0x40000000)
227     liveins: $s0, $s1, $w0, $w1
228     %cond_wide:_(s32) = COPY $w0
229     %fpr_copy:_(s32) = COPY $s0
230     %gpr_copy:_(s32) = COPY $w1
231     G_BRCOND %cond_wide, %bb.1
232     G_BR %bb.2
233   bb.1:
234     successors: %bb.2
235     %select:_(s32) = G_SELECT %cond_wide, %fpr_copy, %gpr_copy
236     G_BR %bb.2
237   bb.2:
238     %phi:_(s32) = G_PHI %fpr_copy(s32), %bb.0, %select(s32), %bb.1
239     $w0 = COPY %phi(s32)
240     RET_ReallyLR implicit $w0
244 name:            select_used_by_phi_gpr
245 legalized:       true
246 tracksRegLiveness: true
247 body:             |
248   ; CHECK-LABEL: name: select_used_by_phi_gpr
249   ; CHECK: bb.0:
250   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
251   ; CHECK-NEXT:   liveins: $s0, $s1, $w0, $w1
252   ; CHECK-NEXT: {{  $}}
253   ; CHECK-NEXT:   %cond_wide:gpr(s32) = COPY $w0
254   ; CHECK-NEXT:   %fpr_copy:fpr(s32) = COPY $s0
255   ; CHECK-NEXT:   %gpr_copy:gpr(s32) = COPY $w1
256   ; CHECK-NEXT:   G_BRCOND %cond_wide(s32), %bb.1
257   ; CHECK-NEXT:   G_BR %bb.2
258   ; CHECK-NEXT: {{  $}}
259   ; CHECK-NEXT: bb.1:
260   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
261   ; CHECK-NEXT: {{  $}}
262   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr(s32) = COPY %fpr_copy(s32)
263   ; CHECK-NEXT:   %select:gpr(s32) = G_SELECT %cond_wide(s32), [[COPY]], %gpr_copy
264   ; CHECK-NEXT:   G_BR %bb.2
265   ; CHECK-NEXT: {{  $}}
266   ; CHECK-NEXT: bb.2:
267   ; CHECK-NEXT:   %phi:gpr(s32) = G_PHI %gpr_copy(s32), %bb.0, %select(s32), %bb.1
268   ; CHECK-NEXT:   $s0 = COPY %phi(s32)
269   ; CHECK-NEXT:   RET_ReallyLR implicit $s0
270   ; The G_SELECT and G_PHI should end up with the same register bank.
271   ;
272   bb.0:
273     successors: %bb.1(0x40000000), %bb.2(0x40000000)
274     liveins: $s0, $s1, $w0, $w1
275     %cond_wide:_(s32) = COPY $w0
276     %fpr_copy:_(s32) = COPY $s0
277     %gpr_copy:_(s32) = COPY $w1
278     G_BRCOND %cond_wide, %bb.1
279     G_BR %bb.2
280   bb.1:
281     successors: %bb.2
282     %select:_(s32) = G_SELECT %cond_wide, %fpr_copy, %gpr_copy
283     G_BR %bb.2
284   bb.2:
285     %phi:_(s32) = G_PHI %gpr_copy(s32), %bb.0, %select(s32), %bb.1
286     $s0 = COPY %phi(s32)
287     RET_ReallyLR implicit $s0
292 name:            unmerge_used_by_phi_fpr
293 legalized:       true
294 tracksRegLiveness: true
295 body:             |
296   ; CHECK-LABEL: name: unmerge_used_by_phi_fpr
297   ; CHECK: bb.0:
298   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
299   ; CHECK-NEXT:   liveins: $x0, $s0, $s1, $w0, $w1
300   ; CHECK-NEXT: {{  $}}
301   ; CHECK-NEXT:   %cond_wide:gpr(s32) = COPY $w0
302   ; CHECK-NEXT:   %fpr_copy:fpr(s32) = COPY $s0
303   ; CHECK-NEXT:   %unmerge_src:gpr(s64) = COPY $x0
304   ; CHECK-NEXT:   G_BRCOND %cond_wide(s32), %bb.1
305   ; CHECK-NEXT:   G_BR %bb.2
306   ; CHECK-NEXT: {{  $}}
307   ; CHECK-NEXT: bb.1:
308   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
309   ; CHECK-NEXT: {{  $}}
310   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:fpr(s64) = COPY %unmerge_src(s64)
311   ; CHECK-NEXT:   %unmerge_1:fpr(s32), %unmerge_2:fpr(s32) = G_UNMERGE_VALUES [[COPY]](s64)
312   ; CHECK-NEXT:   G_BR %bb.2
313   ; CHECK-NEXT: {{  $}}
314   ; CHECK-NEXT: bb.2:
315   ; CHECK-NEXT:   %phi:fpr(s32) = G_PHI %fpr_copy(s32), %bb.0, %unmerge_1(s32), %bb.1
316   ; CHECK-NEXT:   $s0 = COPY %phi(s32)
317   ; CHECK-NEXT:   RET_ReallyLR implicit $s0
318   bb.0:
319     successors: %bb.1(0x40000000), %bb.2(0x40000000)
320     liveins: $x0, $s0, $s1, $w0, $w1
321     %cond_wide:_(s32) = COPY $w0
323     %fpr_copy:_(s32) = COPY $s0
324     %unmerge_src:_(s64) = COPY $x0
325     G_BRCOND %cond_wide, %bb.1
326     G_BR %bb.2
327   bb.1:
328     successors: %bb.2
329     %unmerge_1:_(s32), %unmerge_2:_(s32) = G_UNMERGE_VALUES %unmerge_src(s64)
330     G_BR %bb.2
331   bb.2:
332     %phi:_(s32) = G_PHI %fpr_copy(s32), %bb.0, %unmerge_1(s32), %bb.1
333     $s0 = COPY %phi(s32)
334     RET_ReallyLR implicit $s0
338 name:            unmerge_used_by_phi_gpr
339 legalized:       true
340 tracksRegLiveness: true
341 body:             |
342   ; CHECK-LABEL: name: unmerge_used_by_phi_gpr
343   ; CHECK: bb.0:
344   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
345   ; CHECK-NEXT:   liveins: $x0, $s0, $s1, $w0, $w1
346   ; CHECK-NEXT: {{  $}}
347   ; CHECK-NEXT:   %cond_wide:gpr(s32) = COPY $w0
348   ; CHECK-NEXT:   %gpr_copy:gpr(s32) = COPY $w1
349   ; CHECK-NEXT:   %unmerge_src:gpr(s64) = COPY $x0
350   ; CHECK-NEXT:   G_BRCOND %cond_wide(s32), %bb.1
351   ; CHECK-NEXT:   G_BR %bb.2
352   ; CHECK-NEXT: {{  $}}
353   ; CHECK-NEXT: bb.1:
354   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
355   ; CHECK-NEXT: {{  $}}
356   ; CHECK-NEXT:   %unmerge_1:gpr(s32), %unmerge_2:gpr(s32) = G_UNMERGE_VALUES %unmerge_src(s64)
357   ; CHECK-NEXT:   G_BR %bb.2
358   ; CHECK-NEXT: {{  $}}
359   ; CHECK-NEXT: bb.2:
360   ; CHECK-NEXT:   %phi:gpr(s32) = G_PHI %gpr_copy(s32), %bb.0, %unmerge_1(s32), %bb.1
361   ; CHECK-NEXT:   $s0 = COPY %phi(s32)
362   ; CHECK-NEXT:   RET_ReallyLR implicit $s0
363   bb.0:
364     successors: %bb.1(0x40000000), %bb.2(0x40000000)
365     liveins: $x0, $s0, $s1, $w0, $w1
366     %cond_wide:_(s32) = COPY $w0
367     %gpr_copy:_(s32) = COPY $w1
368     %unmerge_src:_(s64) = COPY $x0
369     G_BRCOND %cond_wide, %bb.1
370     G_BR %bb.2
371   bb.1:
372     successors: %bb.2
373     %unmerge_1:_(s32), %unmerge_2:_(s32) = G_UNMERGE_VALUES %unmerge_src(s64)
374     G_BR %bb.2
375   bb.2:
376     %phi:_(s32) = G_PHI %gpr_copy(s32), %bb.0, %unmerge_1(s32), %bb.1
377     $s0 = COPY %phi(s32)
378     RET_ReallyLR implicit $s0
382 name:            load_used_by_sitofp
383 legalized:       true
384 tracksRegLiveness: true
385 body: |
386   bb.0:
387     liveins: $x0
388     ; The load should be assigned an fpr bank because it's used by the sitofp.
389     ; The sitofp should assign both src and dest to FPR, resulting in no copies.
390     ; CHECK-LABEL: name: load_used_by_sitofp
391     ; CHECK: liveins: $x0
392     ; CHECK-NEXT: {{  $}}
393     ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(p0) = COPY $x0
394     ; CHECK-NEXT: [[LOAD:%[0-9]+]]:fpr(s32) = G_LOAD [[COPY]](p0) :: (load (s32))
395     ; CHECK-NEXT: [[SITOFP:%[0-9]+]]:fpr(s32) = G_SITOFP [[LOAD]](s32)
396     ; CHECK-NEXT: $s0 = COPY [[SITOFP]](s32)
397     ; CHECK-NEXT: RET_ReallyLR implicit $s0
398     %0:_(p0) = COPY $x0
399     %1:_(s32) = G_LOAD %0 :: (load (s32))
400     %2:_(s32) = G_SITOFP %1:_(s32)
401     $s0 = COPY %2(s32)
402     RET_ReallyLR implicit $s0
405 name:            load_used_by_uitofp
406 legalized:       true
407 tracksRegLiveness: true
408 body: |
409   bb.0:
410     liveins: $x0
411     ; CHECK-LABEL: name: load_used_by_uitofp
412     ; CHECK: liveins: $x0
413     ; CHECK-NEXT: {{  $}}
414     ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(p0) = COPY $x0
415     ; CHECK-NEXT: [[LOAD:%[0-9]+]]:fpr(s32) = G_LOAD [[COPY]](p0) :: (load (s32))
416     ; CHECK-NEXT: [[UITOFP:%[0-9]+]]:fpr(s32) = G_UITOFP [[LOAD]](s32)
417     ; CHECK-NEXT: $s0 = COPY [[UITOFP]](s32)
418     ; CHECK-NEXT: RET_ReallyLR implicit $s0
419     %0:_(p0) = COPY $x0
420     %1:_(s32) = G_LOAD %0 :: (load (s32))
421     %2:_(s32) = G_UITOFP %1:_(s32)
422     $s0 = COPY %2(s32)
423     RET_ReallyLR implicit $s0