On 8/4/2026 10:57 AM, Kyrylo Tkachov wrote:
On 4 Aug 2026, at 18:26, Jeffrey Law <[email protected]> wrote:
On 7/23/2026 7:20 AM, [email protected] wrote:
From: Kyrylo Tkachov <[email protected]>
insn-opinit.cc contains large generated initialization functions with
thousands of target-feature expressions. The single file is among the
slowest objects in every AArch64 bootstrap stage.
Teach genopinit to accept repeatable -O output options, following genemit and
genrecog. Reuse the existing --with-insnemit-partitions count, while
preserving the default init-opinit.c output and -cFILE interface when -O is not
used. Collect and validate all output names before opening them, rejecting
duplicates, resolvable aliases, header collisions, and incompatible -c and -O
options.
Keep shared lookup code and all helper declarations in the first output, then
place helper definitions in the shortest output. One-file output retains the
historical static helper names. Split output uses generator-private external
names for cross-file references.
With the default ten AArch64 partitions, the largest part compiles about 90%
faster than the original single object.
Bootstrapped and tested on aarch64-none-linux-gnu and x86_64-linux.
Ok for trunk?
Thanks,
Kyrill
gcc/ChangeLog:
* Makefile.in (INSNOPINIT_SPLITS_SEQ, INSNOPINIT_SEQ_SRC)
(INSNOPINIT_SEQ_TMP, INSNOPINIT_SEQ_O): New variables.
(OBJS): Replace insn-opinit.o with $(INSNOPINIT_SEQ_O).
(MOSTLYCLEANFILES): Add $(INSNOPINIT_SEQ_SRC), retaining the legacy
unnumbered source for cleanup.
(s-opinit): Generate and move numbered insn-opinit-N.cc files. Stop if
moving an output fails.
* configure.ac (--with-insnemit-partitions): Mention genopinit outputs.
* configure: Regenerate.
* genopinit.cc (source_file_option, output_file_names, output_files):
New variables.
(handle_arg): Record and validate repeatable -O output names.
(main): Validate all output modes before opening files. Preserve static
helper linkage for one output and distribute private split helpers.
Signed-off-by: Kyrylo Tkachov <[email protected]>
It'll be interesting to see if this improves the RISC-V build times too. Robin
fixed the worst of the offenders a while back, but we've got daily build data
and if there's a meaningful improvement we should be able to see it.
The only concern is the INSNOPINIT_SPLITS_SEQ is slightly different than the
other _SEQ variables. The others use:
MATCH_SPLITS_SEQ = $(wordlist 1,$(NUM_MATCH_SPLITS),$(one_to_9999))
INSNEMIT_SPLITS_SEQ = $(wordlist 1,$(NUM_INSNEMIT_SPLITS),$(one_to_9999))
INSNRECOG_SPLITS_SEQ = $(wordlist 1,$(NUM_INSNEMIT_SPLITS),$(one_to_9999))
Is there a reason you didn't use that form?
No particular reason, they both work the same in practice, I can change to use
that form.
Ok with that change if testing passes?
Yea, let's keep them consistent. OK assuming testing passes.
jeff