From 537a2904e71f46dce47e2cbcd5b90b59b974568f Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Fri, 4 Mar 2005 18:59:25 -0800 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/tree-if-conv.c | 19 ++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 084aa506f82..22615e178d6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-03-04 Devang Patel + + 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 * doc/invoke.texi: Remove reference to webpage that does not exist. diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index bb832d24616..ef9dc574ce1 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -858,7 +858,8 @@ combine_blocks (struct loop *loop) basic_block bb, exit_bb, merge_target_bb; unsigned int orig_loop_num_nodes = loop->num_nodes; 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 (loop); @@ -905,11 +906,23 @@ combine_blocks (struct loop *loop) continue; /* 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) 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. */ for (bsi = bsi_start (bb); !bsi_end_p (bsi); ) { -- 2.30.2