Commit c3583c4a by Jakub Jelinek Committed by Jakub Jelinek

re PR target/55659 ([SH] Build failure with ICE in dwarf2out_var_location, at dwarf2out.c:20748)

	PR target/55659
	Revert
	2012-12-11  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/43631
	* var-tracking.c (emit_note_insn_var_location): If insn is followed
	by BARRIER, put note after the BARRIER.
	(next_non_note_insn_var_location): Skip over BARRIERs.
	(emit_notes_in_bb): If call is followed by BARRIER, put note after
	the BARRIER.

	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.

From-SVN: r194442
parent 57dab792
2012-12-12 Jakub Jelinek <jakub@redhat.com>
PR target/55659
Revert
2012-12-11 Jakub Jelinek <jakub@redhat.com>
PR middle-end/43631
* var-tracking.c (emit_note_insn_var_location): If insn is followed
by BARRIER, put note after the BARRIER.
(next_non_note_insn_var_location): Skip over BARRIERs.
(emit_notes_in_bb): If call is followed by BARRIER, put note after
the BARRIER.
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.
2012-12-12 Steven Bosscher <steven@gcc.gnu.org> 2012-12-12 Steven Bosscher <steven@gcc.gnu.org>
Jakub Jelinek <jakub@redhat.com> Jakub Jelinek <jakub@redhat.com>
...@@ -8538,10 +8538,7 @@ emit_note_insn_var_location (void **varp, void *data) ...@@ -8538,10 +8538,7 @@ emit_note_insn_var_location (void **varp, void *data)
if (where != EMIT_NOTE_BEFORE_INSN) if (where != EMIT_NOTE_BEFORE_INSN)
{ {
rtx after = insn; note = emit_note_after (NOTE_INSN_VAR_LOCATION, insn);
while (NEXT_INSN (after) && BARRIER_P (NEXT_INSN (after)))
after = NEXT_INSN (after);
note = emit_note_after (NOTE_INSN_VAR_LOCATION, after);
if (where == EMIT_NOTE_AFTER_CALL_INSN) if (where == EMIT_NOTE_AFTER_CALL_INSN)
NOTE_DURING_CALL_P (note) = true; NOTE_DURING_CALL_P (note) = true;
} }
...@@ -8560,30 +8557,9 @@ emit_note_insn_var_location (void **varp, void *data) ...@@ -8560,30 +8557,9 @@ 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);
...@@ -8895,11 +8871,9 @@ next_non_note_insn_var_location (rtx insn) ...@@ -8895,11 +8871,9 @@ next_non_note_insn_var_location (rtx insn)
while (insn) while (insn)
{ {
insn = NEXT_INSN (insn); insn = NEXT_INSN (insn);
if (insn == 0) if (insn == 0
break; || !NOTE_P (insn)
if (BARRIER_P (insn)) || NOTE_KIND (insn) != NOTE_INSN_VAR_LOCATION)
continue;
if (!NOTE_P (insn) || NOTE_KIND (insn) != NOTE_INSN_VAR_LOCATION)
break; break;
} }
...@@ -8928,7 +8902,7 @@ emit_notes_in_bb (basic_block bb, dataflow_set *set) ...@@ -8928,7 +8902,7 @@ emit_notes_in_bb (basic_block bb, dataflow_set *set)
dataflow_set_clear_at_call (set); dataflow_set_clear_at_call (set);
emit_notes_for_changes (insn, EMIT_NOTE_AFTER_CALL_INSN, set->vars); emit_notes_for_changes (insn, EMIT_NOTE_AFTER_CALL_INSN, set->vars);
{ {
rtx arguments = mo->u.loc, *p = &arguments, note, after; rtx arguments = mo->u.loc, *p = &arguments, note;
while (*p) while (*p)
{ {
XEXP (XEXP (*p, 0), 1) XEXP (XEXP (*p, 0), 1)
...@@ -8952,21 +8926,8 @@ emit_notes_in_bb (basic_block bb, dataflow_set *set) ...@@ -8952,21 +8926,8 @@ emit_notes_in_bb (basic_block bb, dataflow_set *set)
else else
*p = XEXP (*p, 1); *p = XEXP (*p, 1);
} }
after = insn; note = emit_note_after (NOTE_INSN_CALL_ARG_LOCATION, insn);
while (NEXT_INSN (after) && BARRIER_P (NEXT_INSN (after)))
after = NEXT_INSN (after);
note = emit_note_after (NOTE_INSN_CALL_ARG_LOCATION, after);
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