[RL78] Questions about code-generation

Richard Hulme peper03@yahoo.com
Mon Mar 24 21:11:00 GMT 2014


On 24/03/14 04:44, Jeff Law wrote:
> On 03/22/14 05:29, Richard Hulme wrote:
>> On 22/03/14 01:47, Jeff Law wrote:
>>> On 03/21/14 18:35, DJ Delorie wrote:
>>>>
>>>> I've found that "removing uneeded moves through registers" is
>>>> something gcc does poorly in the post-reload optimizers.  I've written
>>>> my own on some occasions (for rl78 too).  Perhaps this is a good
>>>> starting point to look at?
>>>>
>>>>> much needless copying, which strengthens my suspicion that it's
>>>>> something in the RL78 backend that needs 'tweaking'.
>>>>
>>>> Of course it is, I've said that before I think.  The RL78 uses a
>>>> virtual model until reload, then converts each virtual instructions
>>>> into multiple real instructions, then optimizes the result.  This is
>>>> going to be worse than if the real model had been used throughout
>>>> (like arm or x86), but in this case, the real model *can't* be used
>>>> throughout, because gcc can't understand it well enough to get through
>>>> regalloc and reload.  The RL78 is just to "weird" to be modelled
>>>> as-is.
>>>>
>>>> I keep hoping that gcc's own post-reload optimizers would do a better
>>>> job, though.  Combine should be able to combine, for example, the "mov
>>>> r8,ax; cmp r8,#4" types of insns together.
>>> The virtual register file was the only way I could see to make RL78
>>> work.  I can't recall the details, but when you described the situation
>>> to me the virtual register file was the only way I could see to make the
>>> RL78 work in the IRA+reload world.
>>>
>>> What would be quite interesting to try would be to continue to use the
>>> virtualized register set, but instead use the IRA+LRA path.  Presumably
>>> that wouldn't be terribly hard to try and there's a reasonable chance
>>> that'll improve the code in a noticeable way.
>>
>> Looking at how that's done by other backends, as far as I can tell, I
>> just need to add something like:
>>
>> #undef  TARGET_LRA_P
>> #define TARGET_LRA_P rl78_enable_lra
>>
>> static bool
>> rl78_enable_lra (void)
>> {
>>    return true;
>> }
>>
>> to rl78.c?  At least in theory, even if other work is needed elsewhere
>> to make things run smoothly.
>>
>> Unfortunately, that function never seems to be called.
>>
>> How does TARGET_LRA_P get used, anyway?  I can't find anything that
>> tries to use it, only places where it gets set.  Is there some funky
>> preprocessor stuff going on that's stopping me grepping for it?
> That should be enough to switch to the LRA path.   It's a target hook.
> Grep for "targetm.lra_p"

Hi Jeff,

Ok, I figured out what was wrong eventually.  I'd added the lines above 
*after* the declaration of the targetm variable.

Activating LRA alone is certainly not the answer.  Whilst I can see that 
*some* of the "to me, to you" register passing has been eliminated, LRA 
seems to have an intense dislike to indirect memory addressing with an 
offset.  So instead of something like:

mov   a, [sp+4]

it's now producing:

movw   ax, sp
addw   ax, #4
movw   hl, ax
mov    a, [hl]

which takes 7 bytes (compared to 4).  Overall I've got an code increase 
of about 31%.

I don't know why it's avoiding the indirect with offset addressing mode. 
  It *does* generate code using it but seemingly as a last resort.

Something else to track down, I guess.

Regards,

Richard.



More information about the Gcc mailing list