[PATCH, rs6000] pr80482 Relax vector builtin parameter checks
PR target/80482 Backport from mainline This patch changes the parameter testing for powerpc vector builtins to relax the existing requirement that the parameters be identical to instead that they be compatible. This allows for mixing parameters with differing qualified (const, volatile, etc.) types. See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80482 for more information. Bootstrapped and tested on powerpc64le-unknown-linux-gnu and powerpc64be-unknown-linux-gnu with no regressions. Is this ok for trunk? [gcc] 2017-04-25 Bill Seurer <seurer@linux.vnet.ibm.com> Backport from mainline PR target/80482 * config/rs6000/rs6000-c.c (altivec_resolve_overloaded_builtin): Change type checks to test for compatibility instead of equality. [gcc/testsuite] 2017-04-25 Bill Seurer <seurer@linux.vnet.ibm.com> Backport from mainline PR target/80482 * gcc.target/powerpc/vec-constvolatile.c: New test. From-SVN: r247256
This commit is contained in:
parent
fd8de490a7
commit
d3de3474fc
|
@ -1,3 +1,10 @@
|
||||||
|
2017-04-25 Bill Seurer <seurer@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
Backport from mainline
|
||||||
|
PR target/80482
|
||||||
|
* config/rs6000/rs6000-c.c (altivec_resolve_overloaded_builtin): Change
|
||||||
|
type checks to test for compatibility instead of equality.
|
||||||
|
|
||||||
2017-04-25 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
|
2017-04-25 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
|
||||||
Jakub Jelinek <jakub@redhat.com>
|
Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
|
|
@ -5595,11 +5595,11 @@ altivec_resolve_overloaded_builtin (location_t loc, tree fndecl,
|
||||||
tree arg1 = (*arglist)[1];
|
tree arg1 = (*arglist)[1];
|
||||||
tree arg1_type = TREE_TYPE (arg1);
|
tree arg1_type = TREE_TYPE (arg1);
|
||||||
|
|
||||||
/* Both arguments must be vectors and the types must match. */
|
/* Both arguments must be vectors and the types must be compatible. */
|
||||||
if (arg0_type != arg1_type)
|
|
||||||
goto bad;
|
|
||||||
if (TREE_CODE (arg0_type) != VECTOR_TYPE)
|
if (TREE_CODE (arg0_type) != VECTOR_TYPE)
|
||||||
goto bad;
|
goto bad;
|
||||||
|
if (!lang_hooks.types_compatible_p (arg0_type, arg1_type))
|
||||||
|
goto bad;
|
||||||
|
|
||||||
switch (TYPE_MODE (TREE_TYPE (arg0_type)))
|
switch (TYPE_MODE (TREE_TYPE (arg0_type)))
|
||||||
{
|
{
|
||||||
|
@ -5610,8 +5610,8 @@ altivec_resolve_overloaded_builtin (location_t loc, tree fndecl,
|
||||||
case TImode:
|
case TImode:
|
||||||
{
|
{
|
||||||
/* For scalar types just use a multiply expression. */
|
/* For scalar types just use a multiply expression. */
|
||||||
return fold_build2_loc (loc, MULT_EXPR, TREE_TYPE (arg0),
|
return fold_build2_loc (loc, MULT_EXPR, TREE_TYPE (arg0), arg0,
|
||||||
arg0, arg1);
|
fold_convert (TREE_TYPE (arg0), arg1));
|
||||||
}
|
}
|
||||||
case SFmode:
|
case SFmode:
|
||||||
{
|
{
|
||||||
|
@ -5655,12 +5655,11 @@ altivec_resolve_overloaded_builtin (location_t loc, tree fndecl,
|
||||||
|| (TYPE_MODE (TREE_TYPE (arg0_type)) == SFmode)
|
|| (TYPE_MODE (TREE_TYPE (arg0_type)) == SFmode)
|
||||||
|| (TYPE_MODE (TREE_TYPE (arg0_type)) == DFmode))
|
|| (TYPE_MODE (TREE_TYPE (arg0_type)) == DFmode))
|
||||||
{
|
{
|
||||||
/* Both arguments must be vectors and the types must match. */
|
/* Both arguments must be vectors and the types must be compatible. */
|
||||||
if (arg0_type != arg1_type)
|
|
||||||
goto bad;
|
|
||||||
if (TREE_CODE (arg0_type) != VECTOR_TYPE)
|
if (TREE_CODE (arg0_type) != VECTOR_TYPE)
|
||||||
goto bad;
|
goto bad;
|
||||||
|
if (!lang_hooks.types_compatible_p (arg0_type, arg1_type))
|
||||||
|
goto bad;
|
||||||
|
|
||||||
switch (TYPE_MODE (TREE_TYPE (arg0_type)))
|
switch (TYPE_MODE (TREE_TYPE (arg0_type)))
|
||||||
{
|
{
|
||||||
|
@ -5720,11 +5719,12 @@ altivec_resolve_overloaded_builtin (location_t loc, tree fndecl,
|
||||||
tree arg2_type = TREE_TYPE (arg2);
|
tree arg2_type = TREE_TYPE (arg2);
|
||||||
|
|
||||||
/* All 3 arguments must be vectors of (signed or unsigned) (int or
|
/* All 3 arguments must be vectors of (signed or unsigned) (int or
|
||||||
__int128) and the types must match. */
|
__int128) and the types must be compatible. */
|
||||||
if ((arg0_type != arg1_type) || (arg1_type != arg2_type))
|
|
||||||
goto bad;
|
|
||||||
if (TREE_CODE (arg0_type) != VECTOR_TYPE)
|
if (TREE_CODE (arg0_type) != VECTOR_TYPE)
|
||||||
goto bad;
|
goto bad;
|
||||||
|
if (!lang_hooks.types_compatible_p (arg0_type, arg1_type) ||
|
||||||
|
!lang_hooks.types_compatible_p (arg1_type, arg2_type))
|
||||||
|
goto bad;
|
||||||
|
|
||||||
switch (TYPE_MODE (TREE_TYPE (arg0_type)))
|
switch (TYPE_MODE (TREE_TYPE (arg0_type)))
|
||||||
{
|
{
|
||||||
|
@ -5783,11 +5783,12 @@ altivec_resolve_overloaded_builtin (location_t loc, tree fndecl,
|
||||||
tree arg2_type = TREE_TYPE (arg2);
|
tree arg2_type = TREE_TYPE (arg2);
|
||||||
|
|
||||||
/* All 3 arguments must be vectors of (signed or unsigned) (int or
|
/* All 3 arguments must be vectors of (signed or unsigned) (int or
|
||||||
__int128) and the types must match. */
|
__int128) and the types must be compatible. */
|
||||||
if (arg0_type != arg1_type || arg1_type != arg2_type)
|
|
||||||
goto bad;
|
|
||||||
if (TREE_CODE (arg0_type) != VECTOR_TYPE)
|
if (TREE_CODE (arg0_type) != VECTOR_TYPE)
|
||||||
goto bad;
|
goto bad;
|
||||||
|
if (!lang_hooks.types_compatible_p (arg0_type, arg1_type) ||
|
||||||
|
!lang_hooks.types_compatible_p (arg1_type, arg2_type))
|
||||||
|
goto bad;
|
||||||
|
|
||||||
switch (TYPE_MODE (TREE_TYPE (arg0_type)))
|
switch (TYPE_MODE (TREE_TYPE (arg0_type)))
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
2017-04-25 Bill Seurer <seurer@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
Backport from mainline
|
||||||
|
PR target/80482
|
||||||
|
* gcc.target/powerpc/vec-constvolatile.c: New test.
|
||||||
|
|
||||||
2017-04-25 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
|
2017-04-25 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
|
||||||
Jakub Jelinek <jakub@redhat.com>
|
Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
/* Test that const and volatile qualifiers can mix on vec_mul operands. */
|
||||||
|
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-require-effective-target powerpc_altivec_ok } */
|
||||||
|
/* { dg-options "-maltivec -mvsx" } */
|
||||||
|
|
||||||
|
#include <altivec.h>
|
||||||
|
|
||||||
|
void P() {
|
||||||
|
const volatile vector float cvva = vec_splats(0.00187682f);
|
||||||
|
volatile vector float vva = vec_splats(0.00187682f);
|
||||||
|
const vector float cva = vec_splats(0.00187682f);
|
||||||
|
vector float va = vec_splats(0.00187682f);
|
||||||
|
vector float dx = {1.0f, 2.0f, 3.0f, 4.0f};
|
||||||
|
|
||||||
|
vector float X1m0 = vec_mul(va, va);
|
||||||
|
vector float X2m0 = vec_mul(va, dx);
|
||||||
|
vector float X3m0 = vec_mul(dx, va);
|
||||||
|
|
||||||
|
vector float X1m1 = vec_mul(cva, cva);
|
||||||
|
vector float X2m1 = vec_mul(cva, dx);
|
||||||
|
vector float X3m1 = vec_mul(dx, cva);
|
||||||
|
|
||||||
|
vector float Y1m2 = vec_mul(vva, vva);
|
||||||
|
vector float Y2m2 = vec_mul(vva, dx);
|
||||||
|
vector float Y3m2 = vec_mul(dx, vva);
|
||||||
|
|
||||||
|
vector float X1m3 = vec_mul(cvva, cvva);
|
||||||
|
vector float X2m3 = vec_mul(cvva, dx);
|
||||||
|
vector float X3m3 = vec_mul(dx, cvva);
|
||||||
|
}
|
Loading…
Reference in New Issue