On Thu, Dec 13, 2018 at 6:36 PM H.J. Lu <hongjiu...@intel.com> wrote:
>
> get_frame_size () returns used stack slots during compilation, which
> may be optimized out later.  Since ix86_find_max_used_stack_alignment
> is called by ix86_finalize_stack_frame_flags to check if stack frame
> is required, there is no need to call get_frame_size () which may give
> inaccurate final stack frame size.
>
> Tested on AVX512 machine configured with
>
> --with-arch=native --with-cpu=native
>
> OK for trunk?
>
>
> H.J.
> ---
> gcc/
>
>         PR target/88483
>         * config/i386/i386.c (ix86_finalize_stack_frame_flags): Don't
>         use get_frame_size ().
>
> gcc/testsuite/
>
>         PR target/88483
>         * gcc.target/i386/stackalign/pr88483.c: New test.

LGTM, but you know this part of the compiler better than I.

Thanks,
Uros.

> ---
>  gcc/config/i386/i386.c                          |  1 -
>  .../gcc.target/i386/stackalign/pr88483.c        | 17 +++++++++++++++++
>  2 files changed, 17 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/gcc.target/i386/stackalign/pr88483.c
>
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index caa701fe242..edc8f4f092e 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -12876,7 +12876,6 @@ ix86_finalize_stack_frame_flags (void)
>            && flag_exceptions
>            && cfun->can_throw_non_call_exceptions)
>        && !ix86_frame_pointer_required ()
> -      && get_frame_size () == 0
>        && ix86_nsaved_sseregs () == 0
>        && ix86_varargs_gpr_size + ix86_varargs_fpr_size == 0)
>      {
> diff --git a/gcc/testsuite/gcc.target/i386/stackalign/pr88483.c 
> b/gcc/testsuite/gcc.target/i386/stackalign/pr88483.c
> new file mode 100644
> index 00000000000..5aec8fd4cf6
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/stackalign/pr88483.c
> @@ -0,0 +1,17 @@
> +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
> +/* { dg-options "-O2 -mavx2" } */
> +
> +struct B
> +{
> +  char a[12];
> +  int b;
> +};
> +
> +struct B
> +f2 (void)
> +{
> +  struct B x = {};
> +  return x;
> +}
> +
> +/* { dg-final { scan-assembler-not 
> "and\[lq\]?\[^\\n\]*-\[0-9\]+,\[^\\n\]*sp" } } */
> --
> 2.19.2
>

Reply via email to