aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-dom.c
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2005-03-07 20:39:19 -0700
committerJeff Law <law@gcc.gnu.org>2005-03-07 20:39:19 -0700
commitbe477406042409e5431463f963e02b4365e94ef6 (patch)
treec58611cf62c9432b67999f9b9ddee77792efffb3 /gcc/tree-ssa-dom.c
parent58261bc2462eacb994befe7f3e25295b4a5e6eb9 (diff)
downloadgcc-be477406042409e5431463f963e02b4365e94ef6.zip
gcc-be477406042409e5431463f963e02b4365e94ef6.tar.gz
gcc-be477406042409e5431463f963e02b4365e94ef6.tar.bz2
tree-cfg.c (find_taken_edge_computed_goto): New function.
* 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. From-SVN: r96084
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r--gcc/tree-ssa-dom.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index a143565..aaa0dc5 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)