diff options
author | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-07-17 06:32:58 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-07-17 04:38:10 -0700 |
commit | db434fd326524a7eea56a1cf61c7d85bcfd33bbe (patch) | |
tree | 1fc4a0b95045ef53f4d43d9a1810fad9755288fb | |
parent | 57002b3537f59714813c5dcd581c3ae3e1fce796 (diff) | |
download | gcc-hjl/pr58066/gcc-5-branch.tar.gz |
Add NO_DEFER_POP/OK_DEFER_POP to prevent deferred popshjl/pr58066/gcc-5-branch
When moving precompute_register_parameters, I didn't notice that the
call was wrapped with NO_DEFER_POP/OK_DEFER_POP.
PR rtl-optimization/66891
* calls.c (expand_call): Wrap precompute_register_parameters with
NO_DEFER_POP/OK_DEFER_POP to prevent deferred pops.
testsuite/ChangeLog:
PR target/66891
* gcc.target/i386/pr66891.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@225918 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/calls.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr66891.c | 16 |
2 files changed, 22 insertions, 0 deletions
diff --git a/gcc/calls.c b/gcc/calls.c index 1e1a4356984..0987dd0a911 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -3115,6 +3115,10 @@ expand_call (tree exp, rtx target, int ignore) compute_argument_addresses (args, argblock, num_actuals); + /* Stack is properly aligned, pops can't safely be deferred during + the evaluation of the arguments. */ + NO_DEFER_POP; + /* Precompute all register parameters. It isn't safe to compute anything once we have started filling any specific hard regs. TLS symbols sometimes need a call to resolve. Precompute @@ -3122,6 +3126,8 @@ expand_call (tree exp, rtx target, int ignore) to avoid unaligned stack in the called function. */ precompute_register_parameters (num_actuals, args, ®_parm_seen); + OK_DEFER_POP; + /* Perform stack alignment before the first push (the last arg). */ if (argblock == 0 && adjusted_args_size.constant > reg_parm_stack_space diff --git a/gcc/testsuite/gcc.target/i386/pr66891.c b/gcc/testsuite/gcc.target/i386/pr66891.c new file mode 100644 index 00000000000..61a45703196 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr66891.c @@ -0,0 +1,16 @@ +/* { dg-do compile { target ia32 } } */ +/* { dg-options "-O2" } */ + +__attribute__((__stdcall__)) void fn1(); + +int a; + +static void fn2() { + for (;;) + ; +} + +void fn3() { + fn1(0); + fn2(a == 0); +} |