http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54988
--- Comment #3 from Thiago Macieira <thiago at kde dot org> 2012-10-22 14:43:11 UTC --- This might be as I pointed out in http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54231: (Node "Function attributes"): On the 386/x86_64 and PowerPC backends, the inliner will not inline a function that has different target options than the caller, unless the callee has a subset of the target options of the caller. For example a function declared with `target("sse3")' can inline a function with `target("sse2")', since `-msse3' implies `-msse2'. My guess was that we were forcing the inlining (via always_inline) of a function that has different target options. But I guess that doesn't explain why it happens only in C++ and only in optimising mode. Does always_inline inline on -O0 too?