[llvm] [RISCV] fix SP recovery in a function epilogue (PR #110809)
Kito Cheng via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 2 03:03:31 PDT 2024
================
@@ -786,74 +799,90 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
--MBBI;
}
- const auto &CSI = getUnmanagedCSI(MF, MFI.getCalleeSavedInfo());
+ const auto &CSI = MFI.getCalleeSavedInfo();
// Skip to before the restores of scalar callee-saved registers
// FIXME: assumes exactly one instruction is used to restore each
// callee-saved register.
- auto LastFrameDestroy = MBBI;
- if (!CSI.empty())
- LastFrameDestroy = std::prev(MBBI, CSI.size());
+ auto LastFrameDestroy = std::prev(MBBI, getUnmanagedCSI(MF, CSI).size());
- uint64_t RealStackSize = getStackSizeWithRVVPadding(MF);
- uint64_t StackSize = RealStackSize - RVFI->getReservedSpillsSize();
- uint64_t FPOffset = RealStackSize - RVFI->getVarArgsSaveSize();
+ uint64_t FirstSPAdjustAmount = getFirstSPAdjustAmount(MF);
+ uint64_t RealStackSize = FirstSPAdjustAmount ? FirstSPAdjustAmount
+ : getStackSizeWithRVVPadding(MF);
+ uint64_t StackSize = FirstSPAdjustAmount ? FirstSPAdjustAmount
+ : getStackSizeWithRVVPadding(MF) -
+ RVFI->getReservedSpillsSize();
+ uint64_t FPOffset = FirstSPAdjustAmount ? FirstSPAdjustAmount
+ : getStackSizeWithRVVPadding(MF) -
+ RVFI->getVarArgsSaveSize();
uint64_t RVVStackSize = RVFI->getRVVStackSize();
- // Restore the stack pointer using the value of the frame pointer. Only
- // necessary if the stack pointer was modified, meaning the stack size is
- // unknown.
- //
- // In order to make sure the stack point is right through the EH region,
- // we also need to restore stack pointer from the frame pointer if we
- // don't preserve stack space within prologue/epilogue for outgoing variables,
- // normally it's just checking the variable sized object is present or not
- // is enough, but we also don't preserve that at prologue/epilogue when
- // have vector objects in stack.
- if (RI->hasStackRealignment(MF) || MFI.hasVarSizedObjects() ||
- !hasReservedCallFrame(MF)) {
- assert(hasFP(MF) && "frame pointer should not have been eliminated");
----------------
kito-cheng wrote:
Could you try to keep this assertion in some where if possible?
https://github.com/llvm/llvm-project/pull/110809
More information about the llvm-commits
mailing list