> -----Original Message-----
> From: H.J. Lu <hjl.to...@gmail.com>
> Sent: Thursday, August 14, 2025 10:29 AM
> To: gcc-patches@gcc.gnu.org
> Cc: ubiz...@gmail.com; Liu, Hongtao <hongtao....@intel.com>
> Subject: [PATCH v2] x86: Disallow MMX and 80387 in
> no_caller_saved_registers function
> 
> commit 9804b23198b39f85a7258be556c5e8aed44b9efc
> Author: H.J. Lu <hjl.to...@gmail.com>
> Date:   Sun Apr 13 11:38:24 2025 -0700
> 
>     x86: Add preserve_none and update no_caller_saved_registers attributes
> 
> allowed MMX/80387 instructions in functions with no_caller_saved_registers
> attribute by accident.  Update ix86_set_current_function to properly check if
> MMX and 80387 are enabled.

Ok.
> 
> gcc/
> 
>       PR target/121540
>       * config/i386/i386-options.cc (ix86_set_current_function):
>       Properly check if MMX and 80387 are enabled.
> 
> gcc/testsuite/
> 
>       PR target/121540
>       * gcc.target/i386/no-callee-saved-19a.c (dg-options): Add
>       "-mno-avx -mno-mmx -mno-80387"
>       * gcc.target/i386/no-callee-saved-19b.c: Likewise.
>       * gcc.target/i386/no-callee-saved-19c.c: Likewise.
>       * gcc.target/i386/no-callee-saved-19d.c: Likewise.
>       * gcc.target/i386/no-callee-saved-19e.c: Likewise.
>       * gcc.target/i386/pr121208-1a.c: Likewise.
>       * gcc.target/i386/pr121208-1b.c: Likewise.
>       * gcc.target/i386/pr121540-1.c: New test.
>       * gcc.target/i386/pr121540-2.c: Likewise.
> 
> Signed-off-by: H.J. Lu <hjl.to...@gmail.com>
> ---
>  gcc/config/i386/i386-options.cc                     | 4 ++++
>  gcc/testsuite/gcc.target/i386/no-callee-saved-19a.c | 2 +-
> gcc/testsuite/gcc.target/i386/no-callee-saved-19b.c | 2 +-
> gcc/testsuite/gcc.target/i386/no-callee-saved-19c.c | 2 +-
> 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/pr121208-1a.c         | 2 +-
>  gcc/testsuite/gcc.target/i386/pr121208-1b.c         | 2 +-
>  gcc/testsuite/gcc.target/i386/pr121540-1.c          | 8 ++++++++
>  gcc/testsuite/gcc.target/i386/pr121540-2.c          | 8 ++++++++
>  10 files changed, 27 insertions(+), 7 deletions(-)  create mode 100644
> gcc/testsuite/gcc.target/i386/pr121540-1.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr121540-2.c
> 
> diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386-options.cc
> index 09a35ef6298..136c0f2e966 100644
> --- a/gcc/config/i386/i386-options.cc
> +++ b/gcc/config/i386/i386-options.cc
> @@ -3556,6 +3556,10 @@ ix86_set_current_function (tree fndecl)
>           isa = "AVX";
>         else if (cfun->machine->func_type != TYPE_NORMAL)
>           isa = "SSE";
> +       else if (TARGET_MMX)
> +         isa = "MMX/3Dnow";
> +       else if (TARGET_80387)
> +         isa = "80387";
>         else
>           isa = NULL;
>       }
> diff --git a/gcc/testsuite/gcc.target/i386/no-callee-saved-19a.c
> b/gcc/testsuite/gcc.target/i386/no-callee-saved-19a.c
> index 12f35cfa8bb..3ba578df8c2 100644
> --- a/gcc/testsuite/gcc.target/i386/no-callee-saved-19a.c
> +++ b/gcc/testsuite/gcc.target/i386/no-callee-saved-19a.c
> @@ -1,5 +1,5 @@
>  /* { dg-do compile { target { *-*-linux* && lp64 } } } */
> -/* { dg-options "-O2 -fno-pic -mtune=generic -msse2 -mno-apxf -mtune-
> ctrl=prologue_using_move,epilogue_using_move" } */
> +/* { dg-options "-O2 -fno-pic -mtune=generic -msse2 -mno-avx -mno-mmx
> +-mno-80387 -mno-apxf
> +-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-19b.c
> b/gcc/testsuite/gcc.target/i386/no-callee-saved-19b.c
> index c9343a65470..dc38936a61a 100644
> --- a/gcc/testsuite/gcc.target/i386/no-callee-saved-19b.c
> +++ b/gcc/testsuite/gcc.target/i386/no-callee-saved-19b.c
> @@ -1,5 +1,5 @@
>  /* { dg-do compile { target { *-*-linux* && maybe_x32 } } } */
> -/* { dg-options "-O2 -mx32 -fno-pic -mtune=generic -msse2 -mno-apxf -
> mtune-ctrl=prologue_using_move,epilogue_using_move" } */
> +/* { dg-options "-O2 -mx32 -fno-pic -mtune=generic -msse2 -mno-avx
> +-mno-mmx -mno-80387 -mno-apxf
> +-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-19c.c
> b/gcc/testsuite/gcc.target/i386/no-callee-saved-19c.c
> index 05aca9f4b11..e7f247b723c 100644
> --- a/gcc/testsuite/gcc.target/i386/no-callee-saved-19c.c
> +++ b/gcc/testsuite/gcc.target/i386/no-callee-saved-19c.c
> @@ -1,5 +1,5 @@
>  /* { dg-do compile { target { *-*-linux* && ia32 } } } */
> -/* { dg-options "-O2 -fno-pic -mtune=generic -msse2 -mtune-
> ctrl=prologue_using_move,epilogue_using_move" } */
> +/* { dg-options "-O2 -fno-pic -mtune=generic -msse2 -mno-avx -mno-mmx
> +-mno-80387 -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-19d.c
> b/gcc/testsuite/gcc.target/i386/no-callee-saved-19d.c
> index b3caa3d81b2..4657e170350 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 -mapxf -mtune-
> ctrl=prologue_using_move,epilogue_using_move" } */
> +/* { dg-options "-O2 -fno-pic -mtune=generic -msse2 -mno-avx -mno-mmx
> +-mno-80387 -mapxf -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 3fcb41ff196..8e0bbe82eae 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 -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
> +-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/pr121208-1a.c
> b/gcc/testsuite/gcc.target/i386/pr121208-1a.c
> index cb8bd0bc8d2..f799bc81d4d 100644
> --- a/gcc/testsuite/gcc.target/i386/pr121208-1a.c
> +++ b/gcc/testsuite/gcc.target/i386/pr121208-1a.c
> @@ -1,5 +1,5 @@
>  /* { dg-do compile { target *-*-linux* } } */
> -/* { dg-options "-O2 -fPIC -mno-80387 -mtls-dialect=gnu" } */
> +/* { dg-options "-O2 -fPIC -mno-avx -mno-mmx -mno-80387
> +-mtls-dialect=gnu" } */
> 
>  extern __thread int bar;
>  extern void func (void);
> diff --git a/gcc/testsuite/gcc.target/i386/pr121208-1b.c
> b/gcc/testsuite/gcc.target/i386/pr121208-1b.c
> index 037e9a0899c..ba37abccfc0 100644
> --- a/gcc/testsuite/gcc.target/i386/pr121208-1b.c
> +++ b/gcc/testsuite/gcc.target/i386/pr121208-1b.c
> @@ -1,4 +1,4 @@
>  /* { dg-do compile { target *-*-linux* } } */
> -/* { dg-options "-O2 -fPIC -mno-80387 -mtls-dialect=gnu2" } */
> +/* { dg-options "-O2 -fPIC -mno-avx -mno-mmx -mno-80387
> +-mtls-dialect=gnu2" } */
> 
>  #include "pr121208-1a.c"
> diff --git a/gcc/testsuite/gcc.target/i386/pr121540-1.c
> b/gcc/testsuite/gcc.target/i386/pr121540-1.c
> new file mode 100644
> index 00000000000..dee9c279d39
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr121540-1.c
> @@ -0,0 +1,8 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -march=x86-64" } */
> +
> +void
> + __attribute__ ((no_caller_saved_registers)) fn (void) { /* {
> +dg-message "sorry, unimplemented: MMX/3Dnow instructions aren't
> +allowed" } */ }
> diff --git a/gcc/testsuite/gcc.target/i386/pr121540-2.c
> b/gcc/testsuite/gcc.target/i386/pr121540-2.c
> new file mode 100644
> index 00000000000..15a3f40af33
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr121540-2.c
> @@ -0,0 +1,8 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -march=x86-64 -mno-mmx" } */
> +
> +void
> + __attribute__ ((no_caller_saved_registers)) fn (void) { /* {
> +dg-message "sorry, unimplemented: 80387 instructions aren't allowed" }
> +*/ }
> --
> 2.50.1

Reply via email to