We're doing quite some useless work here and in the case we actually manage to "vectorize" it, we've done a no-op (bb-slp-42.c).
It also refactors the routine a bit and only dumps about "vectorizable" CTORs when we actually analyze the SLP tree (when all CTOR elements were internally defined). Bootstrap and regtest running on x86_64-unknown-linux-gnu. Richard. 2019-11-20 Richard Biener <rguent...@suse.de> * tree-vect-slp.c (vect_analyze_slp_instance): Dump constructors we are actually analyzing. (vect_slp_check_for_constructors): Do not vectorize uniform constuctors, do not dump here. * gcc.dg/vect/bb-slp-42.c: Adjust. Index: gcc/tree-vect-slp.c =================================================================== --- gcc/tree-vect-slp.c (revision 278484) +++ gcc/tree-vect-slp.c (working copy) @@ -2183,6 +2183,10 @@ vect_analyze_slp_instance (vec_info *vin else return false; } + if (dump_enabled_p ()) + dump_printf_loc (MSG_NOTE, vect_location, + "Analyzing vectorizable constructor: %G\n", + stmt_info->stmt); } else { @@ -3123,31 +3127,22 @@ vect_slp_check_for_constructors (bb_vec_ gimple_stmt_iterator gsi; for (gsi = bb_vinfo->region_begin; - gsi_stmt (gsi) != gsi_stmt (bb_vinfo->region_end); gsi_next (&gsi)) + gsi_stmt (gsi) != gsi_stmt (bb_vinfo->region_end); gsi_next (&gsi)) { - gimple *stmt = gsi_stmt (gsi); - - if (is_gimple_assign (stmt) - && gimple_assign_rhs_code (stmt) == CONSTRUCTOR - && TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME - && TREE_CODE (TREE_TYPE (gimple_assign_lhs (stmt))) == VECTOR_TYPE) - { - tree rhs = gimple_assign_rhs1 (stmt); - - if (CONSTRUCTOR_NELTS (rhs) == 0) - continue; - - poly_uint64 subparts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs)); + gassign *stmt = dyn_cast <gassign *> (gsi_stmt (gsi)); + if (!stmt || gimple_assign_rhs_code (stmt) != CONSTRUCTOR) + continue; - if (maybe_ne (subparts, CONSTRUCTOR_NELTS (rhs))) - continue; + tree rhs = gimple_assign_rhs1 (stmt); + if (!VECTOR_TYPE_P (TREE_TYPE (rhs)) + || maybe_ne (TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs)), + CONSTRUCTOR_NELTS (rhs)) + || VECTOR_TYPE_P (TREE_TYPE (CONSTRUCTOR_ELT (rhs, 0)->value)) + || uniform_vector_p (rhs)) + continue; - if (dump_enabled_p ()) - dump_printf_loc (MSG_NOTE, vect_location, - "Found vectorizable constructor: %G\n", stmt); - stmt_vec_info stmt_info = bb_vinfo->lookup_stmt (stmt); - BB_VINFO_GROUPED_STORES (bb_vinfo).safe_push (stmt_info); - } + stmt_vec_info stmt_info = bb_vinfo->lookup_stmt (stmt); + BB_VINFO_GROUPED_STORES (bb_vinfo).safe_push (stmt_info); } } Index: gcc/testsuite/gcc.dg/vect/bb-slp-42.c =================================================================== --- gcc/testsuite/gcc.dg/vect/bb-slp-42.c (revision 278484) +++ gcc/testsuite/gcc.dg/vect/bb-slp-42.c (working copy) @@ -44,6 +44,5 @@ main () } -/* See that we vectorize an SLP instance. */ -/* { dg-final { scan-tree-dump "Found vectorizable constructor" "slp1" { target { ! vect_fully_masked } } } } */ -/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 4 "slp1" { target { ! vect_fully_masked } } } } */ +/* See that we do not try to vectorize the uniform CTORs. */ +/* { dg-final { scan-tree-dump-not "Analyzing vectorizable constructor" "slp1" } } */