[PATCH] Fix vectorizer ICE with overaligned types (PR tree-optimization/56443)

Richard Biener richard.guenther@gmail.com
Tue Feb 26 09:40:00 GMT 2013


On Tue, Feb 26, 2013 at 7:37 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> For integral types, we really should honor TYPE_UNSIGNED (scalar_type)
> when we call type_for_mode for overaligned types, otherwise we can break
> type checking (original something = something + 1; where something
> is overaligned int type can become unsigned int vector for lhs and rhs1
> and int vector for rhs2).
>
> Fixed thusly, bootstrapped/regtested on x86_64-linux, ok for trunk?

Ok. (ISTR backporting the original re-org to 4.7, so this may apply to 4.7
as well).

Thanks,
Richard.

> 2013-02-26  Jakub Jelinek  <jakub@redhat.com>
>
>         PR tree-optimization/56443
>         * tree-vect-stmts.c (get_vectype_for_scalar_type_and_size): For
>         overaligned types, pass TYPE_UNSIGNED (scalar_type) as second argument
>         to type_for_mode langhook.
>
>         * gcc.dg/torture/pr56443.c: New test.
>
> --- gcc/tree-vect-stmts.c.jj    2013-02-05 16:45:40.000000000 +0100
> +++ gcc/tree-vect-stmts.c       2013-02-25 13:56:46.978440945 +0100
> @@ -6071,7 +6071,8 @@ get_vectype_for_scalar_type_and_size (tr
>    /* We can't build a vector type of elements with alignment bigger than
>       their size.  */
>    else if (nbytes < TYPE_ALIGN_UNIT (scalar_type))
> -    scalar_type = lang_hooks.types.type_for_mode (inner_mode, 1);
> +    scalar_type = lang_hooks.types.type_for_mode (inner_mode,
> +                                                 TYPE_UNSIGNED (scalar_type));
>
>    /* If we felt back to using the mode fail if there was
>       no scalar type for it.  */
> --- gcc/testsuite/gcc.dg/torture/pr56443.c.jj   2013-02-25 14:01:11.347972815 +0100
> +++ gcc/testsuite/gcc.dg/torture/pr56443.c      2013-02-25 14:02:25.662541800 +0100
> @@ -0,0 +1,29 @@
> +/* PR tree-optimization/56443 */
> +/* { dg-do run } */
> +/* { dg-options "-ftree-vectorize" } */
> +
> +extern void abort (void);
> +typedef int myint __attribute__ ((__aligned__ (16)));
> +
> +int a1[1024] __attribute__ ((__aligned__ (16)));
> +int a2[1024] __attribute__ ((__aligned__ (16)));
> +
> +__attribute__((noinline, noclone)) void
> +test (int n, myint * __restrict__ p1, myint * __restrict__ p2)
> +{
> +  while (n--)
> +    *p1++ = *p2++ + 1;
> +}
> +
> +int
> +main ()
> +{
> +  int n;
> +  for (n = 0; n < 1024; n++)
> +    a2[n] = n;
> +  test (1024, a1, a2);
> +  for (n = 0; n < 1024; n++)
> +    if (a1[n] != a2[n] + 1)
> +      abort ();
> +  return 0;
> +}
>
>         Jakub



More information about the Gcc-patches mailing list