x86: Use DRAP only if there are outgoing arguments on stack
authorH.J. Lu <hongjiu.lu@intel.com>
Sun, 9 Jul 2017 18:25:49 +0000 (18:25 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Sun, 9 Jul 2017 18:25:49 +0000 (11:25 -0700)
Since DRAP is needed only if there are outgoing arguments on stack, we
should track outgoing arguments on stack and avoid setting need_drap to
true when there are no outgoing arguments on stack.

gcc/

PR target/81313
* config/i386/i386.c (ix86_function_arg_advance): Set
outgoing_args_on_stack to true if there are outgoing arguments
on stack.
(ix86_function_arg): Likewise.
(ix86_get_drap_rtx): Use DRAP only if there are outgoing
arguments on stack and ACCUMULATE_OUTGOING_ARGS is false.
* config/i386/i386.h (machine_function): Add
outgoing_args_on_stack.

gcc/testsuite/

PR target/81313
* gcc.target/i386/pr81313-1.c: New test.
* gcc.target/i386/pr81313-2.c: Likewise.
* gcc.target/i386/pr81313-3.c: Likewise.
* gcc.target/i386/pr81313-4.c: Likewise.
* gcc.target/i386/pr81313-5.c: Likewise.

From-SVN: r250084

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr81313-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr81313-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr81313-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr81313-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr81313-5.c [new file with mode: 0644]

index 5e2b4f560d0902e80cf4c1bf7beb202ebe990732..2a0c6d6e00784444bd3cab1edd1fdf58add33ebd 100644 (file)
@@ -1,3 +1,15 @@
+2017-07-09  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/81313
+       * config/i386/i386.c (ix86_function_arg_advance): Set
+       outgoing_args_on_stack to true if there are outgoing arguments
+       on stack.
+       (ix86_function_arg): Likewise.
+       (ix86_get_drap_rtx): Use DRAP only if there are outgoing
+       arguments on stack and ACCUMULATE_OUTGOING_ARGS is false.
+       * config/i386/i386.h (machine_function): Add
+       outgoing_args_on_stack.
+
 2017-07-09  Krister Walfridsson  <krister.walfridsson@gmail.com>
 
        * config.gcc (*-*-netbsd*): Remove check for NetBSD versions not
index afd61bf6f8ce514c623110825e94940a09feeada..42e0ddaca56e5896722620653c302a85e6fb795d 100644 (file)
@@ -10143,7 +10143,13 @@ ix86_function_arg_advance (cumulative_args_t cum_v, machine_mode mode,
   /* For pointers passed in memory we expect bounds passed in Bounds
      Table.  */
   if (!nregs)
-    cum->bnds_in_bt = chkp_type_bounds_count (type);
+    {
+      /* Track if there are outgoing arguments on stack.  */
+      if (cum->caller)
+       cfun->machine->outgoing_args_on_stack = true;
+
+      cum->bnds_in_bt = chkp_type_bounds_count (type);
+    }
 }
 
 /* Define where to put the arguments to a function.
@@ -10473,6 +10479,10 @@ ix86_function_arg (cumulative_args_t cum_v, machine_mode omode,
   else
     arg = function_arg_32 (cum, mode, omode, type, bytes, words);
 
+  /* Track if there are outgoing arguments on stack.  */
+  if (arg == NULL_RTX && cum->caller)
+    cfun->machine->outgoing_args_on_stack = true;
+
   return arg;
 }
 
@@ -13646,7 +13656,11 @@ ix86_update_stack_boundary (void)
 static rtx
 ix86_get_drap_rtx (void)
 {
-  if (ix86_force_drap || !ACCUMULATE_OUTGOING_ARGS)
+  /* We must use DRAP if there are outgoing arguments on stack and
+     ACCUMULATE_OUTGOING_ARGS is false.  */
+  if (ix86_force_drap
+      || (cfun->machine->outgoing_args_on_stack
+         && !ACCUMULATE_OUTGOING_ARGS))
     crtl->need_drap = true;
 
   if (stack_realign_drap)
index 08243c16498240b6b7b003a2cbaf84a0df193ba7..a2ae9b4e24295dbdc2e7e856a2cdc2f7ef09e4a3 100644 (file)
@@ -2657,6 +2657,9 @@ struct GTY(()) machine_function {
      frame pointer.) */
   unsigned int call_ms2sysv_extra_regs:3;
 
+  /* Nonzero if the function places outgoing arguments on stack.  */
+  BOOL_BITFIELD outgoing_args_on_stack : 1;
+
   /* During prologue/epilogue generation, the current frame state.
      Otherwise, the frame state at the end of the prologue.  */
   struct machine_frame_state fs;
index d9cf47871fc5438157b7d6be6c5282a134700579..d13db2dbc0dffd33649e8e9e1a000ab1e3046cd4 100644 (file)
@@ -1,3 +1,12 @@
+2017-07-09  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/81313
+       * gcc.target/i386/pr81313-1.c: New test.
+       * gcc.target/i386/pr81313-2.c: Likewise.
+       * gcc.target/i386/pr81313-3.c: Likewise.
+       * gcc.target/i386/pr81313-4.c: Likewise.
+       * gcc.target/i386/pr81313-5.c: Likewise.
+
 2017-07-08  Richard Sandiford  <richard.sandiford@linaro.org>
 
        * gnat.dg/vect15.ads (Sarray): Increase range to 1 .. 5.
diff --git a/gcc/testsuite/gcc.target/i386/pr81313-1.c b/gcc/testsuite/gcc.target/i386/pr81313-1.c
new file mode 100644 (file)
index 0000000..f765003
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mno-accumulate-outgoing-args -mincoming-stack-boundary=4 -mpreferred-stack-boundary=6" } */
+
+extern void foo (void);
+
+void
+bar (void)
+{
+  foo ();
+}
+
+/* { dg-final { scan-assembler-not "lea\[lq\]?\[\\t \]*\[0-9\]*\\(%\[er\]sp\\)" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr81313-2.c b/gcc/testsuite/gcc.target/i386/pr81313-2.c
new file mode 100644 (file)
index 0000000..2cdc645
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile { target ia32 } } */
+/* { dg-options "-O2 -mno-accumulate-outgoing-args -mincoming-stack-boundary=4 -mpreferred-stack-boundary=6 -mno-iamcu" } */
+
+extern void foo (int, int, int);
+
+void
+bar (void)
+{
+  foo (1, 2, 3);
+}
+
+/* { dg-final { scan-assembler "lea\[l\]?\[\\t \]*\[0-9\]*\\(%esp\\)" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr81313-3.c b/gcc/testsuite/gcc.target/i386/pr81313-3.c
new file mode 100644 (file)
index 0000000..9c1b232
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile { target ia32 } } */
+/* { dg-options "-O2 -mno-accumulate-outgoing-args -mincoming-stack-boundary=4 -mpreferred-stack-boundary=6" } */
+
+extern void foo (int, int, int) __attribute__ ((regparm(3)));
+
+void
+bar (int i1, int i2, int i3, int i4)
+{
+  foo (i1, i2, i3);
+}
+
+/* { dg-final { scan-assembler-not "lea\[l\]?\[\\t \]*\[0-9\]*\\(%esp\\)" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr81313-4.c b/gcc/testsuite/gcc.target/i386/pr81313-4.c
new file mode 100644 (file)
index 0000000..bad0b3c
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mno-accumulate-outgoing-args -mincoming-stack-boundary=4 -mpreferred-stack-boundary=6" } */
+
+extern void foo (int, int, int, int, int, int, int);
+
+void
+bar (void)
+{
+  foo (1, 2, 3, 4, 5, 6, 7);
+}
+
+/* { dg-final { scan-assembler "lea\[lq\]?\[\\t \]*\[0-9\]*\\(%\[er\]sp\\)" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr81313-5.c b/gcc/testsuite/gcc.target/i386/pr81313-5.c
new file mode 100644 (file)
index 0000000..51a543c
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-O2 -mno-accumulate-outgoing-args -mincoming-stack-boundary=4 -mpreferred-stack-boundary=6" } */
+
+extern void foo (int, int, int, int, int, int);
+
+void
+bar (int i1, int i2, int i3, int i4, int i5, int i6, int i7)
+{
+  foo (i1, i2, i3, i4, i5, i6);
+}
+
+/* { dg-final { scan-assembler-not "lea\[lq\]?\[\\t \]*\[0-9\]*\\(%\[er\]sp\\)" } } */