rtx prev, next, first, last, insn;
/* First emit all insns that set pseudos. Remove them from the list as
- we go. Avoid insns that set pseudo which were referenced in previous
+ we go. Avoid insns that set pseudos which were referenced in previous
insns. These can be generated by move_by_pieces, for example,
- to update an address. */
+ to update an address. Similarly, avoid insns that reference things
+ set in previous insns. */
for (insn = insns; insn; insn = next)
{
&& REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER
&& (insn == insns
|| (! reg_mentioned_p (SET_DEST (set), PATTERN (insns))
- && ! reg_used_between_p (SET_DEST (set), insns, insn))))
+ && ! reg_used_between_p (SET_DEST (set), insns, insn)
+ && ! modified_in_p (SET_SRC (set), insns)
+ && ! modified_between_p (SET_SRC (set), insns, insn))))
{
if (PREV_INSN (insn))
NEXT_INSN (PREV_INSN (insn)) = next;