aboutsummaryrefslogtreecommitdiff
path: root/libiberty/hashtab.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2006-07-27 19:10:07 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2006-07-27 17:10:07 +0000
commit3050098b161a9f830a4f4d38154bf139584f7330 (patch)
tree14266ba8c54052b56789938ae15882d061451a22 /libiberty/hashtab.c
parent96d0cc8186a650f653ec0bb47168b3ccb6426ce2 (diff)
downloadgcc-3050098b161a9f830a4f4d38154bf139584f7330.zip
gcc-3050098b161a9f830a4f4d38154bf139584f7330.tar.gz
gcc-3050098b161a9f830a4f4d38154bf139584f7330.tar.bz2
re PR middle-end/28071 (A file that can not be compiled in reasonable time/space)
PR rtl-optimization/28071 * hashtab.c (htab_empty): Clear out n_deleted/n_elements; downsize the hashtable. From-SVN: r115779
Diffstat (limited to 'libiberty/hashtab.c')
-rw-r--r--libiberty/hashtab.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/libiberty/hashtab.c b/libiberty/hashtab.c
index a5671a0..bf34a6d 100644
--- a/libiberty/hashtab.c
+++ b/libiberty/hashtab.c
@@ -421,7 +421,28 @@ htab_empty (htab_t htab)
if (entries[i] != HTAB_EMPTY_ENTRY && entries[i] != HTAB_DELETED_ENTRY)
(*htab->del_f) (entries[i]);
- memset (entries, 0, size * sizeof (PTR));
+ /* Instead of clearing megabyte, downsize the table. */
+ if (size > 1024*1024 / sizeof (PTR))
+ {
+ int nindex = higher_prime_index (1024 / sizeof (PTR));
+ int nsize = prime_tab[nindex].prime;
+
+ if (htab->free_f != NULL)
+ (*htab->free_f) (htab->entries);
+ else if (htab->free_with_arg_f != NULL)
+ (*htab->free_with_arg_f) (htab->alloc_arg, htab->entries);
+ if (htab->alloc_with_arg_f != NULL)
+ htab->entries = (PTR *) (*htab->alloc_with_arg_f) (htab->alloc_arg, nsize,
+ sizeof (PTR *));
+ else
+ htab->entries = (PTR *) (*htab->alloc_f) (nsize, sizeof (PTR *));
+ htab->size = nsize;
+ htab->size_prime_index = nindex;
+ }
+ else
+ memset (entries, 0, size * sizeof (PTR));
+ htab->n_deleted = 0;
+ htab->n_elements = 0;
}
/* Similar to htab_find_slot, but without several unwanted side effects: