aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2011-01-18 21:29:11 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2011-01-18 21:29:11 +0000
commit1ecad98e4de3280e8e9951706f2e5251819fb92a (patch)
tree8cc1b63baa2f41820df5c80ec6e17cbd79ac56dd /gcc
parentd4f2460a1bbcf6be3414aa26e79fa4a3fbb3716c (diff)
downloadgcc-1ecad98e4de3280e8e9951706f2e5251819fb92a.zip
gcc-1ecad98e4de3280e8e9951706f2e5251819fb92a.tar.gz
gcc-1ecad98e4de3280e8e9951706f2e5251819fb92a.tar.bz2
re PR middle-end/46894 (vector tests fail on powerpc 32-bit)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/explow.c19
2 files changed, 19 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 00c85f8..736051c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/explow.c b/gcc/explow.c
index 836f244..2a18206 100644
--- a/gcc/explow.c
+++ b/gcc/explow.c
@@ -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);