diff options
author | ak <ak@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-04-23 03:09:47 +0000 |
---|---|---|
committer | ak <ak@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-04-23 03:09:47 +0000 |
commit | 88a96138095975577488bcb3667a85107977b433 (patch) | |
tree | 23ffa8b00dd8951c14d347d1ad8327bd887526c2 /libiberty | |
parent | ab16985ed348bea61e913f3743bd5764a91b8f33 (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | libiberty/hashtab.c | 33 |
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; +} |