aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-12-07 21:57:53 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1994-12-07 21:57:53 -0500
commit38d8473fbb1188149c6824a92ddebf34f06a56f2 (patch)
tree825a17d218677de12ff8dc3d9c42dea05c9dd0ca /gcc
parent61314cb469b7a014caddd55f944ccaa84bd98e7e (diff)
downloadgcc-38d8473fbb1188149c6824a92ddebf34f06a56f2.zip
gcc-38d8473fbb1188149c6824a92ddebf34f06a56f2.tar.gz
gcc-38d8473fbb1188149c6824a92ddebf34f06a56f2.tar.bz2
(distribute_notes): If can't find place for REG_DEAD note, add an INSN
with a USE to hold it. From-SVN: r8625
Diffstat (limited to 'gcc')
-rw-r--r--gcc/combine.c90
1 files changed, 51 insertions, 39 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index bd75160..f7415ae 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -10515,49 +10515,50 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
reg_n_refs[REGNO (XEXP (note, 0))] = 3;
if (place == 0)
- for (tem = prev_nonnote_insn (i3);
- tem && (GET_CODE (tem) == INSN
- || GET_CODE (tem) == CALL_INSN);
- tem = prev_nonnote_insn (tem))
- {
- /* If the register is being set at TEM, see if that is all
- TEM is doing. If so, delete TEM. Otherwise, make this
- into a REG_UNUSED note instead. */
- if (reg_set_p (XEXP (note, 0), PATTERN (tem)))
- {
- rtx set = single_set (tem);
+ {
+ for (tem = prev_nonnote_insn (i3);
+ place == 0 && tem
+ && (GET_CODE (tem) == INSN || GET_CODE (tem) == CALL_INSN);
+ tem = prev_nonnote_insn (tem))
+ {
+ /* If the register is being set at TEM, see if that is all
+ TEM is doing. If so, delete TEM. Otherwise, make this
+ into a REG_UNUSED note instead. */
+ if (reg_set_p (XEXP (note, 0), PATTERN (tem)))
+ {
+ rtx set = single_set (tem);
- /* Verify that it was the set, and not a clobber that
- modified the register. */
+ /* Verify that it was the set, and not a clobber that
+ modified the register. */
- if (set != 0 && ! side_effects_p (SET_SRC (set))
- && rtx_equal_p (XEXP (note, 0), SET_DEST (set)))
- {
- /* Move the notes and links of TEM elsewhere.
- This might delete other dead insns recursively.
- First set the pattern to something that won't use
- any register. */
+ if (set != 0 && ! side_effects_p (SET_SRC (set))
+ && rtx_equal_p (XEXP (note, 0), SET_DEST (set)))
+ {
+ /* Move the notes and links of TEM elsewhere.
+ This might delete other dead insns recursively.
+ First set the pattern to something that won't use
+ any register. */
- PATTERN (tem) = pc_rtx;
+ PATTERN (tem) = pc_rtx;
- distribute_notes (REG_NOTES (tem), tem, tem,
- NULL_RTX, NULL_RTX, NULL_RTX);
- distribute_links (LOG_LINKS (tem));
+ distribute_notes (REG_NOTES (tem), tem, tem,
+ NULL_RTX, NULL_RTX, NULL_RTX);
+ distribute_links (LOG_LINKS (tem));
- PUT_CODE (tem, NOTE);
- NOTE_LINE_NUMBER (tem) = NOTE_INSN_DELETED;
- NOTE_SOURCE_FILE (tem) = 0;
- }
- else
- {
- PUT_REG_NOTE_KIND (note, REG_UNUSED);
-
- /* If there isn't already a REG_UNUSED note, put one
- here. */
- if (! find_regno_note (tem, REG_UNUSED,
- REGNO (XEXP (note, 0))))
- place = tem;
- break;
+ PUT_CODE (tem, NOTE);
+ NOTE_LINE_NUMBER (tem) = NOTE_INSN_DELETED;
+ NOTE_SOURCE_FILE (tem) = 0;
+ }
+ else
+ {
+ PUT_REG_NOTE_KIND (note, REG_UNUSED);
+
+ /* If there isn't already a REG_UNUSED note, put one
+ here. */
+ if (! find_regno_note (tem, REG_UNUSED,
+ REGNO (XEXP (note, 0))))
+ place = tem;
+ break;
}
}
else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem))
@@ -10567,7 +10568,18 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
place = tem;
break;
}
- }
+ }
+
+ /* If we haven't found an insn for the death note and it
+ is still a REG_DEAD note, but we have hit a CODE_LABEL,
+ insert a USE insn for the register at that label and
+ put the death node there. This prevents problems with
+ call-state tracking in caller-save.c. */
+ if (REG_NOTE_KIND (note) == REG_DEAD && place == 0 && tem != 0)
+ place
+ = emit_insn_after (gen_rtx (USE, VOIDmode, XEXP (note, 0)),
+ tem);
+ }
/* If the register is set or already dead at PLACE, we needn't do
anything with this note if it is still a REG_DEAD note.