mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-05 17:30:58 +08:00
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:
parent
90e7f69de5
commit
9eab67850b
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
109
gcc/cfgrtl.c
109
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)
|
||||
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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user