Commit 73553871 by Kazu Hirata Committed by Kazu Hirata

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
parent 2d59754f
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> 2004-11-19 Aldy Hernandez <aldyh@redhat.com>
* simplify-rtx.c (simplify_ternary_operation): Use * simplify-rtx.c (simplify_ternary_operation): Use
......
...@@ -154,6 +154,10 @@ struct edge_def GTY(()) ...@@ -154,6 +154,10 @@ struct edge_def GTY(())
int probability; /* biased by REG_BR_PROB_BASE */ int probability; /* biased by REG_BR_PROB_BASE */
gcov_type count; /* Expected number of executions calculated gcov_type count; /* Expected number of executions calculated
in profile.c */ 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; typedef struct edge_def *edge;
......
...@@ -276,6 +276,7 @@ unchecked_make_edge (basic_block src, basic_block dst, int flags) ...@@ -276,6 +276,7 @@ unchecked_make_edge (basic_block src, basic_block dst, int flags)
e->src = src; e->src = src;
e->dest = dst; e->dest = dst;
e->flags = flags; e->flags = flags;
e->dest_idx = EDGE_COUNT (dst->preds) - 1;
return e; return e;
} }
...@@ -355,11 +356,13 @@ remove_edge (edge e) ...@@ -355,11 +356,13 @@ remove_edge (edge e)
{ {
edge tmp; edge tmp;
basic_block src, dest; basic_block src, dest;
unsigned int dest_idx;
bool found = false; bool found = false;
edge_iterator ei; edge_iterator ei;
src = e->src; src = e->src;
dest = e->dest; dest = e->dest;
dest_idx = e->dest_idx;
for (ei = ei_start (src->succs); (tmp = ei_safe_edge (ei)); ) for (ei = ei_start (src->succs); (tmp = ei_safe_edge (ei)); )
{ {
...@@ -375,20 +378,12 @@ remove_edge (edge e) ...@@ -375,20 +378,12 @@ remove_edge (edge e)
gcc_assert (found); gcc_assert (found);
found = false; VEC_unordered_remove (edge, dest->preds, dest_idx);
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);
}
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); free_edge (e);
} }
...@@ -398,28 +393,20 @@ remove_edge (edge e) ...@@ -398,28 +393,20 @@ remove_edge (edge e)
void void
redirect_edge_succ (edge e, basic_block new_succ) redirect_edge_succ (edge e, basic_block new_succ)
{ {
edge tmp; basic_block dest = e->dest;
edge_iterator ei; unsigned int dest_idx = e->dest_idx;
bool found = false;
/* Disconnect the edge from the old successor block. */ VEC_unordered_remove (edge, dest->preds, dest_idx);
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);
}
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. */ /* Reconnect the edge to the new successor block. */
VEC_safe_push (edge, new_succ->preds, e); VEC_safe_push (edge, new_succ->preds, e);
e->dest = new_succ; e->dest = new_succ;
e->dest_idx = EDGE_COUNT (new_succ->preds) - 1;
} }
/* Like previous but avoid possible duplicate edge. */ /* Like previous but avoid possible duplicate edge. */
......
...@@ -178,6 +178,20 @@ verify_flow_info (void) ...@@ -178,6 +178,20 @@ verify_flow_info (void)
fputc ('\n', stderr); fputc ('\n', stderr);
err = 1; 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; edge_checksum[e->dest->index + 2] -= (size_t) e;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment