[PATCH, rs6000] pr80482 Relax vector builtin parameter checks
authorBill Seurer <seurer@linux.vnet.ibm.com>
Tue, 25 Apr 2017 15:22:40 +0000 (15:22 +0000)
committerBill Seurer <seurer@gcc.gnu.org>
Tue, 25 Apr 2017 15:22:40 +0000 (15:22 +0000)
PR target/80482

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>

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>

PR target/80482
* gcc.target/powerpc/vec-constvolatile.c: New test.

From-SVN: r247250

gcc/ChangeLog
gcc/config/rs6000/rs6000-c.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/vec-constvolatile.c [new file with mode: 0644]

index d44e98b29c51309ba82624bd4c8aa5fe66dbb039..56da6914880b20487d5c1b3ccffad2d585a623ea 100644 (file)
@@ -1,3 +1,9 @@
+2017-04-25  Bill Seurer  <seurer@linux.vnet.ibm.com>
+
+       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>
            Jakub Jelinek  <jakub@redhat.com>
 
index d8e0a4e1310adee46fff10827e1a54a8c20e34a1..80aab5ff2dffd8ecf786af446c2c668747577b33 100644 (file)
@@ -5595,11 +5595,11 @@ altivec_resolve_overloaded_builtin (location_t loc, tree fndecl,
       tree arg1 = (*arglist)[1];
       tree arg1_type = TREE_TYPE (arg1);
 
-      /* Both arguments must be vectors and the types must match.  */
-      if (arg0_type != arg1_type)
-       goto bad;
+      /* Both arguments must be vectors and the types must be compatible.  */
       if (TREE_CODE (arg0_type) != VECTOR_TYPE)
        goto bad;
+      if (!lang_hooks.types_compatible_p (arg0_type, arg1_type))
+       goto bad;
 
       switch (TYPE_MODE (TREE_TYPE (arg0_type)))
        {
@@ -5610,8 +5610,8 @@ altivec_resolve_overloaded_builtin (location_t loc, tree fndecl,
          case TImode:
            {
              /* For scalar types just use a multiply expression.  */
-             return fold_build2_loc (loc, MULT_EXPR, TREE_TYPE (arg0),
-                                       arg0, arg1);
+             return fold_build2_loc (loc, MULT_EXPR, TREE_TYPE (arg0), arg0,
+                                     fold_convert (TREE_TYPE (arg0), arg1));
            }
          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)) == DFmode))
        {
-         /* Both arguments must be vectors and the types must match.  */
-         if (arg0_type != arg1_type)
-           goto bad;
+         /* Both arguments must be vectors and the types must be compatible.  */
          if (TREE_CODE (arg0_type) != VECTOR_TYPE)
            goto bad;
-
+         if (!lang_hooks.types_compatible_p (arg0_type, arg1_type))
+           goto bad;
 
          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);
 
       /* All 3 arguments must be vectors of (signed or unsigned) (int or
-         __int128) and the types must match.  */
-      if ((arg0_type != arg1_type) || (arg1_type != arg2_type))
-       goto bad;
+        __int128) and the types must be compatible.  */
       if (TREE_CODE (arg0_type) != VECTOR_TYPE)
        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)))
        {
@@ -5783,11 +5783,12 @@ altivec_resolve_overloaded_builtin (location_t loc, tree fndecl,
       tree arg2_type = TREE_TYPE (arg2);
 
       /* All 3 arguments must be vectors of (signed or unsigned) (int or
-       __int128) and the types must match.  */
-      if (arg0_type != arg1_type || arg1_type != arg2_type)
-       goto bad;
+        __int128) and the types must be compatible.  */
       if (TREE_CODE (arg0_type) != VECTOR_TYPE)
        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)))
        {
index 2c00ce853985518026f3e4e42d89895683a8a62a..cf583f97dcfdc8728fbf078a96cac73354843f1f 100644 (file)
@@ -1,3 +1,8 @@
+2017-04-25  Bill Seurer  <seurer@linux.vnet.ibm.com>
+
+       PR target/80482
+       * gcc.target/powerpc/vec-constvolatile.c: New test.
+
 2017-04-25  David Malcolm  <dmalcolm@redhat.com>
 
        * g++.dg/semicolon-fixits.C: New test case.
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-constvolatile.c b/gcc/testsuite/gcc.target/powerpc/vec-constvolatile.c
new file mode 100644 (file)
index 0000000..07cbd5c
--- /dev/null
@@ -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);
+}