summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndi Kleen <ak@linux.intel.com>2013-04-23 03:09:47 +0000
committerAndi Kleen <ak@gcc.gnu.org>2013-04-23 03:09:47 +0000
commit86210f13cdab46fb3ac1327f7e016646684e5709 (patch)
tree23ffa8b00dd8951c14d347d1ad8327bd887526c2
parent7441bd3d2250272fa1dce0bb8eb192c13b824512 (diff)
Improve pointer hash function to include all bits
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
-rw-r--r--libiberty/ChangeLog4
-rw-r--r--libiberty/hashtab.c33
2 files changed, 29 insertions, 8 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 717221dd891..1420ad402f3 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -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.
diff --git a/libiberty/hashtab.c b/libiberty/hashtab.c
index dfaec0f31ae..a2fe3ee3bdd 100644
--- a/libiberty/hashtab.c
+++ b/libiberty/hashtab.c
@@ -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;
+}