Denis Chertykov schrieb:
2011/6/14 Georg-Johann Lay <a...@gjlay.de>:

Denis Chertykov schrieb:

2011/6/13 Georg-Johann Lay <a...@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
of BASE_REG_CLASS) resp. REGNO_MODE_CODE_OK_FOR_BASE_P?


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
form.
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.

Denis.

For your interest, here is a patch that shows the changes in
addressing mode.

http://gcc.gnu.org/ml/gcc-patches/2011-06/msg01029.html

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
  gcc.c-torture/compile/950612-1.c

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:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48459#c20

Johann

Reply via email to