This revision substantially reworks the previous proposal for allowing
limited inlining growth under -Os.
The v3 patch introduced two new inliner parameters. Following the
review feedback that the inliner already has too many tuning knobs, v4
removes both parameters and instead uses the existing distinction
between -Os and -Oz.
Both -Os and -Oz enable optimize_size, which makes the generic
callgraph hotness predicate reject all such edges as hot. This revision
leaves that predicate unchanged because it is also used by IPA
transformations unrelated to inlining. Instead, it introduces an
inliner-local decision for OPTIMIZE_SIZE_BALANCED (-Os).
Under -Os, positive growth is permitted only when reliable PGO or
AutoFDO feedback identifies the call as hot and big_speedup_p predicts
a significant benefit. Calls that are probably never executed are
rejected, growth is bounded by the existing automatic inlining limit,
and simple tail-position calls are excluded. -Oz, -Os without profile
feedback, and non-size optimization modes retain their existing
behavior. No new inliner parameters are introduced.
The CoreMark-Pro workloads were analyzed to determine whether each
patch-induced inline occurred inside the timed kernel or only in setup
and support code. The core workload was the only workload where the
patch introduced an additional inline on a path inside the timed kernel:
crcu8 -> crcu16
Other workloads either had no patch-induced inlining in their timed
kernels or differed only in shared setup and support code outside the
measured region. For example, an additional inline involving
random_u32 and random_u8_vector occurred in input-generation code rather
than in a timed workload kernel. Their scores are therefore not used
as evidence for the direct performance benefit of this inlining decision.
The affected CoreMark-Pro core workload produced the following result:
Target Speedup Final .text change
x86_64 +0.50 % 0 bytes
RISC-V +0.32 % +4 bytes (+0.0009 %)
MIPS +0.11 % -16 bytes (-0.0026 %)
All results were optained with CoreMark-Pro's core worklaod compiled
with -Os and PGO. The baseline and patched compilers used identical
compiler options and equivalent profile-training inputs. Final performance
measurments were run natively. The x86_64 measurments were performed on an
Intel Core i5-11500H, RISC-V measurments on a P8700 Boston board,
and MIPS measurments on a Cavium Octeon+ V0.1 processor.
To isolate the local effect of the newly permitted inline, I also used
a PGO microbenchmark whose measured loop is intentionally dominated by
the affected crcu16 call. It produced the following local speedups:
+9.43 % for x86_64, +6.00 % for RISC-V and +25.00 % for MIPS. The
microbenchmark results are intentionally isolated best-case results
and should not be interpreted as suite-wide or general compiler
performance improvements. These measurments were also performed natively.
This work originated from the MIPS GCC patch c38d7e548cbb, but v4
is a substantial rewrite in response to review.
Changes in v4:
- Removed early-inlining-insns cold and
max-inline-insns-small-and-cold.
- Kept cgraph_edge::maybe_hot_p unchanged and scoped the new
behavior to the inliner.
- Distinguished -Os from -Oz using OPTIMIZE_SIZE_BALANCED.
- Required reliable profile hotness and big_speedup_p.
- Rejected probably-never-executed ant tail-position calls.
- Replaced the parameter-based tests with tests for -Os without a
profile, -Os with PGO, profile-cold calls , tail calls and -Oz.
Link to v3:
https://sourceware.org/pipermail/gcc-patches/2026-June/720810.html
Eldar Osmanovic (1):
Possible inlining improvements with -Os
gcc/ipa-inline.cc | 134 +++++++++++++++++-
.../gcc.dg/ipa/inline-os-no-profile-1.c | 24 ++++
.../gcc.dg/tree-prof/inline-os-pgo-1.c | 33 +++++
.../gcc.dg/tree-prof/inline-os-pgo-cold-1.c | 34 +++++
.../gcc.dg/tree-prof/inline-os-pgo-tail-1.c | 32 +++++
.../gcc.dg/tree-prof/inline-oz-pgo-1.c | 33 +++++
6 files changed, 287 insertions(+), 3 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/ipa/inline-os-no-profile-1.c
create mode 100644 gcc/testsuite/gcc.dg/tree-prof/inline-os-pgo-1.c
create mode 100644 gcc/testsuite/gcc.dg/tree-prof/inline-os-pgo-cold-1.c
create mode 100644 gcc/testsuite/gcc.dg/tree-prof/inline-os-pgo-tail-1.c
create mode 100644 gcc/testsuite/gcc.dg/tree-prof/inline-oz-pgo-1.c
--
2.43.0