diff options
| -rw-r--r-- | gcc/ChangeLog | 6 | ||||
| -rw-r--r-- | gcc/cselib.c | 6 |
2 files changed, 11 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4ebe39f..c5c0d6f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,12 @@ 2006-07-27 Jan Hubicka <jh@suse.cz> PR rtl-optimization/28071 + * cselib.c (cselib_process_insn): Don't remove useless values too + often for very large hashtables. + +2006-07-27 Jan Hubicka <jh@suse.cz> + + PR rtl-optimization/28071 * global.c (greg_obstack): New obstack. (allocate_bb_info): Use it. (free_bb_info): Likewise. diff --git a/gcc/cselib.c b/gcc/cselib.c index 0fc8aee..edfc328 100644 --- a/gcc/cselib.c +++ b/gcc/cselib.c @@ -1437,7 +1437,11 @@ cselib_process_insn (rtx insn) cselib_current_insn_in_libcall = false; cselib_current_insn = 0; - if (n_useless_values > MAX_USELESS_VALUES) + if (n_useless_values > MAX_USELESS_VALUES + /* remove_useless_values is linear in the hash table size. Avoid + quadratic behaviour for very large hashtables with very few + useless elements. */ + && (unsigned int)n_useless_values > cselib_hash_table->n_elements / 4) remove_useless_values (); } |
