Index: emit-rtl.c =================================================================== --- emit-rtl.c (revision 120287) +++ emit-rtl.c (working copy) @@ -5255,7 +5255,7 @@ emit_copy_of_insn_after (rtx insn, rtx after) { rtx new; - rtx note1, note2, link; + rtx note2, link; switch (GET_CODE (insn)) { @@ -5295,25 +5295,30 @@ for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) if (REG_NOTE_KIND (link) != REG_LABEL) { - if (GET_CODE (link) == EXPR_LIST) + /* REG_LIBCALL will be fixed up when the insn with REG_RETVAL is added. */ + if (REG_NOTE_KIND (link) == REG_LIBCALL) + REG_NOTES (new) = gen_rtx_INSN_LIST (REG_NOTE_KIND (link), + XEXP (link, 0), REG_NOTES (new)); + /* Copy REG_RETVAL and fix up it and the previous REG_LIBCALL at the same time. */ + else if (REG_NOTE_KIND (link) == REG_RETVAL) + { + rtx p = new; + /* Find the previous REG_LIBCALL which had the old original in it. */ + while ((note2 = find_reg_note (p, REG_LIBCALL, NULL_RTX)) == NULL + || XEXP (note2, 0) != insn) + p = PREV_INSN (p); + XEXP (note2, 0) = new; + REG_NOTES (new) = gen_rtx_INSN_LIST (REG_NOTE_KIND (link), + p, REG_NOTES (new)); + } + else if (GET_CODE (link) == EXPR_LIST) REG_NOTES (new) = gen_rtx_EXPR_LIST (REG_NOTE_KIND (link), - copy_insn_1 (XEXP (link, 0)), REG_NOTES (new)); + copy_rtx (XEXP (link, 0)), REG_NOTES (new)); else - REG_NOTES (new) - = gen_rtx_INSN_LIST (REG_NOTE_KIND (link), - copy_insn_1 (XEXP (link, 0)), REG_NOTES (new)); + gcc_unreachable (); } - /* Fix the libcall sequences. */ - if ((note1 = find_reg_note (new, REG_RETVAL, NULL_RTX)) != NULL) - { - rtx p = new; - while ((note2 = find_reg_note (p, REG_LIBCALL, NULL_RTX)) == NULL) - p = PREV_INSN (p); - XEXP (note1, 0) = p; - XEXP (note2, 0) = new; - } INSN_CODE (new) = INSN_CODE (insn); return new; }