Commit c8211767 by Jakub Jelinek Committed by Jakub Jelinek

re PR middle-end/43631 (var-tracking inserts notes with non-NULL BLOCK_FOR_INSN…

re PR middle-end/43631 (var-tracking inserts notes with non-NULL BLOCK_FOR_INSN in between basic blocks)

	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.

From-SVN: r194252
parent 7d9fe08e
2012-12-06 Jakub Jelinek <jakub@redhat.com> 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 PR c++/55137
* fold-const.c (fold_binary_loc) <associate>: Don't introduce * fold-const.c (fold_binary_loc) <associate>: Don't introduce
TREE_OVERFLOW through reassociation. If type doesn't have defined TREE_OVERFLOW through reassociation. If type doesn't have defined
...@@ -8557,9 +8557,30 @@ emit_note_insn_var_location (void **varp, void *data) ...@@ -8557,9 +8557,30 @@ emit_note_insn_var_location (void **varp, void *data)
|| NOTE_KIND (insn) == NOTE_INSN_CALL_ARG_LOCATION)) || NOTE_KIND (insn) == NOTE_INSN_CALL_ARG_LOCATION))
note = emit_note_after (NOTE_INSN_VAR_LOCATION, insn); note = emit_note_after (NOTE_INSN_VAR_LOCATION, insn);
else 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; 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); set_dv_changed (var->dv, false);
gcc_assert (var->in_changed_variables); gcc_assert (var->in_changed_variables);
...@@ -8928,6 +8949,16 @@ emit_notes_in_bb (basic_block bb, dataflow_set *set) ...@@ -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 = emit_note_after (NOTE_INSN_CALL_ARG_LOCATION, insn);
NOTE_VAR_LOCATION (note) = arguments; 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; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment