aboutsummaryrefslogtreecommitdiff
path: root/gcc/cfgrtl.c
diff options
context:
space:
mode:
authorSteven Bosscher <steven@gcc.gnu.org>2007-01-27 14:48:02 +0000
committerSteven Bosscher <steven@gcc.gnu.org>2007-01-27 14:48:02 +0000
commit9eab67850ba2faf07c1bb3e4f12b4754003066cc (patch)
treec09108de229652b098e73519159d1d90297a51d9 /gcc/cfgrtl.c
parent90e7f69de54c68a7de7966158428bfb4232fc07e (diff)
downloadgcc-9eab67850ba2faf07c1bb3e4f12b4754003066cc.zip
gcc-9eab67850ba2faf07c1bb3e4f12b4754003066cc.tar.gz
gcc-9eab67850ba2faf07c1bb3e4f12b4754003066cc.tar.bz2
tracer.c (rest_of_handle_tracer): We already cleaned up the CFG in tracer() so don't do it here again.
* tracer.c (rest_of_handle_tracer): We already cleaned up the CFG in tracer() so don't do it here again. * cfgcleanup.c (rest_of_handle_jump2): Don't repeat cleanup_cfg here, either. And don't call renumber_insns. * cfgrtl.c (rtl_verify_flow_info_1): Don't verify that BB_END and BB_HEAD are in the insn stream here. Instead make sure that BB_INSN is valid on all insns. Also, do check here that there are no pending branch predictions... (rtl_verify_flow_info): ...instead of doing it here. Checks for BB_END and BB_HEAD moved from rtl_verify_flow_info_1 to here. From-SVN: r121231
Diffstat (limited to 'gcc/cfgrtl.c')
-rw-r--r--gcc/cfgrtl.c107
1 files changed, 61 insertions, 46 deletions
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index c6cc08f..4aaedbe 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -1676,13 +1676,14 @@ get_last_bb_insn (basic_block bb)
Currently it does following checks:
- - test head/end pointers
- overlapping of basic blocks
+ - insns with wrong BLOCK_FOR_INSN pointers
- headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
- tails of basic blocks (ensure that boundary is necessary)
- scans body of the basic block for JUMP_INSN, CODE_LABEL
and NOTE_INSN_BASIC_BLOCK
- verify that no fall_thru edge crosses hot/cold partition boundaries
+ - verify that there are no pending RTL branch predictions
In future it can be extended check a lot of other stuff as well
(reachability of basic blocks, life information, etc. etc.). */
@@ -1690,24 +1691,14 @@ get_last_bb_insn (basic_block bb)
static int
rtl_verify_flow_info_1 (void)
{
- const int max_uid = get_max_uid ();
- rtx last_head = get_last_insn ();
- basic_block *bb_info;
rtx x;
int err = 0;
basic_block bb;
- bb_info = XCNEWVEC (basic_block, max_uid);
-
+ /* Check the general integrity of the basic blocks. */
FOR_EACH_BB_REVERSE (bb)
{
- rtx head = BB_HEAD (bb);
- rtx end = BB_END (bb);
-
- /* 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;
+ rtx insn;
if (!(bb->flags & BB_RTL))
{
@@ -1715,40 +1706,21 @@ rtl_verify_flow_info_1 (void)
err = 1;
}
- if (!x)
- {
- error ("end insn %d for block %d not found in the insn stream",
- INSN_UID (end), bb->index);
- err = 1;
- }
-
- /* 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)",
- INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
- err = 1;
- }
-
- bb_info[INSN_UID (x)] = bb;
+ FOR_BB_INSNS (bb, insn)
+ if (BLOCK_FOR_INSN (insn) != bb)
+ {
+ error ("insn %d basic block pointer is %d, should be %d",
+ INSN_UID (insn),
+ BLOCK_FOR_INSN (insn) ? BLOCK_FOR_INSN (insn)->index : 0,
+ bb->index);
+ err = 1;
+ }
- if (x == head)
- break;
- }
- if (!x)
+ if (bb->predictions)
{
- error ("head insn %d for block %d not found in the insn stream",
- INSN_UID (head), bb->index);
+ error ("bb prediction set for block %d, but it is not used in RTL land", bb->index);
err = 1;
}
-
- last_head = x;
}
/* Now check the basic blocks (boundaries etc.) */
@@ -1916,7 +1888,6 @@ rtl_verify_flow_info_1 (void)
}
/* Clean up. */
- free (bb_info);
return err;
}
@@ -1925,31 +1896,73 @@ rtl_verify_flow_info_1 (void)
Currently it does following checks:
- all checks of rtl_verify_flow_info_1
+ - test head/end pointers
- check that all insns are in the basic blocks
(except the switch handling code, barriers and notes)
- check that all returns are followed by barriers
- check that all fallthru edge points to the adjacent blocks. */
+
static int
rtl_verify_flow_info (void)
{
basic_block bb;
int err = rtl_verify_flow_info_1 ();
rtx x;
+ rtx last_head = get_last_insn ();
+ basic_block *bb_info;
int num_bb_notes;
const rtx rtx_first = get_insns ();
basic_block last_bb_seen = ENTRY_BLOCK_PTR, curr_bb = NULL;
+ const int max_uid = get_max_uid ();
+
+ bb_info = XCNEWVEC (basic_block, max_uid);
FOR_EACH_BB_REVERSE (bb)
{
edge e;
edge_iterator ei;
+ rtx head = BB_HEAD (bb);
+ rtx end = BB_END (bb);
- if (bb->predictions)
+ /* 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 ("end insn %d for block %d not found in the insn stream",
+ INSN_UID (end), bb->index);
+ err = 1;
+ }
+
+ /* 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))
{
- error ("bb prediction set for block %i, but it is not used in RTL land", bb->index);
+ /* While walking over the insn chain, verify insns appear
+ in only one basic block. */
+ if (bb_info[INSN_UID (x)] != NULL)
+ {
+ error ("insn %d is in multiple basic blocks (%d and %d)",
+ INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
+ err = 1;
+ }
+
+ bb_info[INSN_UID (x)] = bb;
+
+ if (x == head)
+ break;
+ }
+ if (!x)
+ {
+ error ("head insn %d for block %d not found in the insn stream",
+ INSN_UID (head), bb->index);
err = 1;
}
+ last_head = x;
+
FOR_EACH_EDGE (e, ei, bb->succs)
if (e->flags & EDGE_FALLTHRU)
break;
@@ -1994,6 +2007,8 @@ rtl_verify_flow_info (void)
}
}
+ free (bb_info);
+
num_bb_notes = 0;
last_bb_seen = ENTRY_BLOCK_PTR;