Target/X86: Tweak allocating shadow area (aka home) on Win64. It must be enough for...
authorNAKAMURA Takumi <geek4civic@gmail.com>
Sat, 5 Feb 2011 15:11:32 +0000 (15:11 +0000)
committerNAKAMURA Takumi <geek4civic@gmail.com>
Sat, 5 Feb 2011 15:11:32 +0000 (15:11 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@124949 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86FrameLowering.cpp
lib/Target/X86/X86FrameLowering.h
lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/2009-06-03-Win64DisableRedZone.ll
test/CodeGen/X86/2009-06-03-Win64SpillXMM.ll
test/CodeGen/X86/win64_params.ll
test/CodeGen/X86/win64_vararg.ll

index 9722701ee2092f2b05d0e33faa19c50b6e34f647..0a3f931acf9384a1979b02f343f643fcd77aa6a7 100644 (file)
@@ -397,11 +397,6 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF) const {
     if (HasFP) MinSize += SlotSize;
     StackSize = std::max(MinSize, StackSize > 128 ? StackSize - 128 : 0);
     MFI->setStackSize(StackSize);
-  } else if (IsWin64) {
-    // We need to always allocate 32 bytes as register spill area.
-    // FIXME: We might reuse these 32 bytes for leaf functions.
-    StackSize += 32;
-    MFI->setStackSize(StackSize);
   }
 
   // Insert stack pointer adjustment for later moving of return addr.  Only
index c067e64fc012dcbfc1e495105f9ef7c990f15858..d71108cd05862b7cb9606c43926e8f60bb300ccf 100644 (file)
@@ -28,8 +28,7 @@ public:
   explicit X86FrameLowering(const X86TargetMachine &tm, const X86Subtarget &sti)
     : TargetFrameLowering(StackGrowsDown,
                           sti.getStackAlignment(),
-                          (sti.isTargetWin64() ? -40 :
-                           (sti.is64Bit() ? -8 : -4))),
+                          (sti.is64Bit() ? -8 : -4)),
       TM(tm), STI(sti) {
   }
 
index 69295f847ce3d43557516b94961c4c967645847a..aa1301fd4591f8ce4ef85b1fb0ba3b5e1d9770bb 100644 (file)
@@ -1544,6 +1544,12 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
   SmallVector<CCValAssign, 16> ArgLocs;
   CCState CCInfo(CallConv, isVarArg, getTargetMachine(),
                  ArgLocs, *DAG.getContext());
+
+  // Allocate shadow area for Win64
+  if (IsWin64) {
+    CCInfo.AllocateStack(32, 8);
+  }
+
   CCInfo.AnalyzeFormalArguments(Ins, CC_X86);
 
   unsigned LastVal = ~0U;
@@ -1778,8 +1784,7 @@ X86TargetLowering::LowerMemOpCallTo(SDValue Chain,
                                     DebugLoc dl, SelectionDAG &DAG,
                                     const CCValAssign &VA,
                                     ISD::ArgFlagsTy Flags) const {
-  const unsigned FirstStackArgOffset = (Subtarget->isTargetWin64() ? 32 : 0);
-  unsigned LocMemOffset = FirstStackArgOffset + VA.getLocMemOffset();
+  unsigned LocMemOffset = VA.getLocMemOffset();
   SDValue PtrOff = DAG.getIntPtrConstant(LocMemOffset);
   PtrOff = DAG.getNode(ISD::ADD, dl, getPointerTy(), StackPtr, PtrOff);
   if (Flags.isByVal())
@@ -1864,6 +1869,12 @@ X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
   SmallVector<CCValAssign, 16> ArgLocs;
   CCState CCInfo(CallConv, isVarArg, getTargetMachine(),
                  ArgLocs, *DAG.getContext());
+
+  // Allocate shadow area for Win64
+  if (IsWin64) {
+    CCInfo.AllocateStack(32, 8);
+  }
+
   CCInfo.AnalyzeCallOperands(Outs, CC_X86);
 
   // Get a count of how many bytes are to be pushed on the stack.
@@ -2447,6 +2458,12 @@ X86TargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
     SmallVector<CCValAssign, 16> ArgLocs;
     CCState CCInfo(CalleeCC, isVarArg, getTargetMachine(),
                    ArgLocs, *DAG.getContext());
+
+    // Allocate shadow area for Win64
+    if (Subtarget->isTargetWin64()) {
+      CCInfo.AllocateStack(32, 8);
+    }
+
     CCInfo.AnalyzeCallOperands(Outs, CC_X86);
     if (CCInfo.getNextStackOffset()) {
       MachineFunction &MF = DAG.getMachineFunction();
index c5982285afe083523b1949eaf27e13b53ceb1e03..9d06a9e84d039991ad1007f7e571804234696113 100644 (file)
@@ -1,9 +1,8 @@
-; RUN: llc < %s | grep "subq.*\\\$40, \\\%rsp"
-target triple = "x86_64-pc-mingw64"
+; RUN: llc -mtriple=x86_64-pc-mingw64 < %s | FileCheck %s
+; CHECK-NOT: -{{[1-9][0-9]*}}(%rsp)
 
 define x86_fp80 @a(i64 %x) nounwind readnone {
 entry:
-       %conv = sitofp i64 %x to x86_fp80               ; <x86_fp80> [#uses=1]
-       ret x86_fp80 %conv
+        %conv = sitofp i64 %x to x86_fp80               ; <x86_fp80> [#uses=1]
+        ret x86_fp80 %conv
 }
-
index 810a6f4d6c65cadcd6979e609b1c0d47df556f3d..6e8d9a996ef9693e560c233c9d2d7728c3129ed0 100644 (file)
@@ -1,12 +1,10 @@
-; RUN: llc < %s -o %t1
-; RUN: grep "subq.*\\\$72, \\\%rsp" %t1
-; RUN: grep "movaps    \\\%xmm8, 32\\\(\\\%rsp\\\)" %t1
-; RUN: grep "movaps    \\\%xmm7, 48\\\(\\\%rsp\\\)" %t1
-target triple = "x86_64-pc-mingw64"
+; RUN: llc -mtriple=x86_64-pc-mingw64 < %s | FileCheck %s
+; CHECK: subq    $40, %rsp
+; CHECK: movaps  %xmm8, (%rsp)
+; CHECK: movaps  %xmm7, 16(%rsp)
 
 define i32 @a() nounwind {
 entry:
-       tail call void asm sideeffect "", "~{xmm7},~{xmm8},~{dirflag},~{fpsr},~{flags}"() nounwind
-       ret i32 undef
+        tail call void asm sideeffect "", "~{xmm7},~{xmm8},~{dirflag},~{fpsr},~{flags}"() nounwind
+        ret i32 undef
 }
-
index 0b67368e04f96eb9cfc4d298838e90c2c3ea2154..f9d4bf9c3094f5e076f829633abe49c4c06bc455 100644 (file)
@@ -4,8 +4,8 @@
 ; on the stack.
 define i32 @f6(i32 %p1, i32 %p2, i32 %p3, i32 %p4, i32 %p5, i32 %p6) nounwind readnone optsize {
 entry:
-; CHECK: movl    80(%rsp), %eax
-; CHECK: addl    72(%rsp), %eax
+; CHECK: movl    48(%rsp), %eax
+; CHECK: addl    40(%rsp), %eax
   %add = add nsw i32 %p6, %p5
   ret i32 %add
 }
index 072f36afb7b64d0b2b1c6b9166091ef7ebce710a..a451318f6e8c30f7deac5318c4e9ac128c332347 100644 (file)
@@ -5,11 +5,11 @@
 ; calculated.
 define void @average_va(i32 %count, ...) nounwind {
 entry:
-; CHECK: subq  $40, %rsp
-; CHECK: movq  %r9, 72(%rsp)
-; CHECK: movq  %r8, 64(%rsp)
-; CHECK: movq  %rdx, 56(%rsp)
-; CHECK: leaq  56(%rsp), %rax
+; CHECK: pushq
+; CHECK: movq   %r9, 40(%rsp)
+; CHECK: movq   %r8, 32(%rsp)
+; CHECK: movq   %rdx, 24(%rsp)
+; CHECK: leaq   24(%rsp), %rax
 
   %ap = alloca i8*, align 8                       ; <i8**> [#uses=1]
   %ap1 = bitcast i8** %ap to i8*                  ; <i8*> [#uses=1]