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

Richard Guenther richard.guenther@gmail.com
Mon Mar 26 12:31:00 GMT 2012


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
>



More information about the Gcc-patches mailing list