On Tue, Feb 26, 2013 at 7:37 AM, Jakub Jelinek <ja...@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 <ja...@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