diff options
author | Ian Lance Taylor <iant@google.com> | 2010-11-05 23:45:32 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2010-11-05 23:45:32 +0000 |
commit | c3928dde21846d4572238317390613c8bcb042b6 (patch) | |
tree | 9f086d2faa96f90607a0c59d97ffe86a12e067f3 /gcc/explow.c | |
parent | 037de943dc054e19f7387c56668fbb6375bee268 (diff) | |
download | gcc-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.c | 13 |
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; |