"Bingfeng Mei" <b...@broadcom.com> writes:

> from gen_reload function. 
>   /* Otherwise, just write (set OUT IN) and hope for the best.  */
>   else
>     emit_insn (gen_rtx_SET (VOIDmode, out, in));

Those lines are one of the curses of reload.  When you hit them, you
know something has gone wrong.  Unfortunately, exactly what has gone
wrong can be difficult to determine.  It basically means that you are
trying to reload something that the reload pass does not understand.


> The comment doesn’t sound very convincing to me. 
>
>
> From debug message:
> Reloads for insn # 680
> Reload 0: reload_in (SI) = (plus:SI (reg/f:SI 57 r57)
>                                                     (const_int 40 [0x28]))
>       GR_REGS, RELOAD_FOR_INPUT_ADDRESS (opnum = 1)
>       reload_in_reg: (plus:SI (reg/f:SI 57 r57)
>                                                     (const_int 40 [0x28]))
>       reload_reg_rtx: (reg:SI 4 r4)
> Reload 1: reload_in (SI) = (plus:SI (reg/f:SI 57 r57)
>                                                     (const_int 78396 
> [0x1323c]))
>       GR_REGS, RELOAD_FOR_INPUT_ADDRESS (opnum = 1), can't combine
>       reload_in_reg: (plus:SI (reg/f:SI 57 r57)
>                                                     (const_int 78396 
> [0x1323c]))
>       reload_reg_rtx: (reg:SI 6 r6)
> Reload 2: reload_in (SI) = (mem/c:SI (plus:SI (reg/f:SI 57 r57)
>                                                         (const_int 78396 
> [0x1323c])) [50 %sfp+78252 S4 A32])
>       GR_REGS, RELOAD_FOR_INPUT_ADDRESS (opnum = 1), can't combine
>       reload_in_reg: (reg:SI 596 [ ivtmp.474 ])
>       reload_reg_rtx: (reg:SI 9 r9)
> Reload 3: reload_in (SI) = (plus:SI (mult:SI (reg:SI 596 [ ivtmp.474 ])
>                                                         (const_int 8 [0x8]))
>                                                     (plus:SI (reg/f:SI 57 r57)
>                                                         (const_int 40 
> [0x28])))
>       GR_REGS, RELOAD_FOR_INPUT (opnum = 1), inc by 8
>       reload_in_reg: (plus:SI (mult:SI (reg:SI 596 [ ivtmp.474 ])
>                                                         (const_int 8 [0x8]))
>                                                     (plus:SI (reg/f:SI 57 r57)
>                                                         (const_int 40 
> [0x28])))
>       reload_reg_rtx: (reg:SI 4 r4)
>
>
> I don’t understand why Reload 3 is necessary. After reload 0, 1, 2, 
> The following expression already fits into our addressing mode. 
>
> (plus:SI (mult:SI (reg:SI 9 r9)  (const_int 8 [0x8]))
>                                  (reg:SI 4 r4))
>
> Instead GCC tries to generate invalid 
> (insn 1716 1715 680 84 src/weighted_prediction.c:729 (set (reg:SI 4 r4)
>         (plus:SI (mult:SI (reg:SI 9 r9)
>                 (const_int 8 [0x8]))
>             (reg:SI 4 r4))) -1 (nil))
> and load from [r4] subsequently. 

Sounds like you're well on the way to tracking down the problem: you
need to see why gcc decided to add reload 3 given the existence of the
reloads 0 through 2.  In particular, look at the code after
  if (strict_memory_address_addr_space_p (mode, ad, as))
in find_reloads_address.

Ian

Reply via email to