PR middle-end/43631
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 6 Dec 2012 14:37:59 +0000 (14:37 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 6 Dec 2012 14:37:59 +0000 (14:37 +0000)
* var-tracking.c (emit_note_insn_var_location, emit_notes_in_bb):
Clear BLOCK_FOR_INSN on notes emitted in between basic blocks,
don't adjust BB_END when inserting note after BB_END of some bb.

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

gcc/ChangeLog
gcc/var-tracking.c

index 348a6f6..30bb3f9 100644 (file)
@@ -1,5 +1,10 @@
 2012-12-06  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/43631
+       * var-tracking.c (emit_note_insn_var_location, emit_notes_in_bb):
+       Clear BLOCK_FOR_INSN on notes emitted in between basic blocks,
+       don't adjust BB_END when inserting note after BB_END of some bb.
+
        PR c++/55137
        * fold-const.c (fold_binary_loc) <associate>: Don't introduce
        TREE_OVERFLOW through reassociation.  If type doesn't have defined
index f5ba115..c35471c 100644 (file)
@@ -8557,9 +8557,30 @@ emit_note_insn_var_location (void **varp, void *data)
              || NOTE_KIND (insn) == NOTE_INSN_CALL_ARG_LOCATION))
        note = emit_note_after (NOTE_INSN_VAR_LOCATION, insn);
       else
-       note = emit_note_before (NOTE_INSN_VAR_LOCATION, insn);
+       {
+         note = emit_note_before (NOTE_INSN_VAR_LOCATION, insn);
+         /* If insn is BB_HEAD of some bb, make sure the note
+            doesn't have BLOCK_FOR_INSN set.  The notes don't
+            extend the extents of a basic block, and e.g. notes emitted
+            for differences in between basic blocks should live in between
+            the basic blocks.  */
+         if (BLOCK_FOR_INSN (note)
+             && BB_HEAD (BLOCK_FOR_INSN (note)) == insn)
+           set_block_for_insn (note, NULL);
+       }
     }
   NOTE_VAR_LOCATION (note) = note_vl;
+  /* If insn is BB_END of some bb, make sure the note
+     doesn't have BLOCK_FOR_INSN set.  The notes don't
+     extend the extents of a basic block, and e.g. a noreturn
+     call can still be followed by NOTE_INSN_CALL_ARG_LOCATION.  */
+  if (BLOCK_FOR_INSN (note)
+      && BB_END (BLOCK_FOR_INSN (note)) == note
+      && PREV_INSN (note) == insn)
+    {
+      BB_END (BLOCK_FOR_INSN (note)) = insn;
+      set_block_for_insn (note, NULL);
+    }
 
   set_dv_changed (var->dv, false);
   gcc_assert (var->in_changed_variables);
@@ -8928,6 +8949,16 @@ emit_notes_in_bb (basic_block bb, dataflow_set *set)
                }
              note = emit_note_after (NOTE_INSN_CALL_ARG_LOCATION, insn);
              NOTE_VAR_LOCATION (note) = arguments;
+             /* If insn is BB_END of some bb, make sure the note
+                doesn't have BLOCK_FOR_INSN set.  The notes don't
+                extend the extents of a basic block, and e.g. a noreturn
+                call can still be followed by NOTE_INSN_CALL_ARG_LOCATION.  */
+             if (BLOCK_FOR_INSN (note)
+                 && BB_END (BLOCK_FOR_INSN (note)) == note)
+               {
+                 BB_END (BLOCK_FOR_INSN (note)) = insn;
+                 set_block_for_insn (note, NULL);
+               }
            }
            break;