OSDN Git Service

* optabs.c (emit_libcall_block): Use no_conflict_move_test.
authoramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Sep 2005 12:13:07 +0000 (12:13 +0000)
committeramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Sep 2005 12:13:07 +0000 (12:13 +0000)
(no_conflict_move_test): Update comments.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@104563 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/optabs.c

index db68f2a..c21990d 100644 (file)
@@ -7,6 +7,9 @@
        *  optabs.c (no_conflict_move_test): Don't set must_stay for a
        clobber / clobber match between dest and p->first.
 
+       * optabs.c (emit_libcall_block): Use no_conflict_move_test.
+       (no_conflict_move_test): Update comments.
+
 2005-09-22  Ranjit Mathew  <rmathew@gcc.gnu.org>
 
        * doc/install.texi: Update URL for Jacks.
index 5da604d..7ca3916 100644 (file)
@@ -3004,9 +3004,10 @@ struct no_conflict_data
   bool must_stay;
 };
 
-/* Called via note_stores by emit_no_conflict_block.  Set P->must_stay
-   if the currently examined clobber / store has to stay in the list of
-   insns that constitute the actual no_conflict block.  */
+/* Called via note_stores by emit_no_conflict_block and emit_libcall_block.
+   Set P->must_stay if the currently examined clobber / store has to stay
+   in the list of insns that constitute the actual no_conflict block /
+   libcall block.  */
 static void
 no_conflict_move_test (rtx dest, rtx set, void *p0)
 {
@@ -3248,23 +3249,27 @@ emit_libcall_block (rtx insns, rtx target, rtx result, rtx equiv)
       next = NEXT_INSN (insn);
 
       if (set != 0 && REG_P (SET_DEST (set))
-         && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER
-         && (insn == insns
-             || ((! INSN_P(insns)
-                  || ! reg_mentioned_p (SET_DEST (set), PATTERN (insns)))
-                 && ! reg_used_between_p (SET_DEST (set), insns, insn)
-                 && ! modified_in_p (SET_SRC (set), insns)
-                 && ! modified_between_p (SET_SRC (set), insns, insn))))
+         && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
        {
-         if (PREV_INSN (insn))
-           NEXT_INSN (PREV_INSN (insn)) = next;
-         else
-           insns = next;
+         struct no_conflict_data data;
+
+         data.target = const0_rtx;
+         data.first = insns;
+         data.insn = insn;
+         data.must_stay = 0;
+         note_stores (PATTERN (insn), no_conflict_move_test, &data);
+         if (! data.must_stay)
+           {
+             if (PREV_INSN (insn))
+               NEXT_INSN (PREV_INSN (insn)) = next;
+             else
+               insns = next;
 
-         if (next)
-           PREV_INSN (next) = PREV_INSN (insn);
+             if (next)
+               PREV_INSN (next) = PREV_INSN (insn);
 
-         add_insn (insn);
+             add_insn (insn);
+           }
        }
 
       /* Some ports use a loop to copy large arguments onto the stack.