From e846028c2ab6dca13e532137a19ae584bf89f0fa Mon Sep 17 00:00:00 2001 From: hjl Date: Sun, 17 Sep 2017 21:11:04 +0000 Subject: 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. (cherry picked from commit a842b1bde9fa682693226e126fe8128d71ca944d) --- 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 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 (); +} -- cgit v1.2.1