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

Reply via email to