summaryrefslogtreecommitdiff
path: root/gcc/var-tracking.c
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2012-12-11 10:41:44 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2012-12-11 10:41:44 +0000
commit95af3f4e2fca8def8ed973357a9c0d75b4caed94 (patch)
treefcc38e0c1bdfc18de6a84d5bc67899fcd21da610 /gcc/var-tracking.c
parent09c97583047eab0c0b9d16651dbe0b2b683a87f7 (diff)
downloadgcc-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.c20
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