diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cfghooks.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/gcc/cfghooks.c b/gcc/cfghooks.c index 71c6b63..14c006d 100644 --- a/gcc/cfghooks.c +++ b/gcc/cfghooks.c @@ -1391,8 +1391,6 @@ copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs, } /* Redirect edges. */ - for (j = 0; j < num_edges; j++) - new_edges[j] = NULL; for (i = 0; i < n; i++) { edge_iterator ei; @@ -1401,15 +1399,26 @@ copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs, FOR_EACH_EDGE (e, ei, new_bb->succs) { - for (j = 0; j < num_edges; j++) - if (edges[j] && edges[j]->src == bb && edges[j]->dest == e->dest) - new_edges[j] = e; - if (!(e->dest->flags & BB_DUPLICATED)) continue; redirect_edge_and_branch_force (e, get_bb_copy (e->dest)); } } + for (j = 0; j < num_edges; j++) + { + if (!edges[j]) + new_edges[j] = NULL; + else + { + basic_block src = edges[j]->src; + basic_block dest = edges[j]->dest; + if (src->flags & BB_DUPLICATED) + src = get_bb_copy (src); + if (dest->flags & BB_DUPLICATED) + dest = get_bb_copy (dest); + new_edges[j] = find_edge (src, dest); + } + } /* Clear information about duplicates. */ for (i = 0; i < n; i++) |