This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [44/46] Remove global vinfo_for_stmt-related routines
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, richard dot sandiford at arm dot com
- Date: Tue, 31 Jul 2018 14:05:23 +0200
- Subject: Re: [44/46] Remove global vinfo_for_stmt-related routines
- References: <87wotlrmen.fsf@arm.com> <87muuhkkq3.fsf@arm.com>
On Tue, Jul 24, 2018 at 12:10 PM Richard Sandiford
<richard.sandiford@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.sandiford@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