Don't pass booleans as mask types to simd clones (PR 92710)

Message ID mptv9r313vx.fsf@arm.com
State New
Headers show
Series
  • Don't pass booleans as mask types to simd clones (PR 92710)
Related show

Commit Message

Richard Sandiford Nov. 29, 2019, 8:30 a.m.
In this PR we assigned a vector mask type to the result of a comparison
and then tried to pass that mask type to a simd clone, which expected
a normal (non-mask) type instead.

This patch simply punts on call arguments that have a mask type.
A better fix would be to pattern-match the comparison to a COND_EXPR,
like we would if the comparison was stored to memory, but doing that
isn't gcc 9 or 10 material.

Note that this doesn't affect x86_64-linux-gnu because the ABI promotes
bool arguments to ints.

Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK for trunk
and gcc-9-branch?

Richard


2019-11-30  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	PR tree-optimization/92710
	* tree-vect-stmts.c (vectorizable_simd_clone_call): Reject
	vector mask arguments.

gcc/testsuite/
	PR tree-optimization/92710
	* gcc.dg/vect/pr92710.c: New test.

Comments

Richard Biener Nov. 29, 2019, 8:41 a.m. | #1
On Fri, Nov 29, 2019 at 9:30 AM Richard Sandiford
<richard.sandiford@arm.com> wrote:
>

> In this PR we assigned a vector mask type to the result of a comparison

> and then tried to pass that mask type to a simd clone, which expected

> a normal (non-mask) type instead.

>

> This patch simply punts on call arguments that have a mask type.

> A better fix would be to pattern-match the comparison to a COND_EXPR,

> like we would if the comparison was stored to memory, but doing that

> isn't gcc 9 or 10 material.

>

> Note that this doesn't affect x86_64-linux-gnu because the ABI promotes

> bool arguments to ints.

>

> Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK for trunk

> and gcc-9-branch?


OK.

Richard.

> Richard

>

>

> 2019-11-30  Richard Sandiford  <richard.sandiford@arm.com>

>

> gcc/

>         PR tree-optimization/92710

>         * tree-vect-stmts.c (vectorizable_simd_clone_call): Reject

>         vector mask arguments.

>

> gcc/testsuite/

>         PR tree-optimization/92710

>         * gcc.dg/vect/pr92710.c: New test.

>

> Index: gcc/tree-vect-stmts.c

> ===================================================================

> --- gcc/tree-vect-stmts.c       2019-11-22 09:57:59.194224976 +0000

> +++ gcc/tree-vect-stmts.c       2019-11-29 08:28:12.015121876 +0000

> @@ -3925,7 +3925,16 @@ vectorizable_simd_clone_call (stmt_vec_i

>           || thisarginfo.dt == vect_external_def)

>         gcc_assert (thisarginfo.vectype == NULL_TREE);

>        else

> -       gcc_assert (thisarginfo.vectype != NULL_TREE);

> +       {

> +         gcc_assert (thisarginfo.vectype != NULL_TREE);

> +         if (VECTOR_BOOLEAN_TYPE_P (thisarginfo.vectype))

> +           {

> +             if (dump_enabled_p ())

> +               dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,

> +                                "vector mask arguments are not supported\n");

> +             return false;

> +           }

> +       }

>

>        /* For linear arguments, the analyze phase should have saved

>          the base and step in STMT_VINFO_SIMD_CLONE_INFO.  */

> Index: gcc/testsuite/gcc.dg/vect/pr92710.c

> ===================================================================

> --- /dev/null   2019-09-17 11:41:18.176664108 +0100

> +++ gcc/testsuite/gcc.dg/vect/pr92710.c 2019-11-29 08:28:12.011121905 +0000

> @@ -0,0 +1,12 @@

> +/* { dg-do compile } */

> +/* { dg-additional-options "-fopenmp-simd" } */

> +

> +#pragma omp declare simd

> +_Bool foo (_Bool) __attribute__((const));

> +

> +void

> +f (_Bool *restrict x, char *restrict y, char *restrict z)

> +{

> +  for (int i = 0; i < 128; ++i)

> +    x[i] = foo (y[i] == z[i]);

> +}

Patch

Index: gcc/tree-vect-stmts.c
===================================================================
--- gcc/tree-vect-stmts.c	2019-11-22 09:57:59.194224976 +0000
+++ gcc/tree-vect-stmts.c	2019-11-29 08:28:12.015121876 +0000
@@ -3925,7 +3925,16 @@  vectorizable_simd_clone_call (stmt_vec_i
 	  || thisarginfo.dt == vect_external_def)
 	gcc_assert (thisarginfo.vectype == NULL_TREE);
       else
-	gcc_assert (thisarginfo.vectype != NULL_TREE);
+	{
+	  gcc_assert (thisarginfo.vectype != NULL_TREE);
+	  if (VECTOR_BOOLEAN_TYPE_P (thisarginfo.vectype))
+	    {
+	      if (dump_enabled_p ())
+		dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+				 "vector mask arguments are not supported\n");
+	      return false;
+	    }
+	}
 
       /* For linear arguments, the analyze phase should have saved
 	 the base and step in STMT_VINFO_SIMD_CLONE_INFO.  */
Index: gcc/testsuite/gcc.dg/vect/pr92710.c
===================================================================
--- /dev/null	2019-09-17 11:41:18.176664108 +0100
+++ gcc/testsuite/gcc.dg/vect/pr92710.c	2019-11-29 08:28:12.011121905 +0000
@@ -0,0 +1,12 @@ 
+/* { dg-do compile } */
+/* { dg-additional-options "-fopenmp-simd" } */
+
+#pragma omp declare simd
+_Bool foo (_Bool) __attribute__((const));
+
+void
+f (_Bool *restrict x, char *restrict y, char *restrict z)
+{
+  for (int i = 0; i < 128; ++i)
+    x[i] = foo (y[i] == z[i]);
+}