* haifa-sched.c (restore_bb_notes): Clear bb field of the notes
authorrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 6 Jun 2007 14:46:34 +0000 (14:46 +0000)
committerrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 6 Jun 2007 14:46:34 +0000 (14:46 +0000)
emited outside of basic block.
* cfgbuild.c (find_bb_boundaries): Clear bb field for insns between
the created blocks.
* rtl.h (delete_insn_chain): Declaration changed.
* cfgrtl.c (delete_insn_chain): Add option to clear bb field for
non-removed insns.
(rtl_delete_block, rtl_merge_blocks): Pass true to delete_insn_chain.
(delete_insn_chain_and_edges, try_redirect_by_replacing_jump,
rtl_tidy_fallthru_edge, cfg_layout_merge_blocks): Pass false
to delete_insn_chain.
(rtl_verify_flow_info_1): Verify that the insns in header and footer
do not have bb field set.
(rtl_verify_flow_info): Verify that insns between basic blocks do not
have bb field set.
* recog.c (peephole2_optimize): Add argument to delete_insn_chain call.
* cfgcleanup.c (try_optimize_cfg): Ditto.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@125492 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cfgbuild.c
gcc/cfgcleanup.c
gcc/cfgrtl.c
gcc/haifa-sched.c
gcc/recog.c
gcc/rtl.h

index 0d19d01..2409729 100644 (file)
@@ -1,3 +1,23 @@
+2007-06-06  Zdenek Dvorak  <dvorakz@suse.cz>
+
+       * haifa-sched.c (restore_bb_notes): Clear bb field of the notes
+       emited outside of basic block.
+       * cfgbuild.c (find_bb_boundaries): Clear bb field for insns between
+       the created blocks.
+       * rtl.h (delete_insn_chain): Declaration changed.
+       * cfgrtl.c (delete_insn_chain): Add option to clear bb field for
+       non-removed insns.
+       (rtl_delete_block, rtl_merge_blocks): Pass true to delete_insn_chain.
+       (delete_insn_chain_and_edges, try_redirect_by_replacing_jump,
+       rtl_tidy_fallthru_edge, cfg_layout_merge_blocks): Pass false 
+       to delete_insn_chain.
+       (rtl_verify_flow_info_1): Verify that the insns in header and footer
+       do not have bb field set.
+       (rtl_verify_flow_info): Verify that insns between basic blocks do not
+       have bb field set.
+       * recog.c (peephole2_optimize): Add argument to delete_insn_chain call.
+       * cfgcleanup.c (try_optimize_cfg): Ditto.
+
 2007-06-06  Thomas Neumann  <tneumann@users.sourceforge.net>
 
        * lambda-code.c (struct lambda_lattice_s): Add a name to the struct.
index e564e8b..cb216af 100644 (file)
@@ -630,7 +630,7 @@ find_bb_boundaries (basic_block bb)
 {
   basic_block orig_bb = bb;
   rtx insn = BB_HEAD (bb);
-  rtx end = BB_END (bb);
+  rtx end = BB_END (bb), x;
   rtx table;
   rtx flow_transfer_insn = NULL_RTX;
   edge fallthru = NULL;
@@ -651,7 +651,16 @@ find_bb_boundaries (basic_block bb)
        {
          fallthru = split_block (bb, PREV_INSN (insn));
          if (flow_transfer_insn)
-           BB_END (bb) = flow_transfer_insn;
+           {
+             BB_END (bb) = flow_transfer_insn;
+
+             /* Clean up the bb field for the insns between the blocks.  */
+             for (x = NEXT_INSN (flow_transfer_insn);
+                  x != BB_HEAD (fallthru->dest);
+                  x = NEXT_INSN (x))
+               if (!BARRIER_P (x))
+                 set_block_for_insn (x, NULL);
+           }
 
          bb = fallthru->dest;
          remove_edge (fallthru);
@@ -666,6 +675,14 @@ find_bb_boundaries (basic_block bb)
        {
          fallthru = split_block (bb, PREV_INSN (insn));
          BB_END (bb) = flow_transfer_insn;
+
+         /* Clean up the bb field for the insns between the blocks.  */
+         for (x = NEXT_INSN (flow_transfer_insn);
+              x != BB_HEAD (fallthru->dest);
+              x = NEXT_INSN (x))
+           if (!BARRIER_P (x))
+             set_block_for_insn (x, NULL);
+
          bb = fallthru->dest;
          remove_edge (fallthru);
          flow_transfer_insn = NULL_RTX;
@@ -682,7 +699,18 @@ find_bb_boundaries (basic_block bb)
      return and barrier, or possibly other sequence not behaving like
      ordinary jump, we need to take care and move basic block boundary.  */
   if (flow_transfer_insn)
-    BB_END (bb) = flow_transfer_insn;
+    {
+      BB_END (bb) = flow_transfer_insn;
+
+      /* Clean up the bb field for the insns that do not belong to BB.  */
+      x = flow_transfer_insn;
+      while (x != end)
+       {
+         x = NEXT_INSN (x);
+         if (!BARRIER_P (x))
+           set_block_for_insn (x, NULL);
+       }
+    }
 
   /* We've possibly replaced the conditional jump by conditional jump
      followed by cleanup at fallthru edge, so the outgoing edges may
index 54d2321..dafdcd5 100644 (file)
@@ -1999,7 +1999,7 @@ try_optimize_cfg (int mode)
                {
                  rtx label = BB_HEAD (b);
 
-                 delete_insn_chain (label, label);
+                 delete_insn_chain (label, label, false);
                  /* In the case label is undeletable, move it after the
                     BASIC_BLOCK note.  */
                  if (NOTE_KIND (BB_HEAD (b)) == NOTE_INSN_DELETED_LABEL)
index 11deebc..5655eef 100644 (file)
@@ -195,10 +195,11 @@ delete_insn_and_edges (rtx insn)
 }
 
 /* Unlink a chain of insns between START and FINISH, leaving notes
-   that must be paired.  */
+   that must be paired.  If CLEAR_BB is true, we set bb field for
+   insns that cannot be removed to NULL.  */
 
 void
-delete_insn_chain (rtx start, rtx finish)
+delete_insn_chain (rtx start, rtx finish, bool clear_bb)
 {
   rtx next;
 
@@ -213,6 +214,9 @@ delete_insn_chain (rtx start, rtx finish)
       else
        next = delete_insn (start);
 
+      if (clear_bb && !INSN_DELETED_P (start))
+       set_block_for_insn (start, NULL);
+
       if (start == finish)
        break;
       start = next;
@@ -229,7 +233,7 @@ delete_insn_chain_and_edges (rtx first, rtx last)
       && BLOCK_FOR_INSN (last)
       && BB_END (BLOCK_FOR_INSN (last)) == last)
     purge = true;
-  delete_insn_chain (first, last);
+  delete_insn_chain (first, last, false);
   if (purge)
     purge_dead_edges (BLOCK_FOR_INSN (last));
 }
@@ -370,7 +374,8 @@ rtl_delete_block (basic_block b)
 
   /* Selectively delete the entire chain.  */
   BB_HEAD (b) = NULL;
-  delete_insn_chain (insn, end);
+  delete_insn_chain (insn, end, true);
+
   if (b->il.rtl->global_live_at_start)
     {
       FREE_REG_SET (b->il.rtl->global_live_at_start);
@@ -608,7 +613,7 @@ rtl_merge_blocks (basic_block a, basic_block b)
   /* Delete everything marked above as well as crap that might be
      hanging out between the two blocks.  */
   BB_HEAD (b) = NULL;
-  delete_insn_chain (del_first, del_last);
+  delete_insn_chain (del_first, del_last, true);
 
   /* Reassociate the insns of B with A.  */
   if (!b_empty)
@@ -745,7 +750,7 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
        {
          rtx insn = src->il.rtl->footer;
 
-         delete_insn_chain (kill_from, BB_END (src));
+         delete_insn_chain (kill_from, BB_END (src), false);
 
          /* Remove barriers but keep jumptables.  */
          while (insn)
@@ -765,7 +770,8 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
            }
        }
       else
-       delete_insn_chain (kill_from, PREV_INSN (BB_HEAD (target)));
+       delete_insn_chain (kill_from, PREV_INSN (BB_HEAD (target)),
+                          false);
     }
 
   /* If this already is simplejump, redirect it.  */
@@ -801,13 +807,13 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
                 INSN_UID (insn), INSN_UID (BB_END (src)));
 
 
-      delete_insn_chain (kill_from, insn);
+      delete_insn_chain (kill_from, insn, false);
 
       /* Recognize a tablejump that we are converting to a
         simple jump and remove its associated CODE_LABEL
         and ADDR_VEC or ADDR_DIFF_VEC.  */
       if (tablejump_p (insn, &label, &table))
-       delete_insn_chain (label, table);
+       delete_insn_chain (label, table, false);
 
       barrier = next_nonnote_insn (BB_END (src));
       if (!barrier || !BARRIER_P (barrier))
@@ -1217,7 +1223,7 @@ rtl_tidy_fallthru_edge (edge e)
 
   /* Selectively unlink the sequence.  */
   if (q != PREV_INSN (BB_HEAD (c)))
-    delete_insn_chain (NEXT_INSN (q), PREV_INSN (BB_HEAD (c)));
+    delete_insn_chain (NEXT_INSN (q), PREV_INSN (BB_HEAD (c)), false);
 
   e->flags |= EDGE_FALLTHRU;
 }
@@ -1715,6 +1721,23 @@ rtl_verify_flow_info_1 (void)
                   bb->index);
            err = 1;
          }
+
+      for (insn = bb->il.rtl->header; insn; insn = NEXT_INSN (insn))
+       if (!BARRIER_P (insn)
+           && BLOCK_FOR_INSN (insn) != NULL)
+         {
+           error ("insn %d in header of bb %d has non-NULL basic block",
+                  INSN_UID (insn), bb->index);
+           err = 1;
+         }
+      for (insn = bb->il.rtl->footer; insn; insn = NEXT_INSN (insn))
+       if (!BARRIER_P (insn)
+           && BLOCK_FOR_INSN (insn) != NULL)
+         {
+           error ("insn %d in footer of bb %d has non-NULL basic block",
+                  INSN_UID (insn), bb->index);
+           err = 1;
+         }
     }
 
   /* Now check the basic blocks (boundaries etc.) */
@@ -1918,10 +1941,21 @@ rtl_verify_flow_info (void)
       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;
+       {
+         /* Verify the end of the basic block is in the INSN chain.  */
+         if (x == end)
+           break;
+
+         /* And that the code outside of basic blocks has NULL bb field.  */
+       if (!BARRIER_P (x)
+           && BLOCK_FOR_INSN (x) != NULL)
+         {
+           error ("insn %d outside of basic blocks has non-NULL bb field",
+                  INSN_UID (x));
+           err = 1;
+         }
+       }
 
       if (!x)
        {
@@ -1955,7 +1989,7 @@ rtl_verify_flow_info (void)
          err = 1;
        }
 
-      last_head = x;
+      last_head = PREV_INSN (x);
 
       FOR_EACH_EDGE (e, ei, bb->succs)
        if (e->flags & EDGE_FALLTHRU)
@@ -2000,6 +2034,18 @@ rtl_verify_flow_info (void)
        }
     }
 
+  for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
+    {
+      /* Check that the code before the first basic block has NULL
+        bb field.  */
+      if (!BARRIER_P (x)
+         && BLOCK_FOR_INSN (x) != NULL)
+       {
+         error ("insn %d outside of basic blocks has non-NULL bb field",
+                INSN_UID (x));
+         err = 1;
+       }
+    }
   free (bb_info);
 
   num_bb_notes = 0;
@@ -2550,7 +2596,7 @@ cfg_layout_merge_blocks (basic_block a, basic_block b)
       rtx first = BB_END (a), last;
 
       last = emit_insn_after_noloc (b->il.rtl->header, BB_END (a));
-      delete_insn_chain (NEXT_INSN (first), last);
+      delete_insn_chain (NEXT_INSN (first), last, false);
       b->il.rtl->header = NULL;
     }
 
index 5696db0..cf02644 100644 (file)
@@ -4080,8 +4080,9 @@ extend_bb (void)
          /* Don't emit a NOTE if it would end up before a BARRIER.  */
          && !BARRIER_P (NEXT_INSN (insn))))
     {
-      emit_note_after (NOTE_INSN_DELETED, insn);
-      /* Make insn to appear outside BB.  */
+      rtx note = emit_note_after (NOTE_INSN_DELETED, insn);
+      /* Make insn appear outside BB.  */
+      set_block_for_insn (note, NULL);
       BB_END (EXIT_BLOCK_PTR->prev_bb) = insn;
     }
 }
index 1b81704..19b6cb2 100644 (file)
@@ -3214,7 +3214,7 @@ peephole2_optimize (void)
                  try = emit_insn_after_setloc (try, peep2_insn_data[i].insn,
                                                INSN_LOCATOR (peep2_insn_data[i].insn));
                  before_try = PREV_INSN (insn);
-                 delete_insn_chain (insn, peep2_insn_data[i].insn);
+                 delete_insn_chain (insn, peep2_insn_data[i].insn, false);
 
                  /* Re-insert the EH_REGION notes.  */
                  if (note || (was_call && nonlocal_goto_handler_labels))
index 61c40f5..2934eab 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2062,7 +2062,7 @@ extern rtx emit (rtx);
 extern rtx delete_insn (rtx);
 extern rtx entry_of_function (void);
 extern void emit_insn_at_entry (rtx);
-extern void delete_insn_chain (rtx, rtx);
+extern void delete_insn_chain (rtx, rtx, bool);
 extern rtx unlink_insn_chain (rtx, rtx);
 extern rtx delete_insn_and_edges (rtx);
 extern void delete_insn_chain_and_edges (rtx, rtx);