On Fri, Dec 16, 2011 at 09:47:52AM +0400, Andrey Belevantsev wrote: > Thus, if an insn has any note that prevents it from being cloned, we > need to fix the above place. (If an insn should not even be moved > from its block, then CANT_MOVE should be set to 1 in the same > function.) Then create_copy_of_insn_rtx can safely copy all the > notes as we already know that only clonable insns get to this > function. The REG_EQUAL/REG_EQUIV notes may be dropped -- I thought > these are supposed to be recomputed by df these days, am I wrong?
REG_DEAD/REG_UNUSED notes are recomputed by df, I don't think anything recomputes REG_EQUAL/REG_EQUIV. Anyway, here is one possible patch. 2011-12-16 Jakub Jelinek <ja...@redhat.com> PR debug/51557 * sel-sched-ir.c (create_copy_of_insn_rtx): Copy all notes other than REG_EQUAL, REG_EQUIV and REG_LABEL_OPERAND. * gcc.dg/pr51557.c: New test. --- gcc/sel-sched-ir.c.jj 2011-12-15 08:06:48.896107305 +0100 +++ gcc/sel-sched-ir.c 2011-12-16 08:42:28.905098093 +0100 @@ -5723,7 +5723,7 @@ create_vinsn_from_insn_rtx (rtx insn_rtx rtx create_copy_of_insn_rtx (rtx insn_rtx) { - rtx res; + rtx res, link; if (DEBUG_INSN_P (insn_rtx)) return create_insn_rtx_from_pattern (copy_rtx (PATTERN (insn_rtx)), @@ -5733,6 +5733,22 @@ create_copy_of_insn_rtx (rtx insn_rtx) res = create_insn_rtx_from_pattern (copy_rtx (PATTERN (insn_rtx)), NULL_RTX); + + /* Copy all REG_NOTES except REG_EQUAL/REG_EQUIV and REG_LABEL_OPERAND + since mark_jump_label will make them. REG_LABEL_TARGETs are created + there too, but are supposed to be sticky, so we copy them. */ + for (link = REG_NOTES (insn_rtx); link; link = XEXP (link, 1)) + if (REG_NOTE_KIND (link) != REG_LABEL_OPERAND + && REG_NOTE_KIND (link) != REG_EQUAL + && REG_NOTE_KIND (link) != REG_EQUIV) + { + if (GET_CODE (link) == EXPR_LIST) + add_reg_note (res, REG_NOTE_KIND (link), + copy_insn_1 (XEXP (link, 0))); + else + add_reg_note (res, REG_NOTE_KIND (link), XEXP (link, 0)); + } + return res; } --- gcc/testsuite/gcc.dg/pr51557.c.jj 2011-12-16 08:38:46.060409035 +0100 +++ gcc/testsuite/gcc.dg/pr51557.c 2011-12-16 08:38:46.060409035 +0100 @@ -0,0 +1,17 @@ +/* PR debug/51557 */ +/* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */ +/* { dg-options "-Os -fno-asynchronous-unwind-tables -g -fsel-sched-pipelining -fselective-scheduling2" } */ + +extern int baz (void); +extern void bar (int, int, int, int, int, int, int); + +void +synth (int *values, int n_values, int ci, int s1, int v, int s2) +{ + while (--s1) + { + int r1 = values[s1]; + int co = ci ? r1 : baz () < r1; + bar (0, n_values, s1, s2, v, co, 0); + } +} Jakub