On Mon, Dec 17, 2012 at 8:36 PM, Lawrence Crowl <cr...@googlers.com> wrote: > Change tree-ssa-coalesce.c'coalesce_list_d.list from htab_t to hash_table. > > Fold coalesce_pair_map_hash and coalesce_pair_map_eq into new > struct coalesce_pair_hasher. > > Removed struct coalesce_pair_iterator, as did not meet the hash_table > iterator interface and it provided no significant code reduction. > > Tested on x86-64. > > Okay for branch? > > > Index: gcc/tree-ssa-coalesce.c > =================================================================== > --- gcc/tree-ssa-coalesce.c (revision 194549) > +++ gcc/tree-ssa-coalesce.c (working copy) > @@ -50,6 +50,41 @@ typedef struct coalesce_pair > } * coalesce_pair_p; > typedef const struct coalesce_pair *const_coalesce_pair_p; > > +/* Coalesce pair hashtable helpers. */ > + > +struct coalesce_pair_hasher : typed_noop_remove <coalesce_pair> > +{ > + typedef coalesce_pair value_type; > + typedef coalesce_pair compare_type; > + static inline hashval_t hash (const value_type *); > + static inline bool equal (const value_type *, const compare_type *); > +}; > + > +/* Hash function for coalesce list. Calculate hash for PAIR. */ > + > +inline hashval_t > +coalesce_pair_hasher::hash (const value_type *pair) > +{ > + hashval_t a = (hashval_t)(pair->first_element); > + hashval_t b = (hashval_t)(pair->second_element); > + > + return b * (b - 1) / 2 + a; > +} > + > +/* Equality function for coalesce list hash table. Compare PAIR1 and PAIR2, > + returning TRUE if the two pairs are equivalent. */ > + > +inline bool > +coalesce_pair_hasher::equal (const value_type *p1, const compare_type *p2) > +{ > + return (p1->first_element == p2->first_element > + && p1->second_element == p2->second_element); > +} > + > +typedef hash_table <coalesce_pair_hasher> coalesce_table_type; > +typedef coalesce_table_type::iterator coalesce_iterator_type; > + > + > typedef struct cost_one_pair_d > { > int first_element; > @@ -61,7 +96,7 @@ typedef struct cost_one_pair_d > > typedef struct coalesce_list_d > { > - htab_t list; /* Hash table. */ > + coalesce_table_type list; /* Hash table. */ > coalesce_pair_p *sorted; /* List when sorted. */ > int num_sorted; /* Number in the sorted list. */ > cost_one_pair_p cost_one_list;/* Single use coalesces with cost 1. */ > @@ -186,34 +221,6 @@ pop_best_coalesce (coalesce_list_p cl, i > } > > > -#define COALESCE_HASH_FN(R1, R2) ((R2) * ((R2) - 1) / 2 + (R1)) > - > -/* Hash function for coalesce list. Calculate hash for PAIR. */ > - > -static unsigned int > -coalesce_pair_map_hash (const void *pair) > -{ > - hashval_t a = (hashval_t)(((const_coalesce_pair_p)pair)->first_element); > - hashval_t b = (hashval_t)(((const_coalesce_pair_p)pair)->second_element); > - > - return COALESCE_HASH_FN (a,b); > -} > - > - > -/* Equality function for coalesce list hash table. Compare PAIR1 and PAIR2, > - returning TRUE if the two pairs are equivalent. */ > - > -static int > -coalesce_pair_map_eq (const void *pair1, const void *pair2) > -{ > - const_coalesce_pair_p const p1 = (const_coalesce_pair_p) pair1; > - const_coalesce_pair_p const p2 = (const_coalesce_pair_p) pair2; > - > - return (p1->first_element == p2->first_element > - && p1->second_element == p2->second_element); > -} > - > - > /* Create a new empty coalesce list object and return it. */ > > static inline coalesce_list_p > @@ -226,8 +233,7 @@ create_coalesce_list (void) > size = 40; > > list = (coalesce_list_p) xmalloc (sizeof (struct coalesce_list_d)); > - list->list = htab_create (size, coalesce_pair_map_hash, > - coalesce_pair_map_eq, NULL); > + list->list.create (size); > list->sorted = NULL; > list->num_sorted = 0; > list->cost_one_list = NULL; > @@ -241,7 +247,7 @@ static inline void > delete_coalesce_list (coalesce_list_p cl) > { > gcc_assert (cl->cost_one_list == NULL); > - htab_delete (cl->list); > + cl->list.dispose (); > free (cl->sorted); > gcc_assert (cl->num_sorted == 0); > free (cl); > @@ -256,7 +262,7 @@ static coalesce_pair_p > find_coalesce_pair (coalesce_list_p cl, int p1, int p2, bool create) > { > struct coalesce_pair p; > - void **slot; > + coalesce_pair **slot; > unsigned int hash; > > /* Normalize so that p1 is the smaller value. */ > @@ -271,9 +277,8 @@ find_coalesce_pair (coalesce_list_p cl, > p.second_element = p2; > } > > - hash = coalesce_pair_map_hash (&p); > - slot = htab_find_slot_with_hash (cl->list, &p, hash, > - create ? INSERT : NO_INSERT); > + hash = coalesce_pair_hasher::hash (&p); > + slot = cl->list.find_slot_with_hash (&p, hash, create ? INSERT : > NO_INSERT); > if (!slot) > return NULL; > > @@ -284,7 +289,7 @@ find_coalesce_pair (coalesce_list_p cl, > pair->first_element = p.first_element; > pair->second_element = p.second_element; > pair->cost = 0; > - *slot = (void *)pair; > + *slot = pair; > } > > return (struct coalesce_pair *) *slot; > @@ -356,58 +361,10 @@ compare_pairs (const void *p1, const voi > static inline int > num_coalesce_pairs (coalesce_list_p cl) > { > - return htab_elements (cl->list); > -} > - > - > -/* Iterator over hash table pairs. */ > -typedef struct > -{ > - htab_iterator hti; > -} coalesce_pair_iterator; > - > - > -/* Return first partition pair from list CL, initializing iterator ITER. */ > - > -static inline coalesce_pair_p > -first_coalesce_pair (coalesce_list_p cl, coalesce_pair_iterator *iter) > -{ > - coalesce_pair_p pair; > - > - pair = (coalesce_pair_p) first_htab_element (&(iter->hti), cl->list); > - return pair; > -} > - > - > -/* Return TRUE if there are no more partitions in for ITER to process. */ > - > -static inline bool > -end_coalesce_pair_p (coalesce_pair_iterator *iter) > -{ > - return end_htab_p (&(iter->hti)); > -} > - > - > -/* Return the next partition pair to be visited by ITER. */ > - > -static inline coalesce_pair_p > -next_coalesce_pair (coalesce_pair_iterator *iter) > -{ > - coalesce_pair_p pair; > - > - pair = (coalesce_pair_p) next_htab_element (&(iter->hti)); > - return pair; > + return cl->list.elements (); > } > > > -/* Iterate over CL using ITER, returning values in PAIR. */ > - > -#define FOR_EACH_PARTITION_PAIR(PAIR, ITER, CL) \ > - for ((PAIR) = first_coalesce_pair ((CL), &(ITER)); \ > - !end_coalesce_pair_p (&(ITER)); \ > - (PAIR) = next_coalesce_pair (&(ITER))) > - > - > /* Prepare CL for removal of preferred pairs. When finished they are sorted > in order from most important coalesce to least important. */ > > @@ -416,7 +373,7 @@ sort_coalesce_list (coalesce_list_p cl) > { > unsigned x, num; > coalesce_pair_p p; > - coalesce_pair_iterator ppi; > + coalesce_iterator_type ppi; > > gcc_assert (cl->sorted == NULL); > > @@ -430,7 +387,7 @@ sort_coalesce_list (coalesce_list_p cl) > > /* Populate the vector with pointers to the pairs. */ > x = 0; > - FOR_EACH_PARTITION_PAIR (p, ppi, cl) > + FOR_EACH_HASH_TABLE_ELEMENT (cl->list, p, coalesce_pair_p, ppi)
That's surely less descriptive than before. Just to point out a case where my bad feelings about these mechanical changes have a reason. Richard. > cl->sorted[x++] = p; > gcc_assert (x == num); > > @@ -462,14 +419,15 @@ static void > dump_coalesce_list (FILE *f, coalesce_list_p cl) > { > coalesce_pair_p node; > - coalesce_pair_iterator ppi; > + coalesce_iterator_type ppi; > + > int x; > tree var; > > if (cl->sorted == NULL) > { > fprintf (f, "Coalesce List:\n"); > - FOR_EACH_PARTITION_PAIR (node, ppi, cl) > + FOR_EACH_HASH_TABLE_ELEMENT (cl->list, node, coalesce_pair_p, ppi) > { > tree var1 = ssa_name (node->first_element); > tree var2 = ssa_name (node->second_element); > > -- > Lawrence Crowl