https://gcc.gnu.org/g:e6db8848d956f5e712dd621d33630b799ff60a72

commit r15-2215-ge6db8848d956f5e712dd621d33630b799ff60a72
Author: Kewen Lin <li...@linux.ibm.com>
Date:   Tue Jul 23 00:48:00 2024 -0500

    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.

Diff:
---
 gcc/config/rs6000/rs6000.cc                     |  7 +++++--
 gcc/testsuite/gcc.target/powerpc/ppc-target-4.c |  2 +-
 gcc/testsuite/gcc.target/powerpc/pr115713-1.c   | 20 ++++++++++++++++++++
 3 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index 019bb7ccc380..ce888d3caa65 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 43a98b353cf7..db9ba500e0e1 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 000000000000..1b93a78682a0
--- /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;
+}

Reply via email to