On Fri, May 6, 2011 at 10:24 PM, Jan Hubicka <hubi...@ucw.cz> wrote: > Hi, > while looking at type merging code I noticed that type pairs can be managed > to be ordered by their UIDs. This save some of hashing overhead in one of > most intensively querried hashes. > > Also gimple_lookup_type_leader is hot function that is better to be inlined. > > I also wonder, why unionfind algorithm is not used here to maintain the > positive answers?
Can you elaborate? > Bootstrapped/regtested x86_64-linux, OK? Ok. Thanks, Richard. > Honza > > * gimple.c (type_pair_hash, type_pair_eq, lookup_type_pair): > Arrange type pairs to be UID ordered. > (gimple_lookup_type_leader): Make inline. > Index: gimple.c > =================================================================== > --- gimple.c (revision 173506) > +++ gimple.c (working copy) > @@ -3240,8 +3240,7 @@ type_pair_hash (const void *p) > const struct type_pair_d *pair = (const struct type_pair_d *) p; > hashval_t val1 = pair->uid1; > hashval_t val2 = pair->uid2; > - return (iterative_hash_hashval_t (val2, val1) > - ^ iterative_hash_hashval_t (val1, val2)); > + return iterative_hash_hashval_t (val1, val2); > } > > /* Compare two type pairs pointed-to by P1 and P2. */ > @@ -3251,8 +3250,7 @@ type_pair_eq (const void *p1, const void > { > const struct type_pair_d *pair1 = (const struct type_pair_d *) p1; > const struct type_pair_d *pair2 = (const struct type_pair_d *) p2; > - return ((pair1->uid1 == pair2->uid1 && pair1->uid2 == pair2->uid2) > - || (pair1->uid1 == pair2->uid2 && pair1->uid2 == pair2->uid1)); > + return (pair1->uid1 == pair2->uid1 && pair1->uid2 == pair2->uid2); > } > > /* Lookup the pair of types T1 and T2 in *VISITED_P. Insert a new > @@ -3271,8 +3269,16 @@ lookup_type_pair (tree t1, tree t2, htab > gcc_obstack_init (ob_p); > } > > - pair.uid1 = TYPE_UID (t1); > - pair.uid2 = TYPE_UID (t2); > + if (TYPE_UID (t1) < TYPE_UID (t2)) > + { > + pair.uid1 = TYPE_UID (t1); > + pair.uid2 = TYPE_UID (t2); > + } > + else > + { > + pair.uid1 = TYPE_UID (t2); > + pair.uid2 = TYPE_UID (t1); > + } > slot = htab_find_slot (*visited_p, &pair, INSERT); > > if (*slot) > @@ -3280,8 +3286,8 @@ lookup_type_pair (tree t1, tree t2, htab > else > { > p = XOBNEW (ob_p, struct type_pair_d); > - p->uid1 = TYPE_UID (t1); > - p->uid2 = TYPE_UID (t2); > + p->uid1 = pair.uid1; > + p->uid2 = pair.uid2; > p->same_p[0] = -2; > p->same_p[1] = -2; > *slot = (void *) p; > @@ -3324,7 +3330,7 @@ static GTY((deletable, length("GIMPLE_TY > /* Lookup an existing leader for T and return it or NULL_TREE, if > there is none in the cache. */ > > -static tree > +static inline tree > gimple_lookup_type_leader (tree t) > { > gimple_type_leader_entry *leader; >