From bc1002e978f2d8e749dd32cd47e3724b0f2e2efb Mon Sep 17 00:00:00 2001 From: rakdver Date: Tue, 14 Feb 2006 23:55:22 +0000 Subject: 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 --- gcc/ChangeLog | 10 +++++++++- gcc/tree-cfg.c | 5 +---- gcc/tree-cfgcleanup.c | 15 ++++++++++----- 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 + + 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 PR middle-end/23670 @@ -8,7 +16,7 @@ 2006-02-14 Roger Sayle - * 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 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 */ }; -- cgit v1.2.1