V pon., 18. maj 2026 09:23 je oseba liuhongt <[email protected]>
napisala:

> 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?
>

I don't think this is a good idea. -mapx would change one of the more
important compile flags behind user's back and it also means %rbp would
become unavailable in asms. Users can always enable frame pointer with
appropriate compile flag when required, as is the case with i. e. Fedora.

Uros.

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