flow.c (life_analysis): After life analysis is complete...
authorJeffrey A Law <law@cygnus.com>
Wed, 16 May 2001 04:12:33 +0000 (04:12 +0000)
committerJeff Law <law@gcc.gnu.org>
Wed, 16 May 2001 04:12:33 +0000 (22:12 -0600)
        * 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.

From-SVN: r42131

gcc/ChangeLog
gcc/flow.c

index b624dbfcb2b0daf0f6cf360cba98cd9e8ae3601b..d0f8dfe744e593c23762557cd48b8736d50cdc81 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 96d2ad040a4fef2895d42d3550778ca1017470a2..d983ab5d24d9611323cb9c929d43128ce24435d1 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;