This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [10/46] Temporarily make stmt_vec_info a class
- 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: Wed, 25 Jul 2018 11:14:01 +0200
- Subject: Re: [10/46] Temporarily make stmt_vec_info a class
- References: <87wotlrmen.fsf@arm.com> <87pnzdq7mf.fsf@arm.com>
On Tue, Jul 24, 2018 at 11:57 AM Richard Sandiford
<richard.sandiford@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.sandiford@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;