I hit a case where we were splitting a set of (const (unspec [...])) into something that still referred to the original expression. We reused that same expression as a REG_EQUAL note, leading to an rtx-sharing violation.
Tested on mips64-linux-gnu and applied. Richard gcc/ * recog.c (split_insn): Copy the original SET_SRC before using it as a note. Index: gcc/recog.c =================================================================== --- gcc/recog.c 2012-08-02 21:19:07.321527035 +0100 +++ gcc/recog.c 2012-08-02 21:22:58.721526468 +0100 @@ -2831,7 +2831,8 @@ split_insn (rtx insn) if (note && CONSTANT_P (XEXP (note, 0))) set_unique_reg_note (last, REG_EQUAL, XEXP (note, 0)); else if (CONSTANT_P (SET_SRC (insn_set))) - set_unique_reg_note (last, REG_EQUAL, SET_SRC (insn_set)); + set_unique_reg_note (last, REG_EQUAL, + copy_rtx (SET_SRC (insn_set))); } }