On Sun, Aug 6, 2017 at 9:40 PM, H.J. Lu <[email protected]> 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
>