From 6ef709e50228eb23c25d3620ac6eadb6d765d40d Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 31 Jul 2018 14:26:31 +0000 Subject: [PATCH] [44/46] Remove global vinfo_for_stmt-related routines 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. 2018-07-31 Richard Sandiford 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. From-SVN: r263159 --- gcc/ChangeLog | 26 +++++++++++++ gcc/tree-parloops.c | 9 +---- gcc/tree-vect-loop.c | 2 - gcc/tree-vect-stmts.c | 91 ------------------------------------------- gcc/tree-vectorizer.c | 91 +++++++++++++++++++++++++++++++++++++++---- gcc/tree-vectorizer.h | 45 +++------------------ 6 files changed, 116 insertions(+), 148 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8590a545bae..2a4979e0432 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,29 @@ +2018-07-31 Richard Sandiford + + * 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. + 2018-07-31 Richard Sandiford * tree-vectorizer.h (free_stmt_vec_info): Take a stmt_vec_info diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c index 513305490c8..e89c8875147 100644 --- a/gcc/tree-parloops.c +++ b/gcc/tree-parloops.c @@ -2592,10 +2592,6 @@ gather_scalar_reductions (loop_p loop, reduction_info_table_type *reduction_list auto_vec double_reduc_phis; auto_vec double_reduc_stmts; - vec 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, reduction_info_table_type *reduction_list } 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) diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 840b38c162d..7ce9ca5e6fc 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -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++) { diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 12f1cac9ab2..568705c3eed 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -9853,97 +9853,6 @@ vect_remove_stores (stmt_vec_info first_stmt_info) } } - -/* 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_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 *v) -{ - stmt_vec_info_vec = v; -} - -/* Free the stmt_vec_info entries in V and release V. */ - -void -free_stmt_vec_infos (vec *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 diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c index bb6a154fab5..579f43579be 100644 --- a/gcc/tree-vectorizer.c +++ b/gcc/tree-vectorizer.c @@ -84,9 +84,6 @@ along with GCC; see the file COPYING3. If not see /* 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_vec; - /* Dump a cost entry according to args to F. */ void @@ -457,7 +454,6 @@ vec_info::vec_info (vec_info::vec_kind kind_in, void *target_cost_data_in, 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; } @@ -619,6 +615,87 @@ vec_info::replace_stmt (gimple_stmt_iterator *gsi, stmt_vec_info stmt_info, 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. */ @@ -974,8 +1051,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 diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index b9aa9c454b5..d88ea2be045 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -267,6 +267,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; @@ -1096,43 +1102,6 @@ inline stmt_vec_info::operator gimple * () const return m_ptr ? m_ptr->stmt : NULL; } -extern vec *stmt_vec_info_vec; - -void set_stmt_vec_info_vec (vec *); -void free_stmt_vec_infos (vec *); - -/* 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) { @@ -1502,8 +1471,6 @@ extern bool supportable_widening_operation (enum tree_code, stmt_vec_info, extern bool supportable_narrowing_operation (enum tree_code, tree, tree, enum tree_code *, int *, vec *); -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); -- 2.30.2