Commit 4fc4e478 by Richard Henderson Committed by Richard Henderson

hashtab.c (higher_prime_number): Use 7 as minimum.

        * hashtab.c (higher_prime_number): Use 7 as minimum.
        (find_empty_slot_for_expand): Don't compute hash2 unless needed.
        (htab_find_slot_with_hash): Likewise.

From-SVN: r52099
parent b911c031
2002-04-09 Richard Henderson <rth@redhat.com>
* hashtab.c (higher_prime_number): Use 7 as minimum.
(find_empty_slot_for_expand): Don't compute hash2 unless needed.
(htab_find_slot_with_hash): Likewise.
2002-04-01 Phil Edwards <pme@gcc.gnu.org> 2002-04-01 Phil Edwards <pme@gcc.gnu.org>
* cp-demangle.c (__cxa_demangle): Also protect with IN_GLIBCPP_V3. * cp-demangle.c (__cxa_demangle): Also protect with IN_GLIBCPP_V3.
......
/* An expandable hash tables datatype. /* An expandable hash tables datatype.
Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
Contributed by Vladimir Makarov (vmakarov@cygnus.com). Contributed by Vladimir Makarov (vmakarov@cygnus.com).
This file is part of the libiberty library. This file is part of the libiberty library.
...@@ -81,7 +81,6 @@ higher_prime_number (n) ...@@ -81,7 +81,6 @@ higher_prime_number (n)
/* These are primes that are near, but slightly smaller than, a /* These are primes that are near, but slightly smaller than, a
power of two. */ power of two. */
static const unsigned long primes[] = { static const unsigned long primes[] = {
(unsigned long) 2,
(unsigned long) 7, (unsigned long) 7,
(unsigned long) 13, (unsigned long) 13,
(unsigned long) 31, (unsigned long) 31,
...@@ -264,21 +263,27 @@ find_empty_slot_for_expand (htab, hash) ...@@ -264,21 +263,27 @@ find_empty_slot_for_expand (htab, hash)
hashval_t hash; hashval_t hash;
{ {
size_t size = htab->size; size_t size = htab->size;
hashval_t hash2 = 1 + hash % (size - 2);
unsigned int index = hash % size; unsigned int index = hash % size;
PTR *slot = htab->entries + index;
hashval_t hash2;
if (*slot == EMPTY_ENTRY)
return slot;
else if (*slot == DELETED_ENTRY)
abort ();
hash2 = 1 + hash % (size - 2);
for (;;) for (;;)
{ {
PTR *slot = htab->entries + index; index += hash2;
if (index >= size)
index -= size;
slot = htab->entries + index;
if (*slot == EMPTY_ENTRY) if (*slot == EMPTY_ENTRY)
return slot; return slot;
else if (*slot == DELETED_ENTRY) else if (*slot == DELETED_ENTRY)
abort (); abort ();
index += hash2;
if (index >= size)
index -= size;
} }
} }
...@@ -405,50 +410,59 @@ htab_find_slot_with_hash (htab, element, hash, insert) ...@@ -405,50 +410,59 @@ htab_find_slot_with_hash (htab, element, hash, insert)
unsigned int index; unsigned int index;
hashval_t hash2; hashval_t hash2;
size_t size; size_t size;
PTR entry;
if (insert == INSERT && htab->size * 3 <= htab->n_elements * 4 if (insert == INSERT && htab->size * 3 <= htab->n_elements * 4
&& htab_expand (htab) == 0) && htab_expand (htab) == 0)
return NULL; return NULL;
size = htab->size; size = htab->size;
hash2 = 1 + hash % (size - 2);
index = hash % size; index = hash % size;
htab->searches++; htab->searches++;
first_deleted_slot = NULL; first_deleted_slot = NULL;
entry = htab->entries[index];
if (entry == EMPTY_ENTRY)
goto empty_entry;
else if (entry == DELETED_ENTRY)
first_deleted_slot = &htab->entries[index];
else if ((*htab->eq_f) (entry, element))
return &htab->entries[index];
hash2 = 1 + hash % (size - 2);
for (;;) for (;;)
{ {
PTR entry = htab->entries[index]; htab->collisions++;
index += hash2;
if (index >= size)
index -= size;
entry = htab->entries[index];
if (entry == EMPTY_ENTRY) if (entry == EMPTY_ENTRY)
{ goto empty_entry;
if (insert == NO_INSERT) else if (entry == DELETED_ENTRY)
return NULL;
htab->n_elements++;
if (first_deleted_slot)
{
*first_deleted_slot = EMPTY_ENTRY;
return first_deleted_slot;
}
return &htab->entries[index];
}
if (entry == DELETED_ENTRY)
{ {
if (!first_deleted_slot) if (!first_deleted_slot)
first_deleted_slot = &htab->entries[index]; first_deleted_slot = &htab->entries[index];
} }
else if ((*htab->eq_f) (entry, element)) else if ((*htab->eq_f) (entry, element))
return &htab->entries[index]; return &htab->entries[index];
htab->collisions++;
index += hash2;
if (index >= size)
index -= size;
} }
empty_entry:
if (insert == NO_INSERT)
return NULL;
htab->n_elements++;
if (first_deleted_slot)
{
*first_deleted_slot = EMPTY_ENTRY;
return first_deleted_slot;
}
return &htab->entries[index];
} }
/* Like htab_find_slot_with_hash, but compute the hash value from the /* Like htab_find_slot_with_hash, but compute the hash value from the
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment