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

Reply via email to