https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85593
Ramana Radhakrishnan <ramana at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2018-05-04
Version|9.0 |5.4.1
Summary|GCC on ARM allocates R3 for |[5,6,7,8 Regression] GCC on
|local variable when calling |ARM allocates R3 for local
|naked function with O2 |variable when calling naked
|optimizations enabled |function with O2
| |optimizations enabled
Ever confirmed|0 |1
--- Comment #5 from Ramana Radhakrishnan <ramana at gcc dot gnu.org> ---
(In reply to Austin Morton from comment #4)
> In my particular case I was able to work around the issue by removing the
> naked attribute and using extended assembly with a clobbers list.
Removing the naked attribute and using the extended assembler with a clobbers
list is absolutely the correct thing to do.
>
> The resulting code is nearly identical (allowing GCC to generate the correct
> pro/epilog instead of hand writing it), and gcc correctly allocates R4
> instead of R3.
>
> This still feels like a bug in GCC. In the example I gave, if you compiled
> the naked function in a separate C file and linked them it would generate
> the correct code. The issue is that GCC is able to "see" the naked function
> and is performing optimizations that it shouldn't as a result.
>
> I believe that GCC should treat naked functions as opaque as far as
> optimizations are concerned.
> At the very least, there should be a note about this kind of issue included
> in the documentation of the naked attribute.
Yes, it should be opaque as far as this IPA-RA optimization is concerned - I
don't think there are many other optimizations that need to treat this as
opaque. That's what I alluded to in my previous comment
> IIRC there is a hook for ipa-ra that says what
> registers can be clobbered : can't find it immediately. I suppose for naked
> functions it is *all* registers.
I wasn't looking in the backend when I responded earlier, there is no such hook
- I think the correct fix would be to get arm_emit_call_insn to mark *all*
registers as clobbered if the target of the call insn is a naked function i.e.
effectively disabling ipa-ra for naked functions. You'd have to figure out that
the DECL for the target of the call had a "naked" attribute attached to it ...
Do you feel up to writing up a patch assuming you have copyright assignments et
al sewn up ?
>
>
>
> regards
> Ramana