Richard Biener <rguent...@suse.de> writes: > 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).
The point of that test was that we could share a vector load at b with four constructors, so it's not really a no-op: https://gcc.gnu.org/ml/gcc-patches/2019-11/msg01240.html Is this because x86 prefers to load-and-duplicate four individual elements rather than load them all at once? Thanks, Richard > > 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" } } */