diff options
author | Richard Biener <rguenther@suse.de> | 2015-10-13 08:39:41 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-10-13 08:39:41 +0000 |
commit | b939ea86b96fcff3f4fe61ad794858ddae553563 (patch) | |
tree | 729ac9ed62a9b2397629cfbe0dfe7004f66eaabf /gcc/tree-vect-data-refs.c | |
parent | 9b054b08813d37586d6765fd087b0fc85dc94daf (diff) | |
download | gcc-b939ea86b96fcff3f4fe61ad794858ddae553563.zip gcc-b939ea86b96fcff3f4fe61ad794858ddae553563.tar.gz gcc-b939ea86b96fcff3f4fe61ad794858ddae553563.tar.bz2 |
tree-vect-data-refs.c (vect_analyze_data_ref_dependences): Allocate the data dependence vector.
2015-10-13 Richard Biener <rguenther@suse.de>
* tree-vect-data-refs.c (vect_analyze_data_ref_dependences): Allocate
the data dependence vector.
(vect_peeling_hash_insert): Get the peeling hash table as argument.
(vect_peeling_hash_get_lowest_cost): Likewise.
(vect_enhance_data_refs_alignment): Adjust.
(struct _vect_peel_info, struct _vect_peel_extended_info,
struct peel_info_hasher): Move from ...
* tree-vectorizer.h: ... here.
(LOOP_VINFO_COST_MODEL_MIN_ITERS): Remove.
(LOOP_VINFO_PEELING_HTAB): Likewise.
(struct _loop_vec_info): Remove min_profitable_iters and
peeling_htab members.
* tree-vect-loop.c (new_loop_vec_info): Do not allocate vectors
here.
(destroy_loop_vec_info): Adjust.
(vect_analyze_loop_2): Do not set LOOP_VINFO_COST_MODEL_MIN_ITERS.
(vect_estimate_min_profitable_iters): Use LOOP_VINFO_COMP_ALIAS_DDRS
to estimate alias versioning cost.
* tree-vect-slp.c (vect_analyze_slp_cost): Dump header.
From-SVN: r228751
Diffstat (limited to 'gcc/tree-vect-data-refs.c')
-rw-r--r-- | gcc/tree-vect-data-refs.c | 72 |
1 files changed, 55 insertions, 17 deletions
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index e653c68..8a4d489 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -468,6 +468,9 @@ vect_analyze_data_ref_dependences (loop_vec_info loop_vinfo, int *max_vf) dump_printf_loc (MSG_NOTE, vect_location, "=== vect_analyze_data_ref_dependences ===\n"); + LOOP_VINFO_DDRS (loop_vinfo) + .create (LOOP_VINFO_DATAREFS (loop_vinfo).length () + * LOOP_VINFO_DATAREFS (loop_vinfo).length ()); LOOP_VINFO_NO_DATA_DEPENDENCIES (loop_vinfo) = true; if (!compute_all_dependences (LOOP_VINFO_DATAREFS (loop_vinfo), &LOOP_VINFO_DDRS (loop_vinfo), @@ -1039,10 +1042,48 @@ vect_get_data_access_cost (struct data_reference *dr, } +typedef struct _vect_peel_info +{ + int npeel; + struct data_reference *dr; + unsigned int count; +} *vect_peel_info; + +typedef struct _vect_peel_extended_info +{ + struct _vect_peel_info peel_info; + unsigned int inside_cost; + unsigned int outside_cost; + stmt_vector_for_cost body_cost_vec; +} *vect_peel_extended_info; + + +/* Peeling hashtable helpers. */ + +struct peel_info_hasher : free_ptr_hash <_vect_peel_info> +{ + static inline hashval_t hash (const _vect_peel_info *); + static inline bool equal (const _vect_peel_info *, const _vect_peel_info *); +}; + +inline hashval_t +peel_info_hasher::hash (const _vect_peel_info *peel_info) +{ + return (hashval_t) peel_info->npeel; +} + +inline bool +peel_info_hasher::equal (const _vect_peel_info *a, const _vect_peel_info *b) +{ + return (a->npeel == b->npeel); +} + + /* Insert DR into peeling hash table with NPEEL as key. */ static void -vect_peeling_hash_insert (loop_vec_info loop_vinfo, struct data_reference *dr, +vect_peeling_hash_insert (hash_table<peel_info_hasher> *peeling_htab, + loop_vec_info loop_vinfo, struct data_reference *dr, int npeel) { struct _vect_peel_info elem, *slot; @@ -1050,7 +1091,7 @@ vect_peeling_hash_insert (loop_vec_info loop_vinfo, struct data_reference *dr, bool supportable_dr_alignment = vect_supportable_dr_alignment (dr, true); elem.npeel = npeel; - slot = LOOP_VINFO_PEELING_HTAB (loop_vinfo)->find (&elem); + slot = peeling_htab->find (&elem); if (slot) slot->count++; else @@ -1059,8 +1100,7 @@ vect_peeling_hash_insert (loop_vec_info loop_vinfo, struct data_reference *dr, slot->npeel = npeel; slot->dr = dr; slot->count = 1; - new_slot - = LOOP_VINFO_PEELING_HTAB (loop_vinfo)->find_slot (slot, INSERT); + new_slot = peeling_htab->find_slot (slot, INSERT); *new_slot = slot; } @@ -1164,7 +1204,8 @@ vect_peeling_hash_get_lowest_cost (_vect_peel_info **slot, option that aligns as many accesses as possible. */ static struct data_reference * -vect_peeling_hash_choose_best_peeling (loop_vec_info loop_vinfo, +vect_peeling_hash_choose_best_peeling (hash_table<peel_info_hasher> *peeling_htab, + loop_vec_info loop_vinfo, unsigned int *npeel, stmt_vector_for_cost *body_cost_vec) { @@ -1177,16 +1218,14 @@ vect_peeling_hash_choose_best_peeling (loop_vec_info loop_vinfo, { res.inside_cost = INT_MAX; res.outside_cost = INT_MAX; - LOOP_VINFO_PEELING_HTAB (loop_vinfo) - ->traverse <_vect_peel_extended_info *, - vect_peeling_hash_get_lowest_cost> (&res); + peeling_htab->traverse <_vect_peel_extended_info *, + vect_peeling_hash_get_lowest_cost> (&res); } else { res.peel_info.count = 0; - LOOP_VINFO_PEELING_HTAB (loop_vinfo) - ->traverse <_vect_peel_extended_info *, - vect_peeling_hash_get_most_frequent> (&res); + peeling_htab->traverse <_vect_peel_extended_info *, + vect_peeling_hash_get_most_frequent> (&res); } *npeel = res.peel_info.npeel; @@ -1307,6 +1346,7 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo) tree vectype; unsigned int nelements, mis, same_align_drs_max = 0; stmt_vector_for_cost body_cost_vec = stmt_vector_for_cost (); + hash_table<peel_info_hasher> peeling_htab (1); if (dump_enabled_p ()) dump_printf_loc (MSG_NOTE, vect_location, @@ -1379,10 +1419,6 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo) size_zero_node) < 0; /* Save info about DR in the hash table. */ - if (!LOOP_VINFO_PEELING_HTAB (loop_vinfo)) - LOOP_VINFO_PEELING_HTAB (loop_vinfo) - = new hash_table<peel_info_hasher> (1); - vectype = STMT_VINFO_VECTYPE (stmt_info); nelements = TYPE_VECTOR_SUBPARTS (vectype); mis = DR_MISALIGNMENT (dr) / GET_MODE_SIZE (TYPE_MODE ( @@ -1424,7 +1460,8 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo) for (j = 0; j < possible_npeel_number; j++) { - vect_peeling_hash_insert (loop_vinfo, dr, npeel_tmp); + vect_peeling_hash_insert (&peeling_htab, loop_vinfo, + dr, npeel_tmp); npeel_tmp += nelements; } @@ -1590,7 +1627,8 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo) gcc_assert (!all_misalignments_unknown); /* Choose the best peeling from the hash table. */ - dr0 = vect_peeling_hash_choose_best_peeling (loop_vinfo, &npeel, + dr0 = vect_peeling_hash_choose_best_peeling (&peeling_htab, + loop_vinfo, &npeel, &body_cost_vec); if (!dr0 || !npeel) do_peeling = false; |