diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-12-11 10:41:44 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-12-11 10:41:44 +0000 |
commit | 95af3f4e2fca8def8ed973357a9c0d75b4caed94 (patch) | |
tree | fcc38e0c1bdfc18de6a84d5bc67899fcd21da610 /gcc/var-tracking.c | |
parent | 09c97583047eab0c0b9d16651dbe0b2b683a87f7 (diff) | |
download | gcc-95af3f4e2fca8def8ed973357a9c0d75b4caed94.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194392 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/var-tracking.c')
-rw-r--r-- | gcc/var-tracking.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index c35471c4a34..98ef1d4bbaa 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -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 |