Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / regbank-fp-use-def.mir
blob4cdefa80b309bd117fefb04350cc06abdb1ac000
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_copy_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:   $w2 = COPY %phi(s32)
177   ; CHECK-NEXT:   RET_ReallyLR implicit $w2
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     $w2 = COPY %phi(s32)
193     RET_ReallyLR implicit $w2
197 name:            load_used_by_phi_gpr_copy_fpr
198 legalized:       true
199 tracksRegLiveness: true
200 body:             |
201   ; CHECK-LABEL: name: load_used_by_phi_gpr
202   ; CHECK: bb.0:
203   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
204   ; CHECK-NEXT:   liveins: $x0, $s0, $s1, $w0, $w1
205   ; CHECK-NEXT: {{  $}}
206   ; CHECK-NEXT:   %cond_wide:gpr(s32) = COPY $w0
207   ; CHECK-NEXT:   %gpr_copy:gpr(s32) = COPY $w1
208   ; CHECK-NEXT:   %ptr:gpr(p0) = COPY $x0
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:   %load:fpr(s32) = G_LOAD %ptr(p0) :: (load (s32))
216   ; CHECK-NEXT:   G_BR %bb.2
217   ; CHECK-NEXT: {{  $}}
218   ; CHECK-NEXT: bb.2:
219   ; CHECK-NEXT:   %phi:gpr(s32) = G_PHI %gpr_copy(s32), %bb.0, %load(s32), %bb.1
220   ; CHECK-NEXT:   $s0 = COPY %phi(s32)
221   ; CHECK-NEXT:   RET_ReallyLR implicit $s0
222   bb.0:
223     successors: %bb.1(0x40000000), %bb.2(0x40000000)
224     liveins: $x0, $s0, $s1, $w0, $w1
225     %cond_wide:_(s32) = COPY $w0
226     %gpr_copy:_(s32) = COPY $w1
227     %ptr:_(p0) = COPY $x0
228     G_BRCOND %cond_wide, %bb.1
229     G_BR %bb.2
230   bb.1:
231     successors: %bb.2
232     %load:_(s32) = G_LOAD %ptr(p0) :: (load (s32))
233     G_BR %bb.2
234   bb.2:
235     %phi:_(s32) = G_PHI %gpr_copy(s32), %bb.0, %load(s32), %bb.1
236     $s0 = COPY %phi(s32) ; G_LOAD should consider this FPR constraint and assign %load FPR
237     RET_ReallyLR implicit $s0
241 name:            select_used_by_phi_fpr
242 legalized:       true
243 tracksRegLiveness: true
244 body:             |
245   ; CHECK-LABEL: name: select_used_by_phi_fpr
246   ; CHECK: bb.0:
247   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
248   ; CHECK-NEXT:   liveins: $s0, $s1, $w0, $w1
249   ; CHECK-NEXT: {{  $}}
250   ; CHECK-NEXT:   %cond_wide:gpr(s32) = COPY $w0
251   ; CHECK-NEXT:   %fpr_copy:fpr(s32) = COPY $s0
252   ; CHECK-NEXT:   %gpr_copy:gpr(s32) = COPY $w1
253   ; CHECK-NEXT:   G_BRCOND %cond_wide(s32), %bb.1
254   ; CHECK-NEXT:   G_BR %bb.2
255   ; CHECK-NEXT: {{  $}}
256   ; CHECK-NEXT: bb.1:
257   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
258   ; CHECK-NEXT: {{  $}}
259   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:fpr(s32) = COPY %gpr_copy(s32)
260   ; CHECK-NEXT:   %select:fpr(s32) = G_SELECT %cond_wide(s32), %fpr_copy, [[COPY]]
261   ; CHECK-NEXT:   G_BR %bb.2
262   ; CHECK-NEXT: {{  $}}
263   ; CHECK-NEXT: bb.2:
264   ; CHECK-NEXT:   %phi:fpr(s32) = G_PHI %fpr_copy(s32), %bb.0, %select(s32), %bb.1
265   ; CHECK-NEXT:   $w0 = COPY %phi(s32)
266   ; CHECK-NEXT:   RET_ReallyLR implicit $w0
267   ; The G_SELECT and G_PHI should end up with the same register bank.
268   ;
269   bb.0:
270     successors: %bb.1(0x40000000), %bb.2(0x40000000)
271     liveins: $s0, $s1, $w0, $w1
272     %cond_wide:_(s32) = COPY $w0
273     %fpr_copy:_(s32) = COPY $s0
274     %gpr_copy:_(s32) = COPY $w1
275     G_BRCOND %cond_wide, %bb.1
276     G_BR %bb.2
277   bb.1:
278     successors: %bb.2
279     %select:_(s32) = G_SELECT %cond_wide, %fpr_copy, %gpr_copy
280     G_BR %bb.2
281   bb.2:
282     %phi:_(s32) = G_PHI %fpr_copy(s32), %bb.0, %select(s32), %bb.1
283     $w0 = COPY %phi(s32)
284     RET_ReallyLR implicit $w0
288 name:            select_used_by_phi_gpr
289 legalized:       true
290 tracksRegLiveness: true
291 body:             |
292   ; CHECK-LABEL: name: select_used_by_phi_gpr
293   ; CHECK: bb.0:
294   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
295   ; CHECK-NEXT:   liveins: $s0, $s1, $w0, $w1
296   ; CHECK-NEXT: {{  $}}
297   ; CHECK-NEXT:   %cond_wide:gpr(s32) = COPY $w0
298   ; CHECK-NEXT:   %fpr_copy:fpr(s32) = COPY $s0
299   ; CHECK-NEXT:   %gpr_copy:gpr(s32) = COPY $w1
300   ; CHECK-NEXT:   G_BRCOND %cond_wide(s32), %bb.1
301   ; CHECK-NEXT:   G_BR %bb.2
302   ; CHECK-NEXT: {{  $}}
303   ; CHECK-NEXT: bb.1:
304   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
305   ; CHECK-NEXT: {{  $}}
306   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gpr(s32) = COPY %fpr_copy(s32)
307   ; CHECK-NEXT:   %select:gpr(s32) = G_SELECT %cond_wide(s32), [[COPY]], %gpr_copy
308   ; CHECK-NEXT:   G_BR %bb.2
309   ; CHECK-NEXT: {{  $}}
310   ; CHECK-NEXT: bb.2:
311   ; CHECK-NEXT:   %phi:gpr(s32) = G_PHI %gpr_copy(s32), %bb.0, %select(s32), %bb.1
312   ; CHECK-NEXT:   $s0 = COPY %phi(s32)
313   ; CHECK-NEXT:   RET_ReallyLR implicit $s0
314   ; The G_SELECT and G_PHI should end up with the same register bank.
315   ;
316   bb.0:
317     successors: %bb.1(0x40000000), %bb.2(0x40000000)
318     liveins: $s0, $s1, $w0, $w1
319     %cond_wide:_(s32) = COPY $w0
320     %fpr_copy:_(s32) = COPY $s0
321     %gpr_copy:_(s32) = COPY $w1
322     G_BRCOND %cond_wide, %bb.1
323     G_BR %bb.2
324   bb.1:
325     successors: %bb.2
326     %select:_(s32) = G_SELECT %cond_wide, %fpr_copy, %gpr_copy
327     G_BR %bb.2
328   bb.2:
329     %phi:_(s32) = G_PHI %gpr_copy(s32), %bb.0, %select(s32), %bb.1
330     $s0 = COPY %phi(s32)
331     RET_ReallyLR implicit $s0
336 name:            unmerge_used_by_phi_fpr
337 legalized:       true
338 tracksRegLiveness: true
339 body:             |
340   ; CHECK-LABEL: name: unmerge_used_by_phi_fpr
341   ; CHECK: bb.0:
342   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
343   ; CHECK-NEXT:   liveins: $x0, $s0, $s1, $w0, $w1
344   ; CHECK-NEXT: {{  $}}
345   ; CHECK-NEXT:   %cond_wide:gpr(s32) = COPY $w0
346   ; CHECK-NEXT:   %fpr_copy:fpr(s32) = COPY $s0
347   ; CHECK-NEXT:   %unmerge_src:gpr(s64) = COPY $x0
348   ; CHECK-NEXT:   G_BRCOND %cond_wide(s32), %bb.1
349   ; CHECK-NEXT:   G_BR %bb.2
350   ; CHECK-NEXT: {{  $}}
351   ; CHECK-NEXT: bb.1:
352   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
353   ; CHECK-NEXT: {{  $}}
354   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:fpr(s64) = COPY %unmerge_src(s64)
355   ; CHECK-NEXT:   %unmerge_1:fpr(s32), %unmerge_2:fpr(s32) = G_UNMERGE_VALUES [[COPY]](s64)
356   ; CHECK-NEXT:   G_BR %bb.2
357   ; CHECK-NEXT: {{  $}}
358   ; CHECK-NEXT: bb.2:
359   ; CHECK-NEXT:   %phi:fpr(s32) = G_PHI %fpr_copy(s32), %bb.0, %unmerge_1(s32), %bb.1
360   ; CHECK-NEXT:   $s0 = COPY %phi(s32)
361   ; CHECK-NEXT:   RET_ReallyLR implicit $s0
362   bb.0:
363     successors: %bb.1(0x40000000), %bb.2(0x40000000)
364     liveins: $x0, $s0, $s1, $w0, $w1
365     %cond_wide:_(s32) = COPY $w0
367     %fpr_copy:_(s32) = COPY $s0
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 %fpr_copy(s32), %bb.0, %unmerge_1(s32), %bb.1
377     $s0 = COPY %phi(s32)
378     RET_ReallyLR implicit $s0
382 name:            unmerge_used_by_phi_gpr
383 legalized:       true
384 tracksRegLiveness: true
385 body:             |
386   ; CHECK-LABEL: name: unmerge_used_by_phi_gpr
387   ; CHECK: bb.0:
388   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
389   ; CHECK-NEXT:   liveins: $x0, $s0, $s1, $w0, $w1
390   ; CHECK-NEXT: {{  $}}
391   ; CHECK-NEXT:   %cond_wide:gpr(s32) = COPY $w0
392   ; CHECK-NEXT:   %gpr_copy:gpr(s32) = COPY $w1
393   ; CHECK-NEXT:   %unmerge_src:gpr(s64) = COPY $x0
394   ; CHECK-NEXT:   G_BRCOND %cond_wide(s32), %bb.1
395   ; CHECK-NEXT:   G_BR %bb.2
396   ; CHECK-NEXT: {{  $}}
397   ; CHECK-NEXT: bb.1:
398   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
399   ; CHECK-NEXT: {{  $}}
400   ; CHECK-NEXT:   %unmerge_1:gpr(s32), %unmerge_2:gpr(s32) = G_UNMERGE_VALUES %unmerge_src(s64)
401   ; CHECK-NEXT:   G_BR %bb.2
402   ; CHECK-NEXT: {{  $}}
403   ; CHECK-NEXT: bb.2:
404   ; CHECK-NEXT:   %phi:gpr(s32) = G_PHI %gpr_copy(s32), %bb.0, %unmerge_1(s32), %bb.1
405   ; CHECK-NEXT:   $s0 = COPY %phi(s32)
406   ; CHECK-NEXT:   RET_ReallyLR implicit $s0
407   bb.0:
408     successors: %bb.1(0x40000000), %bb.2(0x40000000)
409     liveins: $x0, $s0, $s1, $w0, $w1
410     %cond_wide:_(s32) = COPY $w0
411     %gpr_copy:_(s32) = COPY $w1
412     %unmerge_src:_(s64) = COPY $x0
413     G_BRCOND %cond_wide, %bb.1
414     G_BR %bb.2
415   bb.1:
416     successors: %bb.2
417     %unmerge_1:_(s32), %unmerge_2:_(s32) = G_UNMERGE_VALUES %unmerge_src(s64)
418     G_BR %bb.2
419   bb.2:
420     %phi:_(s32) = G_PHI %gpr_copy(s32), %bb.0, %unmerge_1(s32), %bb.1
421     $s0 = COPY %phi(s32)
422     RET_ReallyLR implicit $s0
426 name:            load_used_by_sitofp
427 legalized:       true
428 tracksRegLiveness: true
429 body: |
430   bb.0:
431     liveins: $x0
432     ; The load should be assigned an fpr bank because it's used by the sitofp.
433     ; The sitofp should assign both src and dest to FPR, resulting in no copies.
434     ; CHECK-LABEL: name: load_used_by_sitofp
435     ; CHECK: liveins: $x0
436     ; CHECK-NEXT: {{  $}}
437     ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(p0) = COPY $x0
438     ; CHECK-NEXT: [[LOAD:%[0-9]+]]:fpr(s32) = G_LOAD [[COPY]](p0) :: (load (s32))
439     ; CHECK-NEXT: [[SITOFP:%[0-9]+]]:fpr(s32) = G_SITOFP [[LOAD]](s32)
440     ; CHECK-NEXT: $s0 = COPY [[SITOFP]](s32)
441     ; CHECK-NEXT: RET_ReallyLR implicit $s0
442     %0:_(p0) = COPY $x0
443     %1:_(s32) = G_LOAD %0 :: (load (s32))
444     %2:_(s32) = G_SITOFP %1:_(s32)
445     $s0 = COPY %2(s32)
446     RET_ReallyLR implicit $s0
449 name:            load_used_by_uitofp
450 legalized:       true
451 tracksRegLiveness: true
452 body: |
453   bb.0:
454     liveins: $x0
455     ; CHECK-LABEL: name: load_used_by_uitofp
456     ; CHECK: liveins: $x0
457     ; CHECK-NEXT: {{  $}}
458     ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(p0) = COPY $x0
459     ; CHECK-NEXT: [[LOAD:%[0-9]+]]:fpr(s32) = G_LOAD [[COPY]](p0) :: (load (s32))
460     ; CHECK-NEXT: [[UITOFP:%[0-9]+]]:fpr(s32) = G_UITOFP [[LOAD]](s32)
461     ; CHECK-NEXT: $s0 = COPY [[UITOFP]](s32)
462     ; CHECK-NEXT: RET_ReallyLR implicit $s0
463     %0:_(p0) = COPY $x0
464     %1:_(s32) = G_LOAD %0 :: (load (s32))
465     %2:_(s32) = G_UITOFP %1:_(s32)
466     $s0 = COPY %2(s32)
467     RET_ReallyLR implicit $s0