[llvm] [ARM] Optimise non-ABI frame pointers (PR #110286)
Oliver Stannard via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 25 03:17:41 PDT 2024
================
@@ -492,17 +492,16 @@ ARMSubtarget::getPushPopSplitVariation(const MachineFunction &MF) const {
const std::vector<CalleeSavedInfo> CSI =
MF.getFrameInfo().getCalleeSavedInfo();
- // Returns SplitR7 if the frame setup must be split into two separate pushes
- // of r0-r7,lr and another containing r8-r11 (+r12 if necessary). This is
- // always required on Thumb1-only targets, as the push and pop instructions
- // can't access the high registers. This is also required when R7 is the frame
- // pointer and frame pointer elimiination is disabled, or branch signing is
- // enabled and AAPCS is disabled.
- if ((MF.getInfo<ARMFunctionInfo>()->shouldSignReturnAddress() &&
- !createAAPCSFrameChain()) ||
- (getFramePointerReg() == ARM::R7 &&
- MF.getTarget().Options.DisableFramePointerElim(MF)) ||
- isThumb1Only())
+ // Thumb1 always splits the pushes at R7, because the Thumb1 push instruction
+ // cannot use high registers except for lr.
+ if (isThumb1Only())
+ return SplitR7;
+
+ // If R7 is the frame pointer, we must split at R7 to ensure that the
+ // previous frame pointer (R7) and return address (LR) are adjacent on the
+ // stack, to form a valid frame record.
+ if (getFramePointerReg() == ARM::R7 &&
+ MF.getTarget().Options.DisableFramePointerElim(MF))
----------------
ostannard wrote:
Done, and expanded `pacbti-m-frame-chain.ll` to test that case.
https://github.com/llvm/llvm-project/pull/110286
More information about the llvm-commits
mailing list