diff options
author | Jan Hubicka <jh@suse.cz> | 2003-03-12 15:15:09 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2003-03-12 14:15:09 +0000 |
commit | 0a8e3de3c825de0edac26dc0875e823b1b9d6e9b (patch) | |
tree | 185c9ce9c769ea7a3f9729796fff47cc59493df1 | |
parent | 32cf27e58ed0e95c54c2c2f29ed8130df55f843f (diff) | |
download | gcc-0a8e3de3c825de0edac26dc0875e823b1b9d6e9b.tar.gz |
hashtab.c (htab_expand): Compute the size of hashtable based on the number of elements actually used.
* hashtab.c (htab_expand): Compute the size of hashtable based
on the number of elements actually used.
(htab_traverse): Call htab_expand when table is too empty.
From-SVN: r64246
-rw-r--r-- | libiberty/ChangeLog | 6 | ||||
-rw-r--r-- | libiberty/hashtab.c | 19 |
2 files changed, 22 insertions, 3 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index c863114f0be..16d0b98e123 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,9 @@ +2003-12-03 Jan Hubicka <jh@suse.cz> + + * hashtab.c (htab_expand): Compute the size of hashtable based + on the number of elements actually used. + (htab_traverse): Call htab_expand when table is too empty. + 2003-03-11 Carlo Wood <carlo@gnu.org> * cplus-dem.c (demangle_integral_value): Correction to reflect diff --git a/libiberty/hashtab.c b/libiberty/hashtab.c index 0429936e961..a0cb5a75820 100644 --- a/libiberty/hashtab.c +++ b/libiberty/hashtab.c @@ -373,7 +373,14 @@ htab_expand (htab) oentries = htab->entries; olimit = oentries + htab->size; - nsize = higher_prime_number (htab->size * 2); + /* Resize only when table after removal of unused elements is either + too full or too empty. */ + if ((htab->n_elements - htab->n_deleted) * 2 > htab->size + || (htab->n_elements - htab->n_deleted) * 8 < htab->size + && htab->size > 32) + nsize = higher_prime_number ((htab->n_elements - htab->n_deleted) * 2); + else + nsize = htab->size; if (htab->alloc_with_arg_f != NULL) nentries = (PTR *) (*htab->alloc_with_arg_f) (htab->alloc_arg, nsize, @@ -601,8 +608,14 @@ htab_traverse (htab, callback, info) htab_trav callback; PTR info; { - PTR *slot = htab->entries; - PTR *limit = slot + htab->size; + PTR *slot; + PTR *limit; + + if ((htab->n_elements - htab->n_deleted) * 8 < htab->size) + htab_expand (htab); + + slot = htab->entries; + limit = slot + htab->size; do { |