diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/TargetFrameLoweringImpl.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/CodeGen/TargetOptionsImpl.cpp | 31 | ||||
-rw-r--r-- | llvm/lib/Target/ARM/ARMFrameLowering.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/Target/ARM/ARMFrameLowering.h | 2 |
4 files changed, 28 insertions, 16 deletions
diff --git a/llvm/lib/CodeGen/TargetFrameLoweringImpl.cpp b/llvm/lib/CodeGen/TargetFrameLoweringImpl.cpp index f0cfa2fbe4f..cf78fb5a1f1 100644 --- a/llvm/lib/CodeGen/TargetFrameLoweringImpl.cpp +++ b/llvm/lib/CodeGen/TargetFrameLoweringImpl.cpp @@ -30,12 +30,6 @@ using namespace llvm; TargetFrameLowering::~TargetFrameLowering() = default; -/// The default implementation just looks at attribute "no-frame-pointer-elim". -bool TargetFrameLowering::noFramePointerElim(const MachineFunction &MF) const { - auto Attr = MF.getFunction().getFnAttribute("no-frame-pointer-elim"); - return Attr.getValueAsString() == "true"; -} - bool TargetFrameLowering::enableCalleeSaveSkip(const MachineFunction &MF) const { assert(MF.getFunction().hasFnAttribute(Attribute::NoReturn) && MF.getFunction().hasFnAttribute(Attribute::NoUnwind) && diff --git a/llvm/lib/CodeGen/TargetOptionsImpl.cpp b/llvm/lib/CodeGen/TargetOptionsImpl.cpp index 853e71d0efa..3c133fb8594 100644 --- a/llvm/lib/CodeGen/TargetOptionsImpl.cpp +++ b/llvm/lib/CodeGen/TargetOptionsImpl.cpp @@ -23,15 +23,34 @@ using namespace llvm; /// DisableFramePointerElim - This returns true if frame pointer elimination /// optimization should be disabled for the given machine function. bool TargetOptions::DisableFramePointerElim(const MachineFunction &MF) const { - // Check to see if we should eliminate all frame pointers. - if (MF.getSubtarget().getFrameLowering()->noFramePointerElim(MF)) + // Check to see if the target want to forcably keep frame pointer. + if (MF.getSubtarget().getFrameLowering()->keepFramePointer(MF)) return true; - // Check to see if we should eliminate non-leaf frame pointers. - if (MF.getFunction().hasFnAttribute("no-frame-pointer-elim-non-leaf")) - return MF.getFrameInfo().hasCalls(); + const Function &F = MF.getFunction(); + + // TODO: Remove support for old `fp elim` function attributes after fully + // migrate to use "frame-pointer" + if (!F.hasFnAttribute("frame-pointer")) { + // Check to see if we should eliminate all frame pointers. + if (F.getFnAttribute("no-frame-pointer-elim").getValueAsString() == "true") + return true; + + // Check to see if we should eliminate non-leaf frame pointers. + if (F.hasFnAttribute("no-frame-pointer-elim-non-leaf")) + return MF.getFrameInfo().hasCalls(); - return false; + return false; + } + + StringRef FP = F.getFnAttribute("frame-pointer").getValueAsString(); + if (FP == "all") + return true; + if (FP == "non-leaf") + return MF.getFrameInfo().hasCalls(); + if (FP == "none") + return false; + llvm_unreachable("unknown frame pointer flag"); } /// HonorSignDependentRoundingFPMath - Return true if the codegen must assume diff --git a/llvm/lib/Target/ARM/ARMFrameLowering.cpp b/llvm/lib/Target/ARM/ARMFrameLowering.cpp index 2417166ca96..a9d87ced31f 100644 --- a/llvm/lib/Target/ARM/ARMFrameLowering.cpp +++ b/llvm/lib/Target/ARM/ARMFrameLowering.cpp @@ -79,12 +79,11 @@ ARMFrameLowering::ARMFrameLowering(const ARMSubtarget &sti) : TargetFrameLowering(StackGrowsDown, sti.getStackAlignment(), 0, 4), STI(sti) {} -bool ARMFrameLowering::noFramePointerElim(const MachineFunction &MF) const { +bool ARMFrameLowering::keepFramePointer(const MachineFunction &MF) const { // iOS always has a FP for backtracking, force other targets to keep their FP // when doing FastISel. The emitted code is currently superior, and in cases // like test-suite's lencod FastISel isn't quite correct when FP is eliminated. - return TargetFrameLowering::noFramePointerElim(MF) || - MF.getSubtarget<ARMSubtarget>().useFastISel(); + return MF.getSubtarget<ARMSubtarget>().useFastISel(); } /// Returns true if the target can safely skip saving callee-saved registers diff --git a/llvm/lib/Target/ARM/ARMFrameLowering.h b/llvm/lib/Target/ARM/ARMFrameLowering.h index e994cab28fe..2f7e23840e7 100644 --- a/llvm/lib/Target/ARM/ARMFrameLowering.h +++ b/llvm/lib/Target/ARM/ARMFrameLowering.h @@ -42,7 +42,7 @@ public: std::vector<CalleeSavedInfo> &CSI, const TargetRegisterInfo *TRI) const override; - bool noFramePointerElim(const MachineFunction &MF) const override; + bool keepFramePointer(const MachineFunction &MF) const override; bool enableCalleeSaveSkip(const MachineFunction &MF) const override; |