]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/28966 (-maltivec -m32 causes the stack to be saved and restored even...
authorNathan Sidwell <nathan@codesourcery.com>
Thu, 21 Dec 2006 09:03:18 +0000 (09:03 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Thu, 21 Dec 2006 09:03:18 +0000 (09:03 +0000)
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

gcc/ChangeLog
gcc/reload1.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/rs6000-leaf.c [new file with mode: 0644]

index 40f7c77cbcacb736b3a83a7c50bcb61832908895..2e3f9d9df8744c1fba84c7a45ab200824104b476 100644 (file)
@@ -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
index 454383581e8b6ece28253276a9ca6dbeebcd608f..efa1a397212f45ea3a13b6c39b316f0820a01979 100644 (file)
@@ -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)
        {
index a1e84b11b5efd84cdbb65dc80ce2a477e79f0772..d7087428a6f7c99134c7db6a777053a54a9b6706 100644 (file)
@@ -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
diff --git a/gcc/testsuite/gcc.dg/rs6000-leaf.c b/gcc/testsuite/gcc.dg/rs6000-leaf.c
new file mode 100644 (file)
index 0000000..0794189
--- /dev/null
@@ -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;
+}