re PR rtl-optimization/56131 (gcc.dg/pr56035.c ICEs gcc on sparc-linux)
authorTom de Vries <tom@codesourcery.com>
Wed, 6 Feb 2013 08:53:32 +0000 (08:53 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Wed, 6 Feb 2013 08:53:32 +0000 (08:53 +0000)
2013-02-06  Tom de Vries  <tom@codesourcery.com>

PR rtl-optimization/56131
* cfgrtl.c (delete_insn): Use NOTE_BASIC_BLOCK instead of BLOCK_FOR_INSN
to get the bb of a NOTE_INSN_BASIC_BLOCK.  Handle the case that the bb
of the label is NULL.  Add comment.

From-SVN: r195784

gcc/ChangeLog
gcc/cfgrtl.c

index ffe1af3..44e77f9 100644 (file)
@@ -1,3 +1,10 @@
+2013-02-06  Tom de Vries  <tom@codesourcery.com>
+
+       PR rtl-optimization/56131
+       * cfgrtl.c (delete_insn): Use NOTE_BASIC_BLOCK instead of BLOCK_FOR_INSN
+       to get the bb of a NOTE_INSN_BASIC_BLOCK.  Handle the case that the bb
+       of the label is NULL.  Add comment.
+
 2013-02-05  Jakub Jelinek  <jakub@redhat.com>
 
        * tree.h (struct tree_decl_with_vis): Remove thread_local field.
index ba07f89..c6ed44f 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 = BLOCK_FOR_INSN (insn);
+         basic_block bb, label_bb = BLOCK_FOR_INSN (insn);
          rtx bb_note = NEXT_INSN (insn);
 
          really_delete = false;
@@ -143,10 +143,16 @@ delete_insn (rtx insn)
          NOTE_KIND (insn) = NOTE_INSN_DELETED_LABEL;
          NOTE_DELETED_LABEL_NAME (insn) = name;
 
-         if (bb_note != NULL_RTX && NOTE_INSN_BASIC_BLOCK_P (bb_note)
-             && BLOCK_FOR_INSN (bb_note) == bb)
+         /* 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.  */
+         if (bb_note != NULL_RTX
+             && NOTE_INSN_BASIC_BLOCK_P (bb_note)
+             && (label_bb == NOTE_BASIC_BLOCK (bb_note)
+                 || label_bb == NULL))
            {
              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;