@@ -356,14 +356,15 @@ class AArch64InstructionSelector : public InstructionSelector {
356
356
getExtendTypeForInst (MachineInstr &MI, MachineRegisterInfo &MRI,
357
357
bool IsLoadStore = false ) const ;
358
358
359
- // / Instructions that accept extend modifiers like UXTW expect the register
360
- // / being extended to be a GPR32. Narrow ExtReg to a 32-bit register using a
361
- // / subregister copy if necessary. Return either ExtReg, or the result of the
362
- // / new copy.
363
- Register narrowExtendRegIfNeeded (Register ExtReg,
364
- MachineIRBuilder &MIB) const ;
365
- Register widenGPRBankRegIfNeeded (Register Reg, unsigned Size,
366
- MachineIRBuilder &MIB) const ;
359
+ // / Move \p Reg to \p RC if \p Reg is not already on \p RC.
360
+ // /
361
+ // / \returns Either \p Reg if no change was necessary, or the new register
362
+ // / created by moving \p Reg.
363
+ // /
364
+ // / Note: This uses emitCopy right now.
365
+ Register moveScalarRegClass (Register Reg, const TargetRegisterClass &RC,
366
+ MachineIRBuilder &MIB) const ;
367
+
367
368
ComplexRendererFns selectArithExtendedRegister (MachineOperand &Root) const ;
368
369
369
370
void renderTruncImm (MachineInstrBuilder &MIB, const MachineInstr &MI,
@@ -1353,10 +1354,10 @@ MachineInstr *AArch64InstructionSelector::emitTestBit(
1353
1354
// TBNZW work.
1354
1355
bool UseWReg = Bit < 32 ;
1355
1356
unsigned NecessarySize = UseWReg ? 32 : 64 ;
1356
- if (Size < NecessarySize)
1357
- TestReg = widenGPRBankRegIfNeeded (TestReg, NecessarySize, MIB);
1358
- else if (Size > NecessarySize)
1359
- TestReg = narrowExtendRegIfNeeded (TestReg, MIB);
1357
+ if (Size != NecessarySize)
1358
+ TestReg = moveScalarRegClass (
1359
+ TestReg, UseWReg ? AArch64::GPR32RegClass : AArch64::GPR64RegClass,
1360
+ MIB);
1360
1361
1361
1362
static const unsigned OpcTable[2 ][2 ] = {{AArch64::TBZX, AArch64::TBNZX},
1362
1363
{AArch64::TBZW, AArch64::TBNZW}};
@@ -5152,7 +5153,7 @@ AArch64InstructionSelector::selectExtendedSHL(
5152
5153
5153
5154
// Need a 32-bit wide register here.
5154
5155
MachineIRBuilder MIB (*MRI.getVRegDef (Root.getReg ()));
5155
- OffsetReg = narrowExtendRegIfNeeded (OffsetReg, MIB);
5156
+ OffsetReg = moveScalarRegClass (OffsetReg, AArch64::GPR32RegClass , MIB);
5156
5157
}
5157
5158
5158
5159
// We can use the LHS of the GEP as the base, and the LHS of the shift as an
@@ -5372,8 +5373,8 @@ AArch64InstructionSelector::selectAddrModeWRO(MachineOperand &Root,
5372
5373
5373
5374
// Need a 32-bit wide register.
5374
5375
MachineIRBuilder MIB (*PtrAdd);
5375
- Register ExtReg =
5376
- narrowExtendRegIfNeeded (OffsetInst-> getOperand ( 1 ). getReg () , MIB);
5376
+ Register ExtReg = moveScalarRegClass (OffsetInst-> getOperand ( 1 ). getReg (),
5377
+ AArch64::GPR32RegClass , MIB);
5377
5378
unsigned SignExtend = Ext == AArch64_AM::SXTW;
5378
5379
5379
5380
// Base is LHS, offset is ExtReg.
@@ -5647,67 +5648,21 @@ AArch64_AM::ShiftExtendType AArch64InstructionSelector::getExtendTypeForInst(
5647
5648
}
5648
5649
}
5649
5650
5650
- Register AArch64InstructionSelector::narrowExtendRegIfNeeded (
5651
- Register ExtReg , MachineIRBuilder &MIB) const {
5651
+ Register AArch64InstructionSelector::moveScalarRegClass (
5652
+ Register Reg, const TargetRegisterClass &RC , MachineIRBuilder &MIB) const {
5652
5653
MachineRegisterInfo &MRI = *MIB.getMRI ();
5653
- if (MRI.getType (ExtReg).getSizeInBits () == 32 )
5654
- return ExtReg;
5655
-
5656
- // Insert a copy to move ExtReg to GPR32.
5657
- Register NarrowReg = MRI.createVirtualRegister (&AArch64::GPR32RegClass);
5658
- auto Copy = MIB.buildCopy ({NarrowReg}, {ExtReg});
5654
+ auto Ty = MRI.getType (Reg);
5655
+ assert (!Ty.isVector () && " Expected scalars only!" );
5656
+ if (Ty.getSizeInBits () == TRI.getRegSizeInBits (RC))
5657
+ return Reg;
5659
5658
5660
- // Select the copy into a subregister copy.
5659
+ // Create a copy and immediately select it.
5660
+ // FIXME: We should have an emitCopy function?
5661
+ auto Copy = MIB.buildCopy ({&RC}, {Reg});
5661
5662
selectCopy (*Copy, TII, MRI, TRI, RBI);
5662
5663
return Copy.getReg (0 );
5663
5664
}
5664
5665
5665
- Register AArch64InstructionSelector::widenGPRBankRegIfNeeded (
5666
- Register Reg, unsigned WideSize, MachineIRBuilder &MIB) const {
5667
- assert (WideSize >= 8 && " WideSize is smaller than all possible registers?" );
5668
- MachineRegisterInfo &MRI = *MIB.getMRI ();
5669
- unsigned NarrowSize = MRI.getType (Reg).getSizeInBits ();
5670
- assert (WideSize >= NarrowSize &&
5671
- " WideSize cannot be smaller than NarrowSize!" );
5672
-
5673
- // If the sizes match, just return the register.
5674
- //
5675
- // If NarrowSize is an s1, then we can select it to any size, so we'll treat
5676
- // it as a don't care.
5677
- if (NarrowSize == WideSize || NarrowSize == 1 )
5678
- return Reg;
5679
-
5680
- // Now check the register classes.
5681
- const RegisterBank *RB = RBI.getRegBank (Reg, MRI, TRI);
5682
- const TargetRegisterClass *OrigRC = getMinClassForRegBank (*RB, NarrowSize);
5683
- const TargetRegisterClass *WideRC = getMinClassForRegBank (*RB, WideSize);
5684
- assert (OrigRC && " Could not determine narrow RC?" );
5685
- assert (WideRC && " Could not determine wide RC?" );
5686
-
5687
- // If the sizes differ, but the register classes are the same, there is no
5688
- // need to insert a SUBREG_TO_REG.
5689
- //
5690
- // For example, an s8 that's supposed to be a GPR will be selected to either
5691
- // a GPR32 or a GPR64 register. Note that this assumes that the s8 will
5692
- // always end up on a GPR32.
5693
- if (OrigRC == WideRC)
5694
- return Reg;
5695
-
5696
- // We have two different register classes. Insert a SUBREG_TO_REG.
5697
- unsigned SubReg = 0 ;
5698
- getSubRegForClass (OrigRC, TRI, SubReg);
5699
- assert (SubReg && " Couldn't determine subregister?" );
5700
-
5701
- // Build the SUBREG_TO_REG and return the new, widened register.
5702
- auto SubRegToReg =
5703
- MIB.buildInstr (AArch64::SUBREG_TO_REG, {WideRC}, {})
5704
- .addImm (0 )
5705
- .addUse (Reg)
5706
- .addImm (SubReg);
5707
- constrainSelectedInstRegOperands (*SubRegToReg, TII, TRI, RBI);
5708
- return SubRegToReg.getReg (0 );
5709
- }
5710
-
5711
5666
// / Select an "extended register" operand. This operand folds in an extend
5712
5667
// / followed by an optional left shift.
5713
5668
InstructionSelector::ComplexRendererFns
@@ -5768,7 +5723,7 @@ AArch64InstructionSelector::selectArithExtendedRegister(
5768
5723
// We require a GPR32 here. Narrow the ExtReg if needed using a subregister
5769
5724
// copy.
5770
5725
MachineIRBuilder MIB (*RootDef);
5771
- ExtReg = narrowExtendRegIfNeeded (ExtReg, MIB);
5726
+ ExtReg = moveScalarRegClass (ExtReg, AArch64::GPR32RegClass , MIB);
5772
5727
5773
5728
return {{[=](MachineInstrBuilder &MIB) { MIB.addUse (ExtReg); },
5774
5729
[=](MachineInstrBuilder &MIB) {
0 commit comments