OSDN Git Service

* tracer.c (rest_of_handle_tracer): We already cleaned
authorsteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 27 Jan 2007 14:48:02 +0000 (14:48 +0000)
committersteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 27 Jan 2007 14:48:02 +0000 (14:48 +0000)
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
gcc/cfgcleanup.c
gcc/cfgrtl.c
gcc/tracer.c

index 2b169ff..99fcc33 100644 (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
index 7f2abf1..d7c29b7 100644 (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;
 }
 
index c6cc08f..4aaedbe 100644 (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)
-       {
-         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;
 
index c7bd2bd..4c8d063 100644 (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;
 }