From cc0cbae17ebe0b5c9a9152cd867d2ae5a5e943db Mon Sep 17 00:00:00 2001 From: Jim Wilson Date: Thu, 5 Oct 2000 23:24:18 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/function.c | 44 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 627fb1ce232..bf8dae3e7f3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2000-10-05 Jim Wilson + + * 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 * gcc.c (main): Include generated configargs.h header diff --git a/gcc/function.c b/gcc/function.c index f05711487b6..f5814109211 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -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;