Separate new_edges compute in copy_bbs
This separates out a loop finding new_edges from edges in copy_bbs, making its complexity cheaper overall from total number of succs in copied bbs times num_edges to num_edges times the complexity of find_edge. 2020-10-21 Richard Biener <rguenther@suse.de> * cfghooks.c (copy_bbs): Split out loop computing new_edges.
This commit is contained in:
parent
878315ae48
commit
4fa5dc951e
|
@ -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++)
|
||||
|
|
Loading…
Reference in New Issue