]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
rs6000: Escalate warning to error for VSX with explicit no-altivec etc.
authorKewen Lin <linkw@linux.ibm.com>
Tue, 23 Jul 2024 05:47:49 +0000 (00:47 -0500)
committerKewen Lin <linkw@gcc.gnu.org>
Tue, 23 Jul 2024 05:50:59 +0000 (00:50 -0500)
As the discussion in PR115688, for now when users specify
-mvsx and -mno-altivec explicitly, compiler emits warning
rather than error, but considering both options are given
explicitly, emitting hard error should be better.

So this patch is to escalate some related warning to error
when both are incompatible.

PR target/115713

gcc/ChangeLog:

* config/rs6000/rs6000.cc (rs6000_option_override_internal): Emit error
messages when explicit VSX encounters explicit soft-float, no-altivec
or avoid-indexed-addresses.

gcc/testsuite/ChangeLog:

* gcc.target/powerpc/warn-1.c: Move to ...
* gcc.target/powerpc/error-1.c: ... here.  Adjust dg-warning with
dg-error and remove ineffective scan.

gcc/config/rs6000/rs6000.cc
gcc/testsuite/gcc.target/powerpc/error-1.c [moved from gcc/testsuite/gcc.target/powerpc/warn-1.c with 70% similarity]

index eddd2adbab599782fb578a40a27aaec4cdd1069d..019bb7ccc3806156810b74623b84d87f173ab3a7 100644 (file)
@@ -3830,32 +3830,37 @@ rs6000_option_override_internal (bool global_init_p)
   /* Add some warnings for VSX.  */
   if (TARGET_VSX)
     {
-      const char *msg = NULL;
+      bool explicit_vsx_p = rs6000_isa_flags_explicit & OPTION_MASK_VSX;
       if (!TARGET_HARD_FLOAT)
        {
-         if (rs6000_isa_flags_explicit & OPTION_MASK_VSX)
-           msg = N_("%<-mvsx%> requires hardware floating point");
-         else
+         if (explicit_vsx_p)
            {
-             rs6000_isa_flags &= ~ OPTION_MASK_VSX;
-             rs6000_isa_flags_explicit |= OPTION_MASK_VSX;
+             if (rs6000_isa_flags_explicit & OPTION_MASK_SOFT_FLOAT)
+               error ("%<-mvsx%> and %<-msoft-float%> are incompatible");
+             else
+               warning (0, N_("%<-mvsx%> requires hardware floating-point"));
            }
+         rs6000_isa_flags &= ~OPTION_MASK_VSX;
+         rs6000_isa_flags_explicit |= OPTION_MASK_VSX;
        }
       else if (TARGET_AVOID_XFORM > 0)
-       msg = N_("%<-mvsx%> needs indexed addressing");
-      else if (!TARGET_ALTIVEC && (rs6000_isa_flags_explicit
-                                  & OPTION_MASK_ALTIVEC))
-        {
-         if (rs6000_isa_flags_explicit & OPTION_MASK_VSX)
-           msg = N_("%<-mvsx%> and %<-mno-altivec%> are incompatible");
+       {
+         if (explicit_vsx_p && OPTION_SET_P (TARGET_AVOID_XFORM))
+           error ("%<-mvsx%> and %<-mavoid-indexed-addresses%>"
+                  " are incompatible");
          else
-           msg = N_("%<-mno-altivec%> disables vsx");
-        }
-
-      if (msg)
+           warning (0, N_("%<-mvsx%> needs indexed addressing"));
+         rs6000_isa_flags &= ~OPTION_MASK_VSX;
+         rs6000_isa_flags_explicit |= OPTION_MASK_VSX;
+       }
+      else if (!TARGET_ALTIVEC
+              && (rs6000_isa_flags_explicit & OPTION_MASK_ALTIVEC))
        {
-         warning (0, msg);
-         rs6000_isa_flags &= ~ OPTION_MASK_VSX;
+         if (explicit_vsx_p)
+           error ("%<-mvsx%> and %<-mno-altivec%> are incompatible");
+         else
+           warning (0, N_("%<-mno-altivec%> disables vsx"));
+         rs6000_isa_flags &= ~OPTION_MASK_VSX;
          rs6000_isa_flags_explicit |= OPTION_MASK_VSX;
        }
     }
similarity index 70%
rename from gcc/testsuite/gcc.target/powerpc/warn-1.c
rename to gcc/testsuite/gcc.target/powerpc/error-1.c
index 76ac0c4e26e5192ec237420d25f8106f75860fc1..d38eba8bb8adf50c99447a55c574a0914f8cccb4 100644 (file)
@@ -3,7 +3,7 @@
 /* { dg-require-effective-target powerpc_vsx_ok } */
 /* { dg-options "-O -mvsx -mno-altivec" } */
 
-/* { dg-warning "'-mvsx' and '-mno-altivec' are incompatible" "" { target *-*-* } 0 } */
+/* { dg-error "'-mvsx' and '-mno-altivec' are incompatible" "" { target *-*-* } 0 } */
 
 double
 foo (double *x, double *y)
@@ -16,4 +16,3 @@ foo (double *x, double *y)
   return z[0] * z[1];
 }
 
-/* { dg-final { scan-assembler-not "xsadddp" } } */