http://gcc.gnu.org/ml/gcc-patches/2012-03/msg00641.html

Georg-Johann Lay wrote:
> The problem with the PR is that lower-subreg.c happily splits multi-byte moves
> from address spaces without knowing anything about the additional costs this 
> is
> causing.
> 
> The TARGET_MODE_DEPENDENT_ADDRESS_P hook cannot be used for 16-bit addresses
> because that hook is not sensitive to address spaces, but is is used for the
> 24-bit address space to avoid subreg lowering for PSImode.
> 
> For the 16-bit address spaces the mov expander now assigns the address 
> register
> by hand as post-increment.
> 
> Luckily, post-increment is the only addressing mode that makes sense with the
> non-generic address spaces and there is no choice for the address register
> resp. addressing mode, anyway...
> 
> This patch does not fix the PR issue, of course, it just avoids subreg 
> lowering
> by using/pretending mode-dependent addresses.
> 
> Ok for trunk?
> 
> Johann
> 
>       PR rtl-optimization/52543
>       * config/avr/avr.c (avr_mode_dependent_address_p): New function.
>       (TARGET_MODE_DEPENDENT_ADDRESS_P): New define.
> 
>       * config/avr/avr.md (unspec): Add UNSPEC_LPM.
>       (load_<mode>_libgcc): Use UNSPEC_LPM instead of MEM.
>       (mov<mode>): For multi-byte move from non-generic
>       16-bit address spaces: Expand to use Z++ as address for
>       inline code and use UNSPEC_LPM (Z) for code from libgcc.
>       (load<mode>_libgcc): Remove expander.
>       (split-lpmx): Remove split.

Reply via email to