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
This commit is contained in:
parent
a957d77fc3
commit
970af86771
4 changed files with 34 additions and 8 deletions
|
@ -1,3 +1,9 @@
|
|||
2006-12-21 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
PR target/28966
|
||||
PR target/29248
|
||||
* reload1.c (reload): Realign stack after it changes size.
|
||||
|
||||
2006-12-20 Roger Sayle <roger@eyesopen.com>
|
||||
|
||||
* simplify-rtx.c (simplify_subreg): Use the correct mode when
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2006-12-21 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
PR target/28966
|
||||
PR target/29248
|
||||
* gcc.dg/rs6000-leaf.c: New.
|
||||
|
||||
2006-12-20 Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>
|
||||
|
||||
PR fortran/25392
|
||||
|
|
8
gcc/testsuite/gcc.dg/rs6000-leaf.c
Normal file
8
gcc/testsuite/gcc.dg/rs6000-leaf.c
Normal file
|
@ -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;
|
||||
}
|
Loading…
Add table
Reference in a new issue