Handling of negative steps broke one of the many asserts in the vectorizer. The following patch drops one that I can't make sense of. I think all asserts need comments - especially this one would, as I can't see why using vf is correct to test against and not nelements (and why <= vf and not < vf).
Well, ok? Thanks, Richard. 2011-07-04 Richard Guenther <rguent...@suse.de> PR tree-optimization/49518 * tree-vect-data-refs.c (vect_enhance_data_refs_alignment): Drop assert. * gcc.dg/torture/pr49518.c: New testcase. Index: gcc/tree-vect-data-refs.c =================================================================== --- gcc/tree-vect-data-refs.c (revision 175800) +++ gcc/tree-vect-data-refs.c (working copy) @@ -1552,7 +1552,6 @@ vect_enhance_data_refs_alignment (loop_v for (j = 0; j < possible_npeel_number; j++) { - gcc_assert (npeel_tmp <= vf); vect_peeling_hash_insert (loop_vinfo, dr, npeel_tmp); npeel_tmp += nelements; } Index: gcc/testsuite/gcc.dg/torture/pr49518.c =================================================================== --- gcc/testsuite/gcc.dg/torture/pr49518.c (revision 0) +++ gcc/testsuite/gcc.dg/torture/pr49518.c (revision 0) @@ -0,0 +1,19 @@ +/* { dg-do compile } */ + +int a, b; +struct S { unsigned int s, t, u; } c, d = { 0, 1, 0 }; + +void +test (unsigned char z) +{ + char e[] = {0, 0, 0, 0, 1}; + for (c.s = 1; c.s; c.s++) + { + b = e[c.s]; + if (a) + break; + b = z >= c.u; + if (d.t) + break; + } +}