aboutsummaryrefslogtreecommitdiff
path: root/gcc/flow.c
diff options
context:
space:
mode:
authorRoman Zippel <zippel@linux-m68k.org>2001-08-27 21:29:15 +0000
committerRichard Henderson <rth@gcc.gnu.org>2001-08-27 14:29:15 -0700
commitbce7bfe83537e9e14bbe92e3424694745d7121a6 (patch)
tree8aa6a9b0a909d575b8f77a1862cef46dd2934d94 /gcc/flow.c
parentce4a5723b61d7be5cfd6d6cab6165aefcae9ceff (diff)
downloadgcc-bce7bfe83537e9e14bbe92e3424694745d7121a6.zip
gcc-bce7bfe83537e9e14bbe92e3424694745d7121a6.tar.gz
gcc-bce7bfe83537e9e14bbe92e3424694745d7121a6.tar.bz2
* flow.c (verify_flow_info): Use checksums to verify edges.
From-SVN: r45212
Diffstat (limited to 'gcc/flow.c')
-rw-r--r--gcc/flow.c46
1 files changed, 22 insertions, 24 deletions
diff --git a/gcc/flow.c b/gcc/flow.c
index 1da1ef0..f1e7a6c 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -8340,12 +8340,14 @@ verify_flow_info ()
const rtx rtx_first = get_insns ();
rtx last_head = get_last_insn ();
basic_block *bb_info, *last_visited;
+ size_t *edge_checksum;
rtx x;
int i, last_bb_num_seen, num_bb_notes, err = 0;
bb_info = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
last_visited = (basic_block *) xcalloc (n_basic_blocks + 2,
sizeof (basic_block));
+ edge_checksum = (size_t *) xcalloc (n_basic_blocks + 2, sizeof (size_t));
for (i = n_basic_blocks - 1; i >= 0; i--)
{
@@ -8396,9 +8398,8 @@ verify_flow_info ()
for (i = n_basic_blocks - 1; i >= 0; i--)
{
basic_block bb = BASIC_BLOCK (i);
- /* Check correctness of edge lists. */
- edge e;
int has_fallthru = 0;
+ edge e;
e = bb->succ;
while (e)
@@ -8447,17 +8448,7 @@ verify_flow_info ()
fprintf (stderr, "\n");
err = 1;
}
- if (e->dest != EXIT_BLOCK_PTR)
- {
- edge e2 = e->dest->pred;
- while (e2 && e2 != e)
- e2 = e2->pred_next;
- if (!e2)
- {
- error ("Basic block %i edge lists are corrupted", bb->index);
- err = 1;
- }
- }
+ edge_checksum[e->dest->index + 2] += (size_t) e;
e = e->succ_next;
}
if (!has_fallthru)
@@ -8489,17 +8480,7 @@ verify_flow_info ()
fputc ('\n', stderr);
err = 1;
}
- if (e->src != ENTRY_BLOCK_PTR)
- {
- edge e2 = e->src->succ;
- while (e2 && e2 != e)
- e2 = e2->succ_next;
- if (!e2)
- {
- error ("Basic block %i edge lists are corrupted", bb->index);
- err = 1;
- }
- }
+ edge_checksum[e->dest->index + 2] -= (size_t) e;
e = e->pred_next;
}
@@ -8556,6 +8537,22 @@ verify_flow_info ()
}
}
+ /* Complete edge checksumming for ENTRY and EXIT. */
+ {
+ edge e;
+ for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
+ edge_checksum[e->dest->index + 2] += (size_t) e;
+ for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
+ edge_checksum[e->dest->index + 2] -= (size_t) e;
+ }
+
+ for (i = -2; i < n_basic_blocks; ++i)
+ if (edge_checksum[i + 2])
+ {
+ error ("Basic block %i edge lists are corrupted", i);
+ err = 1;
+ }
+
last_bb_num_seen = -1;
num_bb_notes = 0;
x = rtx_first;
@@ -8617,6 +8614,7 @@ verify_flow_info ()
/* Clean up. */
free (bb_info);
free (last_visited);
+ free (edge_checksum);
}
/* Functions to access an edge list with a vector representation.