[Patch, AVR]: Fix PR46779

Georg-Johann Lay avr@gjlay.de
Tue Jun 14 21:38:00 GMT 2011

Denis Chertykov schrieb:
> 2011/6/14 Georg-Johann Lay <avr@gjlay.de>:
>>Denis Chertykov schrieb:
>>>2011/6/13 Georg-Johann Lay <avr@gjlay.de>:
>>>>So you think is is pointless/discouraged to give a more realistic
>>>>description of AVR addressing be means of MODE_CODE_BASE_REG_CLASS (instead
>>>>>Look carefully at `out_movqi_r_mr'.
>>>>>There are even two fake addressing modes:
>>>>>1. [Y + infinite-dslacement];
>>>>>2. [X + (0...63)].
>>>>Yes, I know. The first is introduced by avr_legitimate_address_p and the
>>>>second appears to be artifact of LEGITIMIZE_RELOAD_ADDRESS.
>>>>The changes are basically MODE_CODE_BASE_REG_CLASS (introduced in 4.2) and a
>>>>rewrite of avr_legitimate_address_p. The changes aim at a better addressing
>>>>for X and to minimize fake addresses.
>>>>>I have spent a many hours (days, months) to debug GCC (especially avr port
>>>>>and reload) for right addressing modes.
>>>>>I have stopped on this code.
>>>>>AVR have a limited memory addressing and GCC can't handle it in native
>>>>>Because of that I have supported a fake adddressing modes.
>>>>I assume the code is from prior to 4.2 when REGNO_MODE_CODE_OK_FOR_BASE_P
>>>>and MODE_CODE_BASE_REG_CLASS had not been available so that supporting X
>>>>required some hacking.
>>>>All that would still be fine; however the new register allocator leads to
>>>>code that noone would accept. Accessing a structure through a pointer is not
>>>>uncommon, not even on AVR. So if Z is used for, say accessing flash, X
>>>>appears to be the best register.
>>>>The shortcoming in GCC is that there is no way to give costs of addressing
>>>>(TARGET_ADDRESS_COST does different things).
>>>>So take a look what avr-gcc compiles here:
>>>> http://gcc.gnu.org/bugzilla/attachment.cgi?id=22242
>>>>I saw similar complains in forums on the web.
>>>>>(Richard Henderson have a different opinion: GCC can, AVR port can't)
>>>>What does he mean with that?
>>>>>IMHO that three limited pointer registers is not enough for C compiler.
>>>>>Even more with frame pointer it's only two and X is a very limited.
>>>>The current implementation has several oddities like
>>>>* allowing SUBREGs in avr-legitimate_address_p
>>>>* changing BASE_REG_CLASS on the fly (by means of reload_completed)
>>>>isn't that supposed to cause trouble?
>>>You can try to remove all oddities and check results.
>>>Definitely something changed in GCC core since I wrote addressing code.
>>For your interest, here is a patch that shows the changes in
>>addressing mode.


> Generally, the patch seems as a "right thing". I like it.
> How about a regression testing and code quality.
> Denis.

I tested on some handcrafted examples and on the code attached to 
PR46278. The generated code looked very good and so I started regression 
testing but found at spill fail in

As I don't know how to fix a spill failure I stopped working on the 
patch. Perhaps it would help to have fake y+const addresses; I didn't try.

As far as I remember, reload emits inefficient code in some situations 
when it tries to fit address into available addressing mode by adding 
constant. I could fix that by new constraint alternative in addhi3 insn, 
something like "=*!r,r,n". But that are just details.

The major work left to be done are fixing spill fails and implementing 
appropriate LEGITIMIZE_RELOAD_ADDRESS which are beyond my skills.

BTW, fixing PR48459, Richard ran immediately into a spill failure during 
newlib build:



More information about the Gcc-patches mailing list