aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2015-07-17 08:32:58 +0200
committerUros Bizjak <uros@gcc.gnu.org>2015-07-17 08:32:58 +0200
commit5ba53785f74d9a0bdff4692684f4eba2e3480f74 (patch)
treeb66dd17af273533138afe41bc473424fd7487ddb /gcc
parent92d30ce6d4df686a244fe417fe30b3bc3a81990a (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/calls.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr66891.c16
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, &reg_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);
+}