RE: [PATCH 1/2] Add vect_finish_stmt_generation for sequences
Tamar Christina <[email protected]>
| Newsgroups | gmane.comp.gcc.patches |
|---|---|
| Message-ID | <VI0PR08MB10392ADAF05E1666B7B071816FFDA2@VI0PR08MB10392.eurprd08.prod.outlook.com> |
> -----Original Message----- > From: Richard Biener <[email protected]> > Sent: 14 August 2026 13:13 > To: [email protected] > Cc: Tamar Christina <[email protected]> > Subject: [PATCH 1/2] Add vect_finish_stmt_generation for sequences > > The following attempts to make using gimple_build easier during > vectorizer code generation by providing an overload of > vect_finish_stmt_generation that handles a built sequence. > In addition to inserting and finishing stmts on the sequence the > ultimate result is made to be based on the passed vectorizer > temporary (that gets us the fancy names). > > I have converted one instance in vectorizable_conversion which > I'll need to handle both NOP_EXPR and VIEW_CONVERT_EXPR which > gimple_build happily does correctly, but vect_gimple_build does > not. > > Bootstrapped and tested on x86_64-unknown-linux-gnu. > > Does this look sensible? I can of course sepecial-case > VIEW_CONVERT_EXPR manually as well. > Yeah, it seems useful especially for cleaning up vectorizable_load/store where we have a lot of additional addressing variables being emitted all over the place. > * tree-vect-stmts.cc (vect_finish_stmt_generation): New > overload for gimple_build sequences. > (vectorizable_conversion): Convert one instance of > vect_gimple_build to gimple_build plus > vect_finish_stmt_generation. > --- > gcc/tree-vect-stmts.cc | 43 ++++++++++++++++++++++++++++++++--------- > - > 1 file changed, 33 insertions(+), 10 deletions(-) > > diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc > index a023977bc51..44090015e7a 100644 > --- a/gcc/tree-vect-stmts.cc > +++ b/gcc/tree-vect-stmts.cc > @@ -1260,7 +1260,7 @@ vect_get_vec_defs (vec_info *, slp_tree slp_node, > > /* Helper function called by vect_finish_replace_stmt and > vect_finish_stmt_generation. Set the location of the new > - statement and create and return a stmt_vec_info for it. */ > + statement. */ > > static void > vect_finish_stmt_generation_1 (vec_info *, > @@ -1285,8 +1285,7 @@ vect_finish_stmt_generation_1 (vec_info *, > } > > /* Replace the scalar statement STMT_INFO with a new vector statement > VEC_STMT, > - which sets the same scalar result as STMT_INFO did. Create and return a > - stmt_vec_info for VEC_STMT. */ > + which sets the same scalar result as STMT_INFO did. */ > > void > vect_finish_replace_stmt (vec_info *vinfo, > @@ -1302,7 +1301,7 @@ vect_finish_replace_stmt (vec_info *vinfo, > } > > /* Add VEC_STMT to the vectorized implementation of STMT_INFO and insert > it > - before *GSI. Create and return a stmt_vec_info for VEC_STMT. */ > + before *GSI. */ > > void > vect_finish_stmt_generation (vec_info *vinfo, > @@ -1344,6 +1343,31 @@ vect_finish_stmt_generation (vec_info *vinfo, > vect_finish_stmt_generation_1 (vinfo, stmt_info, vec_stmt); > } > > +/* Add the stmts in STMTS to the vectorized implementation of STMT_INFO > and > + insert them before *GSI. Make sure the final stmt has a result > + based on VAR. */ > + > +void > +vect_finish_stmt_generation (vec_info *vinfo, > + stmt_vec_info stmt_info, gimple_seq &stmts, > + tree var, gimple_stmt_iterator *gsi) > +{ > + auto si = gsi_start (stmts); > + while (!gsi_end_p (si)) > + { > + gimple *new_stmt = gsi_stmt (si); > + gsi_remove (&si, false); Do we actually need to remove the stmts since they're not in IL? would it not be easier to just leave it and do stmts = NULL; at the end since it saves the ptr updating? Cheers, Tamar > + if (gsi_end_p (si)) > + { > + tree lhs = gimple_get_lhs (new_stmt); > + gcc_assert (!SSA_NAME_VAR (lhs)); > + SET_SSA_NAME_VAR_OR_IDENTIFIER (lhs, var); > + } > + vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi); > + } > +} > + > + > /* We want to vectorize a call to combined function CFN with function > decl FNDECL, using VECTYPE_OUT as the type of the output and > VECTYPE_IN > as the types of all inputs. Check whether this is possible using > @@ -5797,12 +5821,11 @@ vectorizable_conversion (vec_info *vinfo, > } > else > { > - new_stmt = vect_gimple_build (vec_dest, code1, vop0); > - new_temp = make_ssa_name (vec_dest, new_stmt); > - gimple_set_lhs (new_stmt, new_temp); > - vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi); > - > - slp_node->push_vec_def (new_stmt); > + gimple_seq stmts = NULL; > + new_temp = gimple_build (&stmts, code1, vectype_out, vop0); > + vect_finish_stmt_generation (vinfo, stmt_info, > + stmts, vec_dest, gsi); > + slp_node->push_vec_def (new_temp); > } > } > break; > -- > 2.51.0