Ping.
Thanks,
Kyrill
> On 13 Aug 2026, at 15:24, Kyrylo Tkachov <[email protected]> wrote:
>
> From: Kyrylo Tkachov <[email protected]>
>
> The sources the machine description generators write are among the slowest
> objects to compile in a bootstrap. GCC already works around this by cutting
> insn-emit and insn-recog into numbered partitions, which spreads the cost over
> more processes.
>
> Before improving and extending the splitting machinery, I think we should
> first
> try to optimise the generated code from the generators as much as possible.
>
> In these patches I try to teach the generators to write repeated text once,
> or to replace regular code with a table that a small interpreter walks.
> Nothing about the interfaces changes, so the rest of the compiler is
> untouched.
>
> Measured over one configuration per backend, 46 backends, counting every
> insn-*.cc and insn-*.h a generator writes and summing over all partitions:
>
> generator bytes base bytes new % lines % stmts base stmts
> new %
> extract 6954308 1018570 -85.4 -87.9 35744
> 2116 -94.1
> output 91193978 53162187 -41.7 -87.4 67516
> 32910 -51.3
> recog 74649869 54765387 -26.6 -15.7 712451
> 727994 +2.2
> opinit 4398223 3377021 -23.2 -20.2 44034
> 9332 -78.8
> attrtab 64906810 63096558 -2.8 -2.0 106488
> 102829 -3.4
> emit 107926701 106158175 -1.6 -1.0 814206
> 814206 +0.0
> TOTAL 350029889 281577898 -19.6 -44.2 1780439
> 1689387 -5.1
>
> Every backend shrinks. The reduction runs from 25.0% on vax to 2.7% on moxie,
> with a median of 12.4%. The larger backends gain most in absolute terms:
> riscv 140.0MB to 107.7MB, i386 57.0MB to 49.9MB, aarch64 40.4MB to 31.4MB.
>
> Patches 1 to 9 do the compaction, grouped by generator. Patches 10 to 12 are
> a
> respin of https://gcc.gnu.org/pipermail/gcc-patches/2026-August/726474.html.
> Give the generators one output mechanism, apply it to genattrtab, and let a
> target
> choose its own partition counts. With the sources this much smaller the
> counts
> no longer need to be large, so AArch64 drops from ten emit and ten recog
> partitions to six, and stops splitting insn-attrtab at all.
>
> On bootstrap time the effect is currently small. On an idle x86_64 machine at
> -j48, three rounds alternating baseline and series, the series uses 1.18% less
> CPU and 0.50% less wall time. A bootstrap is dominated by libstdc++, libgcc
> and three stages of the compiler, so the generated sources are a small share
> of the whole even after these reductions.
> The other big seriliser is the gimple genmatch stuff that produces a very
> large
> COND_EXPR match function. I have ideas on how to split that, but that will be
> a
> separate patch. Once that happens I expect this series to matter much more.
> In the meantime I think it would help with things like Jeff's userspace
> emulation-assisted bootstraps.
>
> Bootstrapped on aarch64 and on x86_64.
> All 191 config-list.mk configurations were built, of which 187 succeed.
> The four that do not are pre-existing.
> Every prefix of the series builds, so the series is
> bisectable.
>
> Ok for trunk?
> Thanks,
> Kyrill
>
> Kyrylo Tkachov (12):
> contrib: match the split insn-emit sources in filter-clang-warnings.py
> genoutput: emit insn_data and operand_data compactly
> genoutput: write each output template out once
> genopinit: group optab patterns by their availability condition
> genextract: drive insn_extract from the operand path table
> genrecog: write each .md condition out once
> genemit: emit the split dump message through a helper
> genemit: spread the overloaded-name definitions over the output files
> genattrtab: table-drive attributes that are functions of one other
> attribute
> gensupport: Centralize machine-generator output management
> genattrtab: Distribute generated code across multiple files
> configure: Add target defaults for MD generator partitions
>
> contrib/filter-clang-warnings.py | 4 +-
> gcc/Makefile.in | 63 +++--
> gcc/config.gcc | 8 +
> gcc/config/arc/arc-protos.h | 3 +-
> gcc/config/ia64/ia64.cc | 4 +-
> gcc/config/ia64/t-ia64 | 3 +-
> gcc/config/sh/sh.h | 5 +-
> gcc/configure | 93 ++++++-
> gcc/configure.ac | 82 ++++++-
> gcc/doc/install.texi | 11 +
> gcc/emit-rtl.cc | 12 +
> gcc/final.cc | 2 +-
> gcc/genattrtab.cc | 406 +++++++++++++++++++++++++++----
> gcc/genemit.cc | 32 ++-
> gcc/genextract.cc | 316 +++++++++++++++---------
> gcc/genopinit.cc | 112 ++++++---
> gcc/genoutput.cc | 138 ++++++-----
> gcc/genrecog.cc | 119 ++++++---
> gcc/gensupport.cc | 80 ++++--
> gcc/gensupport.h | 16 +-
> gcc/recog.h | 20 +-
> gcc/rtl.h | 1 +
> gcc/system.h | 9 -
> 23 files changed, 1128 insertions(+), 411 deletions(-)
>
> --
> 2.50.1 (Apple Git-155)
>