summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-loop-ivcanon.c
diff options
context:
space:
mode:
authorSebastian Pop <sebastian.pop@amd.com>2007-11-14 17:36:01 +0000
committerSebastian Pop <spop@gcc.gnu.org>2007-11-14 17:36:01 +0000
commit6c74788ed7b48f057a9f08bde52944726ced24f5 (patch)
tree60159349fdd36d850bf520c89302db135710dc64 /gcc/tree-ssa-loop-ivcanon.c
parent1e992e163d7d21027523b764f02836646036e184 (diff)
downloadgcc-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.c40
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))