aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2017-09-17 21:11:04 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2017-09-17 14:11:04 -0700
commit01f44e44faf37fc34775b9e28e46d1c9243b247d (patch)
tree4753999119bb079225243f730344aa0c7dddd2be
parent62d3c075d52f1b92481bd0cdb9b0ef242210f512 (diff)
downloadgcc-01f44e44faf37fc34775b9e28e46d1c9243b247d.zip
gcc-01f44e44faf37fc34775b9e28e46d1c9243b247d.tar.gz
gcc-01f44e44faf37fc34775b9e28e46d1c9243b247d.tar.bz2
i386: Update preferred stack boundary for leaf functions
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. gcc/ PR target/82166 * config/i386/i386.c (ix86_finalize_stack_frame_flags): Properly compute the minimum stack alignment. Also update preferred stack boundary for leaf functions. gcc/testsuite/ PR target/82166 * gcc.target/i386/pr82166.c: New test. From-SVN: r252895
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/i386.c17
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr82166.c14
4 files changed, 38 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e213db6..b09c7ce 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2017-09-17 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR target/82166
+ * config/i386/i386.c (ix86_finalize_stack_frame_flags): Properly
+ compute the minimum stack alignment. Also update preferred stack
+ boundary for leaf functions.
+
2017-09-16 Richard Sandiford <richard.sandiford@linaro.org>
PR tree-optimization/82228
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index fa79762..4f0414f 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/ChangeLog b/gcc/testsuite/ChangeLog
index d40f08e..47de348 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-09-17 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR target/82166
+ * gcc.target/i386/pr82166.c: New test.
+
2017-09-17 Paul Thomas <pault@gcc.gnu.org>
PR fortran/82173
diff --git a/gcc/testsuite/gcc.target/i386/pr82166.c b/gcc/testsuite/gcc.target/i386/pr82166.c
new file mode 100644
index 0000000..8bc63e1
--- /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 ();
+}