<[email protected]> writes:
> From: Kyrylo Tkachov <[email protected]>
>
> Every define_split and define_peephole2 generator opens by announcing
> itself to the dump file:
>
>   if (dump_file)
>     fprintf (dump_file, "Splitting with gen_split_9 (aarch64.md:2772)\n");
>
> That is a test and a call in each of 4189 functions on aarch64, 414127
> bytes of insn-emit-*.cc, to say something that differs only in the name
> and the location.  Put the test and the call in emit-rtl.cc, next to
> expand_rtx and complete_seq, and pass the part that varies:
>
>   note_split ("gen_split_9 (aarch64.md:2772)");
>
> The dump text is unchanged, which matters because scan-rtl-dump tests
> match on it.
>
> insn-emit-*.cc goes from 12977106 bytes to 12792702 and compiles in 5% less
> time, with peak memory 387MB against 424MB.
>
> Bootstrapped on aarch64-none-linux-gnu.
> Ok for trunk?
>
> gcc/ChangeLog:
>
>       * rtl.h (note_split): Declare.
>       * emit-rtl.cc (note_split): New function.
>       * genemit.cc (gen_split): Call it rather than emitting the test and
>       the fprintf.

If we're optimising the call sites to this extent, perhaps we should
call it "start_split" and include the start_sequence as well.  The patch
is ok as-is though.

Thanks,
Richard

>
> Signed-off-by: Kyrylo Tkachov <[email protected]>
> ---
>  gcc/emit-rtl.cc | 12 ++++++++++++
>  gcc/genemit.cc  |  3 +--
>  gcc/rtl.h       |  1 +
>  3 files changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/gcc/emit-rtl.cc b/gcc/emit-rtl.cc
> index 4a23eaefe02..08e58ce962d 100644
> --- a/gcc/emit-rtl.cc
> +++ b/gcc/emit-rtl.cc
> @@ -7092,6 +7092,18 @@ complete_seq (const uint8_t *seq, rtx *operands)
>    return end_sequence ();
>  }
>  
> +/* Note in the dump file that WHAT, which names a define_split or a
> +   define_peephole2 and where it came from, is being applied.  genemit.cc
> +   emits a call to this rather than the test and the fprintf, so that the
> +   dump is written out once instead of once per pattern.  */
> +
> +void
> +note_split (const char *what)
> +{
> +  if (dump_file)
> +    fprintf (dump_file, "Splitting with %s\n", what);
> +}
> +
>  /* Initialize fields of rtl_data related to stack alignment.  */
>  
>  void
> diff --git a/gcc/genemit.cc b/gcc/genemit.cc
> index 6323aeb19fc..d1dfb296629 100644
> --- a/gcc/genemit.cc
> +++ b/gcc/genemit.cc
> @@ -600,8 +600,7 @@ gen_split (const md_rtx_info &info, FILE *file)
>      if (*p == '/')
>        fn = p + 1;
>  
> -  fprintf (file, "  if (dump_file)\n");
> -  fprintf (file, "    fprintf (dump_file, \"Splitting with gen_%s_%d 
> (%s:%d)\\n\");\n",
> +  fprintf (file, "  note_split (\"gen_%s_%d (%s:%d)\");\n",
>         name, info.index, fn, info.loc.lineno);
>  
>    fprintf (file, "  start_sequence ();\n");
> diff --git a/gcc/rtl.h b/gcc/rtl.h
> index aa0b4c77a39..d305e15a1d1 100644
> --- a/gcc/rtl.h
> +++ b/gcc/rtl.h
> @@ -3080,6 +3080,7 @@ enum class expand_opcode {
>  
>  extern rtx expand_rtx (const uint8_t *, rtx *);
>  extern rtx_insn *complete_seq (const uint8_t *, rtx *);
> +extern void note_split (const char *);
>  extern rtx copy_rtx_if_shared (rtx);
>  
>  /* In rtl.cc */

Reply via email to