diff options
author | Dan Gohman <gohman@apple.com> | 2009-01-27 00:40:06 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-01-27 00:40:06 +0000 |
commit | 336b636dd7d9f690cae4eff27e46b138c1f586db (patch) | |
tree | 72b1de07b1d81b03b527cb67e4309459be5988fa | |
parent | d9660b5f9e7dc7c8bcee3391453661fa08aff062 (diff) | |
download | external_llvm-336b636dd7d9f690cae4eff27e46b138c1f586db.zip external_llvm-336b636dd7d9f690cae4eff27e46b138c1f586db.tar.gz external_llvm-336b636dd7d9f690cae4eff27e46b138c1f586db.tar.bz2 |
Fix the Red Zone calculation for functions with frame pointers.
Don't use the Red Zone when dynamic stack realignment is needed.
This could be implemented, but most x86-64 ABIs don't require
dynamic stack realignment so it isn't urgent.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63074 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/X86/X86RegisterInfo.cpp | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/lib/Target/X86/X86RegisterInfo.cpp b/lib/Target/X86/X86RegisterInfo.cpp index 08746f2..73cab62 100644 --- a/lib/Target/X86/X86RegisterInfo.cpp +++ b/lib/Target/X86/X86RegisterInfo.cpp @@ -721,24 +721,27 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const { // Get desired stack alignment uint64_t MaxAlign = MFI->getMaxAlignment(); + // Add RETADDR move area to callee saved frame size. + int TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta(); + if (TailCallReturnAddrDelta < 0) + X86FI->setCalleeSavedFrameSize( + X86FI->getCalleeSavedFrameSize() +(-TailCallReturnAddrDelta)); + // If this is x86-64 and the Red Zone is not disabled, if we are a leaf // function, and use up to 128 bytes of stack space, don't have a frame // pointer, calls, or dynamic alloca then we do not need to adjust the // stack pointer (we fit in the Red Zone). if (Is64Bit && !DisableRedZone && + !needsStackRealignment(MF) && !MFI->hasVarSizedObjects() && // No dynamic alloca. !MFI->hasCalls()) { // No calls. - StackSize = std::max((uint64_t)X86FI->getCalleeSavedFrameSize(), + uint64_t MinSize = X86FI->getCalleeSavedFrameSize(); + if (hasFP(MF)) MinSize += SlotSize; + StackSize = std::max(MinSize, StackSize > 128 ? StackSize - 128 : 0); MFI->setStackSize(StackSize); } - // Add RETADDR move area to callee saved frame size. - int TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta(); - if (TailCallReturnAddrDelta < 0) - X86FI->setCalleeSavedFrameSize( - X86FI->getCalleeSavedFrameSize() +(-TailCallReturnAddrDelta)); - // Insert stack pointer adjustment for later moving of return addr. Only // applies to tail call optimized functions where the callee argument stack // size is bigger than the callers. |