RFC: always-inline vs unit-at-a-time

Dale Johannesen dalej@apple.com
Tue Mar 15 19:20:00 GMT 2005


On Mar 15, 2005, at 10:32 AM, Zack Weinberg wrote:

> Dale Johannesen <dalej@apple.com> writes:
>
>> Consider the following:
>>
>> static inline int a() __attribute((always_inline));
>> static inline int b() __attribute((always_inline));
>>
>> static inline int b() { a(); }
>> static inline int a() { }
>> int c() { b(); }
>>
>> This compiles fine at -O2.  At -O0 we get the baffling error
>>    sorry, unimplemented: inlining failed in call to 'a': function not
>>    considered for inlining
>>
>> It seems undesirable for -O options to affect which programs will
>> compile.
>
> Agreed.  Perhaps we should run the inliner at -O0 if we see
> always_inline attributes, just for those functions?

We do; the problem is that it makes only 1 pass, so tries to inline
"a" before it has seen the body of "a".  If you interchange the 
definitions
of "a" and "b" the inlining is done at all optimization levels.

> I think this
> could be done without turning on -funit-at-a-time, even (the inliner
> does work in -O2 -fno-unit-at-a-time mode, after all).

That gets the same failure on this example.

> The problem is not the effect on compile speed (IIRC Honza had it down
> to negligible) but the way it breaks assembly hacks such as crtstuff.c.
> (I would love to see a solution to that.)

I wasn't aware of this problem, can you give me a pointer?



More information about the Gcc mailing list