diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2014-02-28 12:57:06 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2014-02-28 12:57:06 +0000 |
commit | 22414f3ffcc916cf5fdaa5d3b0d180c197b6d848 (patch) | |
tree | 7d53a818d98bcca10434e439b2d2301235657e96 /gcc | |
parent | 2e08491710f04b854ed9b7c8d0b520c2c6eac115 (diff) | |
download | gcc-22414f3ffcc916cf5fdaa5d3b0d180c197b6d848.zip gcc-22414f3ffcc916cf5fdaa5d3b0d180c197b6d848.tar.gz gcc-22414f3ffcc916cf5fdaa5d3b0d180c197b6d848.tar.bz2 |
re PR debug/59992 (Compilation of insn-recog.c too slow due to var-tracking)
PR debug/59992
* cselib.c (remove_useless_values): Skip to avoid quadratic
behavior if the condition moved from...
(cselib_process_insn): ... here holds.
From-SVN: r208220
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cselib.c | 16 |
2 files changed, 16 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 51c2706..0ea85dc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2014-02-28 Alexandre Oliva <aoliva@redhat.com> + PR debug/59992 + * cselib.c (remove_useless_values): Skip to avoid quadratic + behavior if the condition moved from... + (cselib_process_insn): ... here holds. + +2014-02-28 Alexandre Oliva <aoliva@redhat.com> + PR debug/57232 * var-tracking.c (vt_initialize): Apply the same condition to preserve the CFA base value. diff --git a/gcc/cselib.c b/gcc/cselib.c index 525e717..dabd2d3 100644 --- a/gcc/cselib.c +++ b/gcc/cselib.c @@ -662,6 +662,14 @@ remove_useless_values (void) { cselib_val **p, *v; + if (n_useless_values <= MAX_USELESS_VALUES + /* remove_useless_values is linear in the hash table size. Avoid + quadratic behavior for very large hashtables with very few + useless elements. */ + || ((unsigned int)n_useless_values + <= (cselib_hash_table.elements () - n_debug_values) / 4)) + return; + /* First pass: eliminate locations that reference the value. That in turn can make more values useless. */ do @@ -2693,13 +2701,7 @@ cselib_process_insn (rtx insn) cselib_current_insn = NULL_RTX; - if (n_useless_values > MAX_USELESS_VALUES - /* remove_useless_values is linear in the hash table size. Avoid - quadratic behavior for very large hashtables with very few - useless elements. */ - && ((unsigned int)n_useless_values - > (cselib_hash_table.elements () - n_debug_values) / 4)) - remove_useless_values (); + remove_useless_values (); } /* Initialize cselib for one pass. The caller must also call |