After the latest changes we now end up building more SLP nodes from scalars - the fact that we have SLP childs for externals triggers this for the case where previously all ops were external (no scalar build was considered). The following adjusts the heuristic to treat constant operands as profitable to vectorize (we can at least use a vector load from the constant pool).
Bootstrapped & tested on x86_64-unknown-linux-gnu, applied. Richard. 2019-10-23 Richard Biener <rguent...@suse.de> * tree-vect-slp.c (vect_build_slp_tree_2): Do not build op from scalars in case there's a constant operand in its definition. Index: gcc/tree-vect-slp.c =================================================================== --- gcc/tree-vect-slp.c (revision 277288) +++ gcc/tree-vect-slp.c (working copy) @@ -1291,7 +1291,7 @@ vect_build_slp_tree_2 (vec_info *vinfo, slp_tree grandchild; FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (child), j, grandchild) - if (SLP_TREE_DEF_TYPE (grandchild) == vect_internal_def) + if (SLP_TREE_DEF_TYPE (grandchild) != vect_external_def) break; if (!grandchild) { @@ -1450,7 +1450,7 @@ vect_build_slp_tree_2 (vec_info *vinfo, slp_tree grandchild; FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (child), j, grandchild) - if (SLP_TREE_DEF_TYPE (grandchild) == vect_internal_def) + if (SLP_TREE_DEF_TYPE (grandchild) != vect_external_def) break; if (!grandchild) {