> The following patch also solves the problem, but it makes me feel the
> need to state that I've *not* tried to make it look as bad as possible. :-(
I think that your solution is the minimally correct one, so no need for any
form of shyness. ;-)
> @@ -3297,23 +3299,6 @@ try_combine (rtx i3, rtx i2, rtx i1, int
> undo_all ();
> return 0;
> }
> -
> - PATTERN (undobuf.other_insn) = other_pat;
> -
> - /* If any of the notes in OTHER_INSN were REG_UNUSED, ensure that
> they - are still valid. Then add any non-duplicate notes added by
> - recog_for_combine. */
> - for (note = REG_NOTES (undobuf.other_insn); note; note = next)
> - {
> - next = XEXP (note, 1);
> -
> - if (REG_NOTE_KIND (note) == REG_UNUSED
> - && ! reg_set_p (XEXP (note, 0), PATTERN (undobuf.other_insn)))
> - remove_note (undobuf.other_insn, note);
> - }
> -
> - distribute_notes (new_other_notes, undobuf.other_insn,
> - undobuf.other_insn, NULL_RTX, NULL_RTX, NULL_RTX);
> }
> #ifdef HAVE_cc0
> /* If I2 is the CC0 setter and I3 is the CC0 user then check whether
Add the missing line skip before the #ifdef.
> @@ -3331,12 +3316,33 @@ try_combine (rtx i3, rtx i2, rtx i1, int
>
> /* Only allow this combination if insn_rtx_costs reports that the
> replacement instructions are cheaper than the originals. */
> - if (!combine_validate_cost (i1, i2, i3, newpat, newi2pat))
> + if (!combine_validate_cost (i1, i2, i3, newpat, newi2pat, other_pat))
> {
> undo_all ();
> return 0;
> }
>
> + if (undobuf.other_insn)
> + {
> + rtx note, next;
> +
> + PATTERN (undobuf.other_insn) = other_pat;
> +
> + /* If any of the notes in OTHER_INSN were REG_UNUSED, ensure that
> they + are still valid. Then add any non-duplicate notes added by
> + recog_for_combine. */
> + for (note = REG_NOTES (undobuf.other_insn); note; note = next)
> + {
> + next = XEXP (note, 1);
> +
> + if (REG_NOTE_KIND (note) == REG_UNUSED
> + && ! reg_set_p (XEXP (note, 0), PATTERN (undobuf.other_insn)))
> + remove_note (undobuf.other_insn, note);
> + }
> +
> + distribute_notes (new_other_notes, undobuf.other_insn,
> + undobuf.other_insn, NULL_RTX, NULL_RTX, NULL_RTX);
> + }
> /* We now know that we can do this combination. Merge the insns and
> update the status of registers and LOG_LINKS. */
And put the new block just after the above comment, surrounded by a couple of
line skips.
> If I'm going to say something I like about this version of the patch,
> then it'll be that we don't mung the notes until we've checked the costs.
Right, I also think that this is a progress.
The patch is pre-approved for mainline with the 2 aforementioned changes.
--
Eric Botcazou