re PR rtl-optimization/56131 (gcc.dg/pr56035.c ICEs gcc on sparc-linux)
authorTom de Vries <tom@codesourcery.com>
Mon, 25 Feb 2013 11:50:25 +0000 (11:50 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Mon, 25 Feb 2013 11:50:25 +0000 (11:50 +0000)
2013-02-25  Tom de Vries  <tom@codesourcery.com>

PR rtl-optimization/56131
* insn-notes.def (INSN_NOTE_BASIC_BLOCK): Update comment.
* cfgrtl.c (delete_insn): Don't reorder NOTE_INSN_DELETED_LABEL and
NOTE_INSN_BASIC_BLOCK if BLOCK_FOR_INSN == NULL.

From-SVN: r196255

gcc/ChangeLog
gcc/cfgrtl.c
gcc/insn-notes.def

index 7b495e7..2d81aa5 100644 (file)
@@ -1,3 +1,10 @@
+2013-02-25  Tom de Vries  <tom@codesourcery.com>
+
+       PR rtl-optimization/56131
+       * insn-notes.def (INSN_NOTE_BASIC_BLOCK): Update comment.
+       * cfgrtl.c (delete_insn): Don't reorder NOTE_INSN_DELETED_LABEL and
+       NOTE_INSN_BASIC_BLOCK if BLOCK_FOR_INSN == NULL.
+
 2013-02-25  Tobias Burnus  <burnus@net-b.de>
 
        * doc/invoke.texi (-fsanitize=): Move from optimization
index c6ed44f..ec1ba9a 100644 (file)
@@ -135,7 +135,7 @@ delete_insn (rtx insn)
       if (! can_delete_label_p (insn))
        {
          const char *name = LABEL_NAME (insn);
-         basic_block bb, label_bb = BLOCK_FOR_INSN (insn);
+         basic_block bb = BLOCK_FOR_INSN (insn);
          rtx bb_note = NEXT_INSN (insn);
 
          really_delete = false;
@@ -144,15 +144,13 @@ delete_insn (rtx insn)
          NOTE_DELETED_LABEL_NAME (insn) = name;
 
          /* If the note following the label starts a basic block, and the
-            label is a member of the same basic block, interchange the two.
-            If the label is not marked with a bb, assume it's the same bb.  */
+            label is a member of the same basic block, interchange the two.  */
          if (bb_note != NULL_RTX
              && NOTE_INSN_BASIC_BLOCK_P (bb_note)
-             && (label_bb == NOTE_BASIC_BLOCK (bb_note)
-                 || label_bb == NULL))
+             && bb != NULL
+             && bb == BLOCK_FOR_INSN (bb_note))
            {
              reorder_insns_nobb (insn, insn, bb_note);
-             bb = NOTE_BASIC_BLOCK (bb_note);
              BB_HEAD (bb) = bb_note;
              if (BB_END (bb) == bb_note)
                BB_END (bb) = insn;
index 9c1523e..1a9883c 100644 (file)
@@ -70,7 +70,9 @@ INSN_NOTE (CALL_ARG_LOCATION)
 
 /* Record the struct for the following basic block.  Uses
    NOTE_BASIC_BLOCK.  FIXME: Redundant with the basic block pointer
-   now included in every insn.  */
+   now included in every insn.  NOTE: If there's no CFG anymore, in other words,
+   if BLOCK_FOR_INSN () == NULL, NOTE_BASIC_BLOCK cannot be considered reliable
+   anymore.  */
 INSN_NOTE (BASIC_BLOCK)
 
 /* Mark the inflection point in the instruction stream where we switch