[PATCH] D68542: [Mips] Always save RA when disabling frame pointer elimination
James Clarke via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sat Oct 5 12:55:44 PDT 2019
jrtc27 created this revision.
jrtc27 added a reviewer: atanasyan.
Herald added subscribers: llvm-commits, hiraditya, arichardson, sdardis.
Herald added a project: LLVM.
This ensures that frame-based unwinding will continue to work when
calling a noreturn function; there is not much use having the caller's
frame pointer saved if you don't also have the caller's program counter.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D68542
Files:
llvm/lib/Target/Mips/MipsSEFrameLowering.cpp
llvm/test/CodeGen/Mips/no-frame-pointer-elim.ll
Index: llvm/test/CodeGen/Mips/no-frame-pointer-elim.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/Mips/no-frame-pointer-elim.ll
@@ -0,0 +1,37 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -march=mips64 -relocation-model=static < %s \
+; RUN: | FileCheck %s --check-prefix STATIC
+; RUN: llc -march=mips64 -relocation-model=pic < %s \
+; RUN: | FileCheck %s --check-prefix PIC
+
+declare dso_local void @callee() noreturn nounwind
+
+define dso_local void @caller() nounwind "no-frame-pointer-elim-non-leaf" {
+; STATIC-LABEL: caller:
+; STATIC: # %bb.0: # %entry
+; STATIC-NEXT: daddiu $sp, $sp, -16
+; STATIC-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
+; STATIC-NEXT: sd $fp, 0($sp) # 8-byte Folded Spill
+; STATIC-NEXT: move $fp, $sp
+; STATIC-NEXT: jal callee
+; STATIC-NEXT: nop
+;
+; PIC-LABEL: caller:
+; PIC: # %bb.0: # %entry
+; PIC-NEXT: daddiu $sp, $sp, -32
+; PIC-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
+; PIC-NEXT: sd $fp, 16($sp) # 8-byte Folded Spill
+; PIC-NEXT: sd $gp, 8($sp) # 8-byte Folded Spill
+; PIC-NEXT: move $fp, $sp
+; PIC-NEXT: lui $1, %hi(%neg(%gp_rel(caller)))
+; PIC-NEXT: daddu $1, $1, $25
+; PIC-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(caller)))
+; PIC-NEXT: ld $25, %call16(callee)($gp)
+; PIC-NEXT: .reloc .Ltmp0, R_MIPS_JALR, callee
+; PIC-NEXT: .Ltmp0:
+; PIC-NEXT: jalr $25
+; PIC-NEXT: nop
+entry:
+ tail call void @callee()
+ unreachable
+}
Index: llvm/lib/Target/Mips/MipsSEFrameLowering.cpp
===================================================================
--- llvm/lib/Target/Mips/MipsSEFrameLowering.cpp
+++ llvm/lib/Target/Mips/MipsSEFrameLowering.cpp
@@ -865,12 +865,15 @@
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
MipsABIInfo ABI = STI.getABI();
+ unsigned RA = ABI.IsN64() ? Mips::RA_64 : Mips::RA;
unsigned FP = ABI.GetFramePtr();
unsigned BP = ABI.IsN64() ? Mips::S7_64 : Mips::S7;
- // Mark $fp as used if function has dedicated frame pointer.
- if (hasFP(MF))
+ // Mark $ra and $fp as used if function has dedicated frame pointer.
+ if (hasFP(MF)) {
+ setAliasRegs(MF, SavedRegs, RA);
setAliasRegs(MF, SavedRegs, FP);
+ }
// Mark $s7 as used if function has dedicated base pointer.
if (hasBP(MF))
setAliasRegs(MF, SavedRegs, BP);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D68542.223383.patch
Type: text/x-patch
Size: 2497 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191005/0f8963cb/attachment.bin>
More information about the llvm-commits
mailing list