diff options
author | Kazu Hirata <kazu@cs.umass.edu> | 2004-11-20 05:02:28 +0000 |
---|---|---|
committer | Kazu Hirata <kazu@gcc.gnu.org> | 2004-11-20 05:02:28 +0000 |
commit | 735538716d00c4a2ba60e3257d7c3092948a5c88 (patch) | |
tree | adcd8f1cb11423dfef36a3d69e2b7f39b0f21c01 /gcc/cfg.c | |
parent | 2d59754f6a83fcfb57baba3ebeefaab2a96a5e78 (diff) | |
download | gcc-735538716d00c4a2ba60e3257d7c3092948a5c88.zip gcc-735538716d00c4a2ba60e3257d7c3092948a5c88.tar.gz gcc-735538716d00c4a2ba60e3257d7c3092948a5c88.tar.bz2 |
basic-block.h (edge_def): Add dest_idx.
* basic-block.h (edge_def): Add dest_idx.
* cfg.c (unchecked_make_edge): Initialize dest_idx.
(remove_edge): Simplify the disconnection of an edge from its
destination.
(redirect_edge_succ): Likewise.
* cfghooks.c (verify_flow_info): Check the consistency of
dest_idx for each edge.
From-SVN: r90958
Diffstat (limited to 'gcc/cfg.c')
-rw-r--r-- | gcc/cfg.c | 45 |
1 files changed, 16 insertions, 29 deletions
@@ -276,6 +276,7 @@ unchecked_make_edge (basic_block src, basic_block dst, int flags) e->src = src; e->dest = dst; e->flags = flags; + e->dest_idx = EDGE_COUNT (dst->preds) - 1; return e; } @@ -355,11 +356,13 @@ remove_edge (edge e) { edge tmp; basic_block src, dest; + unsigned int dest_idx; bool found = false; edge_iterator ei; src = e->src; dest = e->dest; + dest_idx = e->dest_idx; for (ei = ei_start (src->succs); (tmp = ei_safe_edge (ei)); ) { @@ -375,20 +378,12 @@ remove_edge (edge e) gcc_assert (found); - found = false; - for (ei = ei_start (dest->preds); (tmp = ei_safe_edge (ei)); ) - { - if (tmp == e) - { - VEC_unordered_remove (edge, dest->preds, ei.index); - found = true; - break; - } - else - ei_next (&ei); - } + VEC_unordered_remove (edge, dest->preds, dest_idx); - gcc_assert (found); + /* If we removed an edge in the middle of the edge vector, we need + to update dest_idx of the edge that moved into the "hole". */ + if (dest_idx < EDGE_COUNT (dest->preds)) + EDGE_PRED (dest, dest_idx)->dest_idx = dest_idx; free_edge (e); } @@ -398,28 +393,20 @@ remove_edge (edge e) void redirect_edge_succ (edge e, basic_block new_succ) { - edge tmp; - edge_iterator ei; - bool found = false; + basic_block dest = e->dest; + unsigned int dest_idx = e->dest_idx; - /* Disconnect the edge from the old successor block. */ - for (ei = ei_start (e->dest->preds); (tmp = ei_safe_edge (ei)); ) - { - if (tmp == e) - { - VEC_unordered_remove (edge, e->dest->preds, ei.index); - found = true; - break; - } - else - ei_next (&ei); - } + VEC_unordered_remove (edge, dest->preds, dest_idx); - gcc_assert (found); + /* If we removed an edge in the middle of the edge vector, we need + to update dest_idx of the edge that moved into the "hole". */ + if (dest_idx < EDGE_COUNT (dest->preds)) + EDGE_PRED (dest, dest_idx)->dest_idx = dest_idx; /* Reconnect the edge to the new successor block. */ VEC_safe_push (edge, new_succ->preds, e); e->dest = new_succ; + e->dest_idx = EDGE_COUNT (new_succ->preds) - 1; } /* Like previous but avoid possible duplicate edge. */ |