diff options
author | Jeff Law <law@gcc.gnu.org> | 1997-08-11 13:31:10 -0600 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1997-08-11 13:31:10 -0600 |
commit | 5fa39bfeb7285e06d0cd52c1da94fe93a67703d0 (patch) | |
tree | 9a73a8a74c825a512172d5eb5297e78ed4da80fa /gcc/reload1.c | |
parent | 861bb6c1b0958236ad93717f98d347aa6152bd09 (diff) | |
download | gcc-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.c | 32 |
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 |