On Tue, Aug 22, 2023 at 10:45 AM Kewen.Lin <li...@linux.ibm.com> wrote: > > Hi, > > To avoid some duplicates in some follow-up patches on > function vectorizable_store, this patch is to adjust some > existing vec with auto_vec and remove some manual release > invocation. Also refactor a bit and remove some useless > codes. > > Bootstrapped and regtested on x86_64-redhat-linux, > aarch64-linux-gnu and powerpc64{,le}-linux-gnu. > > Is it ok for trunk?
OK. Thanks, Richard. > BR, > Kewen > ----- > > gcc/ChangeLog: > > * tree-vect-stmts.cc (vectorizable_store): Remove vec oprnds, > adjust vec result_chain, vec_oprnd with auto_vec, and adjust > gvec_oprnds with auto_delete_vec. > --- > gcc/tree-vect-stmts.cc | 64 +++++++++++++++--------------------------- > 1 file changed, 23 insertions(+), 41 deletions(-) > > diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc > index 1580a396301..fcaa4127e52 100644 > --- a/gcc/tree-vect-stmts.cc > +++ b/gcc/tree-vect-stmts.cc > @@ -8200,9 +8200,6 @@ vectorizable_store (vec_info *vinfo, > stmt_vec_info first_stmt_info; > bool grouped_store; > unsigned int group_size, i; > - vec<tree> oprnds = vNULL; > - vec<tree> result_chain = vNULL; > - vec<tree> vec_oprnds = vNULL; > bool slp = (slp_node != NULL); > unsigned int vec_num; > bb_vec_info bb_vinfo = dyn_cast <bb_vec_info> (vinfo); > @@ -8601,6 +8598,7 @@ vectorizable_store (vec_info *vinfo, > > alias_off = build_int_cst (ref_type, 0); > stmt_vec_info next_stmt_info = first_stmt_info; > + auto_vec<tree> vec_oprnds (ncopies); > for (g = 0; g < group_size; g++) > { > running_off = offvar; > @@ -8682,7 +8680,7 @@ vectorizable_store (vec_info *vinfo, > } > } > next_stmt_info = DR_GROUP_NEXT_ELEMENT (next_stmt_info); > - vec_oprnds.release (); > + vec_oprnds.truncate(0); > if (slp) > break; > } > @@ -8690,9 +8688,6 @@ vectorizable_store (vec_info *vinfo, > return true; > } > > - auto_vec<tree> dr_chain (group_size); > - oprnds.create (group_size); > - > gcc_assert (alignment_support_scheme); > vec_loop_masks *loop_masks > = (loop_vinfo && LOOP_VINFO_FULLY_MASKED_P (loop_vinfo) > @@ -8783,11 +8778,15 @@ vectorizable_store (vec_info *vinfo, > STMT_VINFO_RELATED_STMT for the next copies. > */ > > + auto_vec<tree> dr_chain (group_size); > + auto_vec<tree> result_chain (group_size); > auto_vec<tree> vec_masks; > tree vec_mask = NULL; > auto_vec<tree> vec_offsets; > - auto_vec<vec<tree> > gvec_oprnds; > - gvec_oprnds.safe_grow_cleared (group_size, true); > + auto_delete_vec<auto_vec<tree>> gvec_oprnds (group_size); > + for (i = 0; i < group_size; i++) > + gvec_oprnds.quick_push (new auto_vec<tree> (ncopies)); > + auto_vec<tree, 1> vec_oprnds; > for (j = 0; j < ncopies; j++) > { > gimple *new_stmt; > @@ -8803,11 +8802,11 @@ vectorizable_store (vec_info *vinfo, > else > { > /* For interleaved stores we collect vectorized defs for all the > - stores in the group in DR_CHAIN and OPRNDS. DR_CHAIN is then > - used as an input to vect_permute_store_chain(). > + stores in the group in DR_CHAIN. DR_CHAIN is then used as an > + input to vect_permute_store_chain(). > > If the store is not grouped, DR_GROUP_SIZE is 1, and DR_CHAIN > - and OPRNDS are of size 1. */ > + is of size 1. */ > stmt_vec_info next_stmt_info = first_stmt_info; > for (i = 0; i < group_size; i++) > { > @@ -8817,11 +8816,10 @@ vectorizable_store (vec_info *vinfo, > that there is no interleaving, DR_GROUP_SIZE is 1, > and only one iteration of the loop will be executed. */ > op = vect_get_store_rhs (next_stmt_info); > - vect_get_vec_defs_for_operand (vinfo, next_stmt_info, > - ncopies, op, > &gvec_oprnds[i]); > - vec_oprnd = gvec_oprnds[i][0]; > - dr_chain.quick_push (gvec_oprnds[i][0]); > - oprnds.quick_push (gvec_oprnds[i][0]); > + vect_get_vec_defs_for_operand (vinfo, next_stmt_info, > ncopies, > + op, gvec_oprnds[i]); > + vec_oprnd = (*gvec_oprnds[i])[0]; > + dr_chain.quick_push (vec_oprnd); > next_stmt_info = DR_GROUP_NEXT_ELEMENT (next_stmt_info); > } > if (mask) > @@ -8863,16 +8861,13 @@ vectorizable_store (vec_info *vinfo, > else > { > gcc_assert (!LOOP_VINFO_USING_SELECT_VL_P (loop_vinfo)); > - /* For interleaved stores we created vectorized defs for all the > - defs stored in OPRNDS in the previous iteration (previous copy). > - DR_CHAIN is then used as an input to vect_permute_store_chain(). > - If the store is not grouped, DR_GROUP_SIZE is 1, and DR_CHAIN and > - OPRNDS are of size 1. */ > + /* DR_CHAIN is then used as an input to vect_permute_store_chain(). > + If the store is not grouped, DR_GROUP_SIZE is 1, and DR_CHAIN is > + of size 1. */ > for (i = 0; i < group_size; i++) > { > - vec_oprnd = gvec_oprnds[i][j]; > - dr_chain[i] = gvec_oprnds[i][j]; > - oprnds[i] = gvec_oprnds[i][j]; > + vec_oprnd = (*gvec_oprnds[i])[j]; > + dr_chain[i] = vec_oprnd; > } > if (mask) > vec_mask = vec_masks[j]; > @@ -8975,13 +8970,9 @@ vectorizable_store (vec_info *vinfo, > { > new_stmt = NULL; > if (grouped_store) > - { > - if (j == 0) > - result_chain.create (group_size); > - /* Permute. */ > - vect_permute_store_chain (vinfo, dr_chain, group_size, > stmt_info, > - gsi, &result_chain); > - } > + /* Permute. */ > + vect_permute_store_chain (vinfo, dr_chain, group_size, stmt_info, > + gsi, &result_chain); > > stmt_vec_info next_stmt_info = first_stmt_info; > for (i = 0; i < vec_num; i++) > @@ -9278,15 +9269,6 @@ vectorizable_store (vec_info *vinfo, > } > } > > - for (i = 0; i < group_size; ++i) > - { > - vec<tree> oprndsi = gvec_oprnds[i]; > - oprndsi.release (); > - } > - oprnds.release (); > - result_chain.release (); > - vec_oprnds.release (); > - > return true; > } > > -- > 2.31.1