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 | |
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')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr21356.c | 13 | ||||
-rw-r--r-- | gcc/tree-ssa-dce.c | 24 |
4 files changed, 49 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 14c4912..fa01f31 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2005-07-06 Jeff Law <law@redhat.com> + + * 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. + 2005-07-06 Kazu Hirata <kazu@codesourcery.com> * Makefile.in (stamp-collect-ld): Use diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e598f6e..b70b330 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-07-06 Jeff Law <law@redhat.com> + + * gcc.c-torture/compile/pr21356.c: New test. + 2005-07-05 Joseph S. Myers <joseph@codesourcery.com> PR c/22013 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr21356.c b/gcc/testsuite/gcc.c-torture/compile/pr21356.c new file mode 100644 index 0000000..b072b51 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr21356.c @@ -0,0 +1,13 @@ +int a; +void* p; + +void foo (void) +{ + switch (a) + { + a0: case 0: p = &&a1; + a1: case 1: p = &&a2; + a2: default: p = &&a1; + } + goto *p; +} 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 (); |