mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-11 18:57:51 +08:00
Fix reload conflict testing to take correct order of output reloads into account.
From-SVN: r46061
This commit is contained in:
parent
0be6abca22
commit
d1d18b4663
@ -1,3 +1,11 @@
|
|||||||
|
2001-10-07 Dale Johannesen <dalej@apple.com>
|
||||||
|
|
||||||
|
* reload1.c (reload_reg_free_p): Teach register interference
|
||||||
|
checking that multiple output reloads are emitted in
|
||||||
|
reverse order.
|
||||||
|
reload1.c (reload_reg_reaches_end_p): Ditto.
|
||||||
|
reload1.c (reloads_conflict): Ditto.
|
||||||
|
|
||||||
2001-10-07 Joseph S. Myers <jsm28@cam.ac.uk>
|
2001-10-07 Joseph S. Myers <jsm28@cam.ac.uk>
|
||||||
|
|
||||||
* doc/c-tree.texi, doc/tm.texi: Consistently put NULL and
|
* doc/c-tree.texi, doc/tm.texi: Consistently put NULL and
|
||||||
|
@ -4417,11 +4417,13 @@ reload_reg_free_p (regno, opnum, type)
|
|||||||
|
|
||||||
case RELOAD_FOR_OUTPUT_ADDRESS:
|
case RELOAD_FOR_OUTPUT_ADDRESS:
|
||||||
/* Can't use a register if it is used for an output address for this
|
/* Can't use a register if it is used for an output address for this
|
||||||
operand or used as an output in this or a later operand. */
|
operand or used as an output in this or a later operand. Note
|
||||||
|
that multiple output operands are emitted in reverse order, so
|
||||||
|
the conflicting ones are those with lower indices. */
|
||||||
if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[opnum], regno))
|
if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[opnum], regno))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (i = opnum; i < reload_n_operands; i++)
|
for (i = 0; i <= opnum; i++)
|
||||||
if (TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
|
if (TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -4430,11 +4432,13 @@ reload_reg_free_p (regno, opnum, type)
|
|||||||
case RELOAD_FOR_OUTADDR_ADDRESS:
|
case RELOAD_FOR_OUTADDR_ADDRESS:
|
||||||
/* Can't use a register if it is used for an output address
|
/* Can't use a register if it is used for an output address
|
||||||
for this operand or used as an output in this or a
|
for this operand or used as an output in this or a
|
||||||
later operand. */
|
later operand. Note that multiple output operands are
|
||||||
|
emitted in reverse order, so the conflicting ones are
|
||||||
|
those with lower indices. */
|
||||||
if (TEST_HARD_REG_BIT (reload_reg_used_in_outaddr_addr[opnum], regno))
|
if (TEST_HARD_REG_BIT (reload_reg_used_in_outaddr_addr[opnum], regno))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (i = opnum; i < reload_n_operands; i++)
|
for (i = 0; i <= opnum; i++)
|
||||||
if (TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
|
if (TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -4457,7 +4461,9 @@ reload_reg_free_p (regno, opnum, type)
|
|||||||
|
|
||||||
case RELOAD_FOR_OUTPUT:
|
case RELOAD_FOR_OUTPUT:
|
||||||
/* This cannot share a register with RELOAD_FOR_INSN reloads, other
|
/* This cannot share a register with RELOAD_FOR_INSN reloads, other
|
||||||
outputs, or an operand address for this or an earlier output. */
|
outputs, or an operand address for this or an earlier output.
|
||||||
|
Note that multiple output operands are emitted in reverse order,
|
||||||
|
so the conflicting ones are those with higher indices. */
|
||||||
if (TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno))
|
if (TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -4465,7 +4471,7 @@ reload_reg_free_p (regno, opnum, type)
|
|||||||
if (TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
|
if (TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (i = 0; i <= opnum; i++)
|
for (i = opnum; i < reload_n_operands; i++)
|
||||||
if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno)
|
if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno)
|
||||||
|| TEST_HARD_REG_BIT (reload_reg_used_in_outaddr_addr[i], regno))
|
|| TEST_HARD_REG_BIT (reload_reg_used_in_outaddr_addr[i], regno))
|
||||||
return 0;
|
return 0;
|
||||||
@ -4601,7 +4607,7 @@ reload_reg_reaches_end_p (regno, opnum, type)
|
|||||||
/* These conflict with other outputs with RELOAD_OTHER. So
|
/* These conflict with other outputs with RELOAD_OTHER. So
|
||||||
we need only check for output addresses. */
|
we need only check for output addresses. */
|
||||||
|
|
||||||
opnum = -1;
|
opnum = reload_n_operands;
|
||||||
|
|
||||||
/* ... fall through ... */
|
/* ... fall through ... */
|
||||||
|
|
||||||
@ -4609,8 +4615,10 @@ reload_reg_reaches_end_p (regno, opnum, type)
|
|||||||
case RELOAD_FOR_OUTPUT_ADDRESS:
|
case RELOAD_FOR_OUTPUT_ADDRESS:
|
||||||
case RELOAD_FOR_OUTADDR_ADDRESS:
|
case RELOAD_FOR_OUTADDR_ADDRESS:
|
||||||
/* We already know these can't conflict with a later output. So the
|
/* We already know these can't conflict with a later output. So the
|
||||||
only thing to check are later output addresses. */
|
only thing to check are later output addresses.
|
||||||
for (i = opnum + 1; i < reload_n_operands; i++)
|
Note that multiple output operands are emitted in reverse order,
|
||||||
|
so the conflicting ones are those with lower indices. */
|
||||||
|
for (i = 0; i < opnum; i++)
|
||||||
if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno)
|
if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno)
|
||||||
|| TEST_HARD_REG_BIT (reload_reg_used_in_outaddr_addr[i], regno))
|
|| TEST_HARD_REG_BIT (reload_reg_used_in_outaddr_addr[i], regno))
|
||||||
return 0;
|
return 0;
|
||||||
@ -4662,11 +4670,11 @@ reloads_conflict (r1, r2)
|
|||||||
|
|
||||||
case RELOAD_FOR_OUTPUT_ADDRESS:
|
case RELOAD_FOR_OUTPUT_ADDRESS:
|
||||||
return ((r2_type == RELOAD_FOR_OUTPUT_ADDRESS && r2_opnum == r1_opnum)
|
return ((r2_type == RELOAD_FOR_OUTPUT_ADDRESS && r2_opnum == r1_opnum)
|
||||||
|| (r2_type == RELOAD_FOR_OUTPUT && r2_opnum >= r1_opnum));
|
|| (r2_type == RELOAD_FOR_OUTPUT && r2_opnum <= r1_opnum));
|
||||||
|
|
||||||
case RELOAD_FOR_OUTADDR_ADDRESS:
|
case RELOAD_FOR_OUTADDR_ADDRESS:
|
||||||
return ((r2_type == RELOAD_FOR_OUTADDR_ADDRESS && r2_opnum == r1_opnum)
|
return ((r2_type == RELOAD_FOR_OUTADDR_ADDRESS && r2_opnum == r1_opnum)
|
||||||
|| (r2_type == RELOAD_FOR_OUTPUT && r2_opnum >= r1_opnum));
|
|| (r2_type == RELOAD_FOR_OUTPUT && r2_opnum <= r1_opnum));
|
||||||
|
|
||||||
case RELOAD_FOR_OPERAND_ADDRESS:
|
case RELOAD_FOR_OPERAND_ADDRESS:
|
||||||
return (r2_type == RELOAD_FOR_INPUT || r2_type == RELOAD_FOR_INSN
|
return (r2_type == RELOAD_FOR_INPUT || r2_type == RELOAD_FOR_INSN
|
||||||
@ -4680,7 +4688,7 @@ reloads_conflict (r1, r2)
|
|||||||
return (r2_type == RELOAD_FOR_INSN || r2_type == RELOAD_FOR_OUTPUT
|
return (r2_type == RELOAD_FOR_INSN || r2_type == RELOAD_FOR_OUTPUT
|
||||||
|| ((r2_type == RELOAD_FOR_OUTPUT_ADDRESS
|
|| ((r2_type == RELOAD_FOR_OUTPUT_ADDRESS
|
||||||
|| r2_type == RELOAD_FOR_OUTADDR_ADDRESS)
|
|| r2_type == RELOAD_FOR_OUTADDR_ADDRESS)
|
||||||
&& r2_opnum <= r1_opnum));
|
&& r2_opnum >= r1_opnum));
|
||||||
|
|
||||||
case RELOAD_FOR_INSN:
|
case RELOAD_FOR_INSN:
|
||||||
return (r2_type == RELOAD_FOR_INPUT || r2_type == RELOAD_FOR_OUTPUT
|
return (r2_type == RELOAD_FOR_INPUT || r2_type == RELOAD_FOR_OUTPUT
|
||||||
|
Loading…
Reference in New Issue
Block a user