<[email protected]> writes:
> 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.

OK, thanks.

> 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);
>      }

Reply via email to