This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Make gen_rtx_fmt_* functions inline
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 1 Jun 2010 01:25:48 +0200
- Subject: Make gen_rtx_fmt_* functions inline
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?
* 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;