diff mbox series

x86: Set frame size to 0 if stack frame isn't required

Message ID 20181215192238.GB11904@gmail.com
State New
Headers show
Series x86: Set frame size to 0 if stack frame isn't required | expand

Commit Message

H.J. Lu Dec. 15, 2018, 7:22 p.m. UTC
get_frame_size () returns used stack slots during compilation, which
may be optimized out later.  Since ix86_find_max_used_stack_alignment
checks if stack frame is required, it can set a bit in machine_function
to let ix86_compute_frame_layout know that stack frame isn't required.

Tested on i686 and x86-64 with

--with-arch=native --with-cpu=native

on AVX512 machine.  Tested on i686 and x86-64 without

--with-arch=native --with-cpu=native

on x86-64 machine.  OK for trunk?

Thanks.

H.J.
---
gcc/

	PR target/88496
	* config/i386/i386.c (ix86_compute_frame_layout): Set frame size
	to 0 if the function doesn't need a stack frame.
	(ix86_find_max_used_stack_alignment): Set no_stack_frame to 1 if
	stack frame isn't required.
	* config/i386/i386.h (machine_function): Add no_stack_frame.

gcc/testsuite/

	PR target/88496
	* gcc.target/i386/pr88496.c: New test.
---
 gcc/config/i386/i386.c                  | 10 +++++++++-
 gcc/config/i386/i386.h                  |  3 +++
 gcc/testsuite/gcc.target/i386/pr88496.c | 17 +++++++++++++++++
 3 files changed, 29 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr88496.c
diff mbox series

Patch

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index b6dea0c061d..3ef9c967bd6 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -11164,9 +11164,14 @@  ix86_compute_frame_layout (void)
   unsigned HOST_WIDE_INT stack_alignment_needed;
   HOST_WIDE_INT offset;
   unsigned HOST_WIDE_INT preferred_alignment;
-  HOST_WIDE_INT size = get_frame_size ();
+  HOST_WIDE_INT size;
   HOST_WIDE_INT to_allocate;
 
+  if (cfun->machine->no_stack_frame)
+    size = HOST_WIDE_INT_C (0);
+  else
+    size = get_frame_size ();
+
   /* m->call_ms2sysv is initially enabled in ix86_expand_call for all 64-bit
    * ms_abi functions that call a sysv function.  We now need to prune away
    * cases where it should be disabled.  */
@@ -12830,6 +12835,9 @@  ix86_find_max_used_stack_alignment (unsigned int &stack_alignment,
 	  }
     }
 
+  if (!require_stack_frame)
+    cfun->machine->no_stack_frame = 1;
+
   return require_stack_frame;
 }
 
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 64fc5d4058a..4ee86973977 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -2754,6 +2754,9 @@  struct GTY(()) machine_function {
   /* If true, ENDBR is queued at function entrance.  */
   BOOL_BITFIELD endbr_queued_at_entrance : 1;
 
+  /* Nonzero if the function doesn't need a stack frame.  */
+  BOOL_BITFIELD no_stack_frame : 1;
+
   /* The largest alignment, in bytes, of stack slot actually used.  */
   unsigned int max_used_stack_alignment;
 
diff --git a/gcc/testsuite/gcc.target/i386/pr88496.c b/gcc/testsuite/gcc.target/i386/pr88496.c
new file mode 100644
index 00000000000..c07ab594414
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr88496.c
@@ -0,0 +1,17 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512f" } */
+
+struct B
+{
+  char a[12];
+  int b;
+};
+
+struct B
+f2 (void)
+{
+  struct B x = {};
+  return x;
+}
+
+/* { dg-final { scan-assembler-not "(sub|add)(l|q)\[\\t \]*\\$\[0-9\]*,\[\\t \]*%\[re\]?sp" } } */