summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>2017-09-17 21:11:04 +0000
committerH.J. Lu <hjl.tools@gmail.com>2017-09-17 14:24:59 -0700
commite846028c2ab6dca13e532137a19ae584bf89f0fa (patch)
tree6087f93453f865d54fbae30eb5669e63e0a92753
parent1287fe49cea27b7e28493ebeef321463fcfac82a (diff)
downloadgcc-hjl/pr82166/gcc-7-branch.tar.gz
i386: Update preferred stack boundary for leaf functionshjl/pr82166/gcc-7-branch
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. (cherry picked from commit a842b1bde9fa682693226e126fe8128d71ca944d)
-rw-r--r--gcc/config/i386/i386.c17
-rw-r--r--gcc/testsuite/gcc.target/i386/pr82166.c14
2 files changed, 26 insertions, 5 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 743305bf592..93eb559a314 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -13606,11 +13606,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);
if (crtl->stack_realign_finalized)
{
@@ -13654,7 +13655,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)
@@ -13697,6 +13700,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 ();
+}