diff options
-rw-r--r-- | gcc/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/optabs.c | 39 |
2 files changed, 25 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index db68f2ae8ec..c21990d0c0a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/optabs.c b/gcc/optabs.c index 5da604d6e27..7ca39167390 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -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. |