diff options
author | Jim Wilson <wilson@cygnus.com> | 2000-10-05 23:24:18 +0000 |
---|---|---|
committer | Jim Wilson <wilson@gcc.gnu.org> | 2000-10-05 16:24:18 -0700 |
commit | cc0cbae17ebe0b5c9a9152cd867d2ae5a5e943db (patch) | |
tree | c4fb33b2bcd24213c4329edef7116967bd34aa25 | |
parent | f5fa9a5bd08d383e14f920c38f69d15f456e1aeb (diff) | |
download | gcc-cc0cbae17ebe0b5c9a9152cd867d2ae5a5e943db.zip gcc-cc0cbae17ebe0b5c9a9152cd867d2ae5a5e943db.tar.gz gcc-cc0cbae17ebe0b5c9a9152cd867d2ae5a5e943db.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/function.c | 44 |
2 files changed, 40 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 627fb1c..bf8dae3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/function.c b/gcc/function.c index f057114..f581410 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; |