aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKazu Hirata <kazu@cs.umass.edu>2004-11-20 05:02:28 +0000
committerKazu Hirata <kazu@gcc.gnu.org>2004-11-20 05:02:28 +0000
commit735538716d00c4a2ba60e3257d7c3092948a5c88 (patch)
treeadcd8f1cb11423dfef36a3d69e2b7f39b0f21c01 /gcc
parent2d59754f6a83fcfb57baba3ebeefaab2a96a5e78 (diff)
downloadgcc-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')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/basic-block.h4
-rw-r--r--gcc/cfg.c45
-rw-r--r--gcc/cfghooks.c14
4 files changed, 44 insertions, 29 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 760e977..be459bd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2004-11-19 Kazu Hirata <kazu@cs.umass.edu>
+
+ * 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.
+
2004-11-19 Aldy Hernandez <aldyh@redhat.com>
* simplify-rtx.c (simplify_ternary_operation): Use
diff --git a/gcc/basic-block.h b/gcc/basic-block.h
index a8db432..69fc0ab 100644
--- a/gcc/basic-block.h
+++ b/gcc/basic-block.h
@@ -154,6 +154,10 @@ struct edge_def GTY(())
int probability; /* biased by REG_BR_PROB_BASE */
gcov_type count; /* Expected number of executions calculated
in profile.c */
+
+ /* The index number corresponding to this edge in the edge vector
+ dest->preds. */
+ unsigned int dest_idx;
};
typedef struct edge_def *edge;
diff --git a/gcc/cfg.c b/gcc/cfg.c
index b3da142..67b0598 100644
--- a/gcc/cfg.c
+++ b/gcc/cfg.c
@@ -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. */
diff --git a/gcc/cfghooks.c b/gcc/cfghooks.c
index 00f4562..42d1183 100644
--- a/gcc/cfghooks.c
+++ b/gcc/cfghooks.c
@@ -178,6 +178,20 @@ verify_flow_info (void)
fputc ('\n', stderr);
err = 1;
}
+
+ if (ei.index != e->dest_idx)
+ {
+ error ("basic block %d pred edge is corrupted", bb->index);
+ error ("its dest_idx should be %d, not %d",
+ ei.index, e->dest_idx);
+ fputs ("Predecessor: ", stderr);
+ dump_edge_info (stderr, e, 0);
+ fputs ("\nSuccessor: ", stderr);
+ dump_edge_info (stderr, e, 1);
+ fputc ('\n', stderr);
+ err = 1;
+ }
+
edge_checksum[e->dest->index + 2] -= (size_t) e;
}
}