[PATCH] PR target/82166: Update preferred stack boundary for leaf functions

H.J. Lu hjl.tools@gmail.com
Mon Sep 11 01:57:00 GMT 2017


preferred_stack_boundary may not be the minimum stack alignment.  For
leaf functions without TLS access, max_used_stack_slot_alignment may be
smaller.  We should update preferred_stack_boundary for leaf functions.

Tested on i686 and x86-64.  OK for trunk?

H.J.
---
gcc/

	PR target/82166
	* config/i386/i386.c (ix86_finalize_stack_frame_flags): Properly
	compute the minimum stack alignment.  Also update preferred stack
	boundary when main () is a leaf function.

gcc/testsuite/

	PR target/82166
	* gcc.target/i386/pr82166.c: New test.
---
 gcc/config/i386/i386.c                  | 17 ++++++++++++-----
 gcc/testsuite/gcc.target/i386/pr82166.c | 14 ++++++++++++++
 2 files changed, 26 insertions(+), 5 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr82166.c

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 4e93cc1043b..03338e422be 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -14257,11 +14257,12 @@ ix86_finalize_stack_frame_flags (void)
   unsigned int incoming_stack_boundary
     = (crtl->parm_stack_boundary > ix86_incoming_stack_boundary
        ? crtl->parm_stack_boundary : ix86_incoming_stack_boundary);
+  unsigned int stack_alignment
+    = (crtl->is_leaf && !ix86_current_function_calls_tls_descriptor
+       ? crtl->max_used_stack_slot_alignment
+       : crtl->stack_alignment_needed);
   unsigned int stack_realign
-    = (incoming_stack_boundary
-       < (crtl->is_leaf && !ix86_current_function_calls_tls_descriptor
-	  ? crtl->max_used_stack_slot_alignment
-	  : crtl->stack_alignment_needed));
+    = (incoming_stack_boundary < stack_alignment);
   bool recompute_frame_layout_p = false;
 
   if (crtl->stack_realign_finalized)
@@ -14306,7 +14307,9 @@ ix86_finalize_stack_frame_flags (void)
 			   HARD_FRAME_POINTER_REGNUM);
 
       /* The preferred stack alignment is the minimum stack alignment.  */
-      unsigned int stack_alignment = crtl->preferred_stack_boundary;
+      if (stack_alignment > crtl->preferred_stack_boundary)
+	stack_alignment = crtl->preferred_stack_boundary;
+
       bool require_stack_frame = false;
 
       FOR_EACH_BB_FN (bb, cfun)
@@ -14349,6 +14352,10 @@ ix86_finalize_stack_frame_flags (void)
 		= incoming_stack_boundary;
 	      crtl->stack_alignment_needed
 		= incoming_stack_boundary;
+	      /* Also update preferred_stack_boundary for leaf
+	         functions.  */
+	      crtl->preferred_stack_boundary
+		= incoming_stack_boundary;
 	    }
 	}
       else
diff --git a/gcc/testsuite/gcc.target/i386/pr82166.c b/gcc/testsuite/gcc.target/i386/pr82166.c
new file mode 100644
index 00000000000..8bc63e15231
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr82166.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+
+void foo (void);
+int a, b, c;
+int
+main (void)
+{
+  int j;
+  for (; c;)
+    a = b;
+  for (; j;)
+    foo ();
+}
-- 
2.13.5



More information about the Gcc-patches mailing list