218218#include " llvm/Analysis/ValueTracking.h"
219219#include " llvm/CodeGen/CFIInstBuilder.h"
220220#include " llvm/CodeGen/LivePhysRegs.h"
221+ #include " llvm/CodeGen/LiveRegUnits.h"
221222#include " llvm/CodeGen/MachineBasicBlock.h"
222223#include " llvm/CodeGen/MachineFrameInfo.h"
223224#include " llvm/CodeGen/MachineFunction.h"
@@ -1002,7 +1003,7 @@ void AArch64FrameLowering::emitZeroCallUsedRegs(BitVector RegsToZero,
10021003 }
10031004}
10041005
1005- static void getLiveRegsForEntryMBB (LivePhysRegs &LiveRegs,
1006+ static void getLiveRegsForEntryMBB (LiveRegUnits &LiveRegs,
10061007 const MachineBasicBlock &MBB) {
10071008 const MachineFunction *MF = MBB.getParent ();
10081009 LiveRegs.addLiveIns (MBB);
@@ -1035,16 +1036,18 @@ static Register findScratchNonCalleeSaveRegister(MachineBasicBlock *MBB) {
10351036
10361037 const AArch64Subtarget &Subtarget = MF->getSubtarget <AArch64Subtarget>();
10371038 const AArch64RegisterInfo &TRI = *Subtarget.getRegisterInfo ();
1038- LivePhysRegs LiveRegs (TRI);
1039+ LiveRegUnits LiveRegs (TRI);
10391040 getLiveRegsForEntryMBB (LiveRegs, *MBB);
10401041
10411042 // Prefer X9 since it was historically used for the prologue scratch reg.
1042- const MachineRegisterInfo &MRI = MF->getRegInfo ();
1043- if (LiveRegs.available (MRI, AArch64::X9))
1043+ if (LiveRegs.available (AArch64::X9))
10441044 return AArch64::X9;
10451045
1046- for (unsigned Reg : AArch64::GPR64RegClass) {
1047- if (LiveRegs.available (MRI, Reg))
1046+ BitVector Allocatable =
1047+ TRI.getAllocatableSet (*MF, TRI.getRegClass (AArch64::GPR64RegClassID));
1048+
1049+ for (unsigned Reg : Allocatable.set_bits ()) {
1050+ if (LiveRegs.available (Reg))
10481051 return Reg;
10491052 }
10501053 return AArch64::NoRegister;
@@ -1060,14 +1063,11 @@ bool AArch64FrameLowering::canUseAsPrologue(
10601063 const AArch64FunctionInfo *AFI = MF->getInfo <AArch64FunctionInfo>();
10611064
10621065 if (AFI->hasSwiftAsyncContext ()) {
1063- const AArch64RegisterInfo &TRI = *Subtarget.getRegisterInfo ();
1064- const MachineRegisterInfo &MRI = MF->getRegInfo ();
1065- LivePhysRegs LiveRegs (TRI);
1066+ LiveRegUnits LiveRegs (*RegInfo);
10661067 getLiveRegsForEntryMBB (LiveRegs, MBB);
10671068 // The StoreSwiftAsyncContext clobbers X16 and X17. Make sure they are
10681069 // available.
1069- if (!LiveRegs.available (MRI, AArch64::X16) ||
1070- !LiveRegs.available (MRI, AArch64::X17))
1070+ if (!LiveRegs.available (AArch64::X16) || !LiveRegs.available (AArch64::X17))
10711071 return false ;
10721072 }
10731073
@@ -1668,8 +1668,8 @@ static void emitDefineCFAWithFP(MachineFunction &MF, MachineBasicBlock &MBB,
16681668#ifndef NDEBUG
16691669// / Collect live registers from the end of \p MI's parent up to (including) \p
16701670// / MI in \p LiveRegs.
1671- static void getLivePhysRegsUpTo (MachineInstr &MI, const TargetRegisterInfo &TRI,
1672- LivePhysRegs &LiveRegs) {
1671+ static void getLiveRegsUpTo (MachineInstr &MI, const TargetRegisterInfo &TRI,
1672+ LiveRegUnits &LiveRegs) {
16731673
16741674 MachineBasicBlock &MBB = *MI.getParent ();
16751675 LiveRegs.addLiveOuts (MBB);
@@ -1706,9 +1706,9 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
17061706 NonFrameStart->getFlag (MachineInstr::FrameSetup))
17071707 ++NonFrameStart;
17081708
1709- LivePhysRegs LiveRegs (*TRI);
1709+ LiveRegUnits LiveRegs (*TRI);
17101710 if (NonFrameStart != MBB.end ()) {
1711- getLivePhysRegsUpTo (*NonFrameStart, *TRI, LiveRegs);
1711+ getLiveRegsUpTo (*NonFrameStart, *TRI, LiveRegs);
17121712 // Ignore registers used for stack management for now.
17131713 LiveRegs.removeReg (AArch64::SP);
17141714 LiveRegs.removeReg (AArch64::X19);
@@ -1730,7 +1730,7 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
17301730 make_range (MBB.instr_begin (), NonFrameStart->getIterator ())) {
17311731 for (auto &Op : MI.operands ())
17321732 if (Op.isReg () && Op.isDef ())
1733- assert (!LiveRegs.contains (Op.getReg ()) &&
1733+ assert (!LiveRegs.available (Op.getReg ()) &&
17341734 " live register clobbered by inserted prologue instructions" );
17351735 }
17361736 });
@@ -4840,7 +4840,7 @@ MachineBasicBlock::iterator tryMergeAdjacentSTG(MachineBasicBlock::iterator II,
48404840 // FIXME : This approach of bailing out from merge is conservative in
48414841 // some ways like even if stg loops are not present after merge the
48424842 // insert list, this liveness check is done (which is not needed).
4843- LivePhysRegs LiveRegs (*(MBB->getParent ()->getSubtarget ().getRegisterInfo ()));
4843+ LiveRegUnits LiveRegs (*(MBB->getParent ()->getSubtarget ().getRegisterInfo ()));
48444844 LiveRegs.addLiveOuts (*MBB);
48454845 for (auto I = MBB->rbegin ();; ++I) {
48464846 MachineInstr &MI = *I;
@@ -4849,7 +4849,7 @@ MachineBasicBlock::iterator tryMergeAdjacentSTG(MachineBasicBlock::iterator II,
48494849 LiveRegs.stepBackward (*I);
48504850 }
48514851 InsertI++;
4852- if (LiveRegs.contains (AArch64::NZCV))
4852+ if (! LiveRegs.available (AArch64::NZCV))
48534853 return InsertI;
48544854
48554855 llvm::stable_sort (Instrs,
0 commit comments