From: H.J. Lu Date: Thu, 15 Jan 2009 15:44:41 +0000 (+0000) Subject: re PR middle-end/37843 (unaligned stack in main due to tail call optimization) X-Git-Tag: releases/gcc-4.4.0~857 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e939805b7bf63bec46a4b2de6f272d3f77238448;p=thirdparty%2Fgcc.git re PR middle-end/37843 (unaligned stack in main due to tail call optimization) gcc/ 2009-01-15 H.J. Lu Joey Ye 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 PR middle-end/37843 * gcc.target/i386/pr37843-3.c: Replace _Decimal128 with __m128. Co-Authored-By: Joey Ye From-SVN: r143400 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bb99b6fbf47d..4afe53fec258 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2009-01-15 H.J. Lu + Joey Ye + + 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 * dce.c (find_call_stack_args, delete_unmarked_insns): Fixed diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index e0c328f39591..6d7fe772fe78 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -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 (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 237ce656c31c..0876ea0d0c48 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-01-15 H.J. Lu + + PR middle-end/37843 + * gcc.target/i386/pr37843-3.c: Replace _Decimal128 with __m128. + 2009-01-15 Dodji Seketeli PR c++/38636 diff --git a/gcc/testsuite/gcc.target/i386/pr37843-3.c b/gcc/testsuite/gcc.target/i386/pr37843-3.c index 505ff8790230..a475e4143ff0 100644 --- a/gcc/testsuite/gcc.target/i386/pr37843-3.c +++ b/gcc/testsuite/gcc.target/i386/pr37843-3.c @@ -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 -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); }