@@ -4208,7 +4208,7 @@ struct ScopedScavengeOrSpill {
4208
4208
ScopedScavengeOrSpill (ScopedScavengeOrSpill &&) = delete ;
4209
4209
4210
4210
ScopedScavengeOrSpill (MachineFunction &MF, MachineBasicBlock &MBB,
4211
- MachineBasicBlock::iterator MBBI, Register &FreeReg,
4211
+ MachineBasicBlock::iterator MBBI,
4212
4212
Register SpillCandidate, const TargetRegisterClass &RC,
4213
4213
LiveRegUnits const &UsedRegs,
4214
4214
BitVector const &AllocatableRegs,
@@ -4226,17 +4226,22 @@ struct ScopedScavengeOrSpill {
4226
4226
*MaybeSpillFI = MFI.CreateSpillStackObject (TRI.getSpillSize (RC),
4227
4227
TRI.getSpillAlign (RC));
4228
4228
}
4229
- FreeReg = SpilledReg = SpillCandidate;
4229
+ FreeReg = SpillCandidate;
4230
4230
SpillFI = MaybeSpillFI->value ();
4231
- TII.storeRegToStackSlot (MBB, MBBI, SpilledReg , false , SpillFI, &RC, &TRI,
4231
+ TII.storeRegToStackSlot (MBB, MBBI, FreeReg , false , * SpillFI, &RC, &TRI,
4232
4232
Register ());
4233
4233
}
4234
4234
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 (); }
4236
4241
4237
4242
~ScopedScavengeOrSpill () {
4238
4243
if (hasSpilled ())
4239
- TII.loadRegFromStackSlot (MBB, MBBI, SpilledReg, SpillFI, &RC, &TRI,
4244
+ TII.loadRegFromStackSlot (MBB, MBBI, FreeReg, * SpillFI, &RC, &TRI,
4240
4245
Register ());
4241
4246
}
4242
4247
@@ -4246,8 +4251,8 @@ struct ScopedScavengeOrSpill {
4246
4251
const TargetRegisterClass &RC;
4247
4252
const AArch64InstrInfo &TII;
4248
4253
const TargetRegisterInfo &TRI;
4249
- Register SpilledReg = AArch64::NoRegister;
4250
- int SpillFI = - 1 ;
4254
+ Register FreeReg = AArch64::NoRegister;
4255
+ std::optional< int > SpillFI;
4251
4256
};
4252
4257
4253
4258
// / Emergency stack slots for expanding SPILL_PPR_TO_ZPR_SLOT_PSEUDO and
@@ -4291,22 +4296,20 @@ static void expandSpillPPRToZPRSlotPseudo(MachineBasicBlock &MBB,
4291
4296
auto *TII =
4292
4297
static_cast <const AArch64InstrInfo *>(MF.getSubtarget ().getInstrInfo ());
4293
4298
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 ,
4298
4301
isInPrologueOrEpilogue (MI) ? nullptr : &SpillSlots.ZPRSpillFI );
4299
4302
4300
4303
SmallVector<MachineInstr *, 2 > MachineInstrs;
4301
4304
const DebugLoc &DL = MI.getDebugLoc ();
4302
4305
MachineInstrs.push_back (BuildMI (MBB, MI, DL, TII->get (AArch64::CPY_ZPzI_B))
4303
- .addReg (ZPredReg, RegState::Define)
4306
+ .addReg (* ZPredReg, RegState::Define)
4304
4307
.add (MI.getOperand (0 ))
4305
4308
.addImm (1 )
4306
4309
.addImm (0 )
4307
4310
.getInstr ());
4308
4311
MachineInstrs.push_back (BuildMI (MBB, MI, DL, TII->get (AArch64::STR_ZXI))
4309
- .addReg (ZPredReg)
4312
+ .addReg (* ZPredReg)
4310
4313
.add (MI.getOperand (1 ))
4311
4314
.addImm (MI.getOperand (2 ).getImm ())
4312
4315
.setMemRefs (MI.memoperands ())
@@ -4338,61 +4341,56 @@ static bool expandFillPPRFromZPRSlotPseudo(MachineBasicBlock &MBB,
4338
4341
auto *TII =
4339
4342
static_cast <const AArch64InstrInfo *>(MF.getSubtarget ().getInstrInfo ());
4340
4343
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 ,
4345
4346
isInPrologueOrEpilogue (MI) ? nullptr : &SpillSlots.ZPRSpillFI );
4346
4347
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 ,
4351
4350
isInPrologueOrEpilogue (MI) ? nullptr : &SpillSlots.PPRSpillFI );
4352
4351
4353
4352
// Elide NZCV spills if we know it is not used.
4354
- Register NZCVSaveReg = AArch64::NoRegister;
4355
4353
bool IsNZCVUsed = !UsedRegs.available (AArch64::NZCV);
4356
- std::optional<ScopedScavengeOrSpill> FindGPRReg ;
4354
+ std::optional<ScopedScavengeOrSpill> NZCVSaveReg ;
4357
4355
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 ,
4361
4358
isInPrologueOrEpilogue (MI) ? nullptr : &SpillSlots.GPRSpillFI );
4362
4359
SmallVector<MachineInstr *, 4 > MachineInstrs;
4363
4360
const DebugLoc &DL = MI.getDebugLoc ();
4364
4361
MachineInstrs.push_back (BuildMI (MBB, MI, DL, TII->get (AArch64::LDR_ZXI))
4365
- .addReg (ZPredReg, RegState::Define)
4362
+ .addReg (* ZPredReg, RegState::Define)
4366
4363
.add (MI.getOperand (1 ))
4367
4364
.addImm (MI.getOperand (2 ).getImm ())
4368
4365
.setMemRefs (MI.memoperands ())
4369
4366
.getInstr ());
4370
4367
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 ());
4376
4374
MachineInstrs.push_back (BuildMI (MBB, MI, DL, TII->get (AArch64::PTRUE_B))
4377
- .addReg (PredReg, RegState::Define)
4375
+ .addReg (* PredReg, RegState::Define)
4378
4376
.addImm (31 ));
4379
4377
MachineInstrs.push_back (
4380
4378
BuildMI (MBB, MI, DL, TII->get (AArch64::CMPNE_PPzZI_B))
4381
4379
.addReg (MI.getOperand (0 ).getReg (), RegState::Define)
4382
- .addReg (PredReg)
4383
- .addReg (ZPredReg)
4380
+ .addReg (* PredReg)
4381
+ .addReg (* ZPredReg)
4384
4382
.addImm (0 )
4385
4383
.addReg (AArch64::NZCV, RegState::ImplicitDefine)
4386
4384
.getInstr ());
4387
4385
if (IsNZCVUsed)
4388
4386
MachineInstrs.push_back (BuildMI (MBB, MI, DL, TII->get (AArch64::MSR))
4389
4387
.addImm (AArch64SysReg::NZCV)
4390
- .addReg (NZCVSaveReg)
4388
+ .addReg (NZCVSaveReg-> freeRegister () )
4391
4389
.addReg (AArch64::NZCV, RegState::ImplicitDefine)
4392
4390
.getInstr ());
4393
4391
4394
4392
propagateFrameFlags (MI, MachineInstrs);
4395
- return FindPPR3bReg .hasSpilled ();
4393
+ return PredReg .hasSpilled ();
4396
4394
}
4397
4395
4398
4396
// / Expands all FILL_PPR_FROM_ZPR_SLOT_PSEUDO and SPILL_PPR_TO_ZPR_SLOT_PSEUDO
@@ -5510,7 +5508,6 @@ void AArch64FrameLowering::emitRemarks(
5510
5508
if (MI.getOpcode () != AArch64::SPILL_PPR_TO_ZPR_SLOT_PSEUDO &&
5511
5509
MI.getOpcode () != AArch64::FILL_PPR_FROM_ZPR_SLOT_PSEUDO &&
5512
5510
AArch64::PPRRegClass.contains (MI.getOperand (0 ).getReg ())) {
5513
- MI.dump ();
5514
5511
RegTy = StackAccess::PPR;
5515
5512
} else
5516
5513
RegTy = StackAccess::FPR;
0 commit comments