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 >