diff options
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; |