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"
@@ -1007,7 +1008,7 @@ void AArch64FrameLowering::emitZeroCallUsedRegs(BitVector RegsToZero,
1007
1008
}
1008
1009
}
1009
1010
1010
- static void getLiveRegsForEntryMBB (LivePhysRegs &LiveRegs,
1011
+ static void getLiveRegsForEntryMBB (LiveRegUnits &LiveRegs,
1011
1012
const MachineBasicBlock &MBB) {
1012
1013
const MachineFunction *MF = MBB.getParent ();
1013
1014
LiveRegs.addLiveIns (MBB);
@@ -1040,16 +1041,18 @@ static Register findScratchNonCalleeSaveRegister(MachineBasicBlock *MBB) {
1040
1041
1041
1042
const AArch64Subtarget &Subtarget = MF->getSubtarget <AArch64Subtarget>();
1042
1043
const AArch64RegisterInfo &TRI = *Subtarget.getRegisterInfo ();
1043
- LivePhysRegs LiveRegs (TRI);
1044
+ LiveRegUnits LiveRegs (TRI);
1044
1045
getLiveRegsForEntryMBB (LiveRegs, *MBB);
1045
1046
1046
1047
// Prefer X9 since it was historically used for the prologue scratch reg.
1047
- const MachineRegisterInfo &MRI = MF->getRegInfo ();
1048
- if (LiveRegs.available (MRI, AArch64::X9))
1048
+ if (LiveRegs.available (AArch64::X9))
1049
1049
return AArch64::X9;
1050
1050
1051
- for (unsigned Reg : AArch64::GPR64RegClass) {
1052
- if (LiveRegs.available (MRI, Reg))
1051
+ BitVector Allocatable =
1052
+ TRI.getAllocatableSet (*MF, TRI.getRegClass (AArch64::GPR64RegClassID));
1053
+
1054
+ for (unsigned Reg : Allocatable.set_bits ()) {
1055
+ if (LiveRegs.available (Reg))
1053
1056
return Reg;
1054
1057
}
1055
1058
return AArch64::NoRegister;
@@ -1065,14 +1068,11 @@ bool AArch64FrameLowering::canUseAsPrologue(
1065
1068
const AArch64FunctionInfo *AFI = MF->getInfo <AArch64FunctionInfo>();
1066
1069
1067
1070
if (AFI->hasSwiftAsyncContext ()) {
1068
- const AArch64RegisterInfo &TRI = *Subtarget.getRegisterInfo ();
1069
- const MachineRegisterInfo &MRI = MF->getRegInfo ();
1070
- LivePhysRegs LiveRegs (TRI);
1071
+ LiveRegUnits LiveRegs (*RegInfo);
1071
1072
getLiveRegsForEntryMBB (LiveRegs, MBB);
1072
1073
// The StoreSwiftAsyncContext clobbers X16 and X17. Make sure they are
1073
1074
// available.
1074
- if (!LiveRegs.available (MRI, AArch64::X16) ||
1075
- !LiveRegs.available (MRI, AArch64::X17))
1075
+ if (!LiveRegs.available (AArch64::X16) || !LiveRegs.available (AArch64::X17))
1076
1076
return false ;
1077
1077
}
1078
1078
@@ -1664,7 +1664,7 @@ static void emitDefineCFAWithFP(MachineFunction &MF, MachineBasicBlock &MBB,
1664
1664
// / Collect live registers from the end of \p MI's parent up to (including) \p
1665
1665
// / MI in \p LiveRegs.
1666
1666
static void getLivePhysRegsUpTo (MachineInstr &MI, const TargetRegisterInfo &TRI,
1667
- LivePhysRegs &LiveRegs) {
1667
+ LiveRegUnits &LiveRegs) {
1668
1668
1669
1669
MachineBasicBlock &MBB = *MI.getParent ();
1670
1670
LiveRegs.addLiveOuts (MBB);
@@ -1702,7 +1702,7 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1702
1702
NonFrameStart->getFlag (MachineInstr::FrameSetup))
1703
1703
++NonFrameStart;
1704
1704
1705
- LivePhysRegs LiveRegs (*TRI);
1705
+ LiveRegUnits LiveRegs (*TRI);
1706
1706
if (NonFrameStart != MBB.end ()) {
1707
1707
getLivePhysRegsUpTo (*NonFrameStart, *TRI, LiveRegs);
1708
1708
// Ignore registers used for stack management for now.
@@ -1726,7 +1726,7 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1726
1726
make_range (MBB.instr_begin (), NonFrameStart->getIterator ())) {
1727
1727
for (auto &Op : MI.operands ())
1728
1728
if (Op.isReg () && Op.isDef ())
1729
- assert (! LiveRegs.contains (Op.getReg ()) &&
1729
+ assert (LiveRegs.available (Op.getReg ()) &&
1730
1730
" live register clobbered by inserted prologue instructions" );
1731
1731
}
1732
1732
});
@@ -4333,7 +4333,7 @@ MachineBasicBlock::iterator tryMergeAdjacentSTG(MachineBasicBlock::iterator II,
4333
4333
// FIXME : This approach of bailing out from merge is conservative in
4334
4334
// some ways like even if stg loops are not present after merge the
4335
4335
// insert list, this liveness check is done (which is not needed).
4336
- LivePhysRegs LiveRegs (*(MBB->getParent ()->getSubtarget ().getRegisterInfo ()));
4336
+ LiveRegUnits LiveRegs (*(MBB->getParent ()->getSubtarget ().getRegisterInfo ()));
4337
4337
LiveRegs.addLiveOuts (*MBB);
4338
4338
for (auto I = MBB->rbegin ();; ++I) {
4339
4339
MachineInstr &MI = *I;
@@ -4342,7 +4342,7 @@ MachineBasicBlock::iterator tryMergeAdjacentSTG(MachineBasicBlock::iterator II,
4342
4342
LiveRegs.stepBackward (*I);
4343
4343
}
4344
4344
InsertI++;
4345
- if (LiveRegs.contains (AArch64::NZCV))
4345
+ if (! LiveRegs.available (AArch64::NZCV))
4346
4346
return InsertI;
4347
4347
4348
4348
llvm::stable_sort (Instrs,
0 commit comments