aboutsummaryrefslogtreecommitdiff
path: root/gcc/explow.c
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2010-11-05 23:45:32 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2010-11-05 23:45:32 +0000
commitc3928dde21846d4572238317390613c8bcb042b6 (patch)
tree9f086d2faa96f90607a0c59d97ffe86a12e067f3 /gcc/explow.c
parent037de943dc054e19f7387c56668fbb6375bee268 (diff)
downloadgcc-c3928dde21846d4572238317390613c8bcb042b6.zip
gcc-c3928dde21846d4572238317390613c8bcb042b6.tar.gz
gcc-c3928dde21846d4572238317390613c8bcb042b6.tar.bz2
re PR target/46084 (gcc.dg/split-4.c failed with -mavx -m32)
gcc/: PR target/46084 * explow.c (allocate_dynamic_stack_space): If flag_split_stack, request enough additional space for alignment, and force alignment. testsuite/: * gcc.target/i386/pr46084.c: New test. From-SVN: r166383
Diffstat (limited to 'gcc/explow.c')
-rw-r--r--gcc/explow.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/gcc/explow.c b/gcc/explow.c
index a83c6e8..1d809bc 100644
--- a/gcc/explow.c
+++ b/gcc/explow.c
@@ -1340,7 +1340,7 @@ allocate_dynamic_stack_space (rtx size, unsigned size_align,
least it doesn't cause a stack overflow. */
if (flag_split_stack)
{
- rtx available_label, space, func;
+ rtx available_label, ask, space, func;
available_label = NULL_RTX;
@@ -1355,10 +1355,19 @@ allocate_dynamic_stack_space (rtx size, unsigned size_align,
}
#endif
+ /* The __morestack_allocate_stack_space function will allocate
+ memory using malloc. We don't know that the alignment of the
+ memory returned by malloc will meet REQUIRED_ALIGN. Increase
+ SIZE to make sure we allocate enough space. */
+ ask = expand_binop (Pmode, add_optab, size,
+ GEN_INT (required_align / BITS_PER_UNIT - 1),
+ NULL_RTX, 1, OPTAB_LIB_WIDEN);
+ must_align = true;
+
func = init_one_libfunc ("__morestack_allocate_stack_space");
space = emit_library_call_value (func, target, LCT_NORMAL, Pmode,
- 1, size, Pmode);
+ 1, ask, Pmode);
if (available_label == NULL_RTX)
return space;