@@ -4208,7 +4208,7 @@ struct ScopedScavengeOrSpill {
42084208 ScopedScavengeOrSpill (ScopedScavengeOrSpill &&) = delete ;
42094209
42104210 ScopedScavengeOrSpill (MachineFunction &MF, MachineBasicBlock &MBB,
4211- MachineBasicBlock::iterator MBBI, Register &FreeReg,
4211+ MachineBasicBlock::iterator MBBI,
42124212 Register SpillCandidate, const TargetRegisterClass &RC,
42134213 LiveRegUnits const &UsedRegs,
42144214 BitVector const &AllocatableRegs,
@@ -4226,17 +4226,22 @@ struct ScopedScavengeOrSpill {
42264226 *MaybeSpillFI = MFI.CreateSpillStackObject (TRI.getSpillSize (RC),
42274227 TRI.getSpillAlign (RC));
42284228 }
4229- FreeReg = SpilledReg = SpillCandidate;
4229+ FreeReg = SpillCandidate;
42304230 SpillFI = MaybeSpillFI->value ();
4231- TII.storeRegToStackSlot (MBB, MBBI, SpilledReg , false , SpillFI, &RC, &TRI,
4231+ TII.storeRegToStackSlot (MBB, MBBI, FreeReg , false , * SpillFI, &RC, &TRI,
42324232 Register ());
42334233 }
42344234
4235- bool hasSpilled () const { return SpilledReg != AArch64::NoRegister; }
4235+ bool hasSpilled () const { return SpillFI.has_value (); }
4236+
4237+ // / Returns the free register (found from scavenging or spilling a register).
4238+ Register freeRegister () const { return FreeReg; }
4239+
4240+ Register operator *() const { return freeRegister (); }
42364241
42374242 ~ScopedScavengeOrSpill () {
42384243 if (hasSpilled ())
4239- TII.loadRegFromStackSlot (MBB, MBBI, SpilledReg, SpillFI, &RC, &TRI,
4244+ TII.loadRegFromStackSlot (MBB, MBBI, FreeReg, * SpillFI, &RC, &TRI,
42404245 Register ());
42414246 }
42424247
@@ -4246,8 +4251,8 @@ struct ScopedScavengeOrSpill {
42464251 const TargetRegisterClass &RC;
42474252 const AArch64InstrInfo &TII;
42484253 const TargetRegisterInfo &TRI;
4249- Register SpilledReg = AArch64::NoRegister;
4250- int SpillFI = - 1 ;
4254+ Register FreeReg = AArch64::NoRegister;
4255+ std::optional< int > SpillFI;
42514256};
42524257
42534258// / Emergency stack slots for expanding SPILL_PPR_TO_ZPR_SLOT_PSEUDO and
@@ -4291,22 +4296,20 @@ static void expandSpillPPRToZPRSlotPseudo(MachineBasicBlock &MBB,
42914296 auto *TII =
42924297 static_cast <const AArch64InstrInfo *>(MF.getSubtarget ().getInstrInfo ());
42934298
4294- Register ZPredReg = AArch64::NoRegister;
4295- ScopedScavengeOrSpill FindZPRReg (
4296- MF, MBB, MachineBasicBlock::iterator (MI), ZPredReg, AArch64::Z0,
4297- AArch64::ZPRRegClass, UsedRegs, SR.ZPRRegs ,
4299+ ScopedScavengeOrSpill ZPredReg (
4300+ MF, MBB, MI, AArch64::Z0, AArch64::ZPRRegClass, UsedRegs, SR.ZPRRegs ,
42984301 isInPrologueOrEpilogue (MI) ? nullptr : &SpillSlots.ZPRSpillFI );
42994302
43004303 SmallVector<MachineInstr *, 2 > MachineInstrs;
43014304 const DebugLoc &DL = MI.getDebugLoc ();
43024305 MachineInstrs.push_back (BuildMI (MBB, MI, DL, TII->get (AArch64::CPY_ZPzI_B))
4303- .addReg (ZPredReg, RegState::Define)
4306+ .addReg (* ZPredReg, RegState::Define)
43044307 .add (MI.getOperand (0 ))
43054308 .addImm (1 )
43064309 .addImm (0 )
43074310 .getInstr ());
43084311 MachineInstrs.push_back (BuildMI (MBB, MI, DL, TII->get (AArch64::STR_ZXI))
4309- .addReg (ZPredReg)
4312+ .addReg (* ZPredReg)
43104313 .add (MI.getOperand (1 ))
43114314 .addImm (MI.getOperand (2 ).getImm ())
43124315 .setMemRefs (MI.memoperands ())
@@ -4338,61 +4341,56 @@ static bool expandFillPPRFromZPRSlotPseudo(MachineBasicBlock &MBB,
43384341 auto *TII =
43394342 static_cast <const AArch64InstrInfo *>(MF.getSubtarget ().getInstrInfo ());
43404343
4341- Register ZPredReg = AArch64::NoRegister;
4342- ScopedScavengeOrSpill FindZPRReg (
4343- MF, MBB, MachineBasicBlock::iterator (MI), ZPredReg, AArch64::Z0,
4344- AArch64::ZPRRegClass, UsedRegs, SR.ZPRRegs ,
4344+ ScopedScavengeOrSpill ZPredReg (
4345+ MF, MBB, MI, AArch64::Z0, AArch64::ZPRRegClass, UsedRegs, SR.ZPRRegs ,
43454346 isInPrologueOrEpilogue (MI) ? nullptr : &SpillSlots.ZPRSpillFI );
43464347
4347- Register PredReg = AArch64::NoRegister;
4348- ScopedScavengeOrSpill FindPPR3bReg (
4349- MF, MBB, MachineBasicBlock::iterator (MI), PredReg, AArch64::P0,
4350- AArch64::PPR_3bRegClass, UsedRegs, SR.PPR3bRegs ,
4348+ ScopedScavengeOrSpill PredReg (
4349+ MF, MBB, MI, AArch64::P0, AArch64::PPR_3bRegClass, UsedRegs, SR.PPR3bRegs ,
43514350 isInPrologueOrEpilogue (MI) ? nullptr : &SpillSlots.PPRSpillFI );
43524351
43534352 // Elide NZCV spills if we know it is not used.
4354- Register NZCVSaveReg = AArch64::NoRegister;
43554353 bool IsNZCVUsed = !UsedRegs.available (AArch64::NZCV);
4356- std::optional<ScopedScavengeOrSpill> FindGPRReg ;
4354+ std::optional<ScopedScavengeOrSpill> NZCVSaveReg ;
43574355 if (IsNZCVUsed)
4358- FindGPRReg.emplace (
4359- MF, MBB, MachineBasicBlock::iterator (MI), NZCVSaveReg, AArch64::X0,
4360- AArch64::GPR64RegClass, UsedRegs, SR.GPRRegs ,
4356+ NZCVSaveReg.emplace (
4357+ MF, MBB, MI, AArch64::X0, AArch64::GPR64RegClass, UsedRegs, SR.GPRRegs ,
43614358 isInPrologueOrEpilogue (MI) ? nullptr : &SpillSlots.GPRSpillFI );
43624359 SmallVector<MachineInstr *, 4 > MachineInstrs;
43634360 const DebugLoc &DL = MI.getDebugLoc ();
43644361 MachineInstrs.push_back (BuildMI (MBB, MI, DL, TII->get (AArch64::LDR_ZXI))
4365- .addReg (ZPredReg, RegState::Define)
4362+ .addReg (* ZPredReg, RegState::Define)
43664363 .add (MI.getOperand (1 ))
43674364 .addImm (MI.getOperand (2 ).getImm ())
43684365 .setMemRefs (MI.memoperands ())
43694366 .getInstr ());
43704367 if (IsNZCVUsed)
4371- MachineInstrs.push_back (BuildMI (MBB, MI, DL, TII->get (AArch64::MRS))
4372- .addReg (NZCVSaveReg, RegState::Define)
4373- .addImm (AArch64SysReg::NZCV)
4374- .addReg (AArch64::NZCV, RegState::Implicit)
4375- .getInstr ());
4368+ MachineInstrs.push_back (
4369+ BuildMI (MBB, MI, DL, TII->get (AArch64::MRS))
4370+ .addReg (NZCVSaveReg->freeRegister (), RegState::Define)
4371+ .addImm (AArch64SysReg::NZCV)
4372+ .addReg (AArch64::NZCV, RegState::Implicit)
4373+ .getInstr ());
43764374 MachineInstrs.push_back (BuildMI (MBB, MI, DL, TII->get (AArch64::PTRUE_B))
4377- .addReg (PredReg, RegState::Define)
4375+ .addReg (* PredReg, RegState::Define)
43784376 .addImm (31 ));
43794377 MachineInstrs.push_back (
43804378 BuildMI (MBB, MI, DL, TII->get (AArch64::CMPNE_PPzZI_B))
43814379 .addReg (MI.getOperand (0 ).getReg (), RegState::Define)
4382- .addReg (PredReg)
4383- .addReg (ZPredReg)
4380+ .addReg (* PredReg)
4381+ .addReg (* ZPredReg)
43844382 .addImm (0 )
43854383 .addReg (AArch64::NZCV, RegState::ImplicitDefine)
43864384 .getInstr ());
43874385 if (IsNZCVUsed)
43884386 MachineInstrs.push_back (BuildMI (MBB, MI, DL, TII->get (AArch64::MSR))
43894387 .addImm (AArch64SysReg::NZCV)
4390- .addReg (NZCVSaveReg)
4388+ .addReg (NZCVSaveReg-> freeRegister () )
43914389 .addReg (AArch64::NZCV, RegState::ImplicitDefine)
43924390 .getInstr ());
43934391
43944392 propagateFrameFlags (MI, MachineInstrs);
4395- return FindPPR3bReg .hasSpilled ();
4393+ return PredReg .hasSpilled ();
43964394}
43974395
43984396// / Expands all FILL_PPR_FROM_ZPR_SLOT_PSEUDO and SPILL_PPR_TO_ZPR_SLOT_PSEUDO
@@ -5510,7 +5508,6 @@ void AArch64FrameLowering::emitRemarks(
55105508 if (MI.getOpcode () != AArch64::SPILL_PPR_TO_ZPR_SLOT_PSEUDO &&
55115509 MI.getOpcode () != AArch64::FILL_PPR_FROM_ZPR_SLOT_PSEUDO &&
55125510 AArch64::PPRRegClass.contains (MI.getOperand (0 ).getReg ())) {
5513- MI.dump ();
55145511 RegTy = StackAccess::PPR;
55155512 } else
55165513 RegTy = StackAccess::FPR;
0 commit comments