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
This commit is contained in:
Steven Bosscher 2007-01-27 14:48:02 +00:00
parent 90e7f69de5
commit 9eab67850b
4 changed files with 77 additions and 58 deletions

View File

@ -1,3 +1,18 @@
2007-01-27 Steven Bosscher <steven@gcc.gnu.org>
* 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.
2007-01-26 Roger Sayle <roger@eyesopen.com>
* config/i386/i386.c (ix86_swap_binary_operands_p): New helper

View File

@ -2318,16 +2318,6 @@ rest_of_handle_jump2 (void)
dump_flow_info (dump_file, dump_flags);
cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0)
| (flag_thread_jumps ? CLEANUP_THREADING : 0));
if (optimize)
cleanup_cfg (CLEANUP_EXPENSIVE);
/* Jump optimization, and the removal of NULL pointer checks, may
have reduced the number of instructions substantially. CSE, and
future passes, allocate arrays whose dimensions involve the
maximum instruction UID, so if we can reduce the maximum UID
we'll save big on memory. */
renumber_insns ();
return 0;
}

View File

@ -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)
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 (bb->predictions)
{
error ("end insn %d for block %d not found in the insn stream",
INSN_UID (end), bb->index);
error ("bb prediction set for block %d, but it is not used in RTL land", 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;
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;
}
/* 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 ("bb prediction set for block %i, but it is not used in RTL land", bb->index);
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. */
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;

View File

@ -393,7 +393,6 @@ rest_of_handle_tracer (void)
if (dump_file)
dump_flow_info (dump_file, dump_flags);
tracer (0);
cleanup_cfg (CLEANUP_EXPENSIVE);
reg_scan (get_insns (), max_reg_num ());
return 0;
}