[Patch, rtl] PR middle-end/78016, keep REG_NOTE order during insn copy
Jiong Wang
jiong.wang@foss.arm.com
Mon Oct 31 09:26:00 GMT 2016
On 21/10/16 13:30, Bernd Schmidt wrote:
>
>
> On 10/21/2016 02:04 PM, Jiong Wang wrote:
>> + /* Locate the end of existing REG_NOTES in NEW_RTX. */
>> + rtx *ptail = ®_NOTES (new_rtx);
>> + while (*ptail != NULL_RTX)
>> + ptail = &XEXP (*ptail, 1);
>
> I was thinking along the lines of something like this (untested,
> emit-rtl.c part omitted). Eric can choose whether he likes either of
> these or wants something else.
Hi Eric,
What's your decision on this?
Thanks.
Regards,
Jiong
>
>
> Bernd
>
> Index: gcc/rtl.h
> ===================================================================
> --- gcc/rtl.h (revision 241233)
> +++ gcc/rtl.h (working copy)
> @@ -3008,6 +3008,7 @@ extern rtx alloc_reg_note (enum reg_note
> 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_insn *, rtx);
> extern void remove_note (rtx, const_rtx);
> extern void remove_reg_equal_equiv_notes (rtx_insn *);
> extern void remove_reg_equal_equiv_notes_for_regno (unsigned int);
> Index: gcc/rtlanal.c
> ===================================================================
> --- gcc/rtlanal.c (revision 241233)
> +++ gcc/rtlanal.c (working copy)
> @@ -2304,6 +2304,21 @@ add_shallow_copy_of_reg_note (rtx_insn *
> add_reg_note (insn, REG_NOTE_KIND (note), XEXP (note, 0));
> }
>
> +/* Duplicate NOTE and return the copy. */
> +rtx
> +duplicate_reg_note (rtx note)
> +{
> + rtx n;
> + reg_note_kind 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
> Index: gcc/sel-sched-ir.c
> ===================================================================
> --- gcc/sel-sched-ir.c (revision 241233)
> +++ gcc/sel-sched-ir.c (working copy)
> @@ -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 (new_rtx);
> + 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;
More information about the Gcc-patches
mailing list