diff options
author | H.J. Lu <hongjiu.lu@intel.com> | 2017-08-07 11:49:10 +0000 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2017-08-07 04:49:10 -0700 |
commit | 079a03638c5c38918f608c496ca1032a9ddc26c9 (patch) | |
tree | 8789d79f13ef45850fab00accf16b4d49977cbf9 | |
parent | 356512c0660a1f549c48128ab63cc56077d05db2 (diff) | |
download | gcc-079a03638c5c38918f608c496ca1032a9ddc26c9.zip gcc-079a03638c5c38918f608c496ca1032a9ddc26c9.tar.gz gcc-079a03638c5c38918f608c496ca1032a9ddc26c9.tar.bz2 |
i386: Don't use frame pointer without stack access
When there is no stack access, there is no need to use frame pointer
even if -fno-omit-frame-pointer is used.
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.
From-SVN: r250916
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 26 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr81736-1.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr81736-2.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr81736-3.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr81736-4.c | 11 |
7 files changed, 84 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a78b1a7..01eb335 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,18 @@ 2017-08-07 H.J. Lu <hongjiu.lu@intel.com> + 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. + +2017-08-07 H.J. Lu <hongjiu.lu@intel.com> + PR target/81743 * config/i386/i386.c (get_builtin_code_for_version): Set priority to P_AES for Westmere. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index c0b6015..4683da3 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/ChangeLog b/gcc/testsuite/ChangeLog index bf161a3..0e75032 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2017-08-07 H.J. Lu <hongjiu.lu@intel.com> + + 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. + 2017-08-07 Marek Polacek <polacek@redhat.com> PR middle-end/81737 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 0000000..92c7bc9 --- /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 0000000..a372087 --- /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 0000000..c3bde7d --- /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 0000000..25f5001 --- /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" } } */ |