summaryrefslogtreecommitdiff
path: root/libiberty
diff options
context:
space:
mode:
authorak <ak@138bc75d-0d04-0410-961f-82ee72b054a4>2013-04-23 03:09:47 +0000
committerak <ak@138bc75d-0d04-0410-961f-82ee72b054a4>2013-04-23 03:09:47 +0000
commit88a96138095975577488bcb3667a85107977b433 (patch)
tree23ffa8b00dd8951c14d347d1ad8327bd887526c2 /libiberty
parentab16985ed348bea61e913f3743bd5764a91b8f33 (diff)
downloadgcc-88a96138095975577488bcb3667a85107977b433.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@198171 138bc75d-0d04-0410-961f-82ee72b054a4
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 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;
+}