On Mon, Jul 30, 2018 at 1:39 PM Richard Sandiford <richard.sandif...@arm.com> wrote: > > This patch adds a helper that does the opposite of vect_orig_stmt: > go from the original scalar statement to the statement that should > actually be vectorised. > > The use in the last two hunks of vectorizable_reduction are because > reduc_stmt_info (first hunk) and stmt_info (second hunk) are already > pattern statements if appropriate.
OK. Richard. > > 2018-07-30 Richard Sandiford <richard.sandif...@arm.com> > > gcc/ > * tree-vectorizer.h (vect_stmt_to_vectorize): New function. > * tree-vect-loop.c (vect_update_vf_for_slp): Use it. > (vectorizable_reduction): Likewise. > * tree-vect-slp.c (vect_analyze_slp_instance): Likewise. > (vect_detect_hybrid_slp_stmts): Likewise. > * tree-vect-stmts.c (vect_is_simple_use): Likewise. > > Index: gcc/tree-vectorizer.h > =================================================================== > --- gcc/tree-vectorizer.h 2018-07-30 12:32:26.218536339 +0100 > +++ gcc/tree-vectorizer.h 2018-07-30 12:32:29.586506669 +0100 > @@ -1131,6 +1131,17 @@ vect_orig_stmt (stmt_vec_info stmt_info) > return stmt_info; > } > > +/* If STMT_INFO has been replaced by a pattern statement, return the > + replacement statement, otherwise return STMT_INFO itself. */ > + > +inline stmt_vec_info > +vect_stmt_to_vectorize (stmt_vec_info stmt_info) > +{ > + if (STMT_VINFO_IN_PATTERN_P (stmt_info)) > + return STMT_VINFO_RELATED_STMT (stmt_info); > + return stmt_info; > +} > + > /* Return true if BB is a loop header. */ > > static inline bool > Index: gcc/tree-vect-loop.c > =================================================================== > --- gcc/tree-vect-loop.c 2018-07-30 12:32:26.214536374 +0100 > +++ gcc/tree-vect-loop.c 2018-07-30 12:32:29.586506669 +0100 > @@ -1424,9 +1424,7 @@ vect_update_vf_for_slp (loop_vec_info lo > gsi_next (&si)) > { > stmt_vec_info stmt_info = loop_vinfo->lookup_stmt (gsi_stmt (si)); > - if (STMT_VINFO_IN_PATTERN_P (stmt_info) > - && STMT_VINFO_RELATED_STMT (stmt_info)) > - stmt_info = STMT_VINFO_RELATED_STMT (stmt_info); > + stmt_info = vect_stmt_to_vectorize (stmt_info); > if ((STMT_VINFO_RELEVANT_P (stmt_info) > || VECTORIZABLE_CYCLE_DEF (STMT_VINFO_DEF_TYPE (stmt_info))) > && !PURE_SLP_STMT (stmt_info)) > @@ -6111,8 +6109,7 @@ vectorizable_reduction (stmt_vec_info st > return true; > > stmt_vec_info reduc_stmt_info = STMT_VINFO_REDUC_DEF (stmt_info); > - if (STMT_VINFO_IN_PATTERN_P (reduc_stmt_info)) > - reduc_stmt_info = STMT_VINFO_RELATED_STMT (reduc_stmt_info); > + reduc_stmt_info = vect_stmt_to_vectorize (reduc_stmt_info); > > if (STMT_VINFO_VEC_REDUCTION_TYPE (reduc_stmt_info) > == EXTRACT_LAST_REDUCTION) > @@ -6145,8 +6142,7 @@ vectorizable_reduction (stmt_vec_info st > if (ncopies > 1 > && STMT_VINFO_RELEVANT (reduc_stmt_info) <= vect_used_only_live > && (use_stmt_info = loop_vinfo->lookup_single_use (phi_result)) > - && (use_stmt_info == reduc_stmt_info > - || STMT_VINFO_RELATED_STMT (use_stmt_info) == reduc_stmt_info)) > + && vect_stmt_to_vectorize (use_stmt_info) == reduc_stmt_info) > single_defuse_cycle = true; > > /* Create the destination vector */ > @@ -6915,8 +6911,7 @@ vectorizable_reduction (stmt_vec_info st > if (ncopies > 1 > && (STMT_VINFO_RELEVANT (stmt_info) <= vect_used_only_live) > && (use_stmt_info = loop_vinfo->lookup_single_use (reduc_phi_result)) > - && (use_stmt_info == stmt_info > - || STMT_VINFO_RELATED_STMT (use_stmt_info) == stmt_info)) > + && vect_stmt_to_vectorize (use_stmt_info) == stmt_info) > { > single_defuse_cycle = true; > epilog_copies = 1; > Index: gcc/tree-vect-slp.c > =================================================================== > --- gcc/tree-vect-slp.c 2018-07-30 12:32:26.218536339 +0100 > +++ gcc/tree-vect-slp.c 2018-07-30 12:32:29.586506669 +0100 > @@ -1969,11 +1969,7 @@ vect_analyze_slp_instance (vec_info *vin > /* Collect the stores and store them in SLP_TREE_SCALAR_STMTS. */ > while (next_info) > { > - if (STMT_VINFO_IN_PATTERN_P (next_info) > - && STMT_VINFO_RELATED_STMT (next_info)) > - scalar_stmts.safe_push (STMT_VINFO_RELATED_STMT (next_info)); > - else > - scalar_stmts.safe_push (next_info); > + scalar_stmts.safe_push (vect_stmt_to_vectorize (next_info)); > next_info = DR_GROUP_NEXT_ELEMENT (next_info); > } > } > @@ -1983,11 +1979,7 @@ vect_analyze_slp_instance (vec_info *vin > SLP_TREE_SCALAR_STMTS. */ > while (next_info) > { > - if (STMT_VINFO_IN_PATTERN_P (next_info) > - && STMT_VINFO_RELATED_STMT (next_info)) > - scalar_stmts.safe_push (STMT_VINFO_RELATED_STMT (next_info)); > - else > - scalar_stmts.safe_push (next_info); > + scalar_stmts.safe_push (vect_stmt_to_vectorize (next_info)); > next_info = REDUC_GROUP_NEXT_ELEMENT (next_info); > } > /* Mark the first element of the reduction chain as reduction to > properly > @@ -2325,9 +2317,7 @@ vect_detect_hybrid_slp_stmts (slp_tree n > use_vinfo = loop_vinfo->lookup_stmt (use_stmt); > if (!use_vinfo) > continue; > - if (STMT_VINFO_IN_PATTERN_P (use_vinfo) > - && STMT_VINFO_RELATED_STMT (use_vinfo)) > - use_vinfo = STMT_VINFO_RELATED_STMT (use_vinfo); > + use_vinfo = vect_stmt_to_vectorize (use_vinfo); > if (!STMT_SLP_TYPE (use_vinfo) > && (STMT_VINFO_RELEVANT (use_vinfo) > || VECTORIZABLE_CYCLE_DEF (STMT_VINFO_DEF_TYPE > (use_vinfo))) > Index: gcc/tree-vect-stmts.c > =================================================================== > --- gcc/tree-vect-stmts.c 2018-07-30 12:32:26.218536339 +0100 > +++ gcc/tree-vect-stmts.c 2018-07-30 12:32:29.586506669 +0100 > @@ -10031,11 +10031,8 @@ vect_is_simple_use (tree operand, vec_in > *dt = vect_external_def; > else > { > - if (STMT_VINFO_IN_PATTERN_P (stmt_vinfo)) > - { > - stmt_vinfo = STMT_VINFO_RELATED_STMT (stmt_vinfo); > - def_stmt = stmt_vinfo->stmt; > - } > + stmt_vinfo = vect_stmt_to_vectorize (stmt_vinfo); > + def_stmt = stmt_vinfo->stmt; > switch (gimple_code (def_stmt)) > { > case GIMPLE_PHI: