Skip to content

Commit d618b14

Browse files
committed
Remove overly cautious code
Turns out LiveRegUnits will already reserve unsaved callee-saved registers so we don't need to worry about doing this here.
1 parent 29e484a commit d618b14

File tree

1 file changed

+22
-62
lines changed

1 file changed

+22
-62
lines changed

llvm/lib/Target/AArch64/AArch64FrameLowering.cpp

+22-62
Original file line numberDiff line numberDiff line change
@@ -4285,7 +4285,7 @@ static void expandSpillPPRToZPRSlotPseudo(MachineBasicBlock &MBB,
42854285
MachineInstr &MI,
42864286
const TargetRegisterInfo &TRI,
42874287
LiveRegUnits const &UsedRegs,
4288-
ScavengeableRegs const &Regs,
4288+
ScavengeableRegs const &SR,
42894289
EmergencyStackSlots &SpillSlots) {
42904290
MachineFunction &MF = *MBB.getParent();
42914291
auto *TII =
@@ -4294,7 +4294,7 @@ static void expandSpillPPRToZPRSlotPseudo(MachineBasicBlock &MBB,
42944294
Register ZPredReg = AArch64::NoRegister;
42954295
ScopedScavengeOrSpill FindZPRReg(
42964296
MF, MBB, MachineBasicBlock::iterator(MI), ZPredReg, AArch64::Z0,
4297-
AArch64::ZPRRegClass, UsedRegs, Regs.ZPRRegs,
4297+
AArch64::ZPRRegClass, UsedRegs, SR.ZPRRegs,
42984298
isInPrologueOrEpilogue(MI) ? nullptr : &SpillSlots.ZPRSpillFI);
42994299

43004300
SmallVector<MachineInstr *, 2> MachineInstrs;
@@ -4332,7 +4332,7 @@ static bool expandFillPPRFromZPRSlotPseudo(MachineBasicBlock &MBB,
43324332
MachineInstr &MI,
43334333
const TargetRegisterInfo &TRI,
43344334
LiveRegUnits const &UsedRegs,
4335-
ScavengeableRegs const &Regs,
4335+
ScavengeableRegs const &SR,
43364336
EmergencyStackSlots &SpillSlots) {
43374337
MachineFunction &MF = *MBB.getParent();
43384338
auto *TII =
@@ -4341,13 +4341,13 @@ static bool expandFillPPRFromZPRSlotPseudo(MachineBasicBlock &MBB,
43414341
Register ZPredReg = AArch64::NoRegister;
43424342
ScopedScavengeOrSpill FindZPRReg(
43434343
MF, MBB, MachineBasicBlock::iterator(MI), ZPredReg, AArch64::Z0,
4344-
AArch64::ZPRRegClass, UsedRegs, Regs.ZPRRegs,
4344+
AArch64::ZPRRegClass, UsedRegs, SR.ZPRRegs,
43454345
isInPrologueOrEpilogue(MI) ? nullptr : &SpillSlots.ZPRSpillFI);
43464346

43474347
Register PredReg = AArch64::NoRegister;
43484348
ScopedScavengeOrSpill FindPPR3bReg(
43494349
MF, MBB, MachineBasicBlock::iterator(MI), PredReg, AArch64::P0,
4350-
AArch64::PPR_3bRegClass, UsedRegs, Regs.PPR3bRegs,
4350+
AArch64::PPR_3bRegClass, UsedRegs, SR.PPR3bRegs,
43514351
isInPrologueOrEpilogue(MI) ? nullptr : &SpillSlots.PPRSpillFI);
43524352

43534353
// Elide NZCV spills if we know it is not used.
@@ -4357,7 +4357,7 @@ static bool expandFillPPRFromZPRSlotPseudo(MachineBasicBlock &MBB,
43574357
if (IsNZCVUsed)
43584358
FindGPRReg.emplace(
43594359
MF, MBB, MachineBasicBlock::iterator(MI), NZCVSaveReg, AArch64::X0,
4360-
AArch64::GPR64RegClass, UsedRegs, Regs.GPRRegs,
4360+
AArch64::GPR64RegClass, UsedRegs, SR.GPRRegs,
43614361
isInPrologueOrEpilogue(MI) ? nullptr : &SpillSlots.GPRSpillFI);
43624362
SmallVector<MachineInstr *, 4> MachineInstrs;
43634363
const DebugLoc &DL = MI.getDebugLoc();
@@ -4397,27 +4397,23 @@ static bool expandFillPPRFromZPRSlotPseudo(MachineBasicBlock &MBB,
43974397

43984398
/// Expands all FILL_PPR_FROM_ZPR_SLOT_PSEUDO and SPILL_PPR_TO_ZPR_SLOT_PSEUDO
43994399
/// operations within the MachineBasicBlock \p MBB.
4400-
static bool expandSMEPPRToZPRSpillPseudos(
4401-
MachineBasicBlock &MBB, const TargetRegisterInfo &TRI,
4402-
ScavengeableRegs const &ScavengeableRegsBody,
4403-
ScavengeableRegs const &ScavengeableRegsFrameSetup,
4404-
EmergencyStackSlots &SpillSlots) {
4400+
static bool expandSMEPPRToZPRSpillPseudos(MachineBasicBlock &MBB,
4401+
const TargetRegisterInfo &TRI,
4402+
ScavengeableRegs const &SR,
4403+
EmergencyStackSlots &SpillSlots) {
44054404
LiveRegUnits UsedRegs(TRI);
44064405
UsedRegs.addLiveOuts(MBB);
44074406
bool HasPPRSpills = false;
44084407
for (MachineInstr &MI : make_early_inc_range(reverse(MBB))) {
44094408
UsedRegs.stepBackward(MI);
4410-
ScavengeableRegs const &Regs = isInPrologueOrEpilogue(MI)
4411-
? ScavengeableRegsFrameSetup
4412-
: ScavengeableRegsBody;
44134409
switch (MI.getOpcode()) {
44144410
case AArch64::FILL_PPR_FROM_ZPR_SLOT_PSEUDO:
4415-
HasPPRSpills |= expandFillPPRFromZPRSlotPseudo(MBB, MI, TRI, UsedRegs,
4416-
Regs, SpillSlots);
4411+
HasPPRSpills |= expandFillPPRFromZPRSlotPseudo(MBB, MI, TRI, UsedRegs, SR,
4412+
SpillSlots);
44174413
MI.eraseFromParent();
44184414
break;
44194415
case AArch64::SPILL_PPR_TO_ZPR_SLOT_PSEUDO:
4420-
expandSpillPPRToZPRSlotPseudo(MBB, MI, TRI, UsedRegs, Regs, SpillSlots);
4416+
expandSpillPPRToZPRSlotPseudo(MBB, MI, TRI, UsedRegs, SR, SpillSlots);
44214417
MI.eraseFromParent();
44224418
break;
44234419
default:
@@ -4434,56 +4430,21 @@ void AArch64FrameLowering::processFunctionBeforeFrameFinalized(
44344430
AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
44354431
const TargetSubtargetInfo &TSI = MF.getSubtarget();
44364432
const TargetRegisterInfo &TRI = *TSI.getRegisterInfo();
4437-
if (AFI->hasStackFrame() && TRI.getSpillSize(AArch64::PPRRegClass) == 16) {
4438-
// If predicates spills are 16-bytes we may need to expand
4439-
// SPILL_PPR_TO_ZPR_SLOT_PSEUDO/FILL_PPR_FROM_ZPR_SLOT_PSEUDO.
4440-
4441-
const uint32_t *CSRMask =
4442-
TRI.getCallPreservedMask(MF, MF.getFunction().getCallingConv());
44434433

4434+
// If predicates spills are 16-bytes we may need to expand
4435+
// SPILL_PPR_TO_ZPR_SLOT_PSEUDO/FILL_PPR_FROM_ZPR_SLOT_PSEUDO.
4436+
if (AFI->hasStackFrame() && TRI.getSpillSize(AArch64::PPRRegClass) == 16) {
44444437
auto ComputeScavengeableRegisters = [&](unsigned RegClassID) {
44454438
BitVector Regs = TRI.getAllocatableSet(MF, TRI.getRegClass(RegClassID));
4446-
if (CSRMask)
4447-
Regs.clearBitsInMask(CSRMask);
44484439
assert(Regs.count() > 0 && "Expected scavengeable registers");
44494440
return Regs;
44504441
};
44514442

4452-
// Registers free to scavenge in the prologue/epilogue.
4453-
ScavengeableRegs ScavengeableRegsFrameSetup;
4454-
ScavengeableRegsFrameSetup.ZPRRegs =
4455-
ComputeScavengeableRegisters(AArch64::ZPRRegClassID);
4443+
ScavengeableRegs SR{};
4444+
SR.ZPRRegs = ComputeScavengeableRegisters(AArch64::ZPRRegClassID);
44564445
// Only p0-7 are possible as the second operand of cmpne (needed for fills).
4457-
ScavengeableRegsFrameSetup.PPR3bRegs =
4458-
ComputeScavengeableRegisters(AArch64::PPR_3bRegClassID);
4459-
ScavengeableRegsFrameSetup.GPRRegs =
4460-
ComputeScavengeableRegisters(AArch64::GPR64RegClassID);
4461-
4462-
const MachineFrameInfo &MFI = MF.getFrameInfo();
4463-
assert(MFI.isCalleeSavedInfoValid());
4464-
const std::vector<CalleeSavedInfo> &CSI = MFI.getCalleeSavedInfo();
4465-
auto MarkSavedRegistersAsAvailable =
4466-
[&, &Reserved = MF.getRegInfo().getReservedRegs()](
4467-
BitVector &Regs, unsigned RegClassID) {
4468-
for (const CalleeSavedInfo &I : CSI)
4469-
if (!Reserved[I.getReg()] &&
4470-
TRI.getRegClass(RegClassID)->contains(I.getReg()))
4471-
Regs.set(I.getReg());
4472-
};
4473-
4474-
// Registers free to scavenge in the function body.
4475-
ScavengeableRegs ScavengeableRegsBody = ScavengeableRegsFrameSetup;
4476-
MarkSavedRegistersAsAvailable(ScavengeableRegsBody.ZPRRegs,
4477-
AArch64::ZPRRegClassID);
4478-
MarkSavedRegistersAsAvailable(ScavengeableRegsBody.PPR3bRegs,
4479-
AArch64::PPR_3bRegClassID);
4480-
MarkSavedRegistersAsAvailable(ScavengeableRegsBody.GPRRegs,
4481-
AArch64::GPR64RegClassID);
4482-
4483-
// p4 (CSR) is reloaded last in the epilogue, so if it is saved, it can be
4484-
// used to reload other predicates.
4485-
if (ScavengeableRegsBody.PPR3bRegs[AArch64::P4])
4486-
ScavengeableRegsFrameSetup.PPR3bRegs.set(AArch64::P4);
4446+
SR.PPR3bRegs = ComputeScavengeableRegisters(AArch64::PPR_3bRegClassID);
4447+
SR.GPRRegs = ComputeScavengeableRegisters(AArch64::GPR64RegClassID);
44874448

44884449
EmergencyStackSlots SpillSlots;
44894450
for (MachineBasicBlock &MBB : MF) {
@@ -4493,9 +4454,8 @@ void AArch64FrameLowering::processFunctionBeforeFrameFinalized(
44934454
// most two expansion passes, as spilling/filling a predicate in the range
44944455
// p0-p7 never requires spilling another predicate.
44954456
for (int Pass = 0; Pass < 2; Pass++) {
4496-
bool HasPPRSpills = expandSMEPPRToZPRSpillPseudos(
4497-
MBB, TRI, ScavengeableRegsBody, ScavengeableRegsFrameSetup,
4498-
SpillSlots);
4457+
bool HasPPRSpills =
4458+
expandSMEPPRToZPRSpillPseudos(MBB, TRI, SR, SpillSlots);
44994459
assert((Pass == 0 || !HasPPRSpills) && "Did not expect PPR spills");
45004460
if (!HasPPRSpills)
45014461
break;

0 commit comments

Comments
 (0)