From: Nathan Sidwell Date: Thu, 21 Dec 2006 09:03:18 +0000 (+0000) Subject: re PR target/28966 (-maltivec -m32 causes the stack to be saved and restored even... X-Git-Tag: releases/gcc-4.3.0~7877 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=970af8677126773a729c5fde809ab307b6494082;p=thirdparty%2Fgcc.git re PR target/28966 (-maltivec -m32 causes the stack to be saved and restored even though there is no need for it) gcc/ PR target/28966 PR target/29248 * reload1.c (reload): Realign stack after it changes size. gcc/testsuite/ PR target/28966 PR target/29248 * gcc.dg/rs6000-leaf.c: New. From-SVN: r120102 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 40f7c77cbcac..2e3f9d9df874 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-12-21 Nathan Sidwell + + PR target/28966 + PR target/29248 + * reload1.c (reload): Realign stack after it changes size. + 2006-12-20 Roger Sayle * simplify-rtx.c (simplify_subreg): Use the correct mode when diff --git a/gcc/reload1.c b/gcc/reload1.c index 454383581e8b..efa1a397212f 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -888,16 +888,8 @@ reload (rtx first, int global) { int something_changed; int did_spill; - HOST_WIDE_INT starting_frame_size; - /* Round size of stack frame to stack_alignment_needed. This must be done - here because the stack size may be a part of the offset computation - for register elimination, and there might have been new stack slots - created in the last iteration of this loop. */ - if (cfun->stack_alignment_needed) - assign_stack_local (BLKmode, 0, cfun->stack_alignment_needed); - starting_frame_size = get_frame_size (); set_initial_elim_offsets (); @@ -964,6 +956,20 @@ reload (rtx first, int global) /* If we allocated another stack slot, redo elimination bookkeeping. */ if (starting_frame_size != get_frame_size ()) continue; + if (starting_frame_size && cfun->stack_alignment_needed) + { + /* If we have a stack frame, we must align it now. The + stack size may be a part of the offset computation for + register elimination. So if this changes the stack size, + then repeat the elimination bookkeeping. We don't + realign when there is no stack, as that will cause a + stack frame when none is needed should + STARTING_FRAME_OFFSET not be already aligned to + STACK_BOUNDARY. */ + assign_stack_local (BLKmode, 0, cfun->stack_alignment_needed); + if (starting_frame_size != get_frame_size ()) + continue; + } if (caller_save_needed) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a1e84b11b5ef..d7087428a6f7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-12-21 Nathan Sidwell + + PR target/28966 + PR target/29248 + * gcc.dg/rs6000-leaf.c: New. + 2006-12-20 Tobias Schlüter PR fortran/25392 diff --git a/gcc/testsuite/gcc.dg/rs6000-leaf.c b/gcc/testsuite/gcc.dg/rs6000-leaf.c new file mode 100644 index 000000000000..079418930da7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/rs6000-leaf.c @@ -0,0 +1,8 @@ +/* { dg-do compile { target rs6000-*-* } } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler-not "\tstwu 1,-\[0-9\]*(1)\n" } } */ + +int Leaf (int i) +{ + return i + 1; +}