aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload1.c
diff options
context:
space:
mode:
authorJeff Law <law@gcc.gnu.org>1997-08-11 13:31:10 -0600
committerJeff Law <law@gcc.gnu.org>1997-08-11 13:31:10 -0600
commit5fa39bfeb7285e06d0cd52c1da94fe93a67703d0 (patch)
tree9a73a8a74c825a512172d5eb5297e78ed4da80fa /gcc/reload1.c
parent861bb6c1b0958236ad93717f98d347aa6152bd09 (diff)
downloadgcc-5fa39bfeb7285e06d0cd52c1da94fe93a67703d0.zip
gcc-5fa39bfeb7285e06d0cd52c1da94fe93a67703d0.tar.gz
gcc-5fa39bfeb7285e06d0cd52c1da94fe93a67703d0.tar.bz2
* Integrate reload bugfix from Wilson which enables the PA port
to bootstrap again. * reload1.c (reload): Sum needs for both OPADDR_ADDR and and OPERAND_ADDRESS when computing how many registers an insn needs. (reload_reg_free_p): OPADDR_ADDR and OPERAND_ADDRESS reloads do conflict. (reload_reg_free_before_p): Treat OPERAND_ADDRESS reloads just like OPADDR_ADDR reload. (reload_reg_reaches_end_p): For RELOAD_FOR_OPADDR_ADDR insns, registers in reload_reg_use_in_op_addr do not reach the end. do not reach the end. (reloads_conflict): RELOAD_FOR_OPADDR_ADDR conflicts with RELOAD_FOR_OPERAND_ADDRESS. Start a new ChangeLog for gcc3. From-SVN: r14767
Diffstat (limited to 'gcc/reload1.c')
-rw-r--r--gcc/reload1.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c
index a3361ab..8067787 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -1341,8 +1341,8 @@ reload (first, global, dumpfile)
don't conflict with things needed to reload inputs or
outputs. */
- in_max = MAX (MAX (insn_needs.op_addr.regs[j][i],
- insn_needs.op_addr_reload.regs[j][i]),
+ in_max = MAX ((insn_needs.op_addr.regs[j][i]
+ + insn_needs.op_addr_reload.regs[j][i]),
in_max);
out_max = MAX (out_max, insn_needs.insn.regs[j][i]);
@@ -1374,8 +1374,8 @@ reload (first, global, dumpfile)
= MAX (out_max, insn_needs.out_addr_addr[j].groups[i]);
}
- in_max = MAX (MAX (insn_needs.op_addr.groups[i],
- insn_needs.op_addr_reload.groups[i]),
+ in_max = MAX ((insn_needs.op_addr.groups[i]
+ + insn_needs.op_addr_reload.groups[i]),
in_max);
out_max = MAX (out_max, insn_needs.insn.groups[i]);
@@ -4605,7 +4605,13 @@ reload_reg_free_p (regno, opnum, type)
if (TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno))
return 0;
+ /* ??? A OPADDR_ADDR reload does not conflict with the OPERAND_ADDRESS
+ reload that uses it. However, the same operand can have multiple
+ OPERAND_ADDRESS reloads, and a OPADDR_ADDR reload does conflict with
+ other OPERAND_ADDRESS reloads for the same operand, hence we must
+ say that OPADDR_ADDR and OPERAND_ADDRESS reloads always conflict. */
return (! TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno)
+ && ! TEST_HARD_REG_BIT (reload_reg_used_in_op_addr_reload, regno)
&& ! TEST_HARD_REG_BIT (reload_reg_used_in_op_addr, regno));
case RELOAD_FOR_OPADDR_ADDR:
@@ -4613,7 +4619,8 @@ reload_reg_free_p (regno, opnum, type)
if (TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno))
return 0;
- return (!TEST_HARD_REG_BIT (reload_reg_used_in_op_addr_reload, regno));
+ return (! TEST_HARD_REG_BIT (reload_reg_used_in_op_addr_reload, regno)
+ && ! TEST_HARD_REG_BIT (reload_reg_used_in_op_addr, regno));
case RELOAD_FOR_OUTPUT:
/* This cannot share a register with RELOAD_FOR_INSN reloads, other
@@ -4730,12 +4737,6 @@ reload_reg_free_before_p (regno, opnum, type)
return ! TEST_HARD_REG_BIT (reload_reg_used_in_other_addr, regno);
case RELOAD_FOR_OPERAND_ADDRESS:
- /* Earlier reloads include RELOAD_FOR_OPADDR_ADDR reloads. */
- if (TEST_HARD_REG_BIT (reload_reg_used_in_op_addr_reload, regno))
- return 0;
-
- /* ... fall through ... */
-
case RELOAD_FOR_OPADDR_ADDR:
case RELOAD_FOR_INSN:
/* These can't conflict with inputs, or each other, so all we have to
@@ -4879,8 +4880,7 @@ reload_reg_reaches_end_p (regno, opnum, type)
|| TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
return 0;
- return (! TEST_HARD_REG_BIT (reload_reg_used_in_op_addr, regno)
- && !TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno));
+ return (! TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno));
case RELOAD_FOR_INSN:
/* These conflict with other outputs with RELOAD_OTHER. So
@@ -4955,11 +4955,13 @@ reloads_conflict (r1, r2)
case RELOAD_FOR_OPERAND_ADDRESS:
return (r2_type == RELOAD_FOR_INPUT || r2_type == RELOAD_FOR_INSN
- || r2_type == RELOAD_FOR_OPERAND_ADDRESS);
+ || r2_type == RELOAD_FOR_OPERAND_ADDRESS
+ || r2_type == RELOAD_FOR_OPADDR_ADDR);
case RELOAD_FOR_OPADDR_ADDR:
return (r2_type == RELOAD_FOR_INPUT
- || r2_type == RELOAD_FOR_OPADDR_ADDR);
+ || r2_type == RELOAD_FOR_OPADDR_ADDR
+ || r2_type == RELOAD_FOR_OPERAND_ADDRESS);
case RELOAD_FOR_OUTPUT:
return (r2_type == RELOAD_FOR_INSN || r2_type == RELOAD_FOR_OUTPUT