aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/cselib.c6
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 ();
}