How to target a processor with very primitive addressing modes?

Georg-Johann Lay avr@gjlay.de
Mon Jun 10 15:48:12 GMT 2024



Am 08.06.24 um 11:32 schrieb Mikael Pettersson via Gcc:
> On Thu, Jun 6, 2024 at 8:59 PM Dimitar Dimitrov <dimitar@dinux.eu> wrote:
>> Have you tried defining TARGET_LEGITIMIZE_ADDRESS for your target? From
>> a quick search I see that the iq2000 and rx backends are rewriting some
>> PLUS expression addresses with insn sequence to calculate the address.
> 
> I have partial success.
> 
> The key was to define both TARGET_LEGITIMATE_ADDRESS_P and an
> addptr<Pmode>3 insn.
> 
> I had tried TARGET_LEGITIMATE_ADDRESS_P before, together with various
> combinations of TARGET_LEGITIMIZE_ADDRESS and
> LEGITIMIZE_RELOAD_ADDRESS, but they all threw gcc into reload loops.
> 
> My add<Pmode>3 insn clobbers the CC register. The docs say to define
> addptr<Pmode>3 in this case, and that eliminated the reload loops.
> 
> The issue now is that the machine cannot perform an add without
> clobbering the CC register, so I'll have to hide that somehow. When
> emitting the asm code, can one check if the CC register is LIVE-OUT
> from the insn? If it isn't I shouldn't have to generate code to
> preserve it.
> 
> /Mikael

There is a different approach like liken by AVR (and maybe some
more targets):

Don't introduce CC until after reload, i.e. keep cbranch insns
and only split them to compare + branch after reload in the
first post reload split pass.

It's some effort because the number of insns is effectively
doubled: One pre-reload version of the insn without CC,
and a postreload version with CC.  On AVR, most insns don't
set CCmode is a usable way, so that works, though not as
well like the killed cc0 representation.

Then I am not sure whether TARGET_LEGITIMIZE_ADDRESS works in
all situations, in particular when it comes to accessing frame
locations. It might be required to fake-supply reg+offset
addressing, and then split that post-reload.

An example is the Reduced Tiny cores (-mavrtiny) of the AVR
port that only support POST_INC or byte addressing.  Splitting
locations after reload improved code quality a lot.

But it also revealed an unfixed bug in DSE:

DSE does not track frame pointer changes and eliminates
living stores. So be prepared.

Johann





More information about the Gcc mailing list