]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
i386: Fix up handling of some -mno-avx512* options [PR123216]
authorJakub Jelinek <jakub@redhat.com>
Sat, 20 Dec 2025 10:59:19 +0000 (11:59 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 20 Dec 2025 10:59:19 +0000 (11:59 +0100)
This PR is about -mavx10.2 -mno-avx512vl ICE on some builtin.
Though, because -mavx10.2 implies -mavx512vl (among many others), the
pattern is right and doesn't need to care about such weird cases.

What is wrong is the handling of -mno-avx512vl and various other options,
that should unset -mavx10.1 and that should unset -mavx10.2, but it doesn't.

I went through various ISAs which 10.1 or 10.2 implies, looking for the
ISA{,2}_*_SET and corresponding ISA{,2}_*_UNSET macros and their use or lack
thereof.
Here is what I found.
OPTION_MASK_ISA_AVX512FP16_UNSET has been incorrectly defined (avx512fp16
implies avx512bw, not the other way around), but fortunately wasn't used.
And then various ISAs implied by -mavx10.1 (except for -mavx512f which was
correct) missed clearing -mavx10.{1,2} on -mno-* handling.

As mentioned in the PR, it would be really nice to add some verification of
the set and unset macros to verify consistency.

2025-12-20  Jakub Jelinek  <jakub@redhat.com>

PR target/123216
* common/config/i386/i386-common.cc (OPTION_MASK_ISA_AVX512FP16_UNSET):
Remove unused macro.
(OPTION_MASK_ISA2_AVX512FP16_UNSET, OPTION_MASK_ISA2_AVX512BF16_UNSET,
OPTION_MASK_ISA2_AVX512BW_UNSET): Or in OPTION_MASK_ISA2_AVX10_1_UNSET.
(OPTION_MASK_ISA2_AVX512CD_UNSET, OPTION_MASK_ISA2_AVX512DQ_UNSET,
OPTION_MASK_ISA2_AVX512VL_UNSET, OPTION_MASK_ISA2_AVX512IFMA_UNSET,
OPTION_MASK_ISA2_AVX512VNNI_UNSET,
OPTION_MASK_ISA2_AVX512VPOPCNTDQ_UNSET,
OPTION_MASK_ISA2_AVX512VBMI_UNSET, OPTION_MASK_ISA2_AVX512VBMI2_UNSET,
OPTION_MASK_ISA2_AVX512BITALG_UNSET): Define.
(ix86_handle_option): For
-mno-avx512{cd,dq,vl,ifma,vnni,vpopcntdq,vbmi,vbmi2,bitalg} also remove
corresponding OPTION_MASK_ISA2_AVX512*_UNSET from ix86_isa_flags2
and add it to ix86_isa_flags2_explicit.

gcc/common/config/i386/i386-common.cc

index f0f4c1069d34c7d225e2f66c014efd65e7f718a4..4de069f0a9d81d0abde69ef6ec1ba920db9f4a0f 100644 (file)
@@ -266,13 +266,14 @@ along with GCC; see the file COPYING3.  If not see
 #define OPTION_MASK_ISA2_AVXIFMA_UNSET OPTION_MASK_ISA2_AVXIFMA
 #define OPTION_MASK_ISA_AVX512VBMI_UNSET OPTION_MASK_ISA_AVX512VBMI
 #define OPTION_MASK_ISA_AVX512VBMI2_UNSET OPTION_MASK_ISA_AVX512VBMI2
-#define OPTION_MASK_ISA_AVX512FP16_UNSET OPTION_MASK_ISA_AVX512BW_UNSET
-#define OPTION_MASK_ISA2_AVX512FP16_UNSET OPTION_MASK_ISA2_AVX512FP16
+#define OPTION_MASK_ISA2_AVX512FP16_UNSET \
+  (OPTION_MASK_ISA2_AVX512FP16 | OPTION_MASK_ISA2_AVX10_1_UNSET)
 #define OPTION_MASK_ISA_AVX512VNNI_UNSET OPTION_MASK_ISA_AVX512VNNI
 #define OPTION_MASK_ISA2_AVXVNNI_UNSET OPTION_MASK_ISA2_AVXVNNI
 #define OPTION_MASK_ISA_AVX512VPOPCNTDQ_UNSET OPTION_MASK_ISA_AVX512VPOPCNTDQ
 #define OPTION_MASK_ISA_AVX512BITALG_UNSET OPTION_MASK_ISA_AVX512BITALG
-#define OPTION_MASK_ISA2_AVX512BF16_UNSET OPTION_MASK_ISA2_AVX512BF16
+#define OPTION_MASK_ISA2_AVX512BF16_UNSET \
+  (OPTION_MASK_ISA2_AVX512BF16 | OPTION_MASK_ISA2_AVX10_1_UNSET)
 #define OPTION_MASK_ISA_RTM_UNSET OPTION_MASK_ISA_RTM
 #define OPTION_MASK_ISA_PRFCHW_UNSET OPTION_MASK_ISA_PRFCHW
 #define OPTION_MASK_ISA_RDSEED_UNSET OPTION_MASK_ISA_RDSEED
@@ -396,7 +397,17 @@ along with GCC; see the file COPYING3.  If not see
 #define OPTION_MASK_ISA2_AVX512BW_UNSET \
   (OPTION_MASK_ISA2_AVX512BF16_UNSET \
     | OPTION_MASK_ISA2_AVX512FP16_UNSET \
+    | OPTION_MASK_ISA2_AVX10_1_UNSET \
     | OPTION_MASK_ISA2_AVX512BMM_UNSET)
+#define OPTION_MASK_ISA2_AVX512CD_UNSET OPTION_MASK_ISA2_AVX10_1_UNSET
+#define OPTION_MASK_ISA2_AVX512DQ_UNSET OPTION_MASK_ISA2_AVX10_1_UNSET
+#define OPTION_MASK_ISA2_AVX512VL_UNSET OPTION_MASK_ISA2_AVX10_1_UNSET
+#define OPTION_MASK_ISA2_AVX512IFMA_UNSET OPTION_MASK_ISA2_AVX10_1_UNSET
+#define OPTION_MASK_ISA2_AVX512VNNI_UNSET OPTION_MASK_ISA2_AVX10_1_UNSET
+#define OPTION_MASK_ISA2_AVX512VPOPCNTDQ_UNSET OPTION_MASK_ISA2_AVX10_1_UNSET
+#define OPTION_MASK_ISA2_AVX512VBMI_UNSET OPTION_MASK_ISA2_AVX10_1_UNSET
+#define OPTION_MASK_ISA2_AVX512VBMI2_UNSET OPTION_MASK_ISA2_AVX10_1_UNSET
+#define OPTION_MASK_ISA2_AVX512BITALG_UNSET OPTION_MASK_ISA2_AVX10_1_UNSET
 
 /* Set 1 << value as value of -malign-FLAG option.  */
 
@@ -648,6 +659,8 @@ ix86_handle_option (struct gcc_options *opts,
        {
          opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512CD_UNSET;
          opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512CD_UNSET;
+         opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512CD_UNSET;
+         opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX512CD_UNSET;
        }
       return true;
 
@@ -866,6 +879,9 @@ ix86_handle_option (struct gcc_options *opts,
        {
          opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512VBMI2_UNSET;
          opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512VBMI2_UNSET;
+         opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512VBMI2_UNSET;
+         opts->x_ix86_isa_flags2_explicit
+           |= OPTION_MASK_ISA2_AVX512VBMI2_UNSET;
        }
       return true;
 
@@ -894,6 +910,9 @@ ix86_handle_option (struct gcc_options *opts,
        {
          opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512VNNI_UNSET;
          opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512VNNI_UNSET;
+         opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512VNNI_UNSET;
+         opts->x_ix86_isa_flags2_explicit
+           |= OPTION_MASK_ISA2_AVX512VNNI_UNSET;
        }
       return true;
 
@@ -909,6 +928,9 @@ ix86_handle_option (struct gcc_options *opts,
          opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512VPOPCNTDQ_UNSET;
          opts->x_ix86_isa_flags_explicit
            |= OPTION_MASK_ISA_AVX512VPOPCNTDQ_UNSET;
+         opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512VPOPCNTDQ_UNSET;
+         opts->x_ix86_isa_flags2_explicit
+           |= OPTION_MASK_ISA2_AVX512VPOPCNTDQ_UNSET;
        }
       return true;
 
@@ -923,6 +945,9 @@ ix86_handle_option (struct gcc_options *opts,
          opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512BITALG_UNSET;
          opts->x_ix86_isa_flags_explicit
                |= OPTION_MASK_ISA_AVX512BITALG_UNSET;
+         opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512BITALG_UNSET;
+         opts->x_ix86_isa_flags2_explicit
+           |= OPTION_MASK_ISA2_AVX512BITALG_UNSET;
        }
       return true;
 
@@ -1020,6 +1045,8 @@ ix86_handle_option (struct gcc_options *opts,
        {
          opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512DQ_UNSET;
          opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512DQ_UNSET;
+         opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512DQ_UNSET;
+         opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX512DQ_UNSET;
        }
       return true;
 
@@ -1048,6 +1075,8 @@ ix86_handle_option (struct gcc_options *opts,
        {
          opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512VL_UNSET;
          opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512VL_UNSET;
+         opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512VL_UNSET;
+         opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX512VL_UNSET;
        }
       return true;
 
@@ -1061,6 +1090,9 @@ ix86_handle_option (struct gcc_options *opts,
        {
          opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512IFMA_UNSET;
          opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512IFMA_UNSET;
+         opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512IFMA_UNSET;
+         opts->x_ix86_isa_flags2_explicit
+           |= OPTION_MASK_ISA2_AVX512IFMA_UNSET;
        }
       return true;
 
@@ -1074,6 +1106,9 @@ ix86_handle_option (struct gcc_options *opts,
        {
          opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512VBMI_UNSET;
          opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512VBMI_UNSET;
+         opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512VBMI_UNSET;
+         opts->x_ix86_isa_flags2_explicit
+           |= OPTION_MASK_ISA2_AVX512VBMI_UNSET;
        }
       return true;