On Sun, Aug 6, 2017 at 9:40 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
> When there is no stack access, there is no need to use frame pointer
> even if -fno-omit-frame-pointer is used.
>
> Tested on i686 and x86-64.  OK for trunk?
>
> H.J.
> ---
> gcc/
>
>         PR target/81736
>         * config/i386/i386.c (ix86_finalize_stack_realign_flags): Renamed
>         to ...
>         (ix86_finalize_stack_frame_flags): This.  Also clear
>         frame_pointer_needed if -fno-omit-frame-pointer is used without
>         stack access.
>         (ix86_expand_prologue): Replace ix86_finalize_stack_realign_flags
>         with ix86_finalize_stack_frame_flags.
>         (ix86_expand_epilogue): Likewise.
>         (ix86_expand_split_stack_prologue): Likewise.
>
> gcc/testsuite/
>
>         PR target/81736
>         * gcc.target/i386/pr81736-1.c: New test.
>         * gcc.target/i386/pr81736-2.c: Likewise.
>         * gcc.target/i386/pr81736-3.c: Likewise.
>         * gcc.target/i386/pr81736-4.c: Likewise.

LGTM.

Thanks,
Uros.

>  gcc/config/i386/i386.c                    | 26 ++++++++++++++------------
>  gcc/testsuite/gcc.target/i386/pr81736-1.c | 13 +++++++++++++
>  gcc/testsuite/gcc.target/i386/pr81736-2.c | 14 ++++++++++++++
>  gcc/testsuite/gcc.target/i386/pr81736-3.c | 11 +++++++++++
>  gcc/testsuite/gcc.target/i386/pr81736-4.c | 11 +++++++++++
>  5 files changed, 63 insertions(+), 12 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr81736-1.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr81736-2.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr81736-3.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr81736-4.c
>
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index a5984659eb2..fb16b5e77a3 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -14116,22 +14116,24 @@ output_probe_stack_range (rtx reg, rtx end)
>    return "";
>  }
>
> -/* Finalize stack_realign_needed flag, which will guide prologue/epilogue
> -   to be generated in correct form.  */
> +/* Finalize stack_realign_needed and frame_pointer_needed flags, which
> +   will guide prologue/epilogue to be generated in correct form.  */
> +
>  static void
> -ix86_finalize_stack_realign_flags (void)
> +ix86_finalize_stack_frame_flags (void)
>  {
>    /* Check if stack realign is really needed after reload, and
>       stores result in cfun */
>    unsigned int incoming_stack_boundary
>      = (crtl->parm_stack_boundary > ix86_incoming_stack_boundary
>         ? crtl->parm_stack_boundary : ix86_incoming_stack_boundary);
> -  unsigned int stack_realign
> +  bool stack_realign
>      = (incoming_stack_boundary
>         < (crtl->is_leaf && !ix86_current_function_calls_tls_descriptor
>           ? crtl->max_used_stack_slot_alignment
>           : crtl->stack_alignment_needed));
>    bool recompute_frame_layout_p = false;
> +  bool omit_frame_pointer = flag_omit_frame_pointer != 0;
>
>    if (crtl->stack_realign_finalized)
>      {
> @@ -14142,13 +14144,13 @@ ix86_finalize_stack_realign_flags (void)
>      }
>
>    /* If the only reason for frame_pointer_needed is that we conservatively
> -     assumed stack realignment might be needed, but in the end nothing that
> -     needed the stack alignment had been spilled, clear frame_pointer_needed
> -     and say we don't need stack realignment.  */
> -  if (stack_realign
> +     assumed stack realignment might be needed or -fno-omit-frame-pointer
> +     is used, but in the end nothing that needed the stack alignment had
> +     been spilled nor stack access, clear frame_pointer_needed and say we
> +     don't need stack realignment.  */
> +  if (stack_realign == omit_frame_pointer
>        && frame_pointer_needed
>        && crtl->is_leaf
> -      && flag_omit_frame_pointer
>        && crtl->sp_is_unchanging
>        && !ix86_current_function_calls_tls_descriptor
>        && !crtl->accesses_prior_frames
> @@ -14339,7 +14341,7 @@ ix86_expand_prologue (void)
>    if (ix86_function_naked (current_function_decl))
>      return;
>
> -  ix86_finalize_stack_realign_flags ();
> +  ix86_finalize_stack_frame_flags ();
>
>    /* DRAP should not coexist with stack_realign_fp */
>    gcc_assert (!(crtl->drap_reg && stack_realign_fp));
> @@ -15203,7 +15205,7 @@ ix86_expand_epilogue (int style)
>        return;
>      }
>
> -  ix86_finalize_stack_realign_flags ();
> +  ix86_finalize_stack_frame_flags ();
>    frame = m->frame;
>
>    m->fs.sp_realigned = stack_realign_fp;
> @@ -15738,7 +15740,7 @@ ix86_expand_split_stack_prologue (void)
>
>    gcc_assert (flag_split_stack && reload_completed);
>
> -  ix86_finalize_stack_realign_flags ();
> +  ix86_finalize_stack_frame_flags ();
>    frame = cfun->machine->frame;
>    allocate = frame.stack_pointer_offset - INCOMING_FRAME_SP_OFFSET;
>
> diff --git a/gcc/testsuite/gcc.target/i386/pr81736-1.c 
> b/gcc/testsuite/gcc.target/i386/pr81736-1.c
> new file mode 100644
> index 00000000000..92c7bc97a0d
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr81736-1.c
> @@ -0,0 +1,13 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fno-omit-frame-pointer" } */
> +
> +extern int i;
> +
> +int
> +foo (void)
> +{
> +  return i;
> +}
> +
> +/* No need to use a frame pointer.  */
> +/* { dg-final { scan-assembler-not "%\[re\]bp" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr81736-2.c 
> b/gcc/testsuite/gcc.target/i386/pr81736-2.c
> new file mode 100644
> index 00000000000..a3720879937
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr81736-2.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fno-omit-frame-pointer" } */
> +
> +int
> +#ifndef __x86_64__
> +__attribute__((regparm(3)))
> +#endif
> +foo (int i)
> +{
> +  return i;
> +}
> +
> +/* No need to use a frame pointer.  */
> +/* { dg-final { scan-assembler-not "%\[re\]bp" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr81736-3.c 
> b/gcc/testsuite/gcc.target/i386/pr81736-3.c
> new file mode 100644
> index 00000000000..c3bde7dd933
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr81736-3.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fno-omit-frame-pointer" } */
> +
> +void
> +foo (void)
> +{
> +  asm ("# " : : : "ebx");
> +}
> +
> +/* Need to use a frame pointer.  */
> +/* { dg-final { scan-assembler "%\[re\]bp" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr81736-4.c 
> b/gcc/testsuite/gcc.target/i386/pr81736-4.c
> new file mode 100644
> index 00000000000..25f50016a64
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr81736-4.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fno-omit-frame-pointer" } */
> +
> +int
> +foo (int i1, int i2, int i3, int i4, int i5, int i6, int i7)
> +{
> +  return i7;
> +}
> +
> +/* Need to use a frame pointer.  */
> +/* { dg-final { scan-assembler "%\[re\]bp" } } */
> --
> 2.13.3
>

Reply via email to