When APX_F is enabled the extra 16 GPRs make retaining %rbp as the
frame pointer essentially free, while keeping it improves unwind and
profiling quality. Default flag_omit_frame_pointer to 0 when
TARGET_APX_F is on and the user did not pass -f[no-]omit-frame-pointer
explicitly. APX is 64-bit only, so the 32-bit branch is unchanged.
Three pre-existing -mapxf tests hard-code prologues without a frame
pointer; pass -fomit-frame-pointer explicitly so they keep testing
their callee-saved-register expectations.
Bootstrapped and regtested on x86_64-pc-linux-gnu{-m32,}.
Ok for trunk?
gcc/ChangeLog:
* config/i386/i386-options.cc (ix86_recompute_optlev_based_flags):
Keep the frame pointer by default when TARGET_APX_F is enabled.
gcc/testsuite/ChangeLog:
* gcc.target/i386/apx-frame-pointer-1.c: New test.
* gcc.target/i386/apx-frame-pointer-2.c: New test.
* gcc.target/i386/no-callee-saved-19d.c: Add -fomit-frame-pointer.
* gcc.target/i386/no-callee-saved-19e.c: Likewise.
* gcc.target/i386/pr119784a.c: Likewise.
* gcc.target/i386/pr119784b.c: Likewise.
---
gcc/config/i386/i386-options.cc | 3 ++-
gcc/testsuite/gcc.target/i386/apx-frame-pointer-1.c | 13 +++++++++++++
gcc/testsuite/gcc.target/i386/apx-frame-pointer-2.c | 13 +++++++++++++
gcc/testsuite/gcc.target/i386/no-callee-saved-19d.c | 2 +-
gcc/testsuite/gcc.target/i386/no-callee-saved-19e.c | 2 +-
gcc/testsuite/gcc.target/i386/pr119784a.c | 2 +-
gcc/testsuite/gcc.target/i386/pr119784b.c | 2 +-
7 files changed, 32 insertions(+), 5 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/i386/apx-frame-pointer-1.c
create mode 100644 gcc/testsuite/gcc.target/i386/apx-frame-pointer-2.c
diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386-options.cc
index 7ffe9cd2a38..dd58b198ce4 100644
--- a/gcc/config/i386/i386-options.cc
+++ b/gcc/config/i386/i386-options.cc
@@ -1899,7 +1899,8 @@ ix86_recompute_optlev_based_flags (struct gcc_options
*opts,
{
if (opts->x_optimize >= 1)
SET_OPTION_IF_UNSET (opts, opts_set, flag_omit_frame_pointer,
- !USE_IX86_FRAME_POINTER);
+ !(USE_IX86_FRAME_POINTER
+ || TARGET_APX_F_P (opts->x_ix86_isa_flags2)));
if (opts->x_flag_asynchronous_unwind_tables
&& TARGET_64BIT_MS_ABI)
SET_OPTION_IF_UNSET (opts, opts_set, flag_unwind_tables, 1);
diff --git a/gcc/testsuite/gcc.target/i386/apx-frame-pointer-1.c
b/gcc/testsuite/gcc.target/i386/apx-frame-pointer-1.c
new file mode 100644
index 00000000000..2b70db764c1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/apx-frame-pointer-1.c
@@ -0,0 +1,13 @@
+/* Verify that -mapxf implies -fno-omit-frame-pointer when the user
+ didn't pass -f[no-]omit-frame-pointer explicitly. */
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-O2 -mapxf" } */
+/* { dg-final { scan-assembler "movq\[ \t\]+%rsp, %rbp" } } */
+
+extern int bar (int);
+
+int
+foo (int a, int b)
+{
+ return bar (a) + bar (b);
+}
diff --git a/gcc/testsuite/gcc.target/i386/apx-frame-pointer-2.c
b/gcc/testsuite/gcc.target/i386/apx-frame-pointer-2.c
new file mode 100644
index 00000000000..7f895fc9675
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/apx-frame-pointer-2.c
@@ -0,0 +1,13 @@
+/* An explicit -fomit-frame-pointer must still win over the APX_F-driven
+ default. */
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-O2 -mapxf -fomit-frame-pointer" } */
+/* { dg-final { scan-assembler-not "movq\[ \t\]+%rsp, %rbp" } } */
+
+extern int bar (int);
+
+int
+foo (int a, int b)
+{
+ return bar (a) + bar (b);
+}
diff --git a/gcc/testsuite/gcc.target/i386/no-callee-saved-19d.c
b/gcc/testsuite/gcc.target/i386/no-callee-saved-19d.c
index 4657e170350..d0e355d6c25 100644
--- a/gcc/testsuite/gcc.target/i386/no-callee-saved-19d.c
+++ b/gcc/testsuite/gcc.target/i386/no-callee-saved-19d.c
@@ -1,5 +1,5 @@
/* { dg-do compile { target { *-*-linux* && lp64 } } } */
-/* { dg-options "-O2 -fno-pic -mtune=generic -msse2 -mno-avx -mno-mmx
-mno-80387 -mapxf -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
+/* { dg-options "-O2 -fno-pic -mtune=generic -msse2 -mno-avx -mno-mmx
-mno-80387 -mapxf -fomit-frame-pointer
-mtune-ctrl=prologue_using_move,epilogue_using_move" } */
/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc'). */
/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}
} } */
diff --git a/gcc/testsuite/gcc.target/i386/no-callee-saved-19e.c
b/gcc/testsuite/gcc.target/i386/no-callee-saved-19e.c
index 8e0bbe82eae..b3e3f804c0a 100644
--- a/gcc/testsuite/gcc.target/i386/no-callee-saved-19e.c
+++ b/gcc/testsuite/gcc.target/i386/no-callee-saved-19e.c
@@ -1,5 +1,5 @@
/* { dg-do compile { target { *-*-linux* && maybe_x32 } } } */
-/* { dg-options "-O2 -mx32 -fno-pic -mtune=generic -msse2 -mno-avx -mno-mmx
-mno-80387 -mapxf -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
+/* { dg-options "-O2 -mx32 -fno-pic -mtune=generic -msse2 -mno-avx -mno-mmx
-mno-80387 -mapxf -fomit-frame-pointer
-mtune-ctrl=prologue_using_move,epilogue_using_move" } */
/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc'). */
/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}
} } */
diff --git a/gcc/testsuite/gcc.target/i386/pr119784a.c
b/gcc/testsuite/gcc.target/i386/pr119784a.c
index a3b7e4aa7cc..6f741b36d0f 100644
--- a/gcc/testsuite/gcc.target/i386/pr119784a.c
+++ b/gcc/testsuite/gcc.target/i386/pr119784a.c
@@ -1,5 +1,5 @@
/* { dg-do compile { target { *-*-linux* && lp64 } } } */
-/* { dg-options "-O2 -fno-pic -mtune=generic -mgeneral-regs-only -mapxf
-mtune-ctrl=prologue_using_move,epilogue_using_move" } */
+/* { dg-options "-O2 -fno-pic -mtune=generic -mgeneral-regs-only -mapxf
-fomit-frame-pointer -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc'). */
/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}
} } */
diff --git a/gcc/testsuite/gcc.target/i386/pr119784b.c
b/gcc/testsuite/gcc.target/i386/pr119784b.c
index c6761976ed6..55fabcb9b86 100644
--- a/gcc/testsuite/gcc.target/i386/pr119784b.c
+++ b/gcc/testsuite/gcc.target/i386/pr119784b.c
@@ -1,5 +1,5 @@
/* { dg-do compile { target { *-*-linux* && x32 } } } */
-/* { dg-options "-O2 -fno-pic -mtune=generic -mgeneral-regs-only -mapxf
-mtune-ctrl=prologue_using_move,epilogue_using_move" } */
+/* { dg-options "-O2 -fno-pic -mtune=generic -mgeneral-regs-only -mapxf
-fomit-frame-pointer -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc'). */
/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}
} } */
--
2.34.1