emit-rtl.c (emit_copy_of_insn_after): Duplicate notes in order.
* emit-rtl.c (emit_copy_of_insn_after): Duplicate notes in order. * sel-sched-ir.c (create_copy_of_insn_rtx): Likewise. * rtl.h (duplicate_reg_notes): Declare. * rtlanal.c (duplicate_reg_note): New function. From-SVN: r241913
This commit is contained in:
parent
caa024ffce
commit
1581a12c35
|
@ -1,5 +1,10 @@
|
|||
2016-11-07 Bernd Schmidt <bschmidt@redhat.com>
|
||||
|
||||
* emit-rtl.c (emit_copy_of_insn_after): Duplicate notes in order.
|
||||
* sel-sched-ir.c (create_copy_of_insn_rtx): Likewise.
|
||||
* rtl.h (duplicate_reg_notes): Declare.
|
||||
* rtlanal.c (duplicate_reg_note): New function.
|
||||
|
||||
PR rtl-optimization/77309
|
||||
* combine.c (make_compound_operation): Allow EQ for IN_CODE, and
|
||||
don't assume an equality comparison for plain COMPARE.
|
||||
|
|
|
@ -6168,17 +6168,19 @@ emit_copy_of_insn_after (rtx_insn *insn, rtx_insn *after)
|
|||
which may be duplicated by the basic block reordering code. */
|
||||
RTX_FRAME_RELATED_P (new_rtx) = RTX_FRAME_RELATED_P (insn);
|
||||
|
||||
/* Locate the end of existing REG_NOTES in NEW_RTX. */
|
||||
rtx *ptail = ®_NOTES (new_rtx);
|
||||
while (*ptail != NULL_RTX)
|
||||
ptail = &XEXP (*ptail, 1);
|
||||
|
||||
/* Copy all REG_NOTES except 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); link; link = XEXP (link, 1))
|
||||
if (REG_NOTE_KIND (link) != REG_LABEL_OPERAND)
|
||||
{
|
||||
if (GET_CODE (link) == EXPR_LIST)
|
||||
add_reg_note (new_rtx, REG_NOTE_KIND (link),
|
||||
copy_insn_1 (XEXP (link, 0)));
|
||||
else
|
||||
add_shallow_copy_of_reg_note (new_rtx, link);
|
||||
*ptail = duplicate_reg_note (link);
|
||||
ptail = &XEXP (*ptail, 1);
|
||||
}
|
||||
|
||||
INSN_CODE (new_rtx) = INSN_CODE (insn);
|
||||
|
|
|
@ -3019,6 +3019,7 @@ extern rtx alloc_reg_note (enum reg_note, rtx, rtx);
|
|||
extern void add_reg_note (rtx, enum reg_note, rtx);
|
||||
extern void add_int_reg_note (rtx, enum reg_note, int);
|
||||
extern void add_shallow_copy_of_reg_note (rtx_insn *, rtx);
|
||||
extern rtx duplicate_reg_note (rtx);
|
||||
extern void remove_note (rtx_insn *, const_rtx);
|
||||
extern void remove_reg_equal_equiv_notes (rtx_insn *);
|
||||
extern void remove_reg_equal_equiv_notes_for_regno (unsigned int);
|
||||
|
|
|
@ -2304,6 +2304,20 @@ add_shallow_copy_of_reg_note (rtx_insn *insn, rtx note)
|
|||
add_reg_note (insn, REG_NOTE_KIND (note), XEXP (note, 0));
|
||||
}
|
||||
|
||||
/* Duplicate NOTE and return the copy. */
|
||||
rtx
|
||||
duplicate_reg_note (rtx note)
|
||||
{
|
||||
reg_note kind = REG_NOTE_KIND (note);
|
||||
|
||||
if (GET_CODE (note) == INT_LIST)
|
||||
return gen_rtx_INT_LIST ((machine_mode) kind, XINT (note, 0), NULL_RTX);
|
||||
else if (GET_CODE (note) == EXPR_LIST)
|
||||
return alloc_reg_note (kind, copy_insn_1 (XEXP (note, 0)), NULL_RTX);
|
||||
else
|
||||
return alloc_reg_note (kind, XEXP (note, 0), NULL_RTX);
|
||||
}
|
||||
|
||||
/* Remove register note NOTE from the REG_NOTES of INSN. */
|
||||
|
||||
void
|
||||
|
|
|
@ -5762,6 +5762,11 @@ create_copy_of_insn_rtx (rtx insn_rtx)
|
|||
res = create_insn_rtx_from_pattern (copy_rtx (PATTERN (insn_rtx)),
|
||||
NULL_RTX);
|
||||
|
||||
/* Locate the end of existing REG_NOTES in NEW_RTX. */
|
||||
rtx *ptail = ®_NOTES (res);
|
||||
while (*ptail != NULL_RTX)
|
||||
ptail = &XEXP (*ptail, 1);
|
||||
|
||||
/* 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. */
|
||||
|
@ -5770,11 +5775,8 @@ create_copy_of_insn_rtx (rtx insn_rtx)
|
|||
&& 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));
|
||||
*ptail = duplicate_reg_note (link);
|
||||
ptail = &XEXP (*ptail, 1);
|
||||
}
|
||||
|
||||
return res;
|
||||
|
|
Loading…
Reference in New Issue