On Tue, Jul 24, 2018 at 12:10 PM Richard Sandiford <richard.sandif...@arm.com> wrote: > > There are no more direct uses of: > > - new_stmt_vec_info > - set_vinfo_for_stmt > - free_stmt_vec_infos > - free_stmt_vec_info > > outside of vec_info, so they can now be private member functions. > It also seemed better to put them in tree-vectorizer.c, along with the > other vec_info routines. > > We can also get rid of: > > - vinfo_for_stmt > - stmt_vec_info_vec > - set_stmt_vec_info_vec > > since nothing now uses them. This was the main goal of the series.
Great. OK. Thanks, Richard. > > 2018-07-24 Richard Sandiford <richard.sandif...@arm.com> > > gcc/ > * tree-vectorizer.h (vec_info::new_vinfo_for_stmt) > (vec_info::set_vinfo_for_stmt, vec_info::free_stmt_vec_infos) > (vec_info::free_stmt_vec_info): New private member functions. > (set_stmt_vec_info_vec, free_stmt_vec_infos, vinfo_for_stmt) > (set_vinfo_for_stmt, new_stmt_vec_info, free_stmt_vec_info): Delete. > * tree-parloops.c (gather_scalar_reductions): Remove calls to > set_stmt_vec_info_vec and free_stmt_vec_infos. > * tree-vect-loop.c (_loop_vec_info): Remove call to > set_stmt_vec_info_vec. > * tree-vect-stmts.c (new_stmt_vec_info, set_stmt_vec_info_vec) > (free_stmt_vec_infos, free_stmt_vec_info): Delete in favor of... > * tree-vectorizer.c (vec_info::new_stmt_vec_info) > (vec_info::set_vinfo_for_stmt, vec_info::free_stmt_vec_infos) > (vec_info::free_stmt_vec_info): ...these new functions. Remove > assignments in {vec_info::,}new_stmt_vec_info that are redundant > with the clearing in the xcalloc. > (stmt_vec_info_vec): Delete. > (vec_info::vec_info): Don't call set_stmt_vec_info_vec. > (vectorize_loops): Likewise. > (vec_info::~vec_info): Remove argument from call to > free_stmt_vec_infos. > (vec_info::add_stmt): Remove vinfo argument from call to > new_stmt_vec_info. > > Index: gcc/tree-vectorizer.h > =================================================================== > --- gcc/tree-vectorizer.h 2018-07-24 10:24:26.084281700 +0100 > +++ gcc/tree-vectorizer.h 2018-07-24 10:24:29.300253129 +0100 > @@ -266,6 +266,12 @@ struct vec_info { > > /* Cost data used by the target cost model. */ > void *target_cost_data; > + > +private: > + stmt_vec_info new_stmt_vec_info (gimple *stmt); > + void set_vinfo_for_stmt (gimple *, stmt_vec_info); > + void free_stmt_vec_infos (); > + void free_stmt_vec_info (stmt_vec_info); > }; > > struct _loop_vec_info; > @@ -1085,43 +1091,6 @@ inline stmt_vec_info::operator gimple * > return m_ptr ? m_ptr->stmt : NULL; > } > > -extern vec<stmt_vec_info> *stmt_vec_info_vec; > - > -void set_stmt_vec_info_vec (vec<stmt_vec_info> *); > -void free_stmt_vec_infos (vec<stmt_vec_info> *); > - > -/* Return a stmt_vec_info corresponding to STMT. */ > - > -static inline stmt_vec_info > -vinfo_for_stmt (gimple *stmt) > -{ > - int uid = gimple_uid (stmt); > - if (uid <= 0) > - return NULL; > - > - return (*stmt_vec_info_vec)[uid - 1]; > -} > - > -/* Set vectorizer information INFO for STMT. */ > - > -static inline void > -set_vinfo_for_stmt (gimple *stmt, stmt_vec_info info) > -{ > - unsigned int uid = gimple_uid (stmt); > - if (uid == 0) > - { > - gcc_checking_assert (info); > - uid = stmt_vec_info_vec->length () + 1; > - gimple_set_uid (stmt, uid); > - stmt_vec_info_vec->safe_push (info); > - } > - else > - { > - gcc_checking_assert (info == NULL_STMT_VEC_INFO); > - (*stmt_vec_info_vec)[uid - 1] = info; > - } > -} > - > static inline bool > nested_in_vect_loop_p (struct loop *loop, stmt_vec_info stmt_info) > { > @@ -1483,8 +1452,6 @@ extern bool supportable_widening_operati > extern bool supportable_narrowing_operation (enum tree_code, tree, tree, > enum tree_code *, > int *, vec<tree> *); > -extern stmt_vec_info new_stmt_vec_info (gimple *stmt, vec_info *); > -extern void free_stmt_vec_info (stmt_vec_info); > extern unsigned record_stmt_cost (stmt_vector_for_cost *, int, > enum vect_cost_for_stmt, stmt_vec_info, > int, enum vect_cost_model_location); > Index: gcc/tree-parloops.c > =================================================================== > --- gcc/tree-parloops.c 2018-07-24 10:22:57.273070426 +0100 > +++ gcc/tree-parloops.c 2018-07-24 10:24:29.296253164 +0100 > @@ -2592,10 +2592,6 @@ gather_scalar_reductions (loop_p loop, r > auto_vec<gphi *, 4> double_reduc_phis; > auto_vec<gimple *, 4> double_reduc_stmts; > > - vec<stmt_vec_info> stmt_vec_infos; > - stmt_vec_infos.create (50); > - set_stmt_vec_info_vec (&stmt_vec_infos); > - > vec_info_shared shared; > simple_loop_info = vect_analyze_loop_form (loop, &shared); > if (simple_loop_info == NULL) > @@ -2679,14 +2675,11 @@ gather_scalar_reductions (loop_p loop, r > } > > gather_done: > - /* Release the claim on gimple_uid. */ > - free_stmt_vec_infos (&stmt_vec_infos); > - > if (reduction_list->elements () == 0) > return; > > /* As gimple_uid is used by the vectorizer in between > vect_analyze_loop_form > - and free_stmt_vec_info_vec, we can set gimple_uid of reduc_phi stmts > only > + and delete simple_loop_info, we can set gimple_uid of reduc_phi stmts > only > now. */ > basic_block bb; > FOR_EACH_BB_FN (bb, cfun) > Index: gcc/tree-vect-loop.c > =================================================================== > --- gcc/tree-vect-loop.c 2018-07-24 10:24:26.080281735 +0100 > +++ gcc/tree-vect-loop.c 2018-07-24 10:24:29.296253164 +0100 > @@ -888,8 +888,6 @@ _loop_vec_info::~_loop_vec_info () > gimple_stmt_iterator si; > int j; > > - /* ??? We're releasing loop_vinfos en-block. */ > - set_stmt_vec_info_vec (&stmt_vec_infos); > nbbs = loop->num_nodes; > for (j = 0; j < nbbs; j++) > { > Index: gcc/tree-vect-stmts.c > =================================================================== > --- gcc/tree-vect-stmts.c 2018-07-24 10:24:26.084281700 +0100 > +++ gcc/tree-vect-stmts.c 2018-07-24 10:24:29.300253129 +0100 > @@ -9850,98 +9850,6 @@ vect_remove_stores (stmt_vec_info first_ > } > } > > - > -/* Function new_stmt_vec_info. > - > - Create and initialize a new stmt_vec_info struct for STMT. */ > - > -stmt_vec_info > -new_stmt_vec_info (gimple *stmt, vec_info *vinfo) > -{ > - stmt_vec_info res; > - res = (_stmt_vec_info *) xcalloc (1, sizeof (struct _stmt_vec_info)); > - > - STMT_VINFO_TYPE (res) = undef_vec_info_type; > - STMT_VINFO_STMT (res) = stmt; > - res->vinfo = vinfo; > - STMT_VINFO_RELEVANT (res) = vect_unused_in_scope; > - STMT_VINFO_LIVE_P (res) = false; > - STMT_VINFO_VECTYPE (res) = NULL; > - STMT_VINFO_VEC_STMT (res) = NULL; > - STMT_VINFO_VECTORIZABLE (res) = true; > - STMT_VINFO_IN_PATTERN_P (res) = false; > - STMT_VINFO_PATTERN_DEF_SEQ (res) = NULL; > - STMT_VINFO_DATA_REF (res) = NULL; > - STMT_VINFO_VEC_REDUCTION_TYPE (res) = TREE_CODE_REDUCTION; > - STMT_VINFO_VEC_CONST_COND_REDUC_CODE (res) = ERROR_MARK; > - > - if (gimple_code (stmt) == GIMPLE_PHI > - && is_loop_header_bb_p (gimple_bb (stmt))) > - STMT_VINFO_DEF_TYPE (res) = vect_unknown_def_type; > - else > - STMT_VINFO_DEF_TYPE (res) = vect_internal_def; > - > - STMT_VINFO_SAME_ALIGN_REFS (res).create (0); > - STMT_SLP_TYPE (res) = loop_vect; > - STMT_VINFO_NUM_SLP_USES (res) = 0; > - > - res->first_element = NULL; /* GROUP_FIRST_ELEMENT */ > - res->next_element = NULL; /* GROUP_NEXT_ELEMENT */ > - res->size = 0; /* GROUP_SIZE */ > - res->store_count = 0; /* GROUP_STORE_COUNT */ > - res->gap = 0; /* GROUP_GAP */ > - res->same_dr_stmt = NULL; /* GROUP_SAME_DR_STMT */ > - > - /* This is really "uninitialized" until vect_compute_data_ref_alignment. > */ > - res->dr_aux.misalignment = DR_MISALIGNMENT_UNINITIALIZED; > - > - return res; > -} > - > - > -/* Set the current stmt_vec_info vector to V. */ > - > -void > -set_stmt_vec_info_vec (vec<stmt_vec_info> *v) > -{ > - stmt_vec_info_vec = v; > -} > - > -/* Free the stmt_vec_info entries in V and release V. */ > - > -void > -free_stmt_vec_infos (vec<stmt_vec_info> *v) > -{ > - unsigned int i; > - stmt_vec_info info; > - FOR_EACH_VEC_ELT (*v, i, info) > - if (info != NULL_STMT_VEC_INFO) > - free_stmt_vec_info (info); > - if (v == stmt_vec_info_vec) > - stmt_vec_info_vec = NULL; > - v->release (); > -} > - > - > -/* Free stmt vectorization related info. */ > - > -void > -free_stmt_vec_info (stmt_vec_info stmt_info) > -{ > - if (stmt_info->pattern_stmt_p) > - { > - gimple_set_bb (stmt_info->stmt, NULL); > - tree lhs = gimple_get_lhs (stmt_info->stmt); > - if (lhs && TREE_CODE (lhs) == SSA_NAME) > - release_ssa_name (lhs); > - } > - > - STMT_VINFO_SAME_ALIGN_REFS (stmt_info).release (); > - STMT_VINFO_SIMD_CLONE_INFO (stmt_info).release (); > - free (stmt_info); > -} > - > - > /* Function get_vectype_for_scalar_type_and_size. > > Returns the vector type corresponding to SCALAR_TYPE and SIZE as > supported > Index: gcc/tree-vectorizer.c > =================================================================== > --- gcc/tree-vectorizer.c 2018-07-24 10:24:26.084281700 +0100 > +++ gcc/tree-vectorizer.c 2018-07-24 10:24:29.300253129 +0100 > @@ -84,9 +84,6 @@ Software Foundation; either version 3, o > /* Loop or bb location, with hotness information. */ > dump_user_location_t vect_location; > > -/* Vector mapping GIMPLE stmt to stmt_vec_info. */ > -vec<stmt_vec_info> *stmt_vec_info_vec; > - > /* Dump a cost entry according to args to F. */ > > void > @@ -457,7 +454,6 @@ vec_info::vec_info (vec_info::vec_kind k > target_cost_data (target_cost_data_in) > { > stmt_vec_infos.create (50); > - set_stmt_vec_info_vec (&stmt_vec_infos); > } > > vec_info::~vec_info () > @@ -469,7 +465,7 @@ vec_info::~vec_info () > vect_free_slp_instance (instance, true); > > destroy_cost_data (target_cost_data); > - free_stmt_vec_infos (&stmt_vec_infos); > + free_stmt_vec_infos (); > } > > vec_info_shared::vec_info_shared () > @@ -513,7 +509,7 @@ vec_info_shared::check_datarefs () > stmt_vec_info > vec_info::add_stmt (gimple *stmt) > { > - stmt_vec_info res = new_stmt_vec_info (stmt, this); > + stmt_vec_info res = new_stmt_vec_info (stmt); > set_vinfo_for_stmt (stmt, res); > return res; > } > @@ -608,6 +604,87 @@ vec_info::replace_stmt (gimple_stmt_iter > gsi_replace (gsi, new_stmt, true); > } > > +/* Create and initialize a new stmt_vec_info struct for STMT. */ > + > +stmt_vec_info > +vec_info::new_stmt_vec_info (gimple *stmt) > +{ > + stmt_vec_info res = XCNEW (struct _stmt_vec_info); > + res->vinfo = this; > + res->stmt = stmt; > + > + STMT_VINFO_TYPE (res) = undef_vec_info_type; > + STMT_VINFO_RELEVANT (res) = vect_unused_in_scope; > + STMT_VINFO_VECTORIZABLE (res) = true; > + STMT_VINFO_VEC_REDUCTION_TYPE (res) = TREE_CODE_REDUCTION; > + STMT_VINFO_VEC_CONST_COND_REDUC_CODE (res) = ERROR_MARK; > + > + if (gimple_code (stmt) == GIMPLE_PHI > + && is_loop_header_bb_p (gimple_bb (stmt))) > + STMT_VINFO_DEF_TYPE (res) = vect_unknown_def_type; > + else > + STMT_VINFO_DEF_TYPE (res) = vect_internal_def; > + > + STMT_VINFO_SAME_ALIGN_REFS (res).create (0); > + STMT_SLP_TYPE (res) = loop_vect; > + > + /* This is really "uninitialized" until vect_compute_data_ref_alignment. > */ > + res->dr_aux.misalignment = DR_MISALIGNMENT_UNINITIALIZED; > + > + return res; > +} > + > +/* Associate STMT with INFO. */ > + > +void > +vec_info::set_vinfo_for_stmt (gimple *stmt, stmt_vec_info info) > +{ > + unsigned int uid = gimple_uid (stmt); > + if (uid == 0) > + { > + gcc_checking_assert (info); > + uid = stmt_vec_infos.length () + 1; > + gimple_set_uid (stmt, uid); > + stmt_vec_infos.safe_push (info); > + } > + else > + { > + gcc_checking_assert (info == NULL_STMT_VEC_INFO); > + stmt_vec_infos[uid - 1] = info; > + } > +} > + > +/* Free the contents of stmt_vec_infos. */ > + > +void > +vec_info::free_stmt_vec_infos (void) > +{ > + unsigned int i; > + stmt_vec_info info; > + FOR_EACH_VEC_ELT (stmt_vec_infos, i, info) > + if (info != NULL_STMT_VEC_INFO) > + free_stmt_vec_info (info); > + stmt_vec_infos.release (); > +} > + > +/* Free STMT_INFO. */ > + > +void > +vec_info::free_stmt_vec_info (stmt_vec_info stmt_info) > +{ > + if (stmt_info->pattern_stmt_p) > + { > + gimple_set_bb (stmt_info->stmt, NULL); > + tree lhs = gimple_get_lhs (stmt_info->stmt); > + if (lhs && TREE_CODE (lhs) == SSA_NAME) > + release_ssa_name (lhs); > + } > + > + STMT_VINFO_SAME_ALIGN_REFS (stmt_info).release (); > + STMT_VINFO_SIMD_CLONE_INFO (stmt_info).release (); > + free (stmt_info); > +} > + > /* A helper function to free scev and LOOP niter information, as well as > clear loop constraint LOOP_C_FINITE. */ > > @@ -963,8 +1040,6 @@ vectorize_loops (void) > if (cfun->has_simduid_loops) > note_simd_array_uses (&simd_array_to_simduid_htab); > > - set_stmt_vec_info_vec (NULL); > - > /* ----------- Analyze loops. ----------- */ > > /* If some loop was duplicated, it gets bigger number