mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-11 16:07:27 +08:00
* 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
This commit is contained in:
parent
861bb6c1b0
commit
5fa39bfeb7
10670
gcc/ChangeLog
10670
gcc/ChangeLog
File diff suppressed because it is too large
Load Diff
10652
gcc/ChangeLog.11
Normal file
10652
gcc/ChangeLog.11
Normal file
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user