I am testing the following to fix PR69170. Bootstrap / regtest running on x86_64-unknown-linux-gnu.
Richard. 2016-01-15 Richard Biener <rguent...@suse.de> PR tree-optimization/69170 * tree-vect-slp.c (vect_build_slp_tree): Verify we are not building a vector from scalar results of a pattern stmt. * gcc.dg/torture/pr69170.c: New testcase. Index: gcc/tree-vect-slp.c =================================================================== *** gcc/tree-vect-slp.c (revision 232415) --- gcc/tree-vect-slp.c (working copy) *************** vect_build_slp_tree (vec_info *vinfo, *** 933,939 **** { /* If we have all children of child built up from scalars then just throw that away and build it up this node from scalars. */ ! if (!SLP_TREE_CHILDREN (child).is_empty ()) { slp_tree grandchild; --- 966,977 ---- { /* If we have all children of child built up from scalars then just throw that away and build it up this node from scalars. */ ! if (!SLP_TREE_CHILDREN (child).is_empty () ! /* ??? Rejecting patterns this way doesn't work. We'd have to ! do extra work to cancel the pattern so the uses see the ! scalar version. */ ! && !is_pattern_stmt_p ! (vinfo_for_stmt (SLP_TREE_SCALAR_STMTS (child)[0]))) { slp_tree grandchild; *************** vect_build_slp_tree (vec_info *vinfo, *** 1060,1066 **** /* If we have all children of child built up from scalars then just throw that away and build it up this node from scalars. */ ! if (!SLP_TREE_CHILDREN (child).is_empty ()) { unsigned int j; slp_tree grandchild; --- 1115,1126 ---- /* If we have all children of child built up from scalars then just throw that away and build it up this node from scalars. */ ! if (!SLP_TREE_CHILDREN (child).is_empty () ! /* ??? Rejecting patterns this way doesn't work. We'd have ! to do extra work to cancel the pattern so the uses see the ! scalar version. */ ! && !is_pattern_stmt_p ! (vinfo_for_stmt (SLP_TREE_SCALAR_STMTS (child)[0]))) { unsigned int j; slp_tree grandchild; Index: gcc/testsuite/gcc.dg/torture/pr69170.c =================================================================== *** gcc/testsuite/gcc.dg/torture/pr69170.c (revision 0) --- gcc/testsuite/gcc.dg/torture/pr69170.c (working copy) *************** *** 0 **** --- 1,18 ---- + /* { dg-do compile } */ + + typedef long sha2_word_t; + typedef struct { + sha2_word_t length_upper, length_lower; + char buf[]; + } hash_state; + int a; + hash_state b; + void fn1() + { + a = 0; + for (; a < 8; a++) + b.buf[a + 1024 / 8] = b.length_upper >> (1 - a) * 5; + a = 0; + for (; a < 8; a++) + b.buf[a + 1024 / 8 + 8] = b.length_lower >> (1 - a) * 5; + }