[llvm-branch-commits] [llvm] [AArch64][PAC] Prevent PAUTH_EPILOGUE from overwriting live registers (PR #220191)
Jon Roelofs via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Sep 1 08:48:16 PDT 2026
================
@@ -11771,23 +11771,82 @@ unsigned llvm::getBLRCallOpcode(const MachineFunction &MF) {
void AArch64InstrInfo::createPauthEpilogueInstr(MachineBasicBlock &MBB,
DebugLoc DL) const {
MachineBasicBlock::iterator InsertPt = MBB.getFirstTerminator();
- auto Builder = BuildMI(MBB, InsertPt, DL, get(AArch64::PAUTH_EPILOGUE))
- .setMIFlag(MachineInstr::FrameDestroy);
-
MachineFunction &MF = *MBB.getParent();
+ MachineRegisterInfo &MRI = MF.getRegInfo();
const auto *AFI = MF.getInfo<AArch64FunctionInfo>();
auto &AFL = *static_cast<const AArch64FrameLowering *>(
MF.getSubtarget().getFrameLowering());
+
+ SmallVector<Register, 3> ImplicitDefs;
if (AFL.getArgumentStackToRestore(MF, MBB)) {
- Builder.addReg(AArch64::X17, RegState::ImplicitDefine);
- Builder.addReg(AArch64::X16, RegState::ImplicitDefine);
+ ImplicitDefs.push_back(AArch64::X17);
+ ImplicitDefs.push_back(AArch64::X16);
if (AFI->branchProtectionPAuthLR())
- Builder.addReg(AArch64::X15, RegState::ImplicitDefine);
- return;
+ ImplicitDefs.push_back(AArch64::X15);
+ } else if (AFI->branchProtectionPAuthLR() && !Subtarget.hasPAuthLR()) {
+ ImplicitDefs.push_back(AArch64::X16);
+ }
+
+ // If the scratch registers we plan using are alive at this point,
+ // try spilling them to other registers.
+
+ assert(MF.getProperties().hasTracksLiveness());
+ LivePhysRegs LiveRegs(TRI);
+ LiveRegs.addLiveOuts(MBB);
+ for (auto &MI : llvm::reverse(llvm::make_range(InsertPt, MBB.end())))
----------------
jroelofs wrote:
Is this intentionally skipping `InsertPt` itself, or should it be `llvm::make_range(InsertPt.getReverse(), MBB.rend())`?
https://github.com/llvm/llvm-project/pull/220191
More information about the llvm-branch-commits
mailing list