aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vectorizer.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-vectorizer.c')
-rw-r--r--gcc/tree-vectorizer.c54
1 files changed, 40 insertions, 14 deletions
diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c
index 1c487e6..41f5365 100644
--- a/gcc/tree-vectorizer.c
+++ b/gcc/tree-vectorizer.c
@@ -450,10 +450,10 @@ shrink_simd_arrays
/* Initialize the vec_info with kind KIND_IN and target cost data
TARGET_COST_DATA_IN. */
-vec_info::vec_info (vec_info::vec_kind kind_in, void *target_cost_data_in)
+vec_info::vec_info (vec_info::vec_kind kind_in, void *target_cost_data_in,
+ vec_info_shared *shared_)
: kind (kind_in),
- datarefs (vNULL),
- ddrs (vNULL),
+ shared (shared_),
target_cost_data (target_cost_data_in)
{
stmt_vec_infos.create (50);
@@ -463,25 +463,50 @@ vec_info::vec_info (vec_info::vec_kind kind_in, void *target_cost_data_in)
vec_info::~vec_info ()
{
slp_instance instance;
- struct data_reference *dr;
unsigned int i;
- FOR_EACH_VEC_ELT (datarefs, i, dr)
- if (dr->aux)
- {
- free (dr->aux);
- dr->aux = NULL;
- }
-
FOR_EACH_VEC_ELT (slp_instances, i, instance)
vect_free_slp_instance (instance);
- free_data_refs (datarefs);
- free_dependence_relations (ddrs);
destroy_cost_data (target_cost_data);
free_stmt_vec_infos (&stmt_vec_infos);
}
+vec_info_shared::vec_info_shared ()
+ : datarefs (vNULL),
+ datarefs_copy (vNULL),
+ ddrs (vNULL)
+{
+}
+
+vec_info_shared::~vec_info_shared ()
+{
+ free_data_refs (datarefs);
+ free_dependence_relations (ddrs);
+ datarefs_copy.release ();
+}
+
+void
+vec_info_shared::save_datarefs ()
+{
+ if (!flag_checking)
+ return;
+ datarefs_copy.reserve_exact (datarefs.length ());
+ for (unsigned i = 0; i < datarefs.length (); ++i)
+ datarefs_copy.quick_push (*datarefs[i]);
+}
+
+void
+vec_info_shared::check_datarefs ()
+{
+ if (!flag_checking)
+ return;
+ gcc_assert (datarefs.length () == datarefs_copy.length ());
+ for (unsigned i = 0; i < datarefs.length (); ++i)
+ if (memcmp (&datarefs_copy[i], datarefs[i], sizeof (data_reference)) != 0)
+ gcc_unreachable ();
+}
+
/* A helper function to free scev and LOOP niter information, as well as
clear loop constraint LOOP_C_FINITE. */
@@ -669,6 +694,7 @@ try_vectorize_loop_1 (hash_table<simduid_to_vf> *&simduid_to_vf_htab,
gimple *loop_dist_alias_call)
{
unsigned ret = 0;
+ vec_info_shared shared;
vect_location = find_loop_location (loop);
if (LOCATION_LOCUS (vect_location) != UNKNOWN_LOCATION
&& dump_enabled_p ())
@@ -676,7 +702,7 @@ try_vectorize_loop_1 (hash_table<simduid_to_vf> *&simduid_to_vf_htab,
LOCATION_FILE (vect_location),
LOCATION_LINE (vect_location));
- loop_vec_info loop_vinfo = vect_analyze_loop (loop, orig_loop_vinfo);
+ loop_vec_info loop_vinfo = vect_analyze_loop (loop, orig_loop_vinfo, &shared);
loop->aux = loop_vinfo;
if (!loop_vinfo || !LOOP_VINFO_VECTORIZABLE_P (loop_vinfo))