re PR middle-end/46894 (vector tests fail on powerpc 32-bit)
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 18 Jan 2011 21:29:11 +0000 (21:29 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 18 Jan 2011 21:29:11 +0000 (21:29 +0000)
PR middle-end/46894
* explow.c (allocate_dynamic_stack_space): Do not assume more than
BITS_PER_UNIT alignment if STACK_DYNAMIC_OFFSET or STACK_POINTER_OFFSET
are defined.

From-SVN: r168968

gcc/ChangeLog
gcc/explow.c

index 00c85f8e362670368ad37d0fde7c1afb41d78741..736051cab1f64d9e470c838b28cf895e93ea55c9 100644 (file)
@@ -1,3 +1,10 @@
+2011-01-18  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR middle-end/46894
+       * explow.c (allocate_dynamic_stack_space): Do not assume more than
+       BITS_PER_UNIT alignment if STACK_DYNAMIC_OFFSET or STACK_POINTER_OFFSET
+       are defined.
+
 2011-01-18  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
 
        PR tree-optimization/47179
index 836f244b3a17e71db0f79bd00cab093784b5e375..2a182065bca258e08fb5660eb2625b2fae7d487a 100644 (file)
@@ -1148,6 +1148,7 @@ allocate_dynamic_stack_space (rtx size, unsigned size_align,
 {
   HOST_WIDE_INT stack_usage_size = -1;
   rtx final_label, final_target, target;
+  unsigned extra_align = 0;
   bool must_align;
 
   /* If we're asking for zero bytes, it doesn't matter what we point
@@ -1231,21 +1232,25 @@ allocate_dynamic_stack_space (rtx size, unsigned size_align,
      that might result from the alignment operation.  */
 
   must_align = (crtl->preferred_stack_boundary < required_align);
-#if defined (STACK_DYNAMIC_OFFSET) || defined (STACK_POINTER_OFFSET)
-  must_align = true;
-#endif
-
   if (must_align)
     {
-      unsigned extra, extra_align;
-
       if (required_align > PREFERRED_STACK_BOUNDARY)
        extra_align = PREFERRED_STACK_BOUNDARY;
       else if (required_align > STACK_BOUNDARY)
        extra_align = STACK_BOUNDARY;
       else
        extra_align = BITS_PER_UNIT;
-      extra = (required_align - extra_align) / BITS_PER_UNIT;
+    }
+
+  /* ??? STACK_POINTER_OFFSET is always defined now.  */
+#if defined (STACK_DYNAMIC_OFFSET) || defined (STACK_POINTER_OFFSET)
+  must_align = true;
+  extra_align = BITS_PER_UNIT;
+#endif
+
+  if (must_align)
+    {
+      unsigned extra = (required_align - extra_align) / BITS_PER_UNIT;
 
       size = plus_constant (size, extra);
       size = force_operand (size, NULL_RTX);