summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>2015-07-17 06:32:58 +0000
committerH.J. Lu <hjl.tools@gmail.com>2015-07-17 04:38:10 -0700
commitdb434fd326524a7eea56a1cf61c7d85bcfd33bbe (patch)
tree1fc4a0b95045ef53f4d43d9a1810fad9755288fb
parent57002b3537f59714813c5dcd581c3ae3e1fce796 (diff)
downloadgcc-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.c6
-rw-r--r--gcc/testsuite/gcc.target/i386/pr66891.c16
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, &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/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);
+}