2011-08-22  Dimitrios Apostolou  <ji...@gmx.net>

        * emit-rtl.c (mem_attrs_htab_hash): Hash massively by calling
        iterative_hash(). We disregard the offset,size rtx fields of the
        mem_attrs struct, but overall this hash is a *huge* improvement to
        the previous one, it reduces the collisions/searches ratio from 8
        to 0.8 for some cases.
        (init_emit_once): Slightly increase the mem_attrs_htab initial
        size because it's frequently used and expanded many times.
=== modified file 'gcc/emit-rtl.c'
--- gcc/emit-rtl.c      2011-05-29 17:40:05 +0000
+++ gcc/emit-rtl.c      2011-08-21 04:44:25 +0000
@@ -256,11 +256,10 @@ mem_attrs_htab_hash (const void *x)
 {
   const mem_attrs *const p = (const mem_attrs *) x;
 
-  return (p->alias ^ (p->align * 1000)
-         ^ (p->addrspace * 4000)
-         ^ ((p->offset ? INTVAL (p->offset) : 0) * 50000)
-         ^ ((p->size ? INTVAL (p->size) : 0) * 2500000)
-         ^ (size_t) iterative_hash_expr (p->expr, 0));
+  /* By massively feeding the mem_attrs struct to iterative_hash() we
+     disregard the p->offset and p->size rtx, but in total the hash is
+     quick and good enough. */
+  return iterative_hash_object (*p, iterative_hash_expr (p->expr, 0));
 }
 
 /* Returns nonzero if the value represented by X (which is really a
@@ -5494,7 +5500,7 @@ init_emit_once (void)
   const_fixed_htab = htab_create_ggc (37, const_fixed_htab_hash,
                                      const_fixed_htab_eq, NULL);
 
-  mem_attrs_htab = htab_create_ggc (37, mem_attrs_htab_hash,
+  mem_attrs_htab = htab_create_ggc (128, mem_attrs_htab_hash,
                                    mem_attrs_htab_eq, NULL);
   reg_attrs_htab = htab_create_ggc (37, reg_attrs_htab_hash,
                                    reg_attrs_htab_eq, NULL);

Reply via email to