Fix IA-64 REG_LIBCALL dangling reference.

* function.c (fixup_var_refs_1, case SET): When gen_move_insn returns a
	SEQUENCE, call emit_insn_before, copy PATTERN and REG_NOTES of last
	sequence insn to INSN, and delete last sequence insn.

From-SVN: r36735
This commit is contained in:
Jim Wilson 2000-10-05 23:24:18 +00:00 committed by Jim Wilson
parent f5fa9a5bd0
commit cc0cbae17e
2 changed files with 40 additions and 10 deletions

View File

@ -1,3 +1,9 @@
2000-10-05 Jim Wilson <wilson@cygnus.com>
* function.c (fixup_var_refs_1, case SET): When gen_move_insn returns a
SEQUENCE, call emit_insn_before, copy PATTERN and REG_NOTES of last
sequence insn to INSN, and delete last sequence insn.
2000-10-05 Phil Edwards <pme@gcc.gnu.org>
* gcc.c (main): Include generated configargs.h header

View File

@ -2324,7 +2324,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
&& GET_MODE (var) == promoted_mode
&& x == single_set (insn))
{
rtx pat;
rtx pat, last;
replacement = find_fixup_replacement (replacements, SET_SRC (x));
if (replacement->new)
@ -2350,10 +2350,22 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
pat = gen_move_insn (SET_DEST (x), SET_SRC (x));
if (GET_CODE (pat) == SEQUENCE)
{
emit_insn_after (pat, insn);
PUT_CODE (insn, NOTE);
NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
NOTE_SOURCE_FILE (insn) = 0;
last = emit_insn_before (pat, insn);
/* INSN might have REG_RETVAL or other important notes, so
we need to store the pattern of the last insn in the
sequence into INSN similarly to the normal case. LAST
should not have REG_NOTES, but we allow them if INSN has
no REG_NOTES. */
if (REG_NOTES (last) && REG_NOTES (insn))
abort ();
if (REG_NOTES (last))
REG_NOTES (insn) = REG_NOTES (last);
PATTERN (insn) = PATTERN (last);
PUT_CODE (last, NOTE);
NOTE_LINE_NUMBER (last) = NOTE_INSN_DELETED;
NOTE_SOURCE_FILE (last) = 0;
}
else
PATTERN (insn) = pat;
@ -2370,7 +2382,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
&& GET_MODE (var) == promoted_mode
&& x == single_set (insn))
{
rtx pat;
rtx pat, last;
if (GET_CODE (SET_DEST (x)) == SUBREG)
SET_DEST (x) = fixup_memory_subreg (SET_DEST (x), insn, 0);
@ -2383,10 +2395,22 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
pat = gen_move_insn (SET_DEST (x), SET_SRC (x));
if (GET_CODE (pat) == SEQUENCE)
{
emit_insn_after (pat, insn);
PUT_CODE (insn, NOTE);
NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
NOTE_SOURCE_FILE (insn) = 0;
last = emit_insn_before (pat, insn);
/* INSN might have REG_RETVAL or other important notes, so
we need to store the pattern of the last insn in the
sequence into INSN similarly to the normal case. LAST
should not have REG_NOTES, but we allow them if INSN has
no REG_NOTES. */
if (REG_NOTES (last) && REG_NOTES (insn))
abort ();
if (REG_NOTES (last))
REG_NOTES (insn) = REG_NOTES (last);
PATTERN (insn) = PATTERN (last);
PUT_CODE (last, NOTE);
NOTE_LINE_NUMBER (last) = NOTE_INSN_DELETED;
NOTE_SOURCE_FILE (last) = 0;
}
else
PATTERN (insn) = pat;