]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
rs6000: Consider explicitly set options in target option parsing [PR115713]
authorKewen Lin <linkw@linux.ibm.com>
Tue, 23 Jul 2024 05:48:00 +0000 (00:48 -0500)
committerKewen Lin <linkw@gcc.gnu.org>
Tue, 23 Jul 2024 05:50:59 +0000 (00:50 -0500)
In rs6000_inner_target_options, when enabling VSX we enable
altivec and disable -mavoid-indexed-addresses implicitly,
but it doesn't consider the case that the options altivec
and avoid-indexed-addresses can be explicitly disabled.  As
the test case in PR115713#c1 shows, with target attribute
"no-altivec,vsx", it results in that VSX unexpectedly set
altivec flag and there isn't an expected error.

This patch is to avoid the automatic enablement when they
are explicitly specified.  With this change, an existing
test case ppc-target-4.c also requires an adjustment by
specifying explicit altivec in target attribute (since it
requires altivec feature and command line is specifying
no-altivec).

PR target/115713

gcc/ChangeLog:

* config/rs6000/rs6000.cc (rs6000_inner_target_options): Avoid to
enable altivec or disable avoid-indexed-addresses automatically
when they get specified explicitly.

gcc/testsuite/ChangeLog:

* gcc.target/powerpc/pr115713-1.c: New test.
* gcc.target/powerpc/ppc-target-4.c: Adjust by specifying altivec
in target attribute.

gcc/config/rs6000/rs6000.cc
gcc/testsuite/gcc.target/powerpc/ppc-target-4.c
gcc/testsuite/gcc.target/powerpc/pr115713-1.c [new file with mode: 0644]

index 019bb7ccc3806156810b74623b84d87f173ab3a7..ce888d3caa6580ac6e6b72c706f0ed1060fb7c58 100644 (file)
@@ -24669,8 +24669,11 @@ rs6000_inner_target_options (tree args, bool attr_p)
                          {
                            if (mask == OPTION_MASK_VSX)
                              {
-                               mask |= OPTION_MASK_ALTIVEC;
-                               TARGET_AVOID_XFORM = 0;
+                               if (!(rs6000_isa_flags_explicit
+                                     & OPTION_MASK_ALTIVEC))
+                                 mask |= OPTION_MASK_ALTIVEC;
+                               if (!OPTION_SET_P (TARGET_AVOID_XFORM))
+                                 TARGET_AVOID_XFORM = 0;
                              }
                          }
 
index 43a98b353cf7328dc9f8efbf14613643b4479798..db9ba500e0e156f51df196ce1e3c0a4930ad5eab 100644 (file)
@@ -18,7 +18,7 @@
 #error "__VSX__ should not be defined."
 #endif
 
-#pragma GCC target("vsx")
+#pragma GCC target("altivec,vsx")
 #include <altivec.h>
 #pragma GCC reset_options
 
diff --git a/gcc/testsuite/gcc.target/powerpc/pr115713-1.c b/gcc/testsuite/gcc.target/powerpc/pr115713-1.c
new file mode 100644 (file)
index 0000000..1b93a78
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* Force power7 to avoid possible error message on AltiVec ABI change.  */
+/* { dg-options "-mdejagnu-cpu=power7" } */
+
+/* Verify there is an error message for incompatible -maltivec and -mvsx
+   even when they are specified by target attributes.  */
+
+int __attribute__ ((target ("no-altivec,vsx")))
+test1 (void)
+{
+  /* { dg-error "'-mvsx' and '-mno-altivec' are incompatible" "" { target *-*-* } .-1 } */
+  return 0;
+}
+
+int __attribute__ ((target ("vsx,no-altivec")))
+test2 (void)
+{
+  /* { dg-error "'-mvsx' and '-mno-altivec' are incompatible" "" { target *-*-* } .-1 } */
+  return 0;
+}