On Tue, Jul 24, 2018 at 11:57 AM Richard Sandiford <richard.sandif...@arm.com> wrote: > > This patch turns stmt_vec_info into an unspeakably bad wrapper class > and adds an implicit conversion to the associated gimple stmt. > Having this conversion makes the rest of the series easier to write, > but since the class goes away again at the end of the series, I've > not bothered adding any comments or tried to make it pretty.
So I guess I do not need to approve it ;) > > 2018-07-24 Richard Sandiford <richard.sandif...@arm.com> > > gcc/ > * tree-vectorizer.h (stmt_vec_info): Temporarily change from > a typedef to a wrapper class. > (NULL_STMT_VEC_INFO): New macro. > (vec_info::stmt_infos): Change to vec<stmt_vec_info>. > (stmt_vec_info::operator*): New function. > (stmt_vec_info::operator gimple *): Likewise. > (set_vinfo_for_stmt): Use NULL_STMT_VEC_INFO. > (add_stmt_costs): Likewise. > * tree-vect-loop-manip.c (iv_phi_p): Likewise. > * tree-vect-loop.c (vect_compute_single_scalar_iteration_cost) > (vect_get_known_peeling_cost): Likewise. > (vect_estimate_min_profitable_iters): Likewise. > * tree-vect-patterns.c (vect_init_pattern_stmt): Likewise. > * tree-vect-slp.c (vect_remove_slp_scalar_calls): Likewise. > * tree-vect-stmts.c (vect_build_gather_load_calls): Likewise. > (vectorizable_store, free_stmt_vec_infos): Likewise. > (new_stmt_vec_info): Change return type of xcalloc to > _stmt_vec_info *. > > Index: gcc/tree-vectorizer.h > =================================================================== > --- gcc/tree-vectorizer.h 2018-07-24 10:22:30.401309046 +0100 > +++ gcc/tree-vectorizer.h 2018-07-24 10:22:33.829278607 +0100 > @@ -21,12 +21,31 @@ Software Foundation; either version 3, o > #ifndef GCC_TREE_VECTORIZER_H > #define GCC_TREE_VECTORIZER_H > > +class stmt_vec_info { > +public: > + stmt_vec_info () {} > + stmt_vec_info (struct _stmt_vec_info *ptr) : m_ptr (ptr) {} > + struct _stmt_vec_info *operator-> () const { return m_ptr; } > + struct _stmt_vec_info &operator* () const; > + operator struct _stmt_vec_info * () const { return m_ptr; } > + operator gimple * () const; > + operator void * () const { return m_ptr; } > + operator bool () const { return m_ptr; } > + bool operator == (const stmt_vec_info &x) { return x.m_ptr == m_ptr; } > + bool operator == (_stmt_vec_info *x) { return x == m_ptr; } > + bool operator != (const stmt_vec_info &x) { return x.m_ptr != m_ptr; } > + bool operator != (_stmt_vec_info *x) { return x != m_ptr; } > + > +private: > + struct _stmt_vec_info *m_ptr; > +}; > + > +#define NULL_STMT_VEC_INFO (stmt_vec_info (NULL)) > + > #include "tree-data-ref.h" > #include "tree-hash-traits.h" > #include "target.h" > > -typedef struct _stmt_vec_info *stmt_vec_info; > - > /* Used for naming of new temporaries. */ > enum vect_var_kind { > vect_simple_var, > @@ -229,7 +248,7 @@ struct vec_info { > vec_info_shared *shared; > > /* The mapping of GIMPLE UID to stmt_vec_info. */ > - vec<struct _stmt_vec_info *> stmt_vec_infos; > + vec<stmt_vec_info> stmt_vec_infos; > > /* All SLP instances. */ > auto_vec<slp_instance> slp_instances; > @@ -1052,6 +1071,17 @@ #define VECT_SCALAR_BOOLEAN_TYPE_P(TYPE) > && TYPE_PRECISION (TYPE) == 1 \ > && TYPE_UNSIGNED (TYPE))) > > +inline _stmt_vec_info & > +stmt_vec_info::operator* () const > +{ > + return *m_ptr; > +} > + > +inline stmt_vec_info::operator gimple * () const > +{ > + 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> *); > @@ -1084,7 +1114,7 @@ set_vinfo_for_stmt (gimple *stmt, stmt_v > } > else > { > - gcc_checking_assert (info == NULL); > + gcc_checking_assert (info == NULL_STMT_VEC_INFO); > (*stmt_vec_info_vec)[uid - 1] = info; > } > } > @@ -1261,7 +1291,9 @@ add_stmt_costs (void *data, stmt_vector_ > unsigned i; > FOR_EACH_VEC_ELT (*cost_vec, i, cost) > add_stmt_cost (data, cost->count, cost->kind, > - cost->stmt ? vinfo_for_stmt (cost->stmt) : NULL, > + (cost->stmt > + ? vinfo_for_stmt (cost->stmt) > + : NULL_STMT_VEC_INFO), > cost->misalign, cost->where); > } > > Index: gcc/tree-vect-loop-manip.c > =================================================================== > --- gcc/tree-vect-loop-manip.c 2018-06-30 14:56:22.022893750 +0100 > +++ gcc/tree-vect-loop-manip.c 2018-07-24 10:22:33.821278677 +0100 > @@ -1344,7 +1344,7 @@ iv_phi_p (gphi *phi) > return false; > > stmt_vec_info stmt_info = vinfo_for_stmt (phi); > - gcc_assert (stmt_info != NULL); > + gcc_assert (stmt_info != NULL_STMT_VEC_INFO); > if (STMT_VINFO_DEF_TYPE (stmt_info) == vect_reduction_def > || STMT_VINFO_DEF_TYPE (stmt_info) == vect_double_reduction_def) > return false; > Index: gcc/tree-vect-loop.c > =================================================================== > --- gcc/tree-vect-loop.c 2018-07-24 10:22:30.401309046 +0100 > +++ gcc/tree-vect-loop.c 2018-07-24 10:22:33.821278677 +0100 > @@ -1139,7 +1139,7 @@ vect_compute_single_scalar_iteration_cos > j, si) > { > struct _stmt_vec_info *stmt_info > - = si->stmt ? vinfo_for_stmt (si->stmt) : NULL; > + = si->stmt ? vinfo_for_stmt (si->stmt) : NULL_STMT_VEC_INFO; > (void) add_stmt_cost (target_cost_data, si->count, > si->kind, stmt_info, si->misalign, > vect_body); > @@ -3351,7 +3351,7 @@ vect_get_known_peeling_cost (loop_vec_in > FOR_EACH_VEC_ELT (*scalar_cost_vec, j, si) > { > stmt_vec_info stmt_info > - = si->stmt ? vinfo_for_stmt (si->stmt) : NULL; > + = si->stmt ? vinfo_for_stmt (si->stmt) : NULL_STMT_VEC_INFO; > retval += record_stmt_cost (prologue_cost_vec, > si->count * peel_iters_prologue, > si->kind, stmt_info, si->misalign, > @@ -3361,7 +3361,7 @@ vect_get_known_peeling_cost (loop_vec_in > FOR_EACH_VEC_ELT (*scalar_cost_vec, j, si) > { > stmt_vec_info stmt_info > - = si->stmt ? vinfo_for_stmt (si->stmt) : NULL; > + = si->stmt ? vinfo_for_stmt (si->stmt) : NULL_STMT_VEC_INFO; > retval += record_stmt_cost (epilogue_cost_vec, > si->count * *peel_iters_epilogue, > si->kind, stmt_info, si->misalign, > @@ -3504,7 +3504,7 @@ vect_estimate_min_profitable_iters (loop > j, si) > { > struct _stmt_vec_info *stmt_info > - = si->stmt ? vinfo_for_stmt (si->stmt) : NULL; > + = si->stmt ? vinfo_for_stmt (si->stmt) : NULL_STMT_VEC_INFO; > (void) add_stmt_cost (target_cost_data, si->count, > si->kind, stmt_info, si->misalign, > vect_epilogue); > @@ -3541,7 +3541,7 @@ vect_estimate_min_profitable_iters (loop > FOR_EACH_VEC_ELT (LOOP_VINFO_SCALAR_ITERATION_COST (loop_vinfo), j, si) > { > struct _stmt_vec_info *stmt_info > - = si->stmt ? vinfo_for_stmt (si->stmt) : NULL; > + = si->stmt ? vinfo_for_stmt (si->stmt) : NULL_STMT_VEC_INFO; > (void) add_stmt_cost (target_cost_data, > si->count * peel_iters_prologue, > si->kind, stmt_info, si->misalign, > @@ -3573,7 +3573,7 @@ vect_estimate_min_profitable_iters (loop > FOR_EACH_VEC_ELT (prologue_cost_vec, j, si) > { > struct _stmt_vec_info *stmt_info > - = si->stmt ? vinfo_for_stmt (si->stmt) : NULL; > + = si->stmt ? vinfo_for_stmt (si->stmt) : NULL_STMT_VEC_INFO; > (void) add_stmt_cost (data, si->count, si->kind, stmt_info, > si->misalign, vect_prologue); > } > @@ -3581,7 +3581,7 @@ vect_estimate_min_profitable_iters (loop > FOR_EACH_VEC_ELT (epilogue_cost_vec, j, si) > { > struct _stmt_vec_info *stmt_info > - = si->stmt ? vinfo_for_stmt (si->stmt) : NULL; > + = si->stmt ? vinfo_for_stmt (si->stmt) : NULL_STMT_VEC_INFO; > (void) add_stmt_cost (data, si->count, si->kind, stmt_info, > si->misalign, vect_epilogue); > } > Index: gcc/tree-vect-patterns.c > =================================================================== > --- gcc/tree-vect-patterns.c 2018-07-24 10:22:27.281336751 +0100 > +++ gcc/tree-vect-patterns.c 2018-07-24 10:22:33.825278642 +0100 > @@ -103,7 +103,7 @@ vect_init_pattern_stmt (gimple *pattern_ > { > vec_info *vinfo = orig_stmt_info->vinfo; > stmt_vec_info pattern_stmt_info = vinfo->lookup_stmt (pattern_stmt); > - if (pattern_stmt_info == NULL) > + if (pattern_stmt_info == NULL_STMT_VEC_INFO) > pattern_stmt_info = orig_stmt_info->vinfo->add_stmt (pattern_stmt); > gimple_set_bb (pattern_stmt, gimple_bb (orig_stmt_info->stmt)); > > Index: gcc/tree-vect-slp.c > =================================================================== > --- gcc/tree-vect-slp.c 2018-07-24 10:22:27.281336751 +0100 > +++ gcc/tree-vect-slp.c 2018-07-24 10:22:33.825278642 +0100 > @@ -4039,7 +4039,7 @@ vect_remove_slp_scalar_calls (slp_tree n > if (!is_gimple_call (stmt) || gimple_bb (stmt) == NULL) > continue; > stmt_info = vinfo_for_stmt (stmt); > - if (stmt_info == NULL > + if (stmt_info == NULL_STMT_VEC_INFO > || is_pattern_stmt_p (stmt_info) > || !PURE_SLP_STMT (stmt_info)) > continue; > Index: gcc/tree-vect-stmts.c > =================================================================== > --- gcc/tree-vect-stmts.c 2018-07-24 10:22:30.401309046 +0100 > +++ gcc/tree-vect-stmts.c 2018-07-24 10:22:33.829278607 +0100 > @@ -2865,7 +2865,7 @@ vect_build_gather_load_calls (gimple *st > new_stmt = SSA_NAME_DEF_STMT (var); > } > > - if (prev_stmt_info == NULL) > + if (prev_stmt_info == NULL_STMT_VEC_INFO) > STMT_VINFO_VEC_STMT (stmt_info) = *vec_stmt = new_stmt; > else > STMT_VINFO_RELATED_STMT (prev_stmt_info) = new_stmt; > @@ -6550,7 +6550,7 @@ vectorizable_store (gimple *stmt, gimple > > vect_finish_stmt_generation (stmt, new_stmt, gsi); > > - if (prev_stmt_info == NULL) > + if (prev_stmt_info == NULL_STMT_VEC_INFO) > STMT_VINFO_VEC_STMT (stmt_info) = *vec_stmt = new_stmt; > else > STMT_VINFO_RELATED_STMT (prev_stmt_info) = new_stmt; > @@ -9805,7 +9805,7 @@ vect_remove_stores (gimple *first_stmt) > new_stmt_vec_info (gimple *stmt, vec_info *vinfo) > { > stmt_vec_info res; > - res = (stmt_vec_info) xcalloc (1, sizeof (struct _stmt_vec_info)); > + res = (_stmt_vec_info *) xcalloc (1, sizeof (struct _stmt_vec_info)); > > STMT_VINFO_TYPE (res) = undef_vec_info_type; > STMT_VINFO_STMT (res) = stmt; > @@ -9862,7 +9862,7 @@ free_stmt_vec_infos (vec<stmt_vec_info> > unsigned int i; > stmt_vec_info info; > FOR_EACH_VEC_ELT (*v, i, info) > - if (info != NULL) > + if (info != NULL_STMT_VEC_INFO) > free_stmt_vec_info (STMT_VINFO_STMT (info)); > if (v == stmt_vec_info_vec) > stmt_vec_info_vec = NULL;