https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66140
Uroš Bizjak <ubizjak at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2015-05-14 CC| |rth at gcc dot gnu.org, | |ubizjak at gmail dot com Ever confirmed|0 |1 --- Comment #1 from Uroš Bizjak <ubizjak at gmail dot com> --- Confirmed with a cross from x86_64-linux-gnu. The problem is with (insn 56), where reload does: Reloads for insn # 56 Reload 0: reload_in (DI) = (reg/v/f:DI 71 [ bpl ]) GENERAL_REGS, RELOAD_FOR_OUTPUT_ADDRESS (opnum = 0) reload_in_reg: (reg/v/f:DI 71 [ bpl ]) reload_reg_rtx: (reg:DI 4 $4) Reload 1: GENERAL_REGS, RELOAD_FOR_OUTPUT_ADDRESS (opnum = 0), can't combine, secondary_reload_p reload_reg_rtx: (reg:TI 2 $2) Reload 2: reload_out (QI) = (mem:QI (plus:DI (reg/v/f:DI 71 [ bpl ]) (const_int 3 [0x3])) [1 *bpl_5+3 S1 A8]) GENERAL_REGS, RELOAD_FOR_OUTPUT (opnum = 0) reload_out_reg: (mem:QI (plus:DI (reg/v/f:DI 71 [ bpl ]) (const_int 3 [0x3])) [1 *bpl_5+3 S1 A8]) reload_reg_rtx: (reg:QI 5 $5) secondary_out_reload = 1 secondary_out_icode = reload_outqi Tracing the RTX through reload_outqi, we enter with operands[0]: (mem:QI (plus:DI (reg/v/f:DI 71 [ bpl ]) (const_int 3 [0x3])) [1 *bpl_5+3 S1 A8]) and get_unaligned_addr returns: (plus:DI (reg/v/f:DI 71 [ bpl ]) (const_int 3 [0x3])) But ... (reg/v/f:DI 71 [ bpl ]) is scheduled for reload in Reload 0, and got its replacement register (reg:DI 4 $4). So, we have to call find_replacement in get_unaligned_address, even if (ref) is otherwise correct memory_address_p operand. With the (totaly untested) patch below, get_unaligned_address returns: (plus:DI (reg:DI 4 $4) (const_int 3 [0x3])) --cut here-- Index: alpha.c =================================================================== --- alpha.c (revision 223201) +++ alpha.c (working copy) @@ -1602,8 +1602,7 @@ get_unaligned_address (rtx ref) gcc_assert (MEM_P (ref)); - if (reload_in_progress - && ! memory_address_p (GET_MODE (ref), XEXP (ref, 0))) + if (reload_in_progress) { base = find_replacement (&XEXP (ref, 0)); --cut here--