https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117862
Bug ID: 117862
Summary: Missed Optimization: Failure to Inline Functions When
Generating Position-Independent Code (PIC)
Product: gcc
Version: 14.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: ipa
Assignee: unassigned at gcc dot gnu.org
Reporter: jonathan.gruber.jg at gmail dot com
Target Milestone: ---
Created attachment 59754
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=59754&action=edit
Preprocessed source code for minimal test case.
When GCC is directed to generate position-independent code (via the -fPIC or
-fpic option), it fails to inline function invocations that are clearly
suitable for inlining. I have constructed a minimal test case demonstrating
this behavior. In the attached file mycode.i is the preprocessed source. Please
see the attached source before reading further.
To demonstrate, suppose we put the code in mycode.c and build it into a shared
library (simply compiling it into an object file would suffice, but "objdump
-d" more clearly shows the targets of branches instructions for shared
libraries than for object files).
Build it, but *not* as position-independent code (i.e. without -fPIC or -fpic),
with the following command:
gcc -shared -o libmycode.so mycode.c -Wl,-h,libmycode.so.0 -O3
If we then run "objdump -d libmycode.so", we see that the invocation of
function identity in function also_identity has been inlined away.
Next, build the code again but as position-independent code with either of the
below commands:
gcc -shared -o libmycode.so mycode.c -Wl,-h,libmycode.so.0 -O3 -fPIC
gcc -shared -o libmycode.so mycode.c -Wl,-h,libmycode.so.0 -O3 -fpic
If we again run "objdump -d libmycode.so", we see that, this time, gcc has
*not* inlined the invocation of function identity in function also_identity.
(Of course, for my toy example, the failure to inline would have a negligible
effect on performance, but a missed optimization is still a missed
optimization, and one can imagine that the detriment to performance might be
more significant in a more "real world" scenario.)
I am using version 14.2.1+r134+gab884fffe3fc-1 of the Arch Linux gcc package. I
have also pasted below the output of "gcc -v" on my machine:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure
--enable-languages=ada,c,c++,d,fortran,go,lto,m2,objc,obj-c++,rust
--enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib
--mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues
--with-build-config=bootstrap-lto --with-linker-hash-style=gnu
--with-system-zlib --enable-__cxa_atexit --enable-cet=auto
--enable-checking=release --enable-clocale=gnu --enable-default-pie
--enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object
--enable-libstdcxx-backtrace --enable-link-serialization=1
--enable-linker-build-id --enable-lto --enable-multilib --enable-plugin
--enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch
--disable-werror
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 14.2.1 20240910 (GCC)