diff options
author | Jeff Law <law@redhat.com> | 2005-07-05 23:25:57 -0600 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2005-07-05 23:25:57 -0600 |
commit | 9da4058c1454b279f0b5791100105bf7a6734e9d (patch) | |
tree | bfc350f65435feb35c717dcc4a70bc5ec1f0e24d /gcc/tree-ssa-dce.c | |
parent | 1538fc3c3efe8163132b43fb446b15f3fb9be72c (diff) | |
download | gcc-9da4058c1454b279f0b5791100105bf7a6734e9d.zip gcc-9da4058c1454b279f0b5791100105bf7a6734e9d.tar.gz gcc-9da4058c1454b279f0b5791100105bf7a6734e9d.tar.bz2 |
tree-ssa-dce.c (cfg_altered): New global.
* 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.
From-SVN: r101652
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 1b5c9f9..abd4d7a 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 (); |