From 08a45887c86d893f32fbe18d00c15b1e9367b5e1 Mon Sep 17 00:00:00 2001 From: law Date: Fri, 21 Jul 2000 00:15:44 +0000 Subject: [PATCH] * flow.c (verify_flow_info): Revamp code to verify that the head and end of each basic block are in the insn chain. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@35160 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/flow.c | 33 +++++++++++++++++++-------------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a0da767..1a6b8bd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Thu Jul 20 18:13:52 2000 Jeffrey A Law (law@cygnus.com) + + * flow.c (verify_flow_info): Revamp code to verify that the + head and end of each basic block are in the insn chain. + Thu Jul 20 18:02:35 2000 Michael Matz * gcse.c (record_one_set): Prepend instead of append onto diff --git a/gcc/flow.c b/gcc/flow.c index 2dc2b17..7019dbf 100644 --- a/gcc/flow.c +++ b/gcc/flow.c @@ -6342,34 +6342,37 @@ verify_flow_info () { const int max_uid = get_max_uid (); const rtx rtx_first = get_insns (); + rtx last_head = get_last_insn (); basic_block *bb_info; rtx x; int i, last_bb_num_seen, num_bb_notes, err = 0; bb_info = (basic_block *) xcalloc (max_uid, sizeof (basic_block)); - /* First pass check head/end pointers and set bb_info array used by - later passes. */ for (i = n_basic_blocks - 1; i >= 0; i--) { basic_block bb = BASIC_BLOCK (i); + rtx head = bb->head; + rtx end = bb->end; - /* Check the head pointer and make sure that it is pointing into - insn list. */ - for (x = rtx_first; x != NULL_RTX; x = NEXT_INSN (x)) - if (x == bb->head) + /* Verify the end of the basic block is in the INSN chain. */ + for (x = last_head; x != NULL_RTX; x = PREV_INSN (x)) + if (x == end) break; if (!x) { - error ("Head insn %d for block %d not found in the insn stream.", - INSN_UID (bb->head), bb->index); + error ("End insn %d for block %d not found in the insn stream.", + INSN_UID (end), bb->index); err = 1; } - /* Check the end pointer and make sure that it is pointing into - insn list. */ - for (x = bb->head; x != NULL_RTX; x = NEXT_INSN (x)) + /* Work backwards from the end to the head of the basic block + to verify the head is in the RTL chain. */ + for ( ; x != NULL_RTX; x = PREV_INSN (x)) { + /* While walking over the insn chain, verify insns appear + in only one basic block and initialize the BB_INFO array + used by other passes. */ if (bb_info[INSN_UID (x)] != NULL) { error ("Insn %d is in multiple basic blocks (%d and %d)", @@ -6378,15 +6381,17 @@ verify_flow_info () } bb_info[INSN_UID (x)] = bb; - if (x == bb->end) + if (x == head) break; } if (!x) { - error ("End insn %d for block %d not found in the insn stream.", - INSN_UID (bb->end), bb->index); + error ("Head insn %d for block %d not found in the insn stream.", + INSN_UID (head), bb->index); err = 1; } + + last_head = x; } /* Now check the basic blocks (boundaries etc.) */ -- 2.7.4