Commit c699deeb 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
	PR bootstrap/55615
	* 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.

	* g++.dg/other/pr43631.C: New test.

From-SVN: r194392
parent 68a9738a
2012-12-11 Jakub Jelinek <jakub@redhat.com>
PR middle-end/43631
PR bootstrap/55615
* 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.
* sanitizer.def: Add comment about importance of ordering of
BUILT_IN_ASAN_REPORT* builtins.
* cfgcleanup.c (old_insns_match_p): Don't cross-jump __asan_report_*
2012-12-11 Jakub Jelinek <jakub@redhat.com>
PR middle-end/43631
PR bootstrap/55615
* g++.dg/other/pr43631.C: New test.
2012-12-11 Richard Biener <rguenther@suse.de>
PR tree-optimization/55079
......
// PR middle-end/43631
// { dg-do compile }
// { dg-options "-g -O2" }
// { dg-additional-options "-mtune=atom" { target i?86-*-* x86_64-*-* } }
typedef void (*T) ();
struct S { T t; };
void bar (T) __attribute__ ((__noreturn__));
S *p;
void
foo ()
{
try { bar (p->t); } catch (...) { throw 1; }
}
......@@ -8538,7 +8538,10 @@ emit_note_insn_var_location (void **varp, void *data)
if (where != EMIT_NOTE_BEFORE_INSN)
{
note = emit_note_after (NOTE_INSN_VAR_LOCATION, insn);
rtx after = 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)
NOTE_DURING_CALL_P (note) = true;
}
......@@ -8892,9 +8895,11 @@ next_non_note_insn_var_location (rtx insn)
while (insn)
{
insn = NEXT_INSN (insn);
if (insn == 0
|| !NOTE_P (insn)
|| NOTE_KIND (insn) != NOTE_INSN_VAR_LOCATION)
if (insn == 0)
break;
if (BARRIER_P (insn))
continue;
if (!NOTE_P (insn) || NOTE_KIND (insn) != NOTE_INSN_VAR_LOCATION)
break;
}
......@@ -8923,7 +8928,7 @@ emit_notes_in_bb (basic_block bb, dataflow_set *set)
dataflow_set_clear_at_call (set);
emit_notes_for_changes (insn, EMIT_NOTE_AFTER_CALL_INSN, set->vars);
{
rtx arguments = mo->u.loc, *p = &arguments, note;
rtx arguments = mo->u.loc, *p = &arguments, note, after;
while (*p)
{
XEXP (XEXP (*p, 0), 1)
......@@ -8947,7 +8952,10 @@ emit_notes_in_bb (basic_block bb, dataflow_set *set)
else
*p = XEXP (*p, 1);
}
note = emit_note_after (NOTE_INSN_CALL_ARG_LOCATION, insn);
after = 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;
/* If insn is BB_END of some bb, make sure the note
doesn't have BLOCK_FOR_INSN set. The notes don't
......
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