diff options
author | Jeff Law <law@redhat.com> | 2005-03-08 03:39:19 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 2005-03-08 03:39:19 +0000 |
commit | 0f061f92a2262fc31ee6db471794fa5c3231a2a5 (patch) | |
tree | c58611cf62c9432b67999f9b9ddee77792efffb3 /gcc/tree-ssa-dom.c | |
parent | a13633f49d2743d75a62979a4869e93f189fb493 (diff) |
* tree-cfg.c (find_taken_edge_computed_goto): New function.
(find_taken_edge): Call find_taken_edge_computed_goto as
appropriate. Allow any gimple invariant rather than just
INTEGER_CST for VAL.
(cleanup_control_flow): Cleanup a computed goto which has turned
into a simple goto.
(tree_merge_blocks): If block B has any forced labels, move
them to the start of block A.
* tree-ssa-dom.c (thread_across_edge): Allow threading across
computed gotos as well.
* tree-ssa-threadupdate.c (remove_ctrl_stmt_and_useless_edges): Handle
removal of unnecessary computed gotos too.
(lookup_redirection_data): Fix type of INSERT argument. Callers
updated.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@96084 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r-- | gcc/tree-ssa-dom.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index a14356500aa..aaa0dc5f491 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -715,7 +715,8 @@ thread_across_edge (struct dom_walk_data *walk_data, edge e) arm will be taken. */ if (stmt && (TREE_CODE (stmt) == COND_EXPR - || TREE_CODE (stmt) == SWITCH_EXPR)) + || TREE_CODE (stmt) == SWITCH_EXPR + || TREE_CODE (stmt) == GOTO_EXPR)) { tree cond, cached_lhs; @@ -723,6 +724,8 @@ thread_across_edge (struct dom_walk_data *walk_data, edge e) expression in the hash tables. */ if (TREE_CODE (stmt) == COND_EXPR) cond = COND_EXPR_COND (stmt); + else if (TREE_CODE (stmt) == GOTO_EXPR) + cond = GOTO_DESTINATION (stmt); else cond = SWITCH_COND (stmt); @@ -1001,6 +1004,18 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb) thread_across_edge (walk_data, EDGE_SUCC (bb, 0)); } else if ((last = last_stmt (bb)) + && TREE_CODE (last) == GOTO_EXPR + && TREE_CODE (TREE_OPERAND (last, 0)) == SSA_NAME) + { + edge_iterator ei; + edge e; + + FOR_EACH_EDGE (e, ei, bb->succs) + { + thread_across_edge (walk_data, e); + } + } + else if ((last = last_stmt (bb)) && TREE_CODE (last) == COND_EXPR && (COMPARISON_CLASS_P (COND_EXPR_COND (last)) || TREE_CODE (COND_EXPR_COND (last)) == SSA_NAME) |