The following fixes PR68445, SLP permutation being confused by a permutation only using the "first" vector.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk. Richard. 2015-11-23 Richard Biener <rguent...@suse.de> PR tree-optimization/68445 * tree-vect-slp.c (vect_create_mask_and_perm): Properly use two different strides. * gcc.dg/vect/pr68445.c: New testcase. Index: gcc/tree-vect-slp.c =================================================================== *** gcc/tree-vect-slp.c (revision 230653) --- gcc/tree-vect-slp.c (working copy) *************** vect_create_mask_and_perm (gimple *stmt, *** 3177,3186 **** { tree perm_dest; gimple *perm_stmt = NULL; ! int i, stride; tree first_vec, second_vec, data_ref; ! stride = SLP_TREE_NUMBER_OF_VEC_STMTS (node) / ncopies; /* Initialize the vect stmts of NODE to properly insert the generated stmts later. */ --- 3206,3216 ---- { tree perm_dest; gimple *perm_stmt = NULL; ! int i, stride_in, stride_out; tree first_vec, second_vec, data_ref; ! stride_out = SLP_TREE_NUMBER_OF_VEC_STMTS (node) / ncopies; ! stride_in = dr_chain.length () / ncopies; /* Initialize the vect stmts of NODE to properly insert the generated stmts later. */ *************** vect_create_mask_and_perm (gimple *stmt, *** 3202,3211 **** vect_finish_stmt_generation (stmt, perm_stmt, gsi); /* Store the vector statement in NODE. */ ! SLP_TREE_VEC_STMTS (node)[stride * i + vect_stmts_counter] = perm_stmt; ! first_vec_indx += stride; ! second_vec_indx += stride; } } --- 3232,3242 ---- vect_finish_stmt_generation (stmt, perm_stmt, gsi); /* Store the vector statement in NODE. */ ! SLP_TREE_VEC_STMTS (node)[stride_out * i + vect_stmts_counter] ! = perm_stmt; ! first_vec_indx += stride_in; ! second_vec_indx += stride_in; } } Index: gcc/testsuite/gcc.dg/vect/pr68445.c =================================================================== *** gcc/testsuite/gcc.dg/vect/pr68445.c (revision 0) --- gcc/testsuite/gcc.dg/vect/pr68445.c (working copy) *************** *** 0 **** --- 1,19 ---- + /* { dg-do compile } */ + /* { dg-require-effective-target vect_int } */ + + void IMB_double_fast_x (int *destf, int *dest, int y, int *p1f) + { + int i; + for (i = y; i > 0; i--) + { + *dest++ = 0; + destf[0] = destf[4] = p1f[0]; + destf[1] = destf[5] = p1f[1]; + destf[2] = destf[6] = p1f[2]; + destf[3] = destf[7] = p1f[3]; + destf += 8; + p1f += 4; + } + } + + /* { dg-final { scan-tree-dump "vectorizing stmts using SLP" "vect" } } */