xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/GlobalISel/arm64-regbankselect.mir (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker# RUN: llc -O0 -run-pass=regbankselect -global-isel %s -o - 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=FAST
2*9880d681SAndroid Build Coastguard Worker# RUN: llc -O0 -run-pass=regbankselect -global-isel %s -regbankselect-greedy -o - 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=GREEDY
3*9880d681SAndroid Build Coastguard Worker# REQUIRES: global-isel
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker--- |
6*9880d681SAndroid Build Coastguard Worker  ; ModuleID = 'generic-virtual-registers-type-error.mir'
7*9880d681SAndroid Build Coastguard Worker  target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
8*9880d681SAndroid Build Coastguard Worker  target triple = "aarch64-apple-ios"
9*9880d681SAndroid Build Coastguard Worker  define void @defaultMapping() {
10*9880d681SAndroid Build Coastguard Worker  entry:
11*9880d681SAndroid Build Coastguard Worker    ret void
12*9880d681SAndroid Build Coastguard Worker  }
13*9880d681SAndroid Build Coastguard Worker  define void @defaultMappingVector() {
14*9880d681SAndroid Build Coastguard Worker  entry:
15*9880d681SAndroid Build Coastguard Worker    ret void
16*9880d681SAndroid Build Coastguard Worker  }
17*9880d681SAndroid Build Coastguard Worker  define void @defaultMapping1Repair() {
18*9880d681SAndroid Build Coastguard Worker  entry:
19*9880d681SAndroid Build Coastguard Worker    ret void
20*9880d681SAndroid Build Coastguard Worker  }
21*9880d681SAndroid Build Coastguard Worker  define void @defaultMapping2Repairs() {
22*9880d681SAndroid Build Coastguard Worker  entry:
23*9880d681SAndroid Build Coastguard Worker    ret void
24*9880d681SAndroid Build Coastguard Worker  }
25*9880d681SAndroid Build Coastguard Worker  define void @defaultMappingDefRepair() {
26*9880d681SAndroid Build Coastguard Worker  entry:
27*9880d681SAndroid Build Coastguard Worker    ret void
28*9880d681SAndroid Build Coastguard Worker  }
29*9880d681SAndroid Build Coastguard Worker  define void @phiPropagation(i32* %src, i32* %dst, i1 %cond) {
30*9880d681SAndroid Build Coastguard Worker  entry:
31*9880d681SAndroid Build Coastguard Worker    %srcVal = load i32, i32* %src
32*9880d681SAndroid Build Coastguard Worker    br i1 %cond, label %end, label %then
33*9880d681SAndroid Build Coastguard Worker  then:
34*9880d681SAndroid Build Coastguard Worker    %res = add i32 %srcVal, 36
35*9880d681SAndroid Build Coastguard Worker    br label %end
36*9880d681SAndroid Build Coastguard Worker  end:
37*9880d681SAndroid Build Coastguard Worker    %toStore = phi i32 [ %srcVal, %entry ], [ %res, %then ]
38*9880d681SAndroid Build Coastguard Worker    store i32 %toStore, i32* %dst
39*9880d681SAndroid Build Coastguard Worker    ret void
40*9880d681SAndroid Build Coastguard Worker  }
41*9880d681SAndroid Build Coastguard Worker  define void @defaultMappingUseRepairPhysReg() {
42*9880d681SAndroid Build Coastguard Worker  entry:
43*9880d681SAndroid Build Coastguard Worker    ret void
44*9880d681SAndroid Build Coastguard Worker  }
45*9880d681SAndroid Build Coastguard Worker  define void @defaultMappingDefRepairPhysReg() {
46*9880d681SAndroid Build Coastguard Worker  entry:
47*9880d681SAndroid Build Coastguard Worker    ret void
48*9880d681SAndroid Build Coastguard Worker  }
49*9880d681SAndroid Build Coastguard Worker  define void @greedyMappingOr() {
50*9880d681SAndroid Build Coastguard Worker  entry:
51*9880d681SAndroid Build Coastguard Worker    ret void
52*9880d681SAndroid Build Coastguard Worker  }
53*9880d681SAndroid Build Coastguard Worker  define void @greedyMappingOrWithConstraints() {
54*9880d681SAndroid Build Coastguard Worker  entry:
55*9880d681SAndroid Build Coastguard Worker    ret void
56*9880d681SAndroid Build Coastguard Worker  }
57*9880d681SAndroid Build Coastguard Worker...
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker---
60*9880d681SAndroid Build Coastguard Worker# Check that we assign a relevant register bank for %0.
61*9880d681SAndroid Build Coastguard Worker# Based on the type i32, this should be gpr.
62*9880d681SAndroid Build Coastguard Workername:            defaultMapping
63*9880d681SAndroid Build Coastguard WorkerisSSA:           true
64*9880d681SAndroid Build Coastguard Worker# CHECK:      registers:
65*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 0, class: gpr }
66*9880d681SAndroid Build Coastguard Workerregisters:
67*9880d681SAndroid Build Coastguard Worker  - { id: 0, class: _ }
68*9880d681SAndroid Build Coastguard Workerbody: |
69*9880d681SAndroid Build Coastguard Worker  bb.0.entry:
70*9880d681SAndroid Build Coastguard Worker    liveins: %x0
71*9880d681SAndroid Build Coastguard Worker    ; CHECK:      %0(32) = G_ADD i32 %x0
72*9880d681SAndroid Build Coastguard Worker    %0(32) = G_ADD i32 %x0, %x0
73*9880d681SAndroid Build Coastguard Worker...
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker---
76*9880d681SAndroid Build Coastguard Worker# Check that we assign a relevant register bank for %0.
77*9880d681SAndroid Build Coastguard Worker# Based on the type <2 x i32>, this should be fpr.
78*9880d681SAndroid Build Coastguard Worker# FPR is used for both floating point and vector registers.
79*9880d681SAndroid Build Coastguard Workername:            defaultMappingVector
80*9880d681SAndroid Build Coastguard WorkerisSSA:           true
81*9880d681SAndroid Build Coastguard Worker# CHECK:      registers:
82*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 0, class: fpr }
83*9880d681SAndroid Build Coastguard Workerregisters:
84*9880d681SAndroid Build Coastguard Worker  - { id: 0, class: _ }
85*9880d681SAndroid Build Coastguard Workerbody: |
86*9880d681SAndroid Build Coastguard Worker  bb.0.entry:
87*9880d681SAndroid Build Coastguard Worker    liveins: %d0
88*9880d681SAndroid Build Coastguard Worker    ; CHECK:      %0(32) = G_ADD <2 x i32> %d0
89*9880d681SAndroid Build Coastguard Worker    %0(32) = G_ADD <2 x i32> %d0, %d0
90*9880d681SAndroid Build Coastguard Worker...
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker---
93*9880d681SAndroid Build Coastguard Worker# Check that we repair the assignment for %0.
94*9880d681SAndroid Build Coastguard Worker# Indeed based on the source of the copy it should live
95*9880d681SAndroid Build Coastguard Worker# in FPR, but at the use, it should be GPR.
96*9880d681SAndroid Build Coastguard Workername:            defaultMapping1Repair
97*9880d681SAndroid Build Coastguard WorkerisSSA:           true
98*9880d681SAndroid Build Coastguard Worker# CHECK:      registers:
99*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 0, class: fpr }
100*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 1, class: gpr }
101*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 2, class: gpr }
102*9880d681SAndroid Build Coastguard Workerregisters:
103*9880d681SAndroid Build Coastguard Worker  - { id: 0, class: _ }
104*9880d681SAndroid Build Coastguard Worker  - { id: 1, class: _ }
105*9880d681SAndroid Build Coastguard Workerbody: |
106*9880d681SAndroid Build Coastguard Worker  bb.0.entry:
107*9880d681SAndroid Build Coastguard Worker    liveins: %s0, %x0
108*9880d681SAndroid Build Coastguard Worker    ; CHECK:           %0(32) = COPY %s0
109*9880d681SAndroid Build Coastguard Worker    ; CHECK-NEXT:      %2(32) = COPY %0
110*9880d681SAndroid Build Coastguard Worker    ; CHECK-NEXT:      %1(32) = G_ADD i32 %2, %x0
111*9880d681SAndroid Build Coastguard Worker    %0(32) = COPY %s0
112*9880d681SAndroid Build Coastguard Worker    %1(32) = G_ADD i32 %0, %x0
113*9880d681SAndroid Build Coastguard Worker...
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker# Check that we repair the assignment for %0 differently for both uses.
116*9880d681SAndroid Build Coastguard Workername:            defaultMapping2Repairs
117*9880d681SAndroid Build Coastguard WorkerisSSA:           true
118*9880d681SAndroid Build Coastguard Worker# CHECK:      registers:
119*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 0, class: fpr }
120*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 1, class: gpr }
121*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 2, class: gpr }
122*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 3, class: gpr }
123*9880d681SAndroid Build Coastguard Workerregisters:
124*9880d681SAndroid Build Coastguard Worker  - { id: 0, class: _ }
125*9880d681SAndroid Build Coastguard Worker  - { id: 1, class: _ }
126*9880d681SAndroid Build Coastguard Workerbody: |
127*9880d681SAndroid Build Coastguard Worker  bb.0.entry:
128*9880d681SAndroid Build Coastguard Worker    liveins: %s0, %x0
129*9880d681SAndroid Build Coastguard Worker    ; CHECK:           %0(32) = COPY %s0
130*9880d681SAndroid Build Coastguard Worker    ; CHECK-NEXT:      %2(32) = COPY %0
131*9880d681SAndroid Build Coastguard Worker    ; CHECK-NEXT:      %3(32) = COPY %0
132*9880d681SAndroid Build Coastguard Worker    ; CHECK-NEXT:      %1(32) = G_ADD i32 %2, %3
133*9880d681SAndroid Build Coastguard Worker    %0(32) = COPY %s0
134*9880d681SAndroid Build Coastguard Worker    %1(32) = G_ADD i32 %0, %0
135*9880d681SAndroid Build Coastguard Worker...
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker---
138*9880d681SAndroid Build Coastguard Worker# Check that we repair the definition of %1.
139*9880d681SAndroid Build Coastguard Worker# %1 is forced to be into FPR, but its definition actually
140*9880d681SAndroid Build Coastguard Worker# requires that it lives in GPR. Make sure regbankselect
141*9880d681SAndroid Build Coastguard Worker# fixes that.
142*9880d681SAndroid Build Coastguard Workername:            defaultMappingDefRepair
143*9880d681SAndroid Build Coastguard WorkerisSSA:           true
144*9880d681SAndroid Build Coastguard Worker# CHECK:      registers:
145*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 0, class: gpr }
146*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 1, class: fpr }
147*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 2, class: gpr }
148*9880d681SAndroid Build Coastguard Workerregisters:
149*9880d681SAndroid Build Coastguard Worker  - { id: 0, class: _ }
150*9880d681SAndroid Build Coastguard Worker  - { id: 1, class: fpr }
151*9880d681SAndroid Build Coastguard Workerbody: |
152*9880d681SAndroid Build Coastguard Worker  bb.0.entry:
153*9880d681SAndroid Build Coastguard Worker    liveins: %w0
154*9880d681SAndroid Build Coastguard Worker    ; CHECK:           %0(32) = COPY %w0
155*9880d681SAndroid Build Coastguard Worker    ; CHECK-NEXT:      %2(32) = G_ADD i32 %0, %w0
156*9880d681SAndroid Build Coastguard Worker    ; CHECK-NEXT:      %1(32) = COPY %2
157*9880d681SAndroid Build Coastguard Worker    %0(32) = COPY %w0
158*9880d681SAndroid Build Coastguard Worker    %1(32) = G_ADD i32 %0, %w0
159*9880d681SAndroid Build Coastguard Worker...
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker---
162*9880d681SAndroid Build Coastguard Worker# Check that we are able to propagate register banks from phis.
163*9880d681SAndroid Build Coastguard Workername:            phiPropagation
164*9880d681SAndroid Build Coastguard WorkerisSSA:           true
165*9880d681SAndroid Build Coastguard WorkertracksRegLiveness:   true
166*9880d681SAndroid Build Coastguard Worker# CHECK:      registers:
167*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 0, class: gpr32 }
168*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 1, class: gpr64sp }
169*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 2, class: gpr32 }
170*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 3, class: gpr }
171*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 4, class: gpr }
172*9880d681SAndroid Build Coastguard Workerregisters:
173*9880d681SAndroid Build Coastguard Worker  - { id: 0, class: gpr32 }
174*9880d681SAndroid Build Coastguard Worker  - { id: 1, class: gpr64sp }
175*9880d681SAndroid Build Coastguard Worker  - { id: 2, class: gpr32 }
176*9880d681SAndroid Build Coastguard Worker  - { id: 3, class: _ }
177*9880d681SAndroid Build Coastguard Worker  - { id: 4, class: _ }
178*9880d681SAndroid Build Coastguard Workerbody: |
179*9880d681SAndroid Build Coastguard Worker  bb.0.entry:
180*9880d681SAndroid Build Coastguard Worker    successors: %bb.2.end, %bb.1.then
181*9880d681SAndroid Build Coastguard Worker    liveins: %x0, %x1, %w2
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker    %0 = LDRWui killed %x0, 0 :: (load 4 from %ir.src)
184*9880d681SAndroid Build Coastguard Worker    %1 = COPY %x1
185*9880d681SAndroid Build Coastguard Worker    %2 = COPY %w2
186*9880d681SAndroid Build Coastguard Worker    TBNZW killed %2, 0, %bb.2.end
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Worker  bb.1.then:
189*9880d681SAndroid Build Coastguard Worker    successors: %bb.2.end
190*9880d681SAndroid Build Coastguard Worker    %3(32) = G_ADD i32 %0, %0
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Worker  bb.2.end:
193*9880d681SAndroid Build Coastguard Worker    %4(32) = PHI %0, %bb.0.entry, %3, %bb.1.then
194*9880d681SAndroid Build Coastguard Worker    STRWui killed %4, killed %1, 0 :: (store 4 into %ir.dst)
195*9880d681SAndroid Build Coastguard Worker    RET_ReallyLR
196*9880d681SAndroid Build Coastguard Worker...
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Worker---
199*9880d681SAndroid Build Coastguard Worker# Make sure we can repair physical register uses as well.
200*9880d681SAndroid Build Coastguard Workername:            defaultMappingUseRepairPhysReg
201*9880d681SAndroid Build Coastguard WorkerisSSA:           true
202*9880d681SAndroid Build Coastguard Worker# CHECK:      registers:
203*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 0, class: gpr }
204*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 1, class: gpr }
205*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 2, class: gpr }
206*9880d681SAndroid Build Coastguard Workerregisters:
207*9880d681SAndroid Build Coastguard Worker  - { id: 0, class: _ }
208*9880d681SAndroid Build Coastguard Worker  - { id: 1, class: _ }
209*9880d681SAndroid Build Coastguard Workerbody: |
210*9880d681SAndroid Build Coastguard Worker  bb.0.entry:
211*9880d681SAndroid Build Coastguard Worker    liveins: %w0, %s0
212*9880d681SAndroid Build Coastguard Worker    ; CHECK:           %0(32) = COPY %w0
213*9880d681SAndroid Build Coastguard Worker    ; CHECK-NEXT:      %2(32) = COPY %s0
214*9880d681SAndroid Build Coastguard Worker    ; CHECK-NEXT:      %1(32) = G_ADD i32 %0, %2
215*9880d681SAndroid Build Coastguard Worker    %0(32) = COPY %w0
216*9880d681SAndroid Build Coastguard Worker    %1(32) = G_ADD i32 %0, %s0
217*9880d681SAndroid Build Coastguard Worker...
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Worker---
220*9880d681SAndroid Build Coastguard Worker# Make sure we can repair physical register defs.
221*9880d681SAndroid Build Coastguard Workername:            defaultMappingDefRepairPhysReg
222*9880d681SAndroid Build Coastguard WorkerisSSA:           true
223*9880d681SAndroid Build Coastguard Worker# CHECK:      registers:
224*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 0, class: gpr }
225*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:   - { id: 1, class: gpr }
226*9880d681SAndroid Build Coastguard Workerregisters:
227*9880d681SAndroid Build Coastguard Worker  - { id: 0, class: _ }
228*9880d681SAndroid Build Coastguard Workerbody: |
229*9880d681SAndroid Build Coastguard Worker  bb.0.entry:
230*9880d681SAndroid Build Coastguard Worker    liveins: %w0
231*9880d681SAndroid Build Coastguard Worker    ; CHECK:           %0(32) = COPY %w0
232*9880d681SAndroid Build Coastguard Worker    ; CHECK-NEXT:      %1(32) = G_ADD i32 %0, %0
233*9880d681SAndroid Build Coastguard Worker    ; CHECK-NEXT:      %s0 = COPY %1
234*9880d681SAndroid Build Coastguard Worker    %0(32) = COPY %w0
235*9880d681SAndroid Build Coastguard Worker    %s0 = G_ADD i32 %0, %0
236*9880d681SAndroid Build Coastguard Worker...
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Worker---
239*9880d681SAndroid Build Coastguard Worker# Check that the greedy mode is able to switch the
240*9880d681SAndroid Build Coastguard Worker# G_OR instruction from fpr to gpr.
241*9880d681SAndroid Build Coastguard Workername:            greedyMappingOr
242*9880d681SAndroid Build Coastguard WorkerisSSA:           true
243*9880d681SAndroid Build Coastguard Worker# CHECK:      registers:
244*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:  - { id: 0, class: gpr }
245*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:  - { id: 1, class: gpr }
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Worker# Fast mode maps vector instruction on FPR.
248*9880d681SAndroid Build Coastguard Worker# FAST-NEXT:  - { id: 2, class: fpr }
249*9880d681SAndroid Build Coastguard Worker# Fast mode needs two extra copies.
250*9880d681SAndroid Build Coastguard Worker# FAST-NEXT:  - { id: 3, class: fpr }
251*9880d681SAndroid Build Coastguard Worker# FAST-NEXT:  - { id: 4, class: fpr }
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Worker# Greedy mode coalesce the computation on the GPR register
254*9880d681SAndroid Build Coastguard Worker# because it is the cheapest.
255*9880d681SAndroid Build Coastguard Worker# GREEDY-NEXT:  - { id: 2, class: gpr }
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Workerregisters:
258*9880d681SAndroid Build Coastguard Worker  - { id: 0, class: _ }
259*9880d681SAndroid Build Coastguard Worker  - { id: 1, class: _ }
260*9880d681SAndroid Build Coastguard Worker  - { id: 2, class: _ }
261*9880d681SAndroid Build Coastguard Workerbody: |
262*9880d681SAndroid Build Coastguard Worker  bb.0.entry:
263*9880d681SAndroid Build Coastguard Worker    liveins: %x0, %x1
264*9880d681SAndroid Build Coastguard Worker    ; CHECK: %0(64) = COPY %x0
265*9880d681SAndroid Build Coastguard Worker    ; CHECK-NEXT: %1(64) = COPY %x1
266*9880d681SAndroid Build Coastguard Worker
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Worker    ; Fast mode tries to reuse the source of the copy for the destination.
269*9880d681SAndroid Build Coastguard Worker    ; Now, the default mapping says that %0 and %1 need to be in FPR.
270*9880d681SAndroid Build Coastguard Worker    ; The repairing code insert two copies to materialize that.
271*9880d681SAndroid Build Coastguard Worker    ; FAST-NEXT: %3(64) = COPY %0
272*9880d681SAndroid Build Coastguard Worker    ; FAST-NEXT: %4(64) = COPY %1
273*9880d681SAndroid Build Coastguard Worker    ; The mapping of G_OR is on FPR.
274*9880d681SAndroid Build Coastguard Worker    ; FAST-NEXT: %2(64) = G_OR <2 x i32> %3, %4
275*9880d681SAndroid Build Coastguard Worker
276*9880d681SAndroid Build Coastguard Worker    ; Greedy mode remapped the instruction on the GPR bank.
277*9880d681SAndroid Build Coastguard Worker    ; GREEDY-NEXT: %2(64) = G_OR <2 x i32> %0, %1
278*9880d681SAndroid Build Coastguard Worker    %0(64) = COPY %x0
279*9880d681SAndroid Build Coastguard Worker    %1(64) = COPY %x1
280*9880d681SAndroid Build Coastguard Worker    %2(64) = G_OR <2 x i32> %0, %1
281*9880d681SAndroid Build Coastguard Worker...
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Worker---
284*9880d681SAndroid Build Coastguard Worker# Check that the greedy mode is able to switch the
285*9880d681SAndroid Build Coastguard Worker# G_OR instruction from fpr to gpr, while still honoring
286*9880d681SAndroid Build Coastguard Worker# %2 constraint.
287*9880d681SAndroid Build Coastguard Workername:            greedyMappingOrWithConstraints
288*9880d681SAndroid Build Coastguard WorkerisSSA:           true
289*9880d681SAndroid Build Coastguard Worker# CHECK:      registers:
290*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:  - { id: 0, class: gpr }
291*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:  - { id: 1, class: gpr }
292*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:  - { id: 2, class: fpr }
293*9880d681SAndroid Build Coastguard Worker
294*9880d681SAndroid Build Coastguard Worker# Fast mode maps vector instruction on FPR.
295*9880d681SAndroid Build Coastguard Worker# Fast mode needs two extra copies.
296*9880d681SAndroid Build Coastguard Worker# FAST-NEXT:  - { id: 3, class: fpr }
297*9880d681SAndroid Build Coastguard Worker# FAST-NEXT:  - { id: 4, class: fpr }
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Worker# Greedy mode coalesce the computation on the GPR register because it
300*9880d681SAndroid Build Coastguard Worker# is the cheapest, but will need one extra copy to materialize %2 into a FPR.
301*9880d681SAndroid Build Coastguard Worker# GREEDY-NEXT:  - { id: 3, class: gpr }
302*9880d681SAndroid Build Coastguard Worker
303*9880d681SAndroid Build Coastguard Workerregisters:
304*9880d681SAndroid Build Coastguard Worker  - { id: 0, class: _ }
305*9880d681SAndroid Build Coastguard Worker  - { id: 1, class: _ }
306*9880d681SAndroid Build Coastguard Worker  - { id: 2, class: fpr }
307*9880d681SAndroid Build Coastguard Workerbody: |
308*9880d681SAndroid Build Coastguard Worker  bb.0.entry:
309*9880d681SAndroid Build Coastguard Worker    liveins: %x0, %x1
310*9880d681SAndroid Build Coastguard Worker    ; CHECK: %0(64) = COPY %x0
311*9880d681SAndroid Build Coastguard Worker    ; CHECK-NEXT: %1(64) = COPY %x1
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard Worker    ; Fast mode tries to reuse the source of the copy for the destination.
315*9880d681SAndroid Build Coastguard Worker    ; Now, the default mapping says that %0 and %1 need to be in FPR.
316*9880d681SAndroid Build Coastguard Worker    ; The repairing code insert two copies to materialize that.
317*9880d681SAndroid Build Coastguard Worker    ; FAST-NEXT: %3(64) = COPY %0
318*9880d681SAndroid Build Coastguard Worker    ; FAST-NEXT: %4(64) = COPY %1
319*9880d681SAndroid Build Coastguard Worker    ; The mapping of G_OR is on FPR.
320*9880d681SAndroid Build Coastguard Worker    ; FAST-NEXT: %2(64) = G_OR <2 x i32> %3, %4
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Worker    ; Greedy mode remapped the instruction on the GPR bank.
323*9880d681SAndroid Build Coastguard Worker    ; GREEDY-NEXT: %3(64) = G_OR <2 x i32> %0, %1
324*9880d681SAndroid Build Coastguard Worker    ; We need to keep %2 into FPR because we do not know anything about it.
325*9880d681SAndroid Build Coastguard Worker    ; GREEDY-NEXT: %2(64) = COPY %3
326*9880d681SAndroid Build Coastguard Worker    %0(64) = COPY %x0
327*9880d681SAndroid Build Coastguard Worker    %1(64) = COPY %x1
328*9880d681SAndroid Build Coastguard Worker    %2(64) = G_OR <2 x i32> %0, %1
329*9880d681SAndroid Build Coastguard Worker...
330