197
197
#include " llvm/ADT/SmallVector.h"
198
198
#include " llvm/ADT/Statistic.h"
199
199
#include " llvm/CodeGen/LivePhysRegs.h"
200
+ #include " llvm/CodeGen/LiveRegUnits.h"
200
201
#include " llvm/CodeGen/MachineBasicBlock.h"
201
202
#include " llvm/CodeGen/MachineFrameInfo.h"
202
203
#include " llvm/CodeGen/MachineFunction.h"
@@ -988,7 +989,7 @@ void AArch64FrameLowering::emitZeroCallUsedRegs(BitVector RegsToZero,
988
989
}
989
990
}
990
991
991
- static void getLiveRegsForEntryMBB (LivePhysRegs &LiveRegs,
992
+ static void getLiveRegsForEntryMBB (LiveRegUnits &LiveRegs,
992
993
const MachineBasicBlock &MBB) {
993
994
const MachineFunction *MF = MBB.getParent ();
994
995
LiveRegs.addLiveIns (MBB);
@@ -1011,23 +1012,20 @@ static void getLiveRegsForEntryMBB(LivePhysRegs &LiveRegs,
1011
1012
// doesn't seem worth the benefit.
1012
1013
static Register findScratchNonCalleeSaveRegister (MachineBasicBlock *MBB) {
1013
1014
MachineFunction *MF = MBB->getParent ();
1014
-
1015
- // If MBB is an entry block, use X9 as the scratch register
1016
- if (&MF->front () == MBB)
1017
- return AArch64::X9;
1018
-
1019
1015
const AArch64Subtarget &Subtarget = MF->getSubtarget <AArch64Subtarget>();
1020
1016
const AArch64RegisterInfo &TRI = *Subtarget.getRegisterInfo ();
1021
- LivePhysRegs LiveRegs (TRI);
1017
+ LiveRegUnits LiveRegs (TRI);
1022
1018
getLiveRegsForEntryMBB (LiveRegs, *MBB);
1023
1019
1024
1020
// Prefer X9 since it was historically used for the prologue scratch reg.
1025
- const MachineRegisterInfo &MRI = MF->getRegInfo ();
1026
- if (LiveRegs.available (MRI, AArch64::X9))
1021
+ if (LiveRegs.available (AArch64::X9))
1027
1022
return AArch64::X9;
1028
1023
1029
- for (unsigned Reg : AArch64::GPR64RegClass) {
1030
- if (LiveRegs.available (MRI, Reg))
1024
+ BitVector Allocatable =
1025
+ TRI.getAllocatableSet (*MF, TRI.getRegClass (AArch64::GPR64RegClassID));
1026
+
1027
+ for (unsigned Reg : Allocatable.set_bits ()) {
1028
+ if (LiveRegs.available (Reg))
1031
1029
return Reg;
1032
1030
}
1033
1031
return AArch64::NoRegister;
@@ -1043,14 +1041,11 @@ bool AArch64FrameLowering::canUseAsPrologue(
1043
1041
const AArch64FunctionInfo *AFI = MF->getInfo <AArch64FunctionInfo>();
1044
1042
1045
1043
if (AFI->hasSwiftAsyncContext ()) {
1046
- const AArch64RegisterInfo &TRI = *Subtarget.getRegisterInfo ();
1047
- const MachineRegisterInfo &MRI = MF->getRegInfo ();
1048
- LivePhysRegs LiveRegs (TRI);
1044
+ LiveRegUnits LiveRegs (*RegInfo);
1049
1045
getLiveRegsForEntryMBB (LiveRegs, MBB);
1050
1046
// The StoreSwiftAsyncContext clobbers X16 and X17. Make sure they are
1051
1047
// available.
1052
- if (!LiveRegs.available (MRI, AArch64::X16) ||
1053
- !LiveRegs.available (MRI, AArch64::X17))
1048
+ if (!LiveRegs.available (AArch64::X16) || !LiveRegs.available (AArch64::X17))
1054
1049
return false ;
1055
1050
}
1056
1051
@@ -1603,7 +1598,7 @@ static void emitDefineCFAWithFP(MachineFunction &MF, MachineBasicBlock &MBB,
1603
1598
// / Collect live registers from the end of \p MI's parent up to (including) \p
1604
1599
// / MI in \p LiveRegs.
1605
1600
static void getLivePhysRegsUpTo (MachineInstr &MI, const TargetRegisterInfo &TRI,
1606
- LivePhysRegs &LiveRegs) {
1601
+ LiveRegUnits &LiveRegs) {
1607
1602
1608
1603
MachineBasicBlock &MBB = *MI.getParent ();
1609
1604
LiveRegs.addLiveOuts (MBB);
@@ -1641,7 +1636,7 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1641
1636
NonFrameStart->getFlag (MachineInstr::FrameSetup))
1642
1637
++NonFrameStart;
1643
1638
1644
- LivePhysRegs LiveRegs (*TRI);
1639
+ LiveRegUnits LiveRegs (*TRI);
1645
1640
if (NonFrameStart != MBB.end ()) {
1646
1641
getLivePhysRegsUpTo (*NonFrameStart, *TRI, LiveRegs);
1647
1642
// Ignore registers used for stack management for now.
@@ -1659,7 +1654,7 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1659
1654
make_range (MBB.instr_begin (), NonFrameStart->getIterator ())) {
1660
1655
for (auto &Op : MI.operands ())
1661
1656
if (Op.isReg () && Op.isDef ())
1662
- assert (! LiveRegs.contains (Op.getReg ()) &&
1657
+ assert (LiveRegs.available (Op.getReg ()) &&
1663
1658
" live register clobbered by inserted prologue instructions" );
1664
1659
}
1665
1660
});
@@ -4014,7 +4009,7 @@ MachineBasicBlock::iterator tryMergeAdjacentSTG(MachineBasicBlock::iterator II,
4014
4009
// FIXME : This approach of bailing out from merge is conservative in
4015
4010
// some ways like even if stg loops are not present after merge the
4016
4011
// insert list, this liveness check is done (which is not needed).
4017
- LivePhysRegs LiveRegs (*(MBB->getParent ()->getSubtarget ().getRegisterInfo ()));
4012
+ LiveRegUnits LiveRegs (*(MBB->getParent ()->getSubtarget ().getRegisterInfo ()));
4018
4013
LiveRegs.addLiveOuts (*MBB);
4019
4014
for (auto I = MBB->rbegin ();; ++I) {
4020
4015
MachineInstr &MI = *I;
@@ -4023,7 +4018,7 @@ MachineBasicBlock::iterator tryMergeAdjacentSTG(MachineBasicBlock::iterator II,
4023
4018
LiveRegs.stepBackward (*I);
4024
4019
}
4025
4020
InsertI++;
4026
- if (LiveRegs.contains (AArch64::NZCV))
4021
+ if (! LiveRegs.available (AArch64::NZCV))
4027
4022
return InsertI;
4028
4023
4029
4024
llvm::stable_sort (Instrs,
0 commit comments