aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-05-29 11:49:44 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-05-29 11:49:44 +0000
commitf8c0baaf31ac987bd1e85a3ba2fa8a2edeff92a8 (patch)
treefd063fc6faee62c11cf26bbb7454f96ed1214453 /gcc
parent092cb01cbf25e1c19d0b86bfac6dc4404c14a7dd (diff)
downloadgcc-f8c0baaf31ac987bd1e85a3ba2fa8a2edeff92a8.zip
gcc-f8c0baaf31ac987bd1e85a3ba2fa8a2edeff92a8.tar.gz
gcc-f8c0baaf31ac987bd1e85a3ba2fa8a2edeff92a8.tar.bz2
tree-vectorizer.h (struct vec_info): Add stmt_vec_infos member.
2018-05-29 Richard Biener <rguenther@suse.de> * tree-vectorizer.h (struct vec_info): Add stmt_vec_infos member. (stmt_vec_info_vec): Make pointer. (init_stmt_vec_info_vec): Remove. (free_stmt_vec_info_vec): Likewise. (set_stmt_vec_info_vec): New function. (free_stmt_vec_infos): Likewise. (vinfo_for_stmt): Adjust for stmt_vec_info_vec indirection. (set_vinfo_for_stmt): Likewise. (get_earlier_stmt): Likewise. (get_later_stmt): Likewise. * tree-vectorizer.c (stmt_vec_info_vec): Make pointer. (vec_info::vec_info): Allocate stmt_vec_infos and set the global. (vec_info::~vec_info): Free stmt_vec_infos. (vectorize_loops): Set the global stmt_vec_info_vec to NULL. Remove old init_stmt_vec_info_vec/free_stmt_vec_info_vec calls. (pass_slp_vectorize::execute): Likewise. * tree-vect-stmts.c (init_stmt_vec_info_vec): Remove. (free_stmt_vec_info_vec): Likewise. (set_stmt_vec_info_vec): New function. (free_stmt_vec_infos): Likewise. * tree-vect-loop.c (_loop_vec_info::~_loop_vec_info): Set the global stmt_vec_info_vec. * tree-parloops.c (gather_scalar_reductions): Use set_stmt_vec_info_vec/free_stmt_vec_infos and maintain a local vector. From-SVN: r260892
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog29
-rw-r--r--gcc/tree-parloops.c7
-rw-r--r--gcc/tree-vect-loop.c2
-rw-r--r--gcc/tree-vect-stmts.c19
-rw-r--r--gcc/tree-vectorizer.c13
-rw-r--r--gcc/tree-vectorizer.h25
6 files changed, 63 insertions, 32 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f5c2cc1..d2d02b2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,34 @@
2018-05-29 Richard Biener <rguenther@suse.de>
+ * tree-vectorizer.h (struct vec_info): Add stmt_vec_infos
+ member.
+ (stmt_vec_info_vec): Make pointer.
+ (init_stmt_vec_info_vec): Remove.
+ (free_stmt_vec_info_vec): Likewise.
+ (set_stmt_vec_info_vec): New function.
+ (free_stmt_vec_infos): Likewise.
+ (vinfo_for_stmt): Adjust for stmt_vec_info_vec indirection.
+ (set_vinfo_for_stmt): Likewise.
+ (get_earlier_stmt): Likewise.
+ (get_later_stmt): Likewise.
+ * tree-vectorizer.c (stmt_vec_info_vec): Make pointer.
+ (vec_info::vec_info): Allocate stmt_vec_infos and set the global.
+ (vec_info::~vec_info): Free stmt_vec_infos.
+ (vectorize_loops): Set the global stmt_vec_info_vec to NULL.
+ Remove old init_stmt_vec_info_vec/free_stmt_vec_info_vec calls.
+ (pass_slp_vectorize::execute): Likewise.
+ * tree-vect-stmts.c (init_stmt_vec_info_vec): Remove.
+ (free_stmt_vec_info_vec): Likewise.
+ (set_stmt_vec_info_vec): New function.
+ (free_stmt_vec_infos): Likewise.
+ * tree-vect-loop.c (_loop_vec_info::~_loop_vec_info): Set
+ the global stmt_vec_info_vec.
+ * tree-parloops.c (gather_scalar_reductions): Use
+ set_stmt_vec_info_vec/free_stmt_vec_infos and maintain a local
+ vector.
+
+2018-05-29 Richard Biener <rguenther@suse.de>
+
* dominance.c (iterate_fix_dominators): Push/pop TV_DOMINANCE.
2018-05-29 Martin Liska <mliska@suse.cz>
diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c
index 3a788cc..aa74427 100644
--- a/gcc/tree-parloops.c
+++ b/gcc/tree-parloops.c
@@ -2593,8 +2593,9 @@ gather_scalar_reductions (loop_p loop, reduction_info_table_type *reduction_list
auto_vec<gphi *, 4> double_reduc_phis;
auto_vec<gimple *, 4> double_reduc_stmts;
- if (!stmt_vec_info_vec.exists ())
- init_stmt_vec_info_vec ();
+ vec<stmt_vec_info> stmt_vec_infos;
+ stmt_vec_infos.create (50);
+ set_stmt_vec_info_vec (&stmt_vec_infos);
simple_loop_info = vect_analyze_loop_form (loop);
if (simple_loop_info == NULL)
@@ -2674,7 +2675,7 @@ gather_scalar_reductions (loop_p loop, reduction_info_table_type *reduction_list
gather_done:
/* Release the claim on gimple_uid. */
- free_stmt_vec_info_vec ();
+ free_stmt_vec_infos (&stmt_vec_infos);
if (reduction_list->elements () == 0)
return;
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index c49e1c5..9424b52 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -894,6 +894,8 @@ _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++)
{
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 66c78de..759ea23 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -9862,28 +9862,27 @@ new_stmt_vec_info (gimple *stmt, vec_info *vinfo)
}
-/* Create a hash table for stmt_vec_info. */
+/* Set the current stmt_vec_info vector to V. */
void
-init_stmt_vec_info_vec (void)
+set_stmt_vec_info_vec (vec<stmt_vec_info> *v)
{
- gcc_assert (!stmt_vec_info_vec.exists ());
- stmt_vec_info_vec.create (50);
+ stmt_vec_info_vec = v;
}
-
-/* Free hash table for stmt_vec_info. */
+/* Free the stmt_vec_info entries in V and release V. */
void
-free_stmt_vec_info_vec (void)
+free_stmt_vec_infos (vec<stmt_vec_info> *v)
{
unsigned int i;
stmt_vec_info info;
- FOR_EACH_VEC_ELT (stmt_vec_info_vec, i, info)
+ FOR_EACH_VEC_ELT (*v, i, info)
if (info != NULL)
free_stmt_vec_info (STMT_VINFO_STMT (info));
- gcc_assert (stmt_vec_info_vec.exists ());
- stmt_vec_info_vec.release ();
+ if (v == stmt_vec_info_vec)
+ stmt_vec_info_vec = NULL;
+ v->release ();
}
diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c
index 86cd025..8ff90b3 100644
--- a/gcc/tree-vectorizer.c
+++ b/gcc/tree-vectorizer.c
@@ -85,7 +85,7 @@ along with GCC; see the file COPYING3. If not see
source_location vect_location;
/* Vector mapping GIMPLE stmt to stmt_vec_info. */
-vec<stmt_vec_info> stmt_vec_info_vec;
+vec<stmt_vec_info> *stmt_vec_info_vec;
/* Dump a cost entry according to args to F. */
@@ -456,6 +456,8 @@ vec_info::vec_info (vec_info::vec_kind kind_in, void *target_cost_data_in)
ddrs (vNULL),
target_cost_data (target_cost_data_in)
{
+ stmt_vec_infos.create (50);
+ set_stmt_vec_info_vec (&stmt_vec_infos);
}
vec_info::~vec_info ()
@@ -477,6 +479,7 @@ vec_info::~vec_info ()
free_data_refs (datarefs);
free_dependence_relations (ddrs);
destroy_cost_data (target_cost_data);
+ free_stmt_vec_infos (&stmt_vec_infos);
}
/* A helper function to free scev and LOOP niter information, as well as
@@ -682,7 +685,7 @@ vectorize_loops (void)
if (cfun->has_simduid_loops)
note_simd_array_uses (&simd_array_to_simduid_htab);
- init_stmt_vec_info_vec ();
+ set_stmt_vec_info_vec (NULL);
/* ----------- Analyze loops. ----------- */
@@ -923,8 +926,6 @@ vectorize_loops (void)
loop->aux = NULL;
}
- free_stmt_vec_info_vec ();
-
/* Fold IFN_GOMP_SIMD_{VF,LANE,LAST_LANE,ORDERED_{START,END}} builtins. */
if (cfun->has_simduid_loops)
adjust_simduid_builtins (simduid_to_vf_htab);
@@ -1062,8 +1063,6 @@ pass_slp_vectorize::execute (function *fun)
}
}
- init_stmt_vec_info_vec ();
-
FOR_EACH_BB_FN (bb, fun)
{
if (vect_slp_bb (bb))
@@ -1071,8 +1070,6 @@ pass_slp_vectorize::execute (function *fun)
"basic block vectorized\n");
}
- free_stmt_vec_info_vec ();
-
if (!in_loop_pipeline)
{
scev_finalize ();
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index ef8b695..f764634 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -197,6 +197,9 @@ struct vec_info {
/* The type of vectorization. */
vec_kind kind;
+ /* The mapping of GIMPLE UID to stmt_vec_info. */
+ vec<struct _stmt_vec_info *> stmt_vec_infos;
+
/* All SLP instances. */
auto_vec<slp_instance> slp_instances;
@@ -1009,10 +1012,10 @@ struct dataref_aux {
&& TYPE_PRECISION (TYPE) == 1 \
&& TYPE_UNSIGNED (TYPE)))
-extern vec<stmt_vec_info> stmt_vec_info_vec;
+extern vec<stmt_vec_info> *stmt_vec_info_vec;
-void init_stmt_vec_info_vec (void);
-void free_stmt_vec_info_vec (void);
+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. */
@@ -1023,7 +1026,7 @@ vinfo_for_stmt (gimple *stmt)
if (uid <= 0)
return NULL;
- return stmt_vec_info_vec[uid - 1];
+ return (*stmt_vec_info_vec)[uid - 1];
}
/* Set vectorizer information INFO for STMT. */
@@ -1035,14 +1038,14 @@ set_vinfo_for_stmt (gimple *stmt, stmt_vec_info info)
if (uid == 0)
{
gcc_checking_assert (info);
- uid = stmt_vec_info_vec.length () + 1;
+ uid = stmt_vec_info_vec->length () + 1;
gimple_set_uid (stmt, uid);
- stmt_vec_info_vec.safe_push (info);
+ stmt_vec_info_vec->safe_push (info);
}
else
{
gcc_checking_assert (info == NULL);
- stmt_vec_info_vec[uid - 1] = info;
+ (*stmt_vec_info_vec)[uid - 1] = info;
}
}
@@ -1065,8 +1068,8 @@ get_earlier_stmt (gimple *stmt1, gimple *stmt2)
if (uid1 == 0 || uid2 == 0)
return NULL;
- gcc_checking_assert (uid1 <= stmt_vec_info_vec.length ()
- && uid2 <= stmt_vec_info_vec.length ());
+ gcc_checking_assert (uid1 <= stmt_vec_info_vec->length ()
+ && uid2 <= stmt_vec_info_vec->length ());
if (uid1 < uid2)
return stmt1;
@@ -1093,8 +1096,8 @@ get_later_stmt (gimple *stmt1, gimple *stmt2)
if (uid1 == 0 || uid2 == 0)
return NULL;
- gcc_assert (uid1 <= stmt_vec_info_vec.length ());
- gcc_assert (uid2 <= stmt_vec_info_vec.length ());
+ gcc_assert (uid1 <= stmt_vec_info_vec->length ());
+ gcc_assert (uid2 <= stmt_vec_info_vec->length ());
if (uid1 > uid2)
return stmt1;