OSDN Git Service

PR fortran/32550
[pf3gnuchains/gcc-fork.git] / gcc / cfgbuild.c
index 642efc3..cb216af 100644 (file)
@@ -402,7 +402,7 @@ make_edges (basic_block min, basic_block max, int update_p)
 
       while (insn
             && NOTE_P (insn)
-            && NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK)
+            && NOTE_KIND (insn) != NOTE_INSN_BASIC_BLOCK)
        insn = NEXT_INSN (insn);
 
       if (!insn)
@@ -469,22 +469,18 @@ find_basic_blocks_1 (rtx f)
       switch (code)
        {
        case NOTE:
-         {
-           int kind = NOTE_LINE_NUMBER (insn);
-
-           /* Look for basic block notes with which to keep the
-              basic_block_info pointers stable.  Unthread the note now;
-              we'll put it back at the right place in create_basic_block.
-              Or not at all if we've already found a note in this block.  */
-           if (kind == NOTE_INSN_BASIC_BLOCK)
-             {
-               if (bb_note == NULL_RTX)
-                 bb_note = insn;
-               else
-                 next = delete_insn (insn);
-             }
-           break;
-         }
+         /* Look for basic block notes with which to keep the
+            basic_block_info pointers stable.  Unthread the note now;
+            we'll put it back at the right place in create_basic_block.
+            Or not at all if we've already found a note in this block.  */
+         if (NOTE_INSN_BASIC_BLOCK_P (insn))
+           {
+             if (bb_note == NULL_RTX)
+               bb_note = insn;
+             else
+               next = delete_insn (insn);
+           }
+         break;
 
        case CODE_LABEL:
        case JUMP_INSN:
@@ -634,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;
@@ -655,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);
@@ -670,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;
@@ -686,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