diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2015-07-17 08:32:58 +0200 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2015-07-17 08:32:58 +0200 |
commit | 5ba53785f74d9a0bdff4692684f4eba2e3480f74 (patch) | |
tree | b66dd17af273533138afe41bc473424fd7487ddb /gcc | |
parent | 92d30ce6d4df686a244fe417fe30b3bc3a81990a (diff) | |
download | gcc-5ba53785f74d9a0bdff4692684f4eba2e3480f74.zip gcc-5ba53785f74d9a0bdff4692684f4eba2e3480f74.tar.gz gcc-5ba53785f74d9a0bdff4692684f4eba2e3480f74.tar.bz2 |
re PR rtl-optimization/66891 (ICE in expand_call, at calls.c:3407)
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.
From-SVN: r225918
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/calls.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr66891.c | 16 |
4 files changed, 33 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9506686..bac556e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-07-17 Uros Bizjak <ubizjak@gmail.com> + + PR rtl-optimization/66891 + * calls.c (expand_call): Wrap precompute_register_parameters with + NO_DEFER_POP/OK_DEFER_POP to prevent deferred pops. + 2015-07-16 Nathan Sidwell <nathan@codesourcery.com> * config/nvptx/mkoffload.c (process): Constify mapping variables. diff --git a/gcc/calls.c b/gcc/calls.c index 2a297b0..5636725 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -3144,6 +3144,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 @@ -3151,6 +3155,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/ChangeLog b/gcc/testsuite/ChangeLog index cf08693..d3a47c8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-07-17 Uros Bizjak <ubizjak@gmail.com> + + PR target/66891 + * gcc.target/i386/pr66891.c: New test. + 2015-07-16 Kyrylo Tkachov <kyrylo.tkachov@arm.com> * gcc.target/arm/no-volatile-in-it.c: Skip if -mcpu is overriden. diff --git a/gcc/testsuite/gcc.target/i386/pr66891.c b/gcc/testsuite/gcc.target/i386/pr66891.c new file mode 100644 index 0000000..61a4570 --- /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); +} |