On Mon, Sep 11, 2017 at 3:57 AM, H.J. Lu <hjl.to...@gmail.com> wrote:
> 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.

LGTM.

Thanks,
Uros.

> ---
>  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
>

Reply via email to