On Wed, Jul 3, 2024 at 9:25 AM liuhongt <[email protected]> wrote:
>
> The patch can avoid SIGILL on non-AVX512 machine due to kmovd is
> generated in dynamic check.
>
> Committed as an obvious fix.
Hmm, now all avx512 tests SIGILL when testing with -m32:
Dump of assembler code for function __get_cpuid_count:
=> 0x08049500 <+0>: kmovd %eax,%k2
0x08049504 <+4>: kmovd %edx,%k1
0x08049508 <+8>: pushf
0x08049509 <+9>: pushf
0x0804950a <+10>: pop %eax
0x0804950b <+11>: mov %eax,%edx
looks like __get_cpuid_count is no longer inlined but AVX512 is in
effect for it.
Maybe use #pragma GCC target around the includes instead?
> gcc/testsuite/ChangeLog:
>
> PR target/115748
> * gcc.target/i386/avx512-check.h: Move runtime check into a
> separate function and guard it with target ("no-avx").
> ---
> gcc/testsuite/gcc.target/i386/avx512-check.h | 14 +++++++++++++-
> 1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/testsuite/gcc.target/i386/avx512-check.h
> b/gcc/testsuite/gcc.target/i386/avx512-check.h
> index 0ad9064f637..71858a33dac 100644
> --- a/gcc/testsuite/gcc.target/i386/avx512-check.h
> +++ b/gcc/testsuite/gcc.target/i386/avx512-check.h
> @@ -34,8 +34,9 @@ check_osxsave (void)
> return (ecx & bit_OSXSAVE) != 0;
> }
>
> +__attribute__((noipa,target("no-avx")))
> int
> -main ()
> +avx512_runtime_support_p ()
> {
> unsigned int eax, ebx, ecx, edx;
>
> @@ -100,6 +101,17 @@ main ()
> && (edx & bit_AVX512VP2INTERSECT)
> #endif
> && avx512f_os_support ())
> + {
> + return 1;
> + }
> +
> + return 0;
> +}
> +
> +int
> +main ()
> +{
> + if (avx512_runtime_support_p ())
> {
> DO_TEST ();
> #ifdef DEBUG
> --
> 2.31.1
>