diff options
author | spop <spop@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-11-14 17:36:01 +0000 |
---|---|---|
committer | spop <spop@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-11-14 17:36:01 +0000 |
commit | 40ffaada4a2273092c172a611ad470dc3e584347 (patch) | |
tree | 60159349fdd36d850bf520c89302db135710dc64 /gcc/tree-ssa-loop-ivcanon.c | |
parent | 1ca2dbd8f9ff34b6db00c538f27d59dd57482f04 (diff) | |
download | gcc-40ffaada4a2273092c172a611ad470dc3e584347.tar.gz |
2007-11-14 Sebastian Pop <sebastian.pop@amd.com>
* tree-ssa-loop-ivcanon.c (try_unroll_loop_completely): Remove
unused edges after loop duplication.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@130182 138bc75d-0d04-0410-961f-82ee72b054a4
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)) |