@@ -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