Fix the Red Zone calculation for functions with frame pointers.
authorDan Gohman <gohman@apple.com>
Tue, 27 Jan 2009 00:40:06 +0000 (00:40 +0000)
committerDan Gohman <gohman@apple.com>
Tue, 27 Jan 2009 00:40:06 +0000 (00:40 +0000)
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

lib/Target/X86/X86RegisterInfo.cpp

index 08746f2ffb4755f916c474c69d33be64a32fca93..73cab622b668a1c7b1025ac3aa2b6c061dfabf31 100644 (file)
@@ -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.