This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [10/46] Temporarily make stmt_vec_info a class


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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]