Patchwork Fix PR tree-optimization/52686 (SLP crashes) (Re: Vectorizer patches for 4.8)

login
register
mail settings
Submitter Ulrich Weigand
Date March 26, 2012, 11:57 a.m.
Message ID <201203261157.q2QBvPPF015131@d06av02.portsmouth.uk.ibm.com>
Download mbox | patch
Permalink /patch/148706/
State New
Headers show

Comments

Ulrich Weigand - March 26, 2012, 11:57 a.m.
Hello,

one of Ira's vectorizer patches I recently committed seems to have exposed
a pre-existing bug in handling WIDEN_LSHIFT_EXPR, which now causes ICEs
in SLP due to out-of-bounds memory accesses.

The underlying cause is that vect_get_smallest_scalar_type does not handle
WIDEN_LSHIFT_EXPR as it does the other widening operations.  This causes
the SLP pass to operate on the wrong type and thus get confused about the
number of vector instructions it need to allocate space for.

The following patch fixes all those ICEs for me.  Manual checking shows
that widening shifts are now recognized correctly by SLP.

Tested with no regression on armv7l-linux-gnueabi and i686-linux-gnu.

OK for mainline?

Bye,
Ulrich


ChangeLog:

	gcc/
	PR tree-optimization/52686
	* tree-vect-data-refs.c (vect_get_smallest_scalar_type): Handle
	WIDEN_LSHIFT_EXPR.

	gcc/testsuite/
	PR tree-optimization/52686
	* gcc.target/arm/pr52686.c: New test.
Richard Guenther - March 26, 2012, 12:31 p.m.
On Mon, Mar 26, 2012 at 1:57 PM, Ulrich Weigand <uweigand@de.ibm.com> wrote:
> Hello,
>
> one of Ira's vectorizer patches I recently committed seems to have exposed
> a pre-existing bug in handling WIDEN_LSHIFT_EXPR, which now causes ICEs
> in SLP due to out-of-bounds memory accesses.
>
> The underlying cause is that vect_get_smallest_scalar_type does not handle
> WIDEN_LSHIFT_EXPR as it does the other widening operations.  This causes
> the SLP pass to operate on the wrong type and thus get confused about the
> number of vector instructions it need to allocate space for.
>
> The following patch fixes all those ICEs for me.  Manual checking shows
> that widening shifts are now recognized correctly by SLP.
>
> Tested with no regression on armv7l-linux-gnueabi and i686-linux-gnu.
>
> OK for mainline?

Ok.

Thanks,
Richard.

> Bye,
> Ulrich
>
>
> ChangeLog:
>
>        gcc/
>        PR tree-optimization/52686
>        * tree-vect-data-refs.c (vect_get_smallest_scalar_type): Handle
>        WIDEN_LSHIFT_EXPR.
>
>        gcc/testsuite/
>        PR tree-optimization/52686
>        * gcc.target/arm/pr52686.c: New test.
>
>
> Index: gcc/testsuite/gcc.target/arm/pr52686.c
> ===================================================================
> --- gcc/testsuite/gcc.target/arm/pr52686.c      (revision 0)
> +++ gcc/testsuite/gcc.target/arm/pr52686.c      (revision 0)
> @@ -0,0 +1,19 @@
> +/* PR target/52375 */
> +/* { dg-do compile } */
> +/* { dg-require-effective-target arm_neon_ok } */
> +/* { dg-options "-march=armv7-a -mfloat-abi=softfp -mfpu=neon -O -ftree-vectorize" } */
> +
> +unsigned int output[4];
> +
> +void test (unsigned short *p)
> +{
> +  unsigned int x = *p;
> +  if (x)
> +    {
> +      output[0] = x << 1;
> +      output[1] = x << 1;
> +      output[2] = x << 1;
> +      output[3] = x << 1;
> +    }
> +}
> +
> Index: gcc/tree-vect-data-refs.c
> ===================================================================
> --- gcc/tree-vect-data-refs.c   (revision 185467)
> +++ gcc/tree-vect-data-refs.c   (working copy)
> @@ -111,6 +111,7 @@
>   if (is_gimple_assign (stmt)
>       && (gimple_assign_cast_p (stmt)
>           || gimple_assign_rhs_code (stmt) == WIDEN_MULT_EXPR
> +          || gimple_assign_rhs_code (stmt) == WIDEN_LSHIFT_EXPR
>           || gimple_assign_rhs_code (stmt) == FLOAT_EXPR))
>     {
>       tree rhs_type = TREE_TYPE (gimple_assign_rhs1 (stmt));
> --
>  Dr. Ulrich Weigand
>  GNU Toolchain for Linux on System z and Cell BE
>  Ulrich.Weigand@de.ibm.com
>

Patch

Index: gcc/testsuite/gcc.target/arm/pr52686.c
===================================================================
--- gcc/testsuite/gcc.target/arm/pr52686.c	(revision 0)
+++ gcc/testsuite/gcc.target/arm/pr52686.c	(revision 0)
@@ -0,0 +1,19 @@ 
+/* PR target/52375 */
+/* { dg-do compile } */
+/* { dg-require-effective-target arm_neon_ok } */
+/* { dg-options "-march=armv7-a -mfloat-abi=softfp -mfpu=neon -O -ftree-vectorize" } */
+
+unsigned int output[4];
+
+void test (unsigned short *p)
+{
+  unsigned int x = *p;
+  if (x)
+    {
+      output[0] = x << 1;
+      output[1] = x << 1;
+      output[2] = x << 1;
+      output[3] = x << 1;
+    }
+}
+
Index: gcc/tree-vect-data-refs.c
===================================================================
--- gcc/tree-vect-data-refs.c	(revision 185467)
+++ gcc/tree-vect-data-refs.c	(working copy)
@@ -111,6 +111,7 @@ 
   if (is_gimple_assign (stmt)
       && (gimple_assign_cast_p (stmt)
           || gimple_assign_rhs_code (stmt) == WIDEN_MULT_EXPR
+          || gimple_assign_rhs_code (stmt) == WIDEN_LSHIFT_EXPR
           || gimple_assign_rhs_code (stmt) == FLOAT_EXPR))
     {
       tree rhs_type = TREE_TYPE (gimple_assign_rhs1 (stmt));