Skip to content

Commit 0a34cbe

Browse files
authored
AArch64: Use Register in FrameLowering (#165188)
1 parent b549ea7 commit 0a34cbe

File tree

3 files changed

+22
-23
lines changed

3 files changed

+22
-23
lines changed

llvm/lib/Target/AArch64/AArch64FrameLowering.cpp

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1466,7 +1466,7 @@ StackOffset AArch64FrameLowering::resolveFrameOffsetReference(
14661466
return FPOffset;
14671467
}
14681468
FrameReg = RegInfo->hasBasePointer(MF) ? RegInfo->getBaseRegister()
1469-
: (unsigned)AArch64::SP;
1469+
: MCRegister(AArch64::SP);
14701470

14711471
return SPOffset;
14721472
}
@@ -1589,30 +1589,30 @@ static bool invalidateRegisterPairing(unsigned Reg1, unsigned Reg2,
15891589
namespace {
15901590

15911591
struct RegPairInfo {
1592-
unsigned Reg1 = AArch64::NoRegister;
1593-
unsigned Reg2 = AArch64::NoRegister;
1592+
Register Reg1;
1593+
Register Reg2;
15941594
int FrameIdx;
15951595
int Offset;
15961596
enum RegType { GPR, FPR64, FPR128, PPR, ZPR, VG } Type;
15971597
const TargetRegisterClass *RC;
15981598

15991599
RegPairInfo() = default;
16001600

1601-
bool isPaired() const { return Reg2 != AArch64::NoRegister; }
1601+
bool isPaired() const { return Reg2.isValid(); }
16021602

16031603
bool isScalable() const { return Type == PPR || Type == ZPR; }
16041604
};
16051605

16061606
} // end anonymous namespace
16071607

1608-
unsigned findFreePredicateReg(BitVector &SavedRegs) {
1608+
MCRegister findFreePredicateReg(BitVector &SavedRegs) {
16091609
for (unsigned PReg = AArch64::P8; PReg <= AArch64::P15; ++PReg) {
16101610
if (SavedRegs.test(PReg)) {
16111611
unsigned PNReg = PReg - AArch64::P0 + AArch64::PN0;
1612-
return PNReg;
1612+
return MCRegister(PNReg);
16131613
}
16141614
}
1615-
return AArch64::NoRegister;
1615+
return MCRegister();
16161616
}
16171617

16181618
// The multivector LD/ST are available only for SME or SVE2p1 targets
@@ -1930,8 +1930,8 @@ bool AArch64FrameLowering::spillCalleeSavedRegisters(
19301930
}
19311931
bool PTrueCreated = false;
19321932
for (const RegPairInfo &RPI : llvm::reverse(RegPairs)) {
1933-
unsigned Reg1 = RPI.Reg1;
1934-
unsigned Reg2 = RPI.Reg2;
1933+
Register Reg1 = RPI.Reg1;
1934+
Register Reg2 = RPI.Reg2;
19351935
unsigned StrOpc;
19361936

19371937
// Issue sequence of spills for cs regs. The first spill may be converted
@@ -1967,7 +1967,7 @@ bool AArch64FrameLowering::spillCalleeSavedRegisters(
19671967
break;
19681968
}
19691969

1970-
unsigned X0Scratch = AArch64::NoRegister;
1970+
Register X0Scratch;
19711971
auto RestoreX0 = make_scope_exit([&] {
19721972
if (X0Scratch != AArch64::NoRegister)
19731973
BuildMI(MBB, MI, DL, TII.get(TargetOpcode::COPY), AArch64::X0)
@@ -2147,8 +2147,8 @@ bool AArch64FrameLowering::restoreCalleeSavedRegisters(
21472147

21482148
bool PTrueCreated = false;
21492149
for (const RegPairInfo &RPI : RegPairs) {
2150-
unsigned Reg1 = RPI.Reg1;
2151-
unsigned Reg2 = RPI.Reg2;
2150+
Register Reg1 = RPI.Reg1;
2151+
Register Reg2 = RPI.Reg2;
21522152

21532153
// Issue sequence of restores for cs regs. The last restore may be converted
21542154
// to a post-increment load later by emitEpilogue if the callee-save stack
@@ -2452,9 +2452,8 @@ void AArch64FrameLowering::determineCalleeSaves(MachineFunction &MF,
24522452
MachineFrameInfo &MFI = MF.getFrameInfo();
24532453
const MCPhysReg *CSRegs = MF.getRegInfo().getCalleeSavedRegs();
24542454

2455-
unsigned BasePointerReg = RegInfo->hasBasePointer(MF)
2456-
? RegInfo->getBaseRegister()
2457-
: (unsigned)AArch64::NoRegister;
2455+
MCRegister BasePointerReg =
2456+
RegInfo->hasBasePointer(MF) ? RegInfo->getBaseRegister() : MCRegister();
24582457

24592458
unsigned ExtraCSSpill = 0;
24602459
bool HasUnpairedGPR64 = false;
@@ -2464,7 +2463,7 @@ void AArch64FrameLowering::determineCalleeSaves(MachineFunction &MF,
24642463

24652464
// Figure out which callee-saved registers to save/restore.
24662465
for (unsigned i = 0; CSRegs[i]; ++i) {
2467-
const unsigned Reg = CSRegs[i];
2466+
const MCRegister Reg = CSRegs[i];
24682467

24692468
// Add the base pointer register to SavedRegs if it is callee-save.
24702469
if (Reg == BasePointerReg)
@@ -2478,7 +2477,7 @@ void AArch64FrameLowering::determineCalleeSaves(MachineFunction &MF,
24782477
}
24792478

24802479
bool RegUsed = SavedRegs.test(Reg);
2481-
unsigned PairedReg = AArch64::NoRegister;
2480+
MCRegister PairedReg;
24822481
const bool RegIsGPR64 = AArch64::GPR64RegClass.contains(Reg);
24832482
if (RegIsGPR64 || AArch64::FPR64RegClass.contains(Reg) ||
24842483
AArch64::FPR128RegClass.contains(Reg)) {
@@ -2530,8 +2529,8 @@ void AArch64FrameLowering::determineCalleeSaves(MachineFunction &MF,
25302529
AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
25312530
// Find a suitable predicate register for the multi-vector spill/fill
25322531
// instructions.
2533-
unsigned PnReg = findFreePredicateReg(SavedRegs);
2534-
if (PnReg != AArch64::NoRegister)
2532+
MCRegister PnReg = findFreePredicateReg(SavedRegs);
2533+
if (PnReg.isValid())
25352534
AFI->setPredicateRegForFillSpill(PnReg);
25362535
// If no free callee-save has been found assign one.
25372536
if (!AFI->getPredicateRegForFillSpill() &&
@@ -2566,7 +2565,7 @@ void AArch64FrameLowering::determineCalleeSaves(MachineFunction &MF,
25662565
unsigned PPRCSStackSize = 0;
25672566
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
25682567
for (unsigned Reg : SavedRegs.set_bits()) {
2569-
auto *RC = TRI->getMinimalPhysRegClass(Reg);
2568+
auto *RC = TRI->getMinimalPhysRegClass(MCRegister(Reg));
25702569
assert(RC && "expected register class!");
25712570
auto SpillSize = TRI->getSpillSize(*RC);
25722571
bool IsZPR = AArch64::ZPRRegClass.contains(Reg);
@@ -2608,7 +2607,7 @@ void AArch64FrameLowering::determineCalleeSaves(MachineFunction &MF,
26082607
LLVM_DEBUG({
26092608
dbgs() << "*** determineCalleeSaves\nSaved CSRs:";
26102609
for (unsigned Reg : SavedRegs.set_bits())
2611-
dbgs() << ' ' << printReg(Reg, RegInfo);
2610+
dbgs() << ' ' << printReg(MCRegister(Reg), RegInfo);
26122611
dbgs() << "\n";
26132612
});
26142613

llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -620,7 +620,7 @@ AArch64RegisterInfo::getCrossCopyRegClass(const TargetRegisterClass *RC) const {
620620
return RC;
621621
}
622622

623-
unsigned AArch64RegisterInfo::getBaseRegister() const { return AArch64::X19; }
623+
MCRegister AArch64RegisterInfo::getBaseRegister() const { return AArch64::X19; }
624624

625625
bool AArch64RegisterInfo::hasBasePointer(const MachineFunction &MF) const {
626626
const MachineFrameInfo &MFI = MF.getFrameInfo();

llvm/lib/Target/AArch64/AArch64RegisterInfo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ class AArch64RegisterInfo final : public AArch64GenRegisterInfo {
124124

125125
bool requiresVirtualBaseRegisters(const MachineFunction &MF) const override;
126126
bool hasBasePointer(const MachineFunction &MF) const;
127-
unsigned getBaseRegister() const;
127+
MCRegister getBaseRegister() const;
128128

129129
bool isArgumentRegister(const MachineFunction &MF,
130130
MCRegister Reg) const override;

0 commit comments

Comments
 (0)