diff options
author | Sebastian Pop <sebastian.pop@amd.com> | 2007-11-14 17:36:01 +0000 |
---|---|---|
committer | Sebastian Pop <spop@gcc.gnu.org> | 2007-11-14 17:36:01 +0000 |
commit | 6c74788ed7b48f057a9f08bde52944726ced24f5 (patch) | |
tree | 60159349fdd36d850bf520c89302db135710dc64 /gcc/tree-ssa-loop-ivcanon.c | |
parent | 1e992e163d7d21027523b764f02836646036e184 (diff) | |
download | gcc-6c74788ed7b48f057a9f08bde52944726ced24f5.tar.gz |
tree-ssa-loop-ivcanon.c (try_unroll_loop_completely): Remove unused edges after loop duplication.
2007-11-14 Sebastian Pop <sebastian.pop@amd.com>
* tree-ssa-loop-ivcanon.c (try_unroll_loop_completely): Remove
unused edges after loop duplication.
From-SVN: r130182
Diffstat (limited to 'gcc/tree-ssa-loop-ivcanon.c')
-rw-r--r-- | gcc/tree-ssa-loop-ivcanon.c | 40 |
1 files changed, 17 insertions, 23 deletions
diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c index 60fc2ced8de..5e9e2482765 100644 --- a/gcc/tree-ssa-loop-ivcanon.c +++ b/gcc/tree-ssa-loop-ivcanon.c @@ -163,7 +163,7 @@ try_unroll_loop_completely (struct loop *loop, enum unroll_level ul) { unsigned HOST_WIDE_INT n_unroll, ninsns, max_unroll, unr_insns; - tree old_cond, cond, dont_exit, do_exit; + tree cond; if (loop->inner) return false; @@ -207,50 +207,44 @@ try_unroll_loop_completely (struct loop *loop, } } - if (exit->flags & EDGE_TRUE_VALUE) - { - dont_exit = boolean_false_node; - do_exit = boolean_true_node; - } - else - { - dont_exit = boolean_true_node; - do_exit = boolean_false_node; - } - cond = last_stmt (exit->src); - if (n_unroll) { sbitmap wont_exit; + edge e; + unsigned i; + VEC (edge, heap) *to_remove = NULL; - old_cond = COND_EXPR_COND (cond); - COND_EXPR_COND (cond) = dont_exit; - update_stmt (cond); initialize_original_copy_tables (); - wont_exit = sbitmap_alloc (n_unroll + 1); sbitmap_ones (wont_exit); RESET_BIT (wont_exit, 0); if (!tree_duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop), n_unroll, wont_exit, - exit, NULL, + exit, &to_remove, DLTHE_FLAG_UPDATE_FREQ | DLTHE_FLAG_COMPLETTE_PEEL)) { - COND_EXPR_COND (cond) = old_cond; - update_stmt (cond); free_original_copy_tables (); free (wont_exit); return false; } + + for (i = 0; VEC_iterate (edge, to_remove, i, e); i++) + { + bool ok = remove_path (e); + gcc_assert (ok); + } + + VEC_free (edge, heap, to_remove); free (wont_exit); free_original_copy_tables (); } - - COND_EXPR_COND (cond) = do_exit; - update_stmt (cond); + cond = last_stmt (exit->src); + COND_EXPR_COND (cond) = (exit->flags & EDGE_TRUE_VALUE) ? boolean_true_node + : boolean_false_node; + update_stmt (cond); update_ssa (TODO_update_ssa); if (dump_file && (dump_flags & TDF_DETAILS)) |