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.
This commit is contained in:
Kewen Lin 2024-07-23 00:48:00 -05:00 committed by Kewen Lin
parent 04da747a06
commit e6db8848d9
3 changed files with 26 additions and 3 deletions

View 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;
}
}

View 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

View file

@ -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;
}