summaryrefslogtreecommitdiff
path: root/gcc/tree-complex.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-11-15 10:42:15 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-11-15 10:42:15 +0000
commitbca7138a499a88d774ada82f0401ad0981fe7572 (patch)
tree9b4b85f1fa75a6ae7fc24ae3da351319ac5e3e4c /gcc/tree-complex.c
parent3df45f179a29e223d795502b80c1a877bca47a14 (diff)
re PR tree-optimization/88030 (ICE in calc_dfs_tree, at dominance.c:458)
2018-11-15 Richard Biener <rguenther@suse.de> PR tree-optimization/88030 * tree-complex.c (need_eh_cleanup): New global. (update_complex_assignment): Mark blocks that need EH update. (expand_complex_comparison): Likewise. (tree_lower_complex): Allocate and deallocate need_eh_cleanup, perform EH cleanup and schedule CFG cleanup if that did anything. * gcc.dg/tsan/pr88030.c: New testcase. From-SVN: r266175
Diffstat (limited to 'gcc/tree-complex.c')
-rw-r--r--gcc/tree-complex.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/gcc/tree-complex.c b/gcc/tree-complex.c
index 4bf644f9473..2e104c9defb 100644
--- a/gcc/tree-complex.c
+++ b/gcc/tree-complex.c
@@ -80,6 +80,9 @@ static vec<tree> complex_ssa_name_components;
non-SSA_NAME/non-invariant args that need to be replaced by SSA_NAMEs. */
static vec<gphi *> phis_to_revisit;
+/* BBs that need EH cleanup. */
+static bitmap need_eh_cleanup;
+
/* Lookup UID in the complex_variable_components hashtable and return the
associated tree. */
static tree
@@ -701,7 +704,7 @@ update_complex_assignment (gimple_stmt_iterator *gsi, tree r, tree i)
stmt = gsi_stmt (*gsi);
update_stmt (stmt);
if (maybe_clean_eh_stmt (stmt))
- gimple_purge_dead_eh_edges (gimple_bb (stmt));
+ bitmap_set_bit (need_eh_cleanup, gimple_bb (stmt)->index);
update_complex_components (gsi, gsi_stmt (*gsi), r, i);
}
@@ -1559,7 +1562,7 @@ expand_complex_comparison (gimple_stmt_iterator *gsi, tree ar, tree ai,
update_stmt (stmt);
if (maybe_clean_eh_stmt (stmt))
- gimple_purge_dead_eh_edges (gimple_bb (stmt));
+ bitmap_set_bit (need_eh_cleanup, gimple_bb (stmt)->index);
}
/* Expand inline asm that sets some complex SSA_NAMEs. */
@@ -1773,6 +1776,8 @@ tree_lower_complex (void)
class complex_propagate complex_propagate;
complex_propagate.ssa_propagate ();
+ need_eh_cleanup = BITMAP_ALLOC (NULL);
+
complex_variable_components = new int_tree_htab_type (10);
complex_ssa_name_components.create (2 * num_ssa_names);
@@ -1818,11 +1823,15 @@ tree_lower_complex (void)
gsi_commit_edge_inserts ();
+ unsigned todo
+ = gimple_purge_all_dead_eh_edges (need_eh_cleanup) ? TODO_cleanup_cfg : 0;
+ BITMAP_FREE (need_eh_cleanup);
+
delete complex_variable_components;
complex_variable_components = NULL;
complex_ssa_name_components.release ();
complex_lattice_values.release ();
- return 0;
+ return todo;
}
namespace {