This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH 1/9] Improve pointer hash function to include all bits
- From: Andi Kleen <andi at firstfloor dot org>
- To: gcc-patches at gcc dot gnu dot org
- Cc: hubicka at ucw dot cz, Andi Kleen <ak at linux dot intel dot com>
- Date: Fri, 19 Apr 2013 23:31:49 +0200
- Subject: [PATCH 1/9] Improve pointer hash function to include all bits
- References: <1366407117-18462-1-git-send-email-andi at firstfloor dot org>
From: Andi Kleen <ak@linux.intel.com>
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-18 Andi Kleen <ak@linux.intel.com>
* hashtab.c (hash_pointer): Move to end of file and reimplement.
---
libiberty/hashtab.c | 32 ++++++++++++++++++++++++--------
1 file changed, 24 insertions(+), 8 deletions(-)
diff --git a/libiberty/hashtab.c b/libiberty/hashtab.c
index dfaec0f..f714a85 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,27 @@ 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;
+}
--
1.8.1.4