From fcde5c9ebf1a0e7d38b05dd684954f46e609bec4 Mon Sep 17 00:00:00 2001 From: steven Date: Sat, 27 Jan 2007 14:48:02 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121231 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 15 ++++++++ gcc/cfgcleanup.c | 10 ------ gcc/cfgrtl.c | 107 +++++++++++++++++++++++++++++++------------------------ gcc/tracer.c | 1 - 4 files changed, 76 insertions(+), 57 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2b169ff..99fcc33 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2007-01-27 Steven Bosscher + + * 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 * config/i386/i386.c (ix86_swap_binary_operands_p): New helper diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index 7f2abf1..d7c29b7 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -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; } 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; diff --git a/gcc/tracer.c b/gcc/tracer.c index c7bd2bd..4c8d063 100644 --- a/gcc/tracer.c +++ b/gcc/tracer.c @@ -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; } -- 2.7.4