RE: [PATCH 1/2] Add vect_finish_stmt_generation for sequences
Richard Biener <[email protected]>
| Newsgroups | gmane.comp.gcc.patches |
|---|---|
| Message-ID | <[email protected]> |
On Fri, 14 Aug 2026, Tamar Christina wrote: > > -----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? I think it will disrupt the stmt walking, it can't be part of two lists at the same time. Richard. > 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 > > -- Richard Biener <[email protected]> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Jochen Jaser, Andrew McDonald, Abhinav Puri; (HRB 36809, AG Nuernberg)