diff options
author | Jeff Law <law@redhat.com> | 2005-10-07 10:05:37 -0600 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2005-10-07 10:05:37 -0600 |
commit | 3e352c00e15e9742aa076287839f40813957ce21 (patch) | |
tree | 94b2f20aa3de80597a2ecd85c1c321ef129bfa44 /gcc/tree-ssa-dom.c | |
parent | a5cee4808e6598c60068f798542e3c9f690321f2 (diff) | |
download | gcc-3e352c00e15e9742aa076287839f40813957ce21.zip gcc-3e352c00e15e9742aa076287839f40813957ce21.tar.gz gcc-3e352c00e15e9742aa076287839f40813957ce21.tar.bz2 |
tree-ssa-dom.c (dom_opt_finalize_block): Fix conditions to determine whether or not to try and thread outgoing edges.
* tree-ssa-dom.c (dom_opt_finalize_block): Fix conditions to
determine whether or not to try and thread outgoing edges.
From-SVN: r105091
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r-- | gcc/tree-ssa-dom.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 71dcd4f..b37df77 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -1020,14 +1020,14 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb) { tree last; - /* If we are at a leaf node in the dominator tree, see if we can thread - the edge from BB through its successor. - - Do this before we remove entries from our equivalence tables. */ + /* If we have an outgoing edge to a block with multiple incoming and + outgoing edges, then we may be able to thread the edge. ie, we + may be able to statically determine which of the outgoing edges + will be traversed when the incoming edge from BB is traversed. */ if (single_succ_p (bb) && (single_succ_edge (bb)->flags & EDGE_ABNORMAL) == 0 - && (get_immediate_dominator (CDI_DOMINATORS, single_succ (bb)) != bb - || phi_nodes (single_succ (bb)))) + && !single_pred_p (single_succ (bb)) + && !single_succ_p (single_succ (bb))) { thread_across_edge (walk_data, single_succ_edge (bb)); @@ -1044,10 +1044,9 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb) extract_true_false_edges_from_block (bb, &true_edge, &false_edge); - /* If the THEN arm is the end of a dominator tree or has PHI nodes, - then try to thread through its edge. */ - if (get_immediate_dominator (CDI_DOMINATORS, true_edge->dest) != bb - || phi_nodes (true_edge->dest)) + /* Only try to thread the edge if it reaches a target block with + more than one predecessor and more than one successor. */ + if (!single_pred_p (true_edge->dest) && !single_succ_p (true_edge->dest)) { struct edge_info *edge_info; unsigned int i; @@ -1094,8 +1093,7 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb) } /* Similarly for the ELSE arm. */ - if (get_immediate_dominator (CDI_DOMINATORS, false_edge->dest) != bb - || phi_nodes (false_edge->dest)) + if (!single_pred_p (false_edge->dest) && !single_succ_p (false_edge->dest)) { struct edge_info *edge_info; unsigned int i; |