OSDN Git Service

* flow.c (life_analysis): After life analysis is complete, do
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 16 May 2001 04:12:33 +0000 (04:12 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 16 May 2001 04:12:33 +0000 (04:12 +0000)
        an optional scan over insns looking for REG_LABEL notes that
        reference a deleted label.
        (propagate_block_delete_insn): Verify INOTE is a CODE_LABEL
        before peeking at LABEL_NUSES.

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

gcc/ChangeLog
gcc/flow.c

index b624dbf..d0f8dfe 100644 (file)
@@ -1,3 +1,11 @@
+Tue May 15 22:14:09 2001  Jeffrey A Law  (law@cygnus.com)
+
+       * flow.c (life_analysis): After life analysis is complete, do
+       an optional scan over insns looking for REG_LABEL notes that
+       reference a deleted label.
+       (propagate_block_delete_insn): Verify INOTE is a CODE_LABEL
+       before peeking at LABEL_NUSES.
+
 2001-05-15  Richard Henderson  <rth@redhat.com>
 
        * unwind-sjlj.c (_Unwind_GetDataRelBase): New.
index 96d2ad0..d983ab5 100644 (file)
@@ -2854,6 +2854,21 @@ life_analysis (f, file, flags)
     dump_flow_info (file);
 
   free_basic_block_vars (1);
+
+#ifdef ENABLE_CHECKING
+  {
+    rtx insn;
+
+    /* Search for any REG_LABEL notes whih reference deleted labels.  */
+    for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
+      {
+       rtx inote = find_reg_note (insn, REG_LABEL, NULL_RTX);
+
+       if (inote && GET_CODE (inote) == NOTE_INSN_DELETED_LABEL)
+         abort ();
+      }
+  }
+#endif
 }
 
 /* A subroutine of verify_wide_reg, called through for_each_rtx.
@@ -3631,9 +3646,18 @@ propagate_block_delete_insn (bb, insn)
   /* If the insn referred to a label, and that label was attached to
      an ADDR_VEC, it's safe to delete the ADDR_VEC.  In fact, it's
      pretty much mandatory to delete it, because the ADDR_VEC may be
-     referencing labels that no longer exist.  */
+     referencing labels that no longer exist.
+
+     INSN may reference a deleted label, particularly when a jump
+     table has been optimized into a direct jump.  There's no
+     real good way to fix up the reference to the deleted label
+     when the label is deleted, so we just allow it here.
+
+     After dead code elimination is complete, we do search for
+     any REG_LABEL notes which reference deleted labels as a
+     sanity check.  */
 
-  if (inote)
+  if (inote && GET_CODE (inote) == CODE_LABEL)
     {
       rtx label = XEXP (inote, 0);
       rtx next;