This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Make gen_rtx_fmt_* functions inline


On Tue, Jun 1, 2010 at 1:25 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
> Hi,
> looking into -O3 WHOPR compilation build, I noticed that first few thousdand functions
> inlined are functions produced by gengenrtl.c. ?They looks as follows:
> rtx
> gen_rtx_fmt_iuuBieie_stat (RTX_CODE code, enum machine_mode mode,
> ? ? ? ?int arg0,
> ? ? ? ?rtx arg1,
> ? ? ? ?rtx arg2,
> ? ? ? ?struct basic_block_def *arg3,
> ? ? ? ?int arg4,
> ? ? ? ?rtx arg5,
> ? ? ? ?int arg6,
> ? ? ? ?rtx arg7 MEM_STAT_DECL)
> {
> ?rtx rt;
> ?rt = rtx_alloc_stat (code PASS_MEM_STAT);
>
> ?PUT_MODE (rt, mode);
> ?XINT (rt, 0) = arg0;
> ?XEXP (rt, 1) = arg1;
> ?XEXP (rt, 2) = arg2;
> ?XBBDEF (rt, 3) = arg3;
> ?XINT (rt, 4) = arg4;
> ?XEXP (rt, 5) = arg5;
> ?XINT (rt, 6) = arg6;
> ?XEXP (rt, 7) = arg7;
>
> ?return rt;
> }
>
> Inlining those is obviously good idea. ?One save function passing overhead
> and gets the store more explicit. ?It also makes code generation easier.
>
> Bootstrapped/regtested x86_64-linux, OK?

How does size of cc1 compare with this patch at the default
optimization level -O2 -g without LTO?  Ok if that doesn't differ
unreasonably.

Thanks,
Richard.

> ? ? ? ?* gegenrtl.c: Remove unnecesary prototypes.
> ? ? ? ?(gendecl): Remove.
> ? ? ? ?(gendef): Produce static inline and statistics macro.
> ? ? ? ?(gencode): Remove.
> ? ? ? ?(main): Do not decode parameters; generate header only.
> ? ? ? ?* Makefile.in (genrtl.c): Remove.
> Index: Makefile.in
> ===================================================================
> --- Makefile.in (revision 160079)
> +++ Makefile.in (working copy)
> @@ -1469,7 +1469,7 @@
> ?insn-attr.h insn-attrtab.c insn-opinit.c insn-preds.c insn-constants.h \
> ?tm-preds.h tm-constrs.h \
> ?tree-check.h min-insn-modes.c insn-modes.c insn-modes.h \
> - genrtl.c genrtl.h gt-*.h gtype-*.h gtype-desc.c gtyp-input.list \
> + genrtl.h gt-*.h gtype-*.h gtype-desc.c gtyp-input.list \
> ?xgcc$(exeext) cpp$(exeext) cc1$(exeext) cc1*-dummy$(exeext) $(EXTRA_PASSES) \
> ?$(EXTRA_PARTS) $(EXTRA_PROGRAMS) gcc-cross$(exeext) \
> ?$(SPECS) collect2$(exeext) lto-wrapper$(exeext) \
> @@ -3482,8 +3482,6 @@
> ? ? ? ?$(STAMP) s-mddeps
>
> ?# Header dependencies for generated source files.
> -genrtl.o : genrtl.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) ? ? ? ?$(RTL_H)\
> - ?$(GGC_H) $(OBSTACK_H)
> ?insn-attrtab.o : insn-attrtab.c $(CONFIG_H) $(SYSTEM_H) coretypes.h ? ?\
> ? $(TM_H) $(RTL_H) $(REGS_H) output.h $(INSN_ATTR_H) ? ? ? ? ? ? ? ? ? \
> ? insn-config.h $(TOPLEV_H) $(RECOG_H) $(TM_P_H) $(FLAGS_H)
> @@ -3593,16 +3591,10 @@
> ?# These files are generated by running the same generator more than
> ?# once with different options, so they have custom rules. ?The
> ?# stampfile idiom is the same.
> -genrtl.c: s-genrtl; @true
> ?genrtl.h: s-genrtl-h; @true
>
> -s-genrtl: build/gengenrtl$(build_exeext)
> - ? ? ? $(RUN_GEN) build/gengenrtl$(build_exeext) > tmp-genrtl.c
> - ? ? ? $(SHELL) $(srcdir)/../move-if-change tmp-genrtl.c genrtl.c
> - ? ? ? $(STAMP) s-genrtl
> -
> ?s-genrtl-h: build/gengenrtl$(build_exeext)
> - ? ? ? $(RUN_GEN) build/gengenrtl$(build_exeext) -h > tmp-genrtl.h
> + ? ? ? $(RUN_GEN) build/gengenrtl$(build_exeext) > tmp-genrtl.h
> ? ? ? ?$(SHELL) $(srcdir)/../move-if-change tmp-genrtl.h genrtl.h
> ? ? ? ?$(STAMP) s-genrtl-h
>
> Index: gengenrtl.c
> ===================================================================
> --- gengenrtl.c (revision 160079)
> +++ gengenrtl.c (working copy)
> @@ -41,19 +41,6 @@
> ?#define NUM_RTX_CODE ARRAY_SIZE(defs)
>
> ?static const char *formats[NUM_RTX_CODE];
> -
> -static const char *type_from_format ? ?(int);
> -static const char *accessor_from_format ? ? ? ?(int);
> -static int special_format ? ? ? ? ? ? ?(const char *);
> -static int special_rtx ? ? ? ? ? ? ? ? (int);
> -static int excluded_rtx ? ? ? ? ? ? ? ? ? ? ? ?(int);
> -static void find_formats ? ? ? ? ? ? ? (void);
> -static void gendecl ? ? ? ? ? ? ? ? ? ?(const char *);
> -static void genmacro ? ? ? ? ? ? ? ? ? (int);
> -static void gendef ? ? ? ? ? ? ? ? ? ? (const char *);
> -static void genlegend ? ? ? ? ? ? ? ? ?(void);
> -static void genheader ? ? ? ? ? ? ? ? ?(void);
> -static void gencode ? ? ? ? ? ? ? ? ? ?(void);
>
> ?/* Decode a format letter into a C type string. ?*/
>
> @@ -178,45 +165,7 @@
> ? ? }
> ?}
>
> -/* Write the declarations for the routine to allocate RTL with FORMAT. ?*/
>
> -static void
> -gendecl (const char *format)
> -{
> - ?const char *p;
> - ?int i, pos;
> -
> - ?printf ("extern rtx gen_rtx_fmt_%s_stat\t (RTX_CODE, ", format);
> - ?printf ("enum machine_mode mode");
> -
> - ?/* Write each parameter that is needed and start a new line when the line
> - ? ? would overflow. ?*/
> - ?for (p = format, i = 0, pos = 75; *p != 0; p++)
> - ? ?if (*p != '0')
> - ? ? ?{
> - ? ? ? int ourlen = strlen (type_from_format (*p)) + 6 + (i > 9);
> -
> - ? ? ? printf (",");
> - ? ? ? if (pos + ourlen > 76)
> - ? ? ? ? printf ("\n\t\t\t\t ? ? ?"), pos = 39;
> -
> - ? ? ? printf (" %sarg%d", type_from_format (*p), i++);
> - ? ? ? pos += ourlen;
> - ? ? ?}
> - ?printf (" MEM_STAT_DECL");
> -
> - ?printf (");\n");
> - ?printf ("#define gen_rtx_fmt_%s(c, m", format);
> - ?for (p = format, i = 0; *p != 0; p++)
> - ? ?if (*p != '0')
> - ? ? ?printf (", p%i",i++);
> - ?printf (")\\\n ? ? ? ?gen_rtx_fmt_%s_stat (c, m", format);
> - ?for (p = format, i = 0; *p != 0; p++)
> - ? ?if (*p != '0')
> - ? ? ?printf (", p%i",i++);
> - ?printf (" MEM_STAT_INFO)\n\n");
> -}
> -
> ?/* Generate macros to generate RTL of code IDX using the functions we
> ? ?write. ?*/
>
> @@ -262,7 +211,7 @@
> ? /* Start by writing the definition of the function name and the types
> ? ? ?of the arguments. ?*/
>
> - ?printf ("rtx\ngen_rtx_fmt_%s_stat (RTX_CODE code, enum machine_mode mode", format);
> + ?printf ("static inline rtx\ngen_rtx_fmt_%s_stat (RTX_CODE code, enum machine_mode mode", format);
> ? for (p = format, i = 0; *p != 0; p++)
> ? ? if (*p != '0')
> ? ? ? printf (",\n\t%sarg%d", type_from_format (*p), i++);
> @@ -284,6 +233,15 @@
> ? ? ? printf (" ?X0EXP (rt, %d) = NULL_RTX;\n", i);
>
> ? puts ("\n ?return rt;\n}\n");
> + ?printf ("#define gen_rtx_fmt_%s(c, m", format);
> + ?for (p = format, i = 0; *p != 0; p++)
> + ? ?if (*p != '0')
> + ? ? ?printf (", p%i",i++);
> + ?printf (")\\\n ? ? ? ?gen_rtx_fmt_%s_stat (c, m", format);
> + ?for (p = format, i = 0; *p != 0; p++)
> + ? ?if (*p != '0')
> + ? ? ?printf (", p%i",i++);
> + ?printf (" MEM_STAT_INFO)\n\n");
> ?}
>
> ?/* Generate the documentation header for files we write. ?*/
> @@ -307,7 +265,7 @@
> ? puts ("#include \"statistics.h\"\n");
>
> ? for (fmt = formats; *fmt; ++fmt)
> - ? ?gendecl (*fmt);
> + ? ?gendef (*fmt);
>
> ? putchar ('\n');
>
> @@ -318,39 +276,15 @@
> ? puts ("\n#endif /* GCC_GENRTL_H */");
> ?}
>
> -/* Generate the text of the code file we write, genrtl.c. ?*/
> +/* This is the main program. ?*/
>
> -static void
> -gencode (void)
> -{
> - ?const char **fmt;
> -
> - ?puts ("#include \"config.h\"");
> - ?puts ("#include \"system.h\"");
> - ?puts ("#include \"coretypes.h\"");
> - ?puts ("#include \"tm.h\"");
> - ?puts ("#include \"obstack.h\"");
> - ?puts ("#include \"rtl.h\"");
> - ?puts ("#include \"ggc.h\"\n");
> -
> - ?for (fmt = formats; *fmt != 0; fmt++)
> - ? ?gendef (*fmt);
> -}
> -
> -/* This is the main program. ?We accept only one argument, "-h", which
> - ? says we are writing the genrtl.h file. ?Otherwise we are writing the
> - ? genrtl.c file. ?*/
> -
> ?int
> -main (int argc, char **argv)
> +main (void)
> ?{
> ? find_formats ();
> ? genlegend ();
>
> - ?if (argc == 2 && argv[1][0] == '-' && argv[1][1] == 'h')
> - ? ?genheader ();
> - ?else
> - ? ?gencode ();
> + ?genheader ();
>
> ? if (ferror (stdout) || fflush (stdout) || fclose (stdout))
> ? ? return FATAL_EXIT_CODE;
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]