]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/37843 (unaligned stack in main due to tail call optimization)
authorH.J. Lu <hongjiu.lu@intel.com>
Thu, 15 Jan 2009 15:44:41 +0000 (15:44 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Thu, 15 Jan 2009 15:44:41 +0000 (07:44 -0800)
gcc/

2009-01-15  H.J. Lu  <hongjiu.lu@intel.com>
    Joey Ye  <joey.ye@intel.com>

PR middle-end/37843
* cfgexpand.c (expand_stack_alignment): Don't update stack
boundary nor check incoming stack boundary here.
(gimple_expand_cfg): Update stack boundary and check incoming
stack boundary here.

gcc/testsuite/

2009-01-15  H.J. Lu  <hongjiu.lu@intel.com>

PR middle-end/37843
* gcc.target/i386/pr37843-3.c: Replace _Decimal128 with __m128.

Co-Authored-By: Joey Ye <joey.ye@intel.com>
From-SVN: r143400

gcc/ChangeLog
gcc/cfgexpand.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr37843-3.c

index bb99b6fbf47ddd4c82c9d50630ffcd65b4457970..4afe53fec258db9d81c375dd2733fa7ce825a3d1 100644 (file)
@@ -1,3 +1,12 @@
+2009-01-15  H.J. Lu  <hongjiu.lu@intel.com>
+           Joey Ye  <joey.ye@intel.com>
+
+       PR middle-end/37843
+       * cfgexpand.c (expand_stack_alignment): Don't update stack
+       boundary nor check incoming stack boundary here.
+       (gimple_expand_cfg): Update stack boundary and check incoming
+       stack boundary here.
+
 2009-01-15  Kenneth Zadeck <zadeck@naturalbridge.com>
 
        * dce.c (find_call_stack_args, delete_unmarked_insns): Fixed
index e0c328f3959170ae5e30200c52bc8dd82827f7b6..6d7fe772fe789ce18deed043242a949ae5c81dd8 100644 (file)
@@ -2215,7 +2215,7 @@ static void
 expand_stack_alignment (void)
 {
   rtx drap_rtx;
-  unsigned int preferred_stack_boundary, incoming_stack_boundary;
+  unsigned int preferred_stack_boundary;
 
   if (! SUPPORTS_STACK_ALIGNMENT)
     return;
@@ -2228,10 +2228,6 @@ expand_stack_alignment (void)
   gcc_assert (crtl->stack_alignment_needed
              <= crtl->stack_alignment_estimated);
 
-  /* Update stack boundary if needed.  */
-  if (targetm.calls.update_stack_boundary)
-    targetm.calls.update_stack_boundary (); 
-
   /* Update crtl->stack_alignment_estimated and use it later to align
      stack.  We check PREFERRED_STACK_BOUNDARY if there may be non-call
      exceptions since callgraph doesn't collect incoming stack alignment
@@ -2246,15 +2242,8 @@ expand_stack_alignment (void)
   if (preferred_stack_boundary > crtl->stack_alignment_needed)
     crtl->stack_alignment_needed = preferred_stack_boundary;
 
-  /* The incoming stack frame has to be aligned at least at
-     parm_stack_boundary.  */
-  if (crtl->parm_stack_boundary > INCOMING_STACK_BOUNDARY)
-    incoming_stack_boundary = crtl->parm_stack_boundary;
-  else
-    incoming_stack_boundary = INCOMING_STACK_BOUNDARY;
-
   crtl->stack_realign_needed
-    = incoming_stack_boundary < crtl->stack_alignment_estimated;
+    = INCOMING_STACK_BOUNDARY < crtl->stack_alignment_estimated;
   crtl->stack_realign_tried = crtl->stack_realign_needed;
 
   crtl->stack_realign_processed = true;
@@ -2359,6 +2348,23 @@ gimple_expand_cfg (void)
   if (crtl->stack_protect_guard)
     stack_protect_prologue ();
 
+  /* Update stack boundary if needed.  */
+  if (SUPPORTS_STACK_ALIGNMENT)
+    {
+      /* Call update_stack_boundary here to update incoming stack
+        boundary before TARGET_FUNCTION_OK_FOR_SIBCALL is called.
+        TARGET_FUNCTION_OK_FOR_SIBCALL needs to know the accurate
+        incoming stack alignment to check if it is OK to perform
+        sibcall optimization since sibcall optimization will only
+        align the outgoing stack to incoming stack boundary.  */
+      if (targetm.calls.update_stack_boundary)
+       targetm.calls.update_stack_boundary ();
+      
+      /* The incoming stack frame has to be aligned at least at
+        parm_stack_boundary.  */
+      gcc_assert (crtl->parm_stack_boundary <= INCOMING_STACK_BOUNDARY);
+    }
+
   /* Register rtl specific functions for cfg.  */
   rtl_register_cfg_hooks ();
 
index 237ce656c31c835419d125d4c6dcba8d6f8dc94d..0876ea0d0c48f4a1638a40ed09b1074bdf88f59f 100644 (file)
@@ -1,3 +1,8 @@
+2009-01-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR middle-end/37843
+       * gcc.target/i386/pr37843-3.c: Replace _Decimal128 with __m128.
+
 2009-01-15  Dodji Seketeli  <dodji@redhat.com>
 
        PR c++/38636
index 505ff8790230546ba4c390fec9ad6546f03a2e49..a475e4143ff05168e0c22d07fe9f5d9d4de64564 100644 (file)
@@ -1,13 +1,15 @@
 /* Test for stack alignment with sibcall optimization.  */
-/* { dg-do compile { target { *-*-linux* && { ilp32 && nonpic } } } } */
-/* { dg-options "-O2 -std=gnu99 -mpreferred-stack-boundary=4 -mincoming-stack-boundary=2" } */
+/* { dg-do compile { target { ilp32 && nonpic } } } */
+/* { dg-options "-O2 -msse2 -mpreferred-stack-boundary=4 -mstackrealign" } */
 /* { dg-final { scan-assembler-not "andl\[\\t \]*\\$-16,\[\\t \]*%\[re\]?sp" } } */
 /* { dg-final { scan-assembler-not "call\[\\t \]*foo" } } */
 /* { dg-final { scan-assembler "jmp\[\\t \]*foo" } } */
 
-extern int foo (_Decimal128);
+#include <emmintrin.h>
 
-int bar (_Decimal128 x)
+extern int foo (__m128, __m128, __m128, __m128);
+
+int bar (__m128 x1, __m128 x2, __m128 x3, __m128 x4)
 {
-    return foo(x);
+    return foo (x1, x2, x3, x4);
 }