diff mbox series

[44/46] Remove global vinfo_for_stmt-related routines

Message ID 87muuhkkq3.fsf@arm.com
State New
Headers show
Series Remove vinfo_for_stmt etc. | expand

Commit Message

Richard Sandiford July 24, 2018, 10:10 a.m. UTC
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-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.

Comments

Richard Biener July 31, 2018, 12:05 p.m. UTC | #1
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
diff mbox series

Patch

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