aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKewen Lin <linkw@linux.ibm.com>2024-07-23 00:48:00 -0500
committerThomas Koenig <tkoenig@gcc.gnu.org>2024-07-28 19:05:46 +0200
commita5013a17cbf984c4db9f9e518816a5fe42e4a1ba (patch)
treeba79ce5cee2ec2418d7705ddad4869b0ecb66b8c
parent8237d37d294b70c81ae95f72c1e2c814cf1369f2 (diff)
downloadgcc-a5013a17cbf984c4db9f9e518816a5fe42e4a1ba.zip
gcc-a5013a17cbf984c4db9f9e518816a5fe42e4a1ba.tar.gz
gcc-a5013a17cbf984c4db9f9e518816a5fe42e4a1ba.tar.bz2
rs6000: Consider explicitly set options in target option parsing [PR115713]
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.
-rw-r--r--gcc/config/rs6000/rs6000.cc7
-rw-r--r--gcc/testsuite/gcc.target/powerpc/ppc-target-4.c2
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr115713-1.c20
3 files changed, 26 insertions, 3 deletions
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index 019bb7c..ce888d3 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -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;
}
}
diff --git a/gcc/testsuite/gcc.target/powerpc/ppc-target-4.c b/gcc/testsuite/gcc.target/powerpc/ppc-target-4.c
index 43a98b3..db9ba50 100644
--- a/gcc/testsuite/gcc.target/powerpc/ppc-target-4.c
+++ b/gcc/testsuite/gcc.target/powerpc/ppc-target-4.c
@@ -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
index 0000000..1b93a786
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr115713-1.c
@@ -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;
+}