From: Kyrylo Tkachov <[email protected]>
genemit picks an output file per pattern, so the gen_* definitions are
spread evenly. The block it writes afterwards is not: it picks a file
once and then emits add_clobbers, added_clobbers_hard_reg_p and the
code_for_/gen_ pair for every overloaded name into that one file.
On aarch64 that left insn-emit-10.cc at 2020142 bytes against 1196464 to
1197283 for the other nine, a 70% overhang on one of ten files. Since
the files are compiled in parallel, the longest one sets how long the
group takes, so the imbalance costs wall-clock time that splitting exists
to save.
Pick a file per overloaded name. The nine sizes become 1268108 to
1311015 bytes, a spread of 3%. add_clobbers and added_clobbers_hard_reg_p
stay together, since they share the table that describes which patterns
have clobbers.
Bootstrapped on aarch64-none-linux-gnu.
Ok for trunk?
gcc/ChangeLog:
* genemit.cc (main): Choose an output file for each overloaded name.
Signed-off-by: Kyrylo Tkachov <[email protected]>
---
gcc/genemit.cc | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/gcc/genemit.cc b/gcc/genemit.cc
index d1dfb296629..9c881aa2bae 100644
--- a/gcc/genemit.cc
+++ b/gcc/genemit.cc
@@ -970,9 +970,13 @@ main (int argc, const char **argv)
output_add_clobbers (file);
output_added_clobbers_hard_reg_p (file);
+ /* Spread these over the output files too. Emitting them all into
+ whichever file happened to be current leaves that one much bigger than
+ the rest, which is the opposite of what splitting is for. */
for (overloaded_name *oname = rtx_reader_ptr->get_overloads ();
oname; oname = oname->next)
{
+ file = choose_output (output_files, file_idx);
handle_overloaded_code_for (oname, file);
handle_overloaded_gen (oname, file);
}
--
2.50.1 (Apple Git-155)