flow.c (delete_block): Delete the addr_vec along with the block.
authorRichard Henderson <rth@cygnus.com>
Sun, 19 Mar 2000 11:30:38 +0000 (03:30 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Sun, 19 Mar 2000 11:30:38 +0000 (03:30 -0800)
        * flow.c (delete_block): Delete the addr_vec along with the block.
        (flow_delete_insn): Decrement LABEL_NUSES when deleting insns that
        reference labels.

From-SVN: r32635

gcc/ChangeLog
gcc/flow.c

index 5f9babb94ddd57bafde45f21052364fe0f2857ff..cdaef9deb83cae852b7918d0314d00f8bb04031b 100644 (file)
@@ -1,3 +1,9 @@
+2000-03-19  Richard Henderson  <rth@cygnus.com>
+
+       * flow.c (delete_block): Delete the addr_vec along with the block.
+       (flow_delete_insn): Decrement LABEL_NUSES when deleting insns that
+       reference labels.
+
 2000-03-18  Mark Mitchell  <mark@codesourcery.com>
 
        * emit-rtl.c (remove_unncessary_notes): Check that all
index f0e5b5393ab31441cc90b2736756d04274482c95..79203d7a05097e55d542c9f904a14553dfe37357 100644 (file)
@@ -1853,7 +1853,7 @@ delete_block (b)
      basic_block b;
 {
   int deleted_handler = 0;
-  rtx insn, end;
+  rtx insn, end, tmp;
 
   /* If the head of this block is a CODE_LABEL, then it might be the
      label for an exception handler which can't be reached.
@@ -1902,11 +1902,22 @@ delete_block (b)
        }
     }
 
-  /* Selectively unlink the insn chain.  Include any BARRIER that may
-     follow the basic block.  */
-  end = next_nonnote_insn (b->end);
-  if (!end || GET_CODE (end) != BARRIER)
-    end = b->end;
+  /* Include any jump table following the basic block.  */
+  end = b->end;
+  if (GET_CODE (end) == JUMP_INSN
+      && (tmp = JUMP_LABEL (end)) != NULL_RTX
+      && (tmp = NEXT_INSN (tmp)) != NULL_RTX
+      && GET_CODE (tmp) == JUMP_INSN
+      && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
+         || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
+    end = tmp;
+
+  /* Include any barrier that may follow the basic block.  */
+  tmp = next_nonnote_insn (b->end);
+  if (tmp && GET_CODE (tmp) == BARRIER)
+    end = tmp;
+
+  /* Selectively delete the entire chain.  */
   flow_delete_insn_chain (insn, end);
 
  no_delete_insns:
@@ -1972,6 +1983,7 @@ flow_delete_insn (insn)
 {
   rtx prev = PREV_INSN (insn);
   rtx next = NEXT_INSN (insn);
+  rtx note;
 
   PREV_INSN (insn) = NULL_RTX;
   NEXT_INSN (insn) = NULL_RTX;
@@ -1991,6 +2003,10 @@ flow_delete_insn (insn)
   if (GET_CODE (insn) == JUMP_INSN && JUMP_LABEL (insn))
     LABEL_NUSES (JUMP_LABEL (insn))--;
 
+  /* Also if deleting an insn that references a label.  */
+  else if ((note = find_reg_note (insn, REG_LABEL, NULL_RTX)) != NULL_RTX)
+    LABEL_NUSES (XEXP (note, 0))--;
+
   return next;
 }