From: Andi Kleen Date: Tue, 23 Apr 2013 03:09:47 +0000 (+0000) Subject: Improve pointer hash function to include all bits X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=86210f13cdab46fb3ac1327f7e016646684e5709;p=gcc.git 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 * hashtab.c (hash_pointer): Move to end of file and reimplement. From-SVN: r198171 --- 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 + + * hashtab.c (hash_pointer): Move to end of file and reimplement. + 2013-04-03 Jason Merrill * 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; +}