Commit 537a2904 by Devang Patel Committed by Devang Patel

re PR tree-optimization/18815 (Tree if-conversion screws up cfg very badly)

       PR tree-optimization/18815
       * tree-if-conv.c (combine_blocks): Adjust loop header edges for
       loops with zero exit edges.

From-SVN: r95923
parent c533f56b
2005-03-04 Devang Patel <dpatel@apple.com> 2005-03-04 Devang Patel <dpatel@apple.com>
PR tree-optimization/18815
* tree-if-conv.c (combine_blocks): Adjust loop header edges for
loops with zero exit edges.
2005-03-04 Devang Patel <dpatel@apple.com>
* doc/invoke.texi: Remove reference to webpage that does not exist. * doc/invoke.texi: Remove reference to webpage that does not exist.
......
...@@ -858,7 +858,8 @@ combine_blocks (struct loop *loop) ...@@ -858,7 +858,8 @@ combine_blocks (struct loop *loop)
basic_block bb, exit_bb, merge_target_bb; basic_block bb, exit_bb, merge_target_bb;
unsigned int orig_loop_num_nodes = loop->num_nodes; unsigned int orig_loop_num_nodes = loop->num_nodes;
unsigned int i; unsigned int i;
unsigned int n_exits;
edge *exits = get_loop_exit_edges (loop, &n_exits);
/* Process phi nodes to prepare blocks for merge. */ /* Process phi nodes to prepare blocks for merge. */
process_phi_nodes (loop); process_phi_nodes (loop);
...@@ -905,11 +906,23 @@ combine_blocks (struct loop *loop) ...@@ -905,11 +906,23 @@ combine_blocks (struct loop *loop)
continue; continue;
/* It is time to remove this basic block. First remove edges. */ /* It is time to remove this basic block. First remove edges. */
while (EDGE_COUNT (bb->succs) > 0)
remove_edge (EDGE_SUCC (bb, 0));
while (EDGE_COUNT (bb->preds) > 0) while (EDGE_COUNT (bb->preds) > 0)
remove_edge (EDGE_PRED (bb, 0)); remove_edge (EDGE_PRED (bb, 0));
/* This is loop latch and loop does not have exit then do not
delete this basic block. Just remove its PREDS and reconnect
loop->header and loop->latch blocks. */
if (bb == loop->latch && n_exits == 0)
{
exits = NULL; /* To suppress unused warning. */
make_edge (loop->header, loop->latch, EDGE_FALLTHRU);
set_immediate_dominator (CDI_DOMINATORS, loop->latch, loop->header);
continue;
}
while (EDGE_COUNT (bb->succs) > 0)
remove_edge (EDGE_SUCC (bb, 0));
/* Remove labels and make stmts member of loop->header. */ /* Remove labels and make stmts member of loop->header. */
for (bsi = bsi_start (bb); !bsi_end_p (bsi); ) for (bsi = bsi_start (bb); !bsi_end_p (bsi); )
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment