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