aboutsummaryrefslogtreecommitdiff
path: root/libiberty
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 /libiberty
parent7441bd3d2250272fa1dce0bb8eb192c13b824512 (diff)
downloadgcc-86210f13cdab46fb3ac1327f7e016646684e5709.zip
gcc-86210f13cdab46fb3ac1327f7e016646684e5709.tar.gz
gcc-86210f13cdab46fb3ac1327f7e016646684e5709.tar.bz2
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
Diffstat (limited to 'libiberty')
-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 717221d..1420ad4 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 dfaec0f..a2fe3ee 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;
+}