diff options
author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-07-06 05:25:57 +0000 |
---|---|---|
committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-07-06 05:25:57 +0000 |
commit | ba8d970212c49d9a425ce7678cd888dcc14efbea (patch) | |
tree | bfc350f65435feb35c717dcc4a70bc5ec1f0e24d /gcc/tree-ssa-dce.c | |
parent | 5539d5471cf928bdc85073dcdacff0524a25e8bc (diff) | |
download | gcc-ba8d970212c49d9a425ce7678cd888dcc14efbea.tar.gz |
* tree-ssa-dce.c (cfg_altered): New global.
(tree_dce_init): Initialize cfg_altered.
(remove_dead_stmt): If we remove an edge in the CFG, then set
CFG_ALTERED.
(perform_tree_ssa_dce): If we altered the CFG, then invalidate
the dominators.
* gcc.c-torture/compile/pr21356.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@101652 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-dce.c')
-rw-r--r-- | gcc/tree-ssa-dce.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index 1b5c9f94338..abd4d7ae77a 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -96,6 +96,13 @@ static bitmap *control_dependence_map; processed that it is control dependent on. */ static sbitmap visited_control_parents; +/* TRUE if this pass alters the CFG (by removing control statements). + FALSE otherwise. + + If this pass alters the CFG, then it will arrange for the dominators + to be recomputed. */ +static bool cfg_altered; + /* Execute CODE for each edge (given number EDGE_NUMBER within the CODE) for which the block with index N is control dependent. */ #define EXECUTE_IF_CONTROL_DEPENDENT(N, EDGE_NUMBER, CODE) \ @@ -774,7 +781,15 @@ remove_dead_stmt (block_stmt_iterator *i, basic_block bb) /* Remove the remaining the outgoing edges. */ while (!single_succ_p (bb)) - remove_edge (EDGE_SUCC (bb, 1)); + { + /* FIXME. When we remove the edge, we modify the CFG, which + in turn modifies the dominator and post-dominator tree. + Is it safe to postpone recomputing the dominator and + post-dominator tree until the end of this pass given that + the post-dominators are used above? */ + cfg_altered = true; + remove_edge (EDGE_SUCC (bb, 1)); + } } FOR_EACH_SSA_DEF_OPERAND (def_p, t, iter, SSA_OP_VIRTUAL_DEFS) @@ -833,6 +848,7 @@ tree_dce_init (bool aggressive) sbitmap_zero (processed); worklist = VEC_alloc (tree, heap, 64); + cfg_altered = false; } /* Cleanup after this pass. */ @@ -903,6 +919,12 @@ perform_tree_ssa_dce (bool aggressive) if (aggressive) free_dominance_info (CDI_POST_DOMINATORS); + /* If we removed paths in the CFG, then we need to update + dominators as well. I haven't investigated the possibility + of incrementally updating dominators. */ + if (cfg_altered) + free_dominance_info (CDI_DOMINATORS); + /* Debugging dumps. */ if (dump_file) print_stats (); |