(emit_libcall_block): Don't move insns that reference things set in
authorRichard Kenner <kenner@gcc.gnu.org>
Mon, 6 Sep 1993 17:27:49 +0000 (13:27 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Mon, 6 Sep 1993 17:27:49 +0000 (13:27 -0400)
previous insns.

From-SVN: r5268

gcc/optabs.c

index 2ff6d2bd0436566f4da2c18f649e1984e6c08b52..cc742a405182afe1424517dc91a526bbe953a789 100644 (file)
@@ -2295,9 +2295,10 @@ emit_libcall_block (insns, target, result, equiv)
   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)
     {
@@ -2309,7 +2310,9 @@ emit_libcall_block (insns, target, result, equiv)
          && 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;