]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Improve pointer hash function to include all bits
authorAndi Kleen <ak@linux.intel.com>
Tue, 23 Apr 2013 03:09:47 +0000 (03:09 +0000)
committerAndi Kleen <ak@gcc.gnu.org>
Tue, 23 Apr 2013 03:09:47 +0000 (03:09 +0000)
The hashtab pointer hash function is not very good. It throws most of the
bits in the pointer away.

This changes pointer_hash to use the mix code from jhash function that mixes
all the bits on the pointer and makes them dependent on each other, before doing
the modulo.

libiberty/:

2013-04-22  Andi Kleen <ak@linux.intel.com>

* hashtab.c (hash_pointer): Move to end of file and reimplement.

From-SVN: r198171

libiberty/ChangeLog
libiberty/hashtab.c

index 717221dd891730ce03bc408d3d3b591baa5d40a9..1420ad402f3be291793250a4bcef62afff2b3206 100644 (file)
@@ -1,3 +1,7 @@
+2013-04-22  Andi Kleen <ak@linux.intel.com>
+
+       * hashtab.c (hash_pointer): Move to end of file and reimplement.
+
 2013-04-03  Jason Merrill  <jason@redhat.com>
 
        * cp-demangle.c (cplus_demangle_type): Fix function quals.
index dfaec0f31aeef59dc0263ff1de078515f2b67c23..a2fe3ee3bddbff6745024ea3b01df707744574ba 100644 (file)
@@ -194,14 +194,6 @@ higher_prime_index (unsigned long n)
   return low;
 }
 
-/* Returns a hash code for P.  */
-
-static hashval_t
-hash_pointer (const PTR p)
-{
-  return (hashval_t) ((intptr_t)p >> 3);
-}
-
 /* Returns non-zero if P1 and P2 are equal.  */
 
 static int
@@ -988,3 +980,28 @@ iterative_hash (const PTR k_in /* the key */,
   /*-------------------------------------------- report the result */
   return c;
 }
+
+/* Returns a hash code for pointer P. Simplified version of evahash */
+
+static hashval_t
+hash_pointer (const PTR p)
+{
+  intptr_t v = (intptr_t) p;
+  unsigned a, b, c;
+
+  a = b = 0x9e3779b9;
+  if (sizeof (intptr_t) == 4) 
+    {
+      /* Mix as 16bit for now */
+      a += v >> 16;
+      b += v & 0xffff;
+    }
+  else
+    {
+      a += v >> 32;
+      b += v & 0xffffffff;
+    }
+  c = 0x42135234;
+  mix (a, b, c);
+  return c;
+}