mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-06 17:20:14 +08:00
optabs.c (emit_libcall_block): Use no_conflict_move_test.
* optabs.c (emit_libcall_block): Use no_conflict_move_test. (no_conflict_move_test): Update comments. From-SVN: r104563
This commit is contained in:
parent
9617ccfdc4
commit
748ebfc7f9
@ -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.
|
||||
|
39
gcc/optabs.c
39
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;
|
||||
|
||||
if (next)
|
||||
PREV_INSN (next) = PREV_INSN (insn);
|
||||
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;
|
||||
|
||||
add_insn (insn);
|
||||
if (next)
|
||||
PREV_INSN (next) = PREV_INSN (insn);
|
||||
|
||||
add_insn (insn);
|
||||
}
|
||||
}
|
||||
|
||||
/* Some ports use a loop to copy large arguments onto the stack.
|
||||
|
Loading…
Reference in New Issue
Block a user