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)

Reply via email to