[Bug tree-optimization/54965] [4.6 Regression] sorry, unimplemented: inlining failed in call to 'foo': function not considered for inlining

rguenther at suse dot de gcc-bugzilla@gcc.gnu.org
Thu Oct 18 10:59:00 GMT 2012


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54965

--- Comment #4 from rguenther at suse dot de <rguenther at suse dot de> 2012-10-18 10:58:56 UTC ---
On Thu, 18 Oct 2012, siarhei.siamashka at gmail dot com wrote:

> 
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54965
> 
> --- Comment #3 from Siarhei Siamashka <siarhei.siamashka at gmail dot com> 2012-10-18 10:47:51 UTC ---
> (In reply to comment #2)
> > void combine_conjoint_xor_ca_float ()
> > {
> >     combine_channel_t j = pd_combine_conjoint_xor, k = pd_combine_conjoint_xor;
> >     a[0] = k (0, b, 0, a[0]);
> >     a[0] = k (0, b, 0, a[0]);
> >     a[0] = k (0, b, 0, a[0]);
> >     a[0] = j (0, c[0], 0, a[0]);
> >     a[0] = k (0, c[0], 0, a[0]);
> >     a[0] = k (0, c[0], 0, a[0]);
> >     a[0] = k (0, c[0], 0, a[0]);
> > 
> > you are using indirect function calls here, GCC in 4.6 is not smart enough
> > to transform them to direct calls before inlining.  Inlining of
> > always-inline indirect function calls is not going to work reliably.
> 
> Does this only apply to GCC 4.6?

No, that applies in general.  If GCC isn't able to figure out which
function is called it cannot make sure always-inline functions are
always inlined.  always-inline is an attribute that should be used
if it is incorrect to not inline, not if that's just good for 
optimziation.

> > Don't use always-inline or don't use indirect function calls to always-inline
> > functions.
> 
> This looks like it might be really inconvenient. Pixman relies on this
> functionality in a number of places by doing something like this:
> 
> void always_inline per_pixel_operation_a(...)
> {
>     ...
> }
> 
> void always_inline per_pixel_operation_b(...)
> {
>     ...
> }
> 
> void always_inline big_function_template(..., per_pixel_operation_ptr foo)
> {
>     ...
>     /* do some calls to foo() in an inner loop */
>     ...
> }
> 
> void big_function_a(...)
> {
>     big_function_template(..., per_pixel_operation_a);
> }
> 
> void big_function_b(...)
> {
>     big_function_template(..., per_pixel_operation_b);
> }
> 
> Needless to say that we want to be absolutely sure that per-pixel operations
> are always inlined. Otherwise the performance gets really bad if the compiler
> ever makes a bad inlining decision.
> 
> The same functionality can be probably achieved by replacing always_inline
> functions with macros. But the code becomes less readable, more error prone and
> somewhat more difficult to maintain.

In the above case you probably want big_function_a to have all
calls inlined.  You can then conveniently use the flatten attribute:

void __attribute__((flatten)) big_function_b (...)
{
  big_function_template(..., per_pixel_operation_b);
}

GCC will then inline all calls in that function but not ICE
when it fails to inline one case for some weird reason.

Richard.



More information about the Gcc-bugs mailing list