diff options
author | rakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-02-14 23:55:22 +0000 |
---|---|---|
committer | rakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-02-14 23:55:22 +0000 |
commit | bc1002e978f2d8e749dd32cd47e3724b0f2e2efb (patch) | |
tree | 3c6b81a1f48e064bd66b687c972d0a714dd6b1b1 | |
parent | 1eacfaf6bff93ebe734e40034f0c8947f28c89d1 (diff) | |
download | gcc-bc1002e978f2d8e749dd32cd47e3724b0f2e2efb.tar.gz |
PR tree-optimization/26209
* tree-ssa-loop.c (pass_scev_cprop): Add TODO_cleanup_cfg.
* tree-cfgcleanup.c (cleanup_control_flow): Remove dead
eh edges.
* tree-cfg.c (replace_uses_by): Do not alter cfg.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@110999 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/tree-cfg.c | 5 | ||||
-rw-r--r-- | gcc/tree-cfgcleanup.c | 15 | ||||
-rw-r--r-- | gcc/tree-ssa-loop.c | 3 |
4 files changed, 22 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a134098cc81..6312500c0ec 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2006-02-14 Zdenek Dvorak <dvorakz@suse.cz> + + PR tree-optimization/26209 + * tree-ssa-loop.c (pass_scev_cprop): Add TODO_cleanup_cfg. + * tree-cfgcleanup.c (cleanup_control_flow): Remove dead + eh edges. + * tree-cfg.c (replace_uses_by): Do not alter cfg. + 2006-02-14 Roger Sayle <roger@eyesopen.com> PR middle-end/23670 @@ -8,7 +16,7 @@ 2006-02-14 Roger Sayle <roger@eyesopen.com> - * dojump.c (do_compare_rtx_and_jump): Also handle multi-word GTU + * dojump.c (do_compare_rtx_and_jump): Also handle multi-word GTU and GEU. 2006-02-14 Adam Nemet <anemet@caviumnetworks.com> diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 0724c102163..60dacbd5fc8 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -1347,10 +1347,7 @@ replace_uses_by (tree name, tree val) if (TREE_CODE (rhs) == ADDR_EXPR) recompute_tree_invariant_for_addr_expr (rhs); - /* If the statement could throw and now cannot, we need to prune cfg. */ - if (maybe_clean_or_replace_eh_stmt (stmt, stmt)) - tree_purge_dead_eh_edges (bb_for_stmt (stmt)); - + maybe_clean_or_replace_eh_stmt (stmt, stmt); mark_new_vars_to_rename (stmt); } diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c index 76667a6edc1..dc0380aefc2 100644 --- a/gcc/tree-cfgcleanup.c +++ b/gcc/tree-cfgcleanup.c @@ -158,19 +158,24 @@ cleanup_control_flow (void) { bsi = bsi_last (bb); + /* If the last statement of the block could throw and now cannot, + we need to prune cfg. */ + tree_purge_dead_eh_edges (bb); + if (bsi_end_p (bsi)) continue; stmt = bsi_stmt (bsi); + if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR) retval |= cleanup_control_expr_graph (bb, bsi); - /* If we had a computed goto which has a compile-time determinable destination, then we can eliminate the goto. */ - if (TREE_CODE (stmt) == GOTO_EXPR - && TREE_CODE (GOTO_DESTINATION (stmt)) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND (GOTO_DESTINATION (stmt), 0)) == LABEL_DECL) + else if (TREE_CODE (stmt) == GOTO_EXPR + && TREE_CODE (GOTO_DESTINATION (stmt)) == ADDR_EXPR + && (TREE_CODE (TREE_OPERAND (GOTO_DESTINATION (stmt), 0)) + == LABEL_DECL)) { edge e; tree label; @@ -214,7 +219,7 @@ cleanup_control_flow (void) /* Check for indirect calls that have been turned into noreturn calls. */ - if (noreturn_call_p (stmt) && remove_fallthru_edge (bb->succs)) + else if (noreturn_call_p (stmt) && remove_fallthru_edge (bb->succs)) { free_dominance_info (CDI_DOMINATORS); retval = true; diff --git a/gcc/tree-ssa-loop.c b/gcc/tree-ssa-loop.c index 60cdefcbe24..e128c368084 100644 --- a/gcc/tree-ssa-loop.c +++ b/gcc/tree-ssa-loop.c @@ -302,7 +302,8 @@ struct tree_opt_pass pass_scev_cprop = 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - TODO_dump_func | TODO_update_ssa_only_virtuals, + TODO_dump_func | TODO_cleanup_cfg + | TODO_update_ssa_only_virtuals, /* todo_flags_finish */ 0 /* letter */ }; |