re PR tree-optimization/50873 (The fix to PR50730 causes gcc.c-torture/unsorted/dilayout.c to ICE)
gcc/ PR middle-end/50873 * optabs.c (maybe_legitimize_operand_same_code): Use copy_to_mode_reg instead of force_reg. Do nothing if the address is already a non-virtual pseudo register. From-SVN: r182244
This commit is contained in:
parent
c9556982a7
commit
431e1124ed
@ -1,3 +1,10 @@
|
||||
2011-12-12 Richard Sandiford <richard.sandiford@linaro.org>
|
||||
|
||||
PR middle-end/50873
|
||||
* optabs.c (maybe_legitimize_operand_same_code): Use copy_to_mode_reg
|
||||
instead of force_reg. Do nothing if the address is already a
|
||||
non-virtual pseudo register.
|
||||
|
||||
2011-12-12 Torvald Riegel <triegel@redhat.com>
|
||||
|
||||
* gimplify.c (voidify_wrapper_expr): Add default handling for
|
||||
|
35
gcc/optabs.c
35
gcc/optabs.c
@ -8242,24 +8242,31 @@ maybe_legitimize_operand_same_code (enum insn_code icode, unsigned int opno,
|
||||
return true;
|
||||
|
||||
/* If the operand is a memory whose address has no side effects,
|
||||
try forcing the address into a register. The check for side
|
||||
effects is important because force_reg cannot handle things
|
||||
like auto-modified addresses. */
|
||||
if (insn_data[(int) icode].operand[opno].allows_mem
|
||||
&& MEM_P (op->value)
|
||||
&& !side_effects_p (XEXP (op->value, 0)))
|
||||
try forcing the address into a non-virtual pseudo register.
|
||||
The check for side effects is important because copy_to_mode_reg
|
||||
cannot handle things like auto-modified addresses. */
|
||||
if (insn_data[(int) icode].operand[opno].allows_mem && MEM_P (op->value))
|
||||
{
|
||||
rtx addr, mem, last;
|
||||
rtx addr, mem;
|
||||
|
||||
last = get_last_insn ();
|
||||
addr = force_reg (Pmode, XEXP (op->value, 0));
|
||||
mem = replace_equiv_address (op->value, addr);
|
||||
if (insn_operand_matches (icode, opno, mem))
|
||||
mem = op->value;
|
||||
addr = XEXP (mem, 0);
|
||||
if (!(REG_P (addr) && REGNO (addr) > LAST_VIRTUAL_REGISTER)
|
||||
&& !side_effects_p (addr))
|
||||
{
|
||||
op->value = mem;
|
||||
return true;
|
||||
rtx last;
|
||||
enum machine_mode mode;
|
||||
|
||||
last = get_last_insn ();
|
||||
mode = targetm.addr_space.address_mode (MEM_ADDR_SPACE (mem));
|
||||
mem = replace_equiv_address (mem, copy_to_mode_reg (mode, addr));
|
||||
if (insn_operand_matches (icode, opno, mem))
|
||||
{
|
||||
op->value = mem;
|
||||
return true;
|
||||
}
|
||||
delete_insns_since (last);
|
||||
}
|
||||
delete_insns_since (last);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
Loading…
Reference in New Issue
Block a user