The following fixes PR66129. Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
Richard. 2015-05-13 Richard Biener <rguent...@suse.de> PR tree-optimization/66129 * tree-vect-slp.c (vect_build_slp_tree): Make sure all ops are commutative. (vect_schedule_slp_instance): Fix typo. Index: gcc/tree-vect-slp.c =================================================================== *** gcc/tree-vect-slp.c (revision 223119) --- gcc/tree-vect-slp.c (working copy) *************** vect_build_slp_tree (loop_vec_info loop_ *** 1123,1128 **** --- 1123,1129 ---- && oprnds_info[1]->first_dt == vect_internal_def && is_gimple_assign (stmt) && commutative_tree_code (gimple_assign_rhs_code (stmt)) + && !SLP_TREE_TWO_OPERATORS (*node) /* Do so only if the number of not successful permutes was nor more than a cut-ff as re-trying the recursive match on possibly each level of the tree would expose exponential *************** vect_schedule_slp_instance (slp_tree nod *** 3459,3465 **** tree *melts = XALLOCAVEC (tree, TYPE_VECTOR_SUBPARTS (vectype)); for (l = 0; l < TYPE_VECTOR_SUBPARTS (vectype); ++l) { ! if (k > group_size) k = 0; melts[l] = build_int_cst (meltype, mask[k++] * TYPE_VECTOR_SUBPARTS (vectype) + l); --- 3460,3466 ---- tree *melts = XALLOCAVEC (tree, TYPE_VECTOR_SUBPARTS (vectype)); for (l = 0; l < TYPE_VECTOR_SUBPARTS (vectype); ++l) { ! if (k >= group_size) k = 0; melts[l] = build_int_cst (meltype, mask[k++] * TYPE_VECTOR_SUBPARTS (vectype) + l);