On 09/03/2018 02:54 PM, Martin Liška wrote: > On 09/03/2018 02:41 PM, Richard Biener wrote: >> On Mon, 3 Sep 2018, Martin Liška wrote: >> >>> On 04/25/2018 01:42 PM, Richard Biener wrote: >>>> >>>> The following patch^Whack splits $subject files into three, one >>>> for the predicates (due to an implementation detail) and two for >>>> the rest - for now into similar LOC size files. >>>> >>>> I'd like to get help on the makefile changes to make them less >>>> verbose, somehow globbing the -[12p] parts. >>>> >>>> Also you can see the split point is manually chosen which means >>>> it will bitrot. Timings for the stage2 compiles on a x86_64 >>>> box are >>>> >>>> gimple-match-p.c 5s >>>> generic-match-p.c 3s >>>> gimple-match-1.c 85s >>>> generic-match-1.c 56s >>>> gimple-match-2.c 82s >>>> generic-match-2.c 31s >>>> >>>> the required header files are quite big (and of course everything >>>> needs to be exported without the analysis work becoming too cumbersome), >>>> it's 3342 LOC for gimple-match-head.h and 1556 LOC for >>>> generic-match-head.h >>>> >>>> The machine I tested is quite fast so the 80ish second timings are still >>>> too slow I guess and thus splitting up into four files for gimple and >>>> three files for generic looks better. >>>> >>>> Note we lose some inlining/cloning capability in the splitting process >>>> (I see quite a bit of constprop/isra work being done on the generated >>>> files). I didn't try to measure the runtime impact though. >>>> >>>> The patch still needs quite some TLC, it really is a bit hacky but I'd >>>> like to get feedback on the approach and I didn't want to spend time >>>> on programatically finding optimal split points (so everything is output >>>> in the same semi-random order as before). >>>> >>>> Richard. >>>> >>>> <insert ChangeLog here> >>>> >>>> Index: gcc/genmatch.c >>>> =================================================================== >>>> --- gcc/genmatch.c (revision 259638) >>>> +++ gcc/genmatch.c (working copy) >>>> @@ -1641,7 +1641,7 @@ struct decision_tree >>>> dt_node *root; >>>> >>>> void insert (struct simplify *, unsigned); >>>> - void gen (FILE *f, bool gimple); >>>> + void gen (const char *, FILE *, vec<unsigned long> &, bool gimple); >>>> void print (FILE *f = stderr); >>>> >>>> decision_tree () { root = new dt_node (dt_node::DT_NODE, NULL); } >>>> @@ -3608,12 +3608,25 @@ sinfo_hashmap_traits::equal_keys (const >>>> return compare_op (v->s->result, v->s, candidate->s->result, >>>> candidate->s); >>>> } >>>> >>>> +/* Write the common header for the GIMPLE/GENERIC IL matching routines. >>>> */ >>>> + >>>> +static void >>>> +write_header (FILE *f, bool gimple) >>>> +{ >>>> + fprintf (f, "/* Generated automatically by the program `genmatch' >>>> from\n"); >>>> + fprintf (f, " a IL pattern matching and simplification description. >>>> */\n"); >>>> + >>>> + /* Include the header instead of writing it awkwardly quoted here. */ >>>> + fprintf (f, "\n#include \"%s-match-head.c\"\n", >>>> + gimple ? "gimple" : "generic"); >>>> +} >>>> >>>> /* Main entry to generate code for matching GIMPLE IL off the decision >>>> tree. */ >>>> >>>> void >>>> -decision_tree::gen (FILE *f, bool gimple) >>>> +decision_tree::gen (const char *output, FILE *headerf, >>>> + vec<unsigned long> &pieces, bool gimple) >>>> { >>>> sinfo_map_t si; >>>> >>>> @@ -3624,6 +3637,34 @@ decision_tree::gen (FILE *f, bool gimple >>>> gimple ? "GIMPLE" : "GENERIC", >>>> root->num_leafs, root->max_level, root->total_size); >>>> >>>> + FILE *f; >>>> + char *outputtem = NULL; >>>> + if (output) >>>> + outputtem = XNEWVEC (char, strlen (output) + strlen ("-1.c") + 1); >>>> + >>>> + unsigned do_header = headerf ? 2 : 1; >>>> + unsigned n_per_part = -1U; >>>> + unsigned file_n = output ? 1 : 2; >>>> + do >>>> + { >>>> + unsigned n_fn = 0; >>>> + do_header--; >>>> + >>>> + if (do_header) >>>> + f = headerf; >>>> + else if (!output) >>>> + f = stdout; >>>> + else >>>> + { >>>> + sprintf (outputtem, "%s-%d.c", output, file_n++); >>>> + f = fopen (outputtem, "w"); >>>> + if (!f) >>>> + { >>>> + perror ("failed to open output file"); >>>> + exit(1); >>>> + } >>>> + write_header (f, gimple); >>>> + } >>>> /* First split out the transform part of equal leafs. */ >>>> unsigned rcnt = 0; >>>> unsigned fcnt = 1; >>>> @@ -3643,21 +3684,22 @@ decision_tree::gen (FILE *f, bool gimple >>>> } >>>> >>>> /* Generate a split out function with the leaf transform code. */ >>>> + if (do_header || !output) >>>> s->fname = xasprintf ("%s_simplify_%u", gimple ? "gimple" : >>>> "generic", >>>> fcnt++); >>>> if (gimple) >>>> - fprintf (f, "\nstatic bool\n" >>>> + fprintf (f, "\n%sbool\n" >>>> "%s (code_helper *res_code, tree *res_ops,\n" >>>> " gimple_seq *seq, tree (*valueize)(tree) " >>>> "ATTRIBUTE_UNUSED,\n" >>>> " const tree ARG_UNUSED (type), tree >>>> *ARG_UNUSED " >>>> "(captures)\n", >>>> - s->fname); >>>> + headerf ? "" : "static ", s->fname); >>>> else >>>> { >>>> - fprintf (f, "\nstatic tree\n" >>>> + fprintf (f, "\n%stree\n" >>>> "%s (location_t ARG_UNUSED (loc), const tree ARG_UNUSED >>>> (type),\n", >>>> - (*iter).second->fname); >>>> + headerf ? "" : "static ", (*iter).second->fname); >>>> for (unsigned i = 0; >>>> i < as_a <expr *>(s->s->s->match)->ops.length (); ++i) >>>> fprintf (f, " tree ARG_UNUSED (op%d),", i); >>>> @@ -3674,7 +3716,12 @@ decision_tree::gen (FILE *f, bool gimple >>>> fprintf (f, ", const combined_fn ARG_UNUSED (%s)", >>>> s->s->s->for_subst_vec[i].first->id); >>>> } >>>> - >>>> + n_fn++; >>>> + if (do_header) >>>> + { >>>> + fprintf (f, ");\n"); >>>> + continue; >>>> + } >>>> fprintf (f, ")\n{\n"); >>>> s->s->gen_1 (f, 2, gimple, s->s->s->result); >>>> if (gimple) >>>> @@ -3682,7 +3729,22 @@ decision_tree::gen (FILE *f, bool gimple >>>> else >>>> fprintf (f, " return NULL_TREE;\n"); >>>> fprintf (f, "}\n"); >>>> + >>>> + if (n_fn == pieces[file_n - 2]) >>>> + { >>>> + fclose (f); >>>> + sprintf (outputtem, "%s-%d.c", output, file_n++); >>>> + f = fopen (outputtem, "w"); >>>> + if (!f) >>>> + { >>>> + perror ("failed to open output file"); >>>> + exit(1); >>>> + } >>>> + write_header (f, gimple); >>>> + n_fn = 0; >>>> + } >>>> } >>>> + if (!do_header) >>>> fprintf (stderr, "removed %u duplicate tails\n", rcnt); >>>> >>>> for (unsigned n = 1; n <= 3; ++n) >>>> @@ -3702,20 +3764,26 @@ decision_tree::gen (FILE *f, bool gimple >>>> continue; >>>> >>>> if (gimple) >>>> - fprintf (f, "\nstatic bool\n" >>>> + fprintf (f, "\n%sbool\n" >>>> "gimple_simplify_%s (code_helper *res_code, tree >>>> *res_ops,\n" >>>> " gimple_seq *seq, tree (*valueize)(tree) " >>>> "ATTRIBUTE_UNUSED,\n" >>>> " code_helper ARG_UNUSED (code), tree " >>>> "ARG_UNUSED (type)\n", >>>> - e->operation->id); >>>> + headerf ? "" : "static ", e->operation->id); >>>> else >>>> - fprintf (f, "\nstatic tree\n" >>>> + fprintf (f, "\n%stree\n" >>>> "generic_simplify_%s (location_t ARG_UNUSED (loc), enum " >>>> "tree_code ARG_UNUSED (code), const tree ARG_UNUSED >>>> (type)", >>>> - e->operation->id); >>>> + headerf ? "" : "static ", e->operation->id); >>>> for (unsigned i = 0; i < n; ++i) >>>> fprintf (f, ", tree op%d", i); >>>> + n_fn++; >>>> + if (do_header) >>>> + { >>>> + fprintf (f, ");\n"); >>>> + continue; >>>> + } >>>> fprintf (f, ")\n"); >>>> fprintf (f, "{\n"); >>>> dop->gen_kids (f, 2, gimple); >>>> @@ -3724,21 +3792,43 @@ decision_tree::gen (FILE *f, bool gimple >>>> else >>>> fprintf (f, " return NULL_TREE;\n"); >>>> fprintf (f, "}\n"); >>>> + >>>> + if (n_fn == pieces[file_n - 2]) >>>> + { >>>> + fclose (f); >>>> + sprintf (outputtem, "%s-%d.c", output, file_n++); >>>> + f = fopen (outputtem, "w"); >>>> + if (!f) >>>> + { >>>> + perror ("failed to open output file"); >>>> + exit(1); >>>> + } >>>> + write_header (f, gimple); >>>> + n_fn = 0; >>>> + } >>>> + >>>> } >>>> >>>> /* Then generate the main entry with the outermost switch and >>>> tail-calls to the split-out functions. */ >>>> if (gimple) >>>> - fprintf (f, "\nstatic bool\n" >>>> + fprintf (f, "\n%sbool\n" >>>> "gimple_simplify (code_helper *res_code, tree *res_ops,\n" >>>> " gimple_seq *seq, tree (*valueize)(tree),\n" >>>> - " code_helper code, const tree type"); >>>> + " code_helper code, const tree type", >>>> + headerf ? "" : "static "); >>>> else >>>> fprintf (f, "\ntree\n" >>>> "generic_simplify (location_t loc, enum tree_code code, " >>>> "const tree type ATTRIBUTE_UNUSED"); >>>> for (unsigned i = 0; i < n; ++i) >>>> fprintf (f, ", tree op%d", i); >>>> + n_fn++; >>>> + if (do_header) >>>> + { >>>> + fprintf (f, ");\n"); >>>> + continue; >>>> + } >>>> fprintf (f, ")\n"); >>>> fprintf (f, "{\n"); >>>> >>>> @@ -3786,19 +3876,46 @@ decision_tree::gen (FILE *f, bool gimple >>>> else >>>> fprintf (f, " return NULL_TREE;\n"); >>>> fprintf (f, "}\n"); >>>> + if (n_fn == pieces[file_n - 2]) >>>> + { >>>> + fclose (f); >>>> + sprintf (outputtem, "%s-%d.c", output, file_n++); >>>> + f = fopen (outputtem, "w"); >>>> + if (!f) >>>> + { >>>> + perror ("failed to open output file"); >>>> + exit(1); >>>> + } >>>> + write_header (f, gimple); >>>> + n_fn = 0; >>>> + } >>>> + } >>>> + >>>> + n_per_part = n_fn / 4 + 1; >>>> } >>>> + while (do_header); >>>> + if (output) >>>> + fclose (f); >>>> } >>>> >>>> /* Output code to implement the predicate P from the decision tree DT. */ >>>> >>>> void >>>> -write_predicate (FILE *f, predicate_id *p, decision_tree &dt, bool gimple) >>>> +write_predicate (FILE *f, predicate_id *p, decision_tree &dt, bool gimple, >>>> + bool for_header) >>>> { >>>> fprintf (f, "\nbool\n" >>>> - "%s%s (tree t%s%s)\n" >>>> - "{\n", gimple ? "gimple_" : "tree_", p->id, >>>> + "%s%s (tree t%s%s)", >>>> + gimple ? "gimple_" : "tree_", p->id, >>>> p->nargs > 0 ? ", tree *res_ops" : "", >>>> gimple ? ", tree (*valueize)(tree) ATTRIBUTE_UNUSED" : ""); >>>> + if (for_header) >>>> + { >>>> + fprintf (f, ";\n"); >>>> + return; >>>> + } >>>> + >>>> + fprintf (f, "\n{\n"); >>>> /* Conveniently make 'type' available. */ >>>> fprintf_indent (f, 2, "const tree type = TREE_TYPE (t);\n"); >>>> >>>> @@ -3810,18 +3927,6 @@ write_predicate (FILE *f, predicate_id * >>>> "}\n"); >>>> } >>>> >>>> -/* Write the common header for the GIMPLE/GENERIC IL matching routines. >>>> */ >>>> - >>>> -static void >>>> -write_header (FILE *f, const char *head) >>>> -{ >>>> - fprintf (f, "/* Generated automatically by the program `genmatch' >>>> from\n"); >>>> - fprintf (f, " a IL pattern matching and simplification description. >>>> */\n"); >>>> - >>>> - /* Include the header instead of writing it awkwardly quoted here. */ >>>> - fprintf (f, "\n#include \"%s\"\n", head); >>>> -} >>>> - >>>> >>>> >>>> /* AST parsing. */ >>>> @@ -4969,6 +5074,9 @@ main (int argc, char **argv) >>>> >>>> bool gimple = true; >>>> char *input = argv[argc-1]; >>>> + char *output = NULL; >>>> + char *header = NULL; >>>> + auto_vec<unsigned long> pieces; >>>> for (int i = 1; i < argc - 1; ++i) >>>> { >>>> if (strcmp (argv[i], "--gimple") == 0) >>>> @@ -4979,13 +5087,25 @@ main (int argc, char **argv) >>>> verbose = 1; >>>> else if (strcmp (argv[i], "-vv") == 0) >>>> verbose = 2; >>>> + else if (strcmp (argv[i], "-c") == 0) >>>> + { >>>> + char *endp; >>>> + output = argv[++i]; >>>> + while (i + 1 < argc - 1 >>>> + && ISDIGIT (argv[i + 1][0])) >>>> + pieces.safe_push (strtoul (argv[++i], &endp, 10)); >>>> + } >>>> + else if (strcmp (argv[i], "-h") == 0) >>>> + header = argv[++i]; >>>> else >>>> { >>>> fprintf (stderr, "Usage: genmatch " >>>> - "[--gimple] [--generic] [-v[v]] input\n"); >>>> + "[--gimple] [--generic] [-v[v]] " >>>> + "[-c output num...] [-h header] input\n"); >>>> return 1; >>>> } >>>> } >>>> + pieces.safe_push (-1UL); >>>> >>>> line_table = XCNEW (struct line_maps); >>>> linemap_init (line_table, 0); >>>> @@ -5039,10 +5159,32 @@ add_operator (VIEW_CONVERT2, "view_conve >>>> /* Parse ahead! */ >>>> parser p (r); >>>> >>>> - if (gimple) >>>> - write_header (stdout, "gimple-match-head.c"); >>>> + FILE *f, *headerf = NULL; >>>> + if (!output) >>>> + f = stdout; >>>> else >>>> - write_header (stdout, "generic-match-head.c"); >>>> + { >>>> + char *outputtem = XNEWVEC (char, strlen (output) + strlen ("-1.c") >>>> + 1); >>>> + sprintf (outputtem, "%s-p.c", output); >>>> + f = fopen (outputtem, "w"); >>>> + if (!f) >>>> + { >>>> + perror ("failed to open output file"); >>>> + exit(1); >>>> + } >>>> + } >>>> + if (header) >>>> + { >>>> + headerf = fopen (header, "w"); >>>> + if (!headerf) >>>> + { >>>> + perror ("failed to open output file"); >>>> + exit(1); >>>> + } >>>> + } >>>> + >>>> + fprintf (f, "#define GENFOO_MAIN_FILE 1\n"); >>>> + write_header (f, gimple); >>>> >>>> /* Go over all predicates defined with patterns and perform >>>> lowering and code generation. */ >>>> @@ -5062,8 +5204,12 @@ add_operator (VIEW_CONVERT2, "view_conve >>>> if (verbose == 2) >>>> dt.print (stderr); >>>> >>>> - write_predicate (stdout, pred, dt, gimple); >>>> + if (header) >>>> + write_predicate (headerf, pred, dt, gimple, true); >>>> + write_predicate (f, pred, dt, gimple, false); >>>> } >>>> + if (output) >>>> + fclose (f); >>>> >>>> /* Lower the main simplifiers and generate code for them. */ >>>> lower (p.simplifiers, gimple); >>>> @@ -5079,7 +5225,10 @@ add_operator (VIEW_CONVERT2, "view_conve >>>> if (verbose == 2) >>>> dt.print (stderr); >>>> >>>> - dt.gen (stdout, gimple); >>>> + dt.gen (output, headerf, pieces, gimple); >>>> + >>>> + if (header) >>>> + fclose (headerf); >>>> >>>> /* Finalize. */ >>>> cpp_finish (r, NULL); >>>> Index: gcc/gimple-match-head.c >>>> =================================================================== >>>> --- gcc/gimple-match-head.c (revision 259638) >>>> +++ gcc/gimple-match-head.c (working copy) >>>> @@ -40,21 +40,10 @@ along with GCC; see the file COPYING3. >>>> #include "case-cfn-macros.h" >>>> #include "gimplify.h" >>>> #include "optabs-tree.h" >>>> +#include "gimple-match-head.h" >>>> >>>> >>>> -/* Forward declarations of the private auto-generated matchers. >>>> - They expect valueized operands in canonical order and do not >>>> - perform simplification of all-constant operands. */ >>>> -static bool gimple_simplify (code_helper *, tree *, >>>> - gimple_seq *, tree (*)(tree), >>>> - code_helper, tree, tree); >>>> -static bool gimple_simplify (code_helper *, tree *, >>>> - gimple_seq *, tree (*)(tree), >>>> - code_helper, tree, tree, tree); >>>> -static bool gimple_simplify (code_helper *, tree *, >>>> - gimple_seq *, tree (*)(tree), >>>> - code_helper, tree, tree, tree, tree); >>>> - >>>> +#if GENFOO_MAIN_FILE >>>> >>>> /* Return whether T is a constant that we'll dispatch to fold to >>>> evaluate fully constant expressions. */ >>>> @@ -772,6 +761,8 @@ gimple_simplify (gimple *stmt, >>>> return false; >>>> } >>>> >>>> +#endif >>>> + >>>> >>>> /* Helper for the autogenerated code, valueize OP. */ >>>> >>>> Index: gcc/generic-match-head.c >>>> =================================================================== >>>> --- gcc/generic-match-head.c (revision 259638) >>>> +++ gcc/generic-match-head.c (working copy) >>>> @@ -34,6 +34,7 @@ along with GCC; see the file COPYING3. >>>> #include "case-cfn-macros.h" >>>> #include "gimplify.h" >>>> #include "optabs-tree.h" >>>> +#include "generic-match-head.h" >>>> >>>> >>>> /* Routine to determine if the types T1 and T2 are effectively >>>> Index: gcc/Makefile.in >>>> =================================================================== >>>> --- gcc/Makefile.in (revision 259638) >>>> +++ gcc/Makefile.in (working copy) >>>> @@ -216,8 +216,12 @@ gengtype-lex.o-warn = -Wno-error >>>> libgcov-util.o-warn = -Wno-error >>>> libgcov-driver-tool.o-warn = -Wno-error >>>> libgcov-merge-tool.o-warn = -Wno-error >>>> -gimple-match.o-warn = -Wno-unused >>>> -generic-match.o-warn = -Wno-unused >>>> +gimple-match-p.o-warn = -Wno-unused >>>> +gimple-match-1.o-warn = -Wno-unused >>>> +gimple-match-2.o-warn = -Wno-unused >>>> +generic-match-p.o-warn = -Wno-unused >>>> +generic-match-1.o-warn = -Wno-unused >>>> +generic-match-2.o-warn = -Wno-unused >>>> dfp.o-warn = -Wno-strict-aliasing >>>> >>>> # All warnings have to be shut off in stage1 if the compiler used then >>>> @@ -771,7 +775,7 @@ COMPILERS = @all_compilers@ >>>> >>>> # List of things which should already be built whenever we try to use xgcc >>>> # to compile anything (without linking). >>>> -GCC_PASSES=xgcc$(exeext) specs >>>> +GCC_PASSES=xgcc$(exeext) >>>> >>>> # Directory to link to, when using the target `maketest'. >>>> DIR = ../gcc >>>> @@ -1207,8 +1211,12 @@ C_COMMON_OBJS = c-family/c-common.o c-fa >>>> # will build them sooner, because they are large and otherwise tend to be >>>> # the last objects to finish building. >>>> OBJS = \ >>>> - gimple-match.o \ >>>> - generic-match.o \ >>>> + gimple-match-p.o \ >>>> + generic-match-p.o \ >>>> + gimple-match-1.o \ >>>> + generic-match-1.o \ >>>> + gimple-match-2.o \ >>>> + generic-match-2.o \ >>>> insn-attrtab.o \ >>>> insn-automata.o \ >>>> insn-dfatab.o \ >>>> @@ -1654,7 +1662,9 @@ MOSTLYCLEANFILES = insn-flags.h insn-con >>>> insn-output.c insn-recog.c insn-emit.c insn-extract.c insn-peep.c \ >>>> insn-attr.h insn-attr-common.h insn-attrtab.c insn-dfatab.c \ >>>> insn-latencytab.c insn-opinit.c insn-opinit.h insn-preds.c >>>> insn-constants.h \ >>>> - tm-preds.h tm-constrs.h checksum-options gimple-match.c generic-match.c \ >>>> + tm-preds.h tm-constrs.h checksum-options gimple-match-head.h >>>> gimple-match-1.c \ >>>> + gimple-match-2.c gimple-match-p.c generic-match-head.h generic-match-1.c >>>> \ >>>> + generic-match-p.c generic-match-2.c \ >>>> tree-check.h min-insn-modes.c insn-modes.c insn-modes.h >>>> insn-modes-inline.h \ >>>> genrtl.h gt-*.h gtype-*.h gtype-desc.c gtyp-input.list \ >>>> case-cfn-macros.h cfn-operators.pd \ >>>> @@ -1899,7 +1909,7 @@ all.internal: start.encap rest.encap doc >>>> all.cross: native gcc-cross$(exeext) cpp$(exeext) specs \ >>>> libgcc-support lang.all.cross doc selftest @GENINSRC@ srcextra >>>> # This is what must be made before installing GCC and converting >>>> libraries. >>>> -start.encap: native xgcc$(exeext) cpp$(exeext) specs \ >>>> +start.encap: native xgcc$(exeext) cpp$(exeext) \ >>>> libgcc-support lang.start.encap @GENINSRC@ srcextra >>>> # These can't be made until after GCC can run. >>>> rest.encap: lang.rest.encap >>>> @@ -2054,7 +2064,7 @@ checksum-options: >>>> libgcc-support: libgcc.mvars stmp-int-hdrs $(TCONFIG_H) \ >>>> $(MACHMODE_H) gcov-iov.h >>>> >>>> -libgcc.mvars: config.status Makefile specs xgcc$(exeext) >>>> +libgcc.mvars: config.status Makefile xgcc$(exeext) >>>> : > tmp-libgcc.mvars >>>> echo GCC_CFLAGS = '$(GCC_CFLAGS)' >> tmp-libgcc.mvars >>>> echo INHIBIT_LIBC_CFLAGS = '$(INHIBIT_LIBC_CFLAGS)' >> tmp-libgcc.mvars >>>> @@ -2271,8 +2281,9 @@ $(common_out_object_file): $(common_out_ >>>> .PRECIOUS: insn-config.h insn-flags.h insn-codes.h insn-constants.h \ >>>> insn-emit.c insn-recog.c insn-extract.c insn-output.c insn-peep.c \ >>>> insn-attr.h insn-attr-common.h insn-attrtab.c insn-dfatab.c \ >>>> - insn-latencytab.c insn-preds.c gimple-match.c generic-match.c \ >>>> - insn-target-def.h >>>> + insn-latencytab.c insn-preds.c gimple-match-head.h gimple-match-1.c \ >>>> + gimple-match-2.c generic-match-head.h generic-match-1.c >>>> generic-match-2.c \ >>>> + gimple-match-p.c generic-match-p.c insn-target-def.h >>>> >>>> # Dependencies for the md file. The first time through, we just assume >>>> # the md file itself and the generated dependency file (in order to get >>>> @@ -2504,18 +2515,36 @@ s-tm-texi: build/genhooks$(build_exeext) >>>> false; \ >>>> fi >>>> >>>> -gimple-match.c: s-match gimple-match-head.c ; @true >>>> -generic-match.c: s-match generic-match-head.c ; @true >>>> +gimple-match-p.c: s-match gimple-match-head.c ; @true >>>> +gimple-match-1.c: s-match gimple-match-head.c ; @true >>>> +gimple-match-2.c: s-match gimple-match-head.c ; @true >>>> +generic-match-p.c: s-match generic-match-head.c ; @true >>>> +generic-match-1.c: s-match generic-match-head.c ; @true >>>> +generic-match-2.c: s-match generic-match-head.c ; @true >>>> >>>> s-match: build/genmatch$(build_exeext) $(srcdir)/match.pd cfn-operators.pd >>>> - $(RUN_GEN) build/genmatch$(build_exeext) --gimple $(srcdir)/match.pd \ >>>> - > tmp-gimple-match.c >>>> - $(RUN_GEN) build/genmatch$(build_exeext) --generic $(srcdir)/match.pd \ >>>> - > tmp-generic-match.c >>>> - $(SHELL) $(srcdir)/../move-if-change tmp-gimple-match.c \ >>>> - gimple-match.c >>>> - $(SHELL) $(srcdir)/../move-if-change tmp-generic-match.c \ >>>> - generic-match.c >>>> + $(RUN_GEN) build/genmatch$(build_exeext) --gimple \ >>>> + -h tmp-gimple-match-head.h -c tmp-gimple-match 460 \ >>>> + $(srcdir)/match.pd >>>> + $(RUN_GEN) build/genmatch$(build_exeext) --generic \ >>>> + -h tmp-generic-match-head.h -c tmp-generic-match 290 \ >>>> + $(srcdir)/match.pd >>>> + $(SHELL) $(srcdir)/../move-if-change tmp-gimple-match-head.h \ >>>> + gimple-match-head.h >>>> + $(SHELL) $(srcdir)/../move-if-change tmp-gimple-match-1.c \ >>>> + gimple-match-1.c >>>> + $(SHELL) $(srcdir)/../move-if-change tmp-gimple-match-2.c \ >>>> + gimple-match-2.c >>>> + $(SHELL) $(srcdir)/../move-if-change tmp-gimple-match-p.c \ >>>> + gimple-match-p.c >>>> + $(SHELL) $(srcdir)/../move-if-change tmp-generic-match-head.h \ >>>> + generic-match-head.h >>>> + $(SHELL) $(srcdir)/../move-if-change tmp-generic-match-1.c \ >>>> + generic-match-1.c >>>> + $(SHELL) $(srcdir)/../move-if-change tmp-generic-match-2.c \ >>>> + generic-match-2.c >>>> + $(SHELL) $(srcdir)/../move-if-change tmp-generic-match-p.c \ >>>> + generic-match-p.c >>>> $(STAMP) s-match >>>> >>>> GTFILES = $(CPP_ID_DATA_H) $(srcdir)/input.h $(srcdir)/coretypes.h \ >>>> >>> >>> Hi. >>> >>> I took a look at gimple-match.c and what about doing a split in following >>> way: >>> - all gimple_simplify_$number going into a separate header file (~12000 LOC) >>> - all the function can be marked as static inline >>> - all other gimple_simplify_$code can be split into arbitrary number of >>> parts >>> - we have 287 such functions where each function only calls >>> gimple_simplify_$number and >>> on average there 10 of such calls >>> - that would allow to remove most of gimple_simplify_$number functions from >>> the header file >>> >>> Richi do you think it will be viable? >> >> That relies on the cgraph code DCEing all unused gimple_simplify_$number >> functions from the header fast as they are now effectively duplicated >> into all parts, correct? Also I'm not sure if we actually want to inline >> them... they are split out to get both code size and compile-time >> under control. Unfortunately we have still high max-inline-insns-single >> which is used for inline marked functions. >> >> Eventually doing a "proper" partitioning algorithm is viable, that is, >> partition based on gimple_simplify_$code and put gimple_simplify_$number >> where they are used. If they are used across different codes then >> merge those partitions. I guess you'll see that that'll merge the >> biggest _$code parititions :/ (MINUS_EXPR, PLUS_EXPR). > > Yes, that should be much better. I'm attaching a 'callgraph' that was done by > grepping. > Function starting at the beginning of a line is function definition, with an > indentation > one can see calls. > > Yes, PLUS and MINUS call ~20 gimple_simplify_$number calls. > > Well, generating some simple call graph format for the source file and a > source file > annotation of nodes can be input for a partitioning tool that can do the > split. > > Issue with the generated files is that one needs to fix the most offenders > (*-match.c, insn-recog.c, insn-emit.c, ..) > in order to see some improvement. > > Looking at insn-recog.c, maybe similar callgraph-based split can be done for > recog_$number functions? > > Martin > >> >> Richard. >> >
I'm sending SCC components for gimple-match.c. So there are 3 quite big one and rest is small. It's questionable whether partitioning based on that will provide desired speed up? Martin
total functions: 590 ['gimple_simplify_ABS_EXPR'] ['gimple_simplify_CFN_BUILT_IN_COSF'] ['gimple_simplify_CFN_BUILT_IN_COS'] ['gimple_simplify_CFN_BUILT_IN_COSL'] ['gimple_simplify_CFN_COS'] ['gimple_simplify_CFN_BUILT_IN_COSHF'] ['gimple_simplify_CFN_BUILT_IN_COSH'] ['gimple_simplify_CFN_BUILT_IN_COSHL'] ['gimple_simplify_CFN_BUILT_IN_CCOSF'] ['gimple_simplify_CFN_BUILT_IN_CCOS'] ['gimple_simplify_CFN_BUILT_IN_CCOSL'] ['gimple_simplify_CFN_BUILT_IN_CCOSHF'] ['gimple_simplify_CFN_BUILT_IN_CCOSH'] ['gimple_simplify_CFN_BUILT_IN_CCOSHL'] ['gimple_simplify_CFN_BUILT_IN_CABSF'] ['gimple_simplify_CFN_BUILT_IN_CABS'] ['gimple_simplify_CFN_BUILT_IN_CABSL'] ['gimple_simplify_VIEW_CONVERT_EXPR'] ['gimple_simplify_FLOAT_EXPR'] ['gimple_simplify_FIX_TRUNC_EXPR'] ['gimple_simplify_PAREN_EXPR'] ['gimple_simplify_REALPART_EXPR'] ['gimple_simplify_IMAGPART_EXPR'] ['gimple_simplify_CFN_BUILT_IN_EXPF'] ['gimple_simplify_CFN_BUILT_IN_EXP'] ['gimple_simplify_CFN_BUILT_IN_EXPL'] ['gimple_simplify_CFN_EXP'] ['gimple_simplify_CFN_BUILT_IN_EXP2F'] ['gimple_simplify_CFN_BUILT_IN_EXP2'] ['gimple_simplify_CFN_BUILT_IN_EXP2L'] ['gimple_simplify_CFN_EXP2'] ['gimple_simplify_CFN_BUILT_IN_EXP10F'] ['gimple_simplify_CFN_BUILT_IN_EXP10'] ['gimple_simplify_CFN_BUILT_IN_EXP10L'] ['gimple_simplify_CFN_EXP10'] ['gimple_simplify_CFN_BUILT_IN_POW10F'] ['gimple_simplify_CFN_BUILT_IN_POW10'] ['gimple_simplify_CFN_BUILT_IN_POW10L'] ['gimple_simplify_CFN_BUILT_IN_SQRTF'] ['gimple_simplify_CFN_BUILT_IN_SQRT'] ['gimple_simplify_CFN_BUILT_IN_SQRTL'] ['gimple_simplify_CFN_SQRT'] ['gimple_simplify_CFN_BUILT_IN_CBRTF'] ['gimple_simplify_CFN_BUILT_IN_CBRT'] ['gimple_simplify_CFN_BUILT_IN_CBRTL'] ['gimple_simplify_CFN_BUILT_IN_CEXPF'] ['gimple_simplify_CFN_BUILT_IN_CEXP'] ['gimple_simplify_CFN_BUILT_IN_CEXPL'] ['gimple_simplify_CFN_BUILT_IN_IFLOORF'] ['gimple_simplify_CFN_BUILT_IN_LFLOORF'] ['gimple_simplify_CFN_BUILT_IN_LLFLOORF'] ['gimple_simplify_CFN_BUILT_IN_ICEILF'] ['gimple_simplify_CFN_BUILT_IN_LCEILF'] ['gimple_simplify_CFN_BUILT_IN_LLCEILF'] ['gimple_simplify_CFN_BUILT_IN_IROUNDF'] ['gimple_simplify_CFN_BUILT_IN_LROUNDF'] ['gimple_simplify_CFN_BUILT_IN_LLROUNDF'] ['gimple_simplify_CFN_BUILT_IN_IRINTF'] ['gimple_simplify_CFN_BUILT_IN_LRINTF'] ['gimple_simplify_CFN_BUILT_IN_LLRINTF'] ['gimple_simplify_CFN_BUILT_IN_CPROJF'] ['gimple_simplify_CFN_BUILT_IN_CPROJ'] ['gimple_simplify_CFN_BUILT_IN_CPROJL'] ['gimple_simplify_CFN_BUILT_IN_SIGNBITF'] ['gimple_simplify_CFN_BUILT_IN_SIGNBIT'] ['gimple_simplify_CFN_BUILT_IN_SIGNBITL'] ['gimple_simplify_POINTER_PLUS_EXPR'] ['gimple_simplify_POINTER_DIFF_EXPR'] ['gimple_simplify_CFN_BUILT_IN_HYPOTF'] ['gimple_simplify_CFN_BUILT_IN_HYPOT'] ['gimple_simplify_CFN_BUILT_IN_HYPOTL'] ['gimple_simplify_COMPLEX_EXPR'] ['gimple_simplify_TRUTH_ORIF_EXPR'] ['gimple_simplify_TRUTH_OR_EXPR'] ['gimple_simplify_BIT_FIELD_REF'] ['gimple_simplify_CONJ_EXPR', 'gimple_simplify_286'] ['gimple_simplify_NEGATE_EXPR', 'gimple_simplify_56', 'gimple_simplify_202'] ['gimple_simplify_CFN_FMS', 'gimple_simplify_239', 'gimple_simplify_234'] ['gimple_simplify_CFN_FNMA', 'gimple_simplify_268', 'gimple_simplify_259'] ['gimple_simplify_CFN_FNMS', 'gimple_simplify_274', 'gimple_simplify_272'] ['gimple_simplify_CONVERT_EXPR', 'gimple_simplify_58', 'gimple_simplify_29', 'gimple_simplify_236'] ['gimple_simplify_CFN_BUILT_IN_POWIL', 'gimple_simplify_CFN_BUILT_IN_POWIF', 'gimple_simplify_CFN_BUILT_IN_POWI', 'gimple_simplify_108'] ['gimple_simplify_CFN_TAN', 'gimple_simplify_CFN_BUILT_IN_TANL', 'gimple_simplify_CFN_BUILT_IN_TANF', 'gimple_simplify_CFN_BUILT_IN_TAN', 'gimple_simplify_77'] ['gimple_simplify_CFN_BUILT_IN_POPCOUNTLL', 'gimple_simplify_CFN_BUILT_IN_POPCOUNTL', 'gimple_simplify_CFN_BUILT_IN_POPCOUNTIMAX', 'gimple_simplify_CFN_BUILT_IN_POPCOUNT', 'gimple_simplify_214'] ['gimple_simplify_COND_EXPR', 'gimple_simplify_71', 'gimple_simplify_275', 'gimple_simplify_261', 'gimple_simplify_13'] ['gimple_simplify_CFN_BUILT_IN_BSWAP64', 'gimple_simplify_CFN_BUILT_IN_BSWAP32', 'gimple_simplify_CFN_BUILT_IN_BSWAP16', 'gimple_simplify_195', 'gimple_simplify_174', 'gimple_simplify_171'] ['gimple_simplify_CFN_POW', 'gimple_simplify_CFN_BUILT_IN_POWL', 'gimple_simplify_CFN_BUILT_IN_POWF', 'gimple_simplify_CFN_BUILT_IN_POW', 'gimple_simplify_70', 'gimple_simplify_45', 'gimple_simplify_40'] ['gimple_simplify_CFN_FMA', 'gimple_simplify_CFN_BUILT_IN_FMAL', 'gimple_simplify_CFN_BUILT_IN_FMAF', 'gimple_simplify_CFN_BUILT_IN_FMA', 'gimple_simplify_231', 'gimple_simplify_229', 'gimple_simplify_224'] ['gimple_simplify_RDIV_EXPR', 'gimple_simplify_4', 'gimple_simplify_287', 'gimple_simplify_285', 'gimple_simplify_255', 'gimple_simplify_219', 'gimple_simplify_212', 'gimple_simplify_21', 'gimple_simplify_164'] ['gimple_simplify_VEC_COND_EXPR', 'gimple_simplify_74', 'gimple_simplify_269', 'gimple_simplify_266', 'gimple_simplify_209', 'gimple_simplify_165', 'gimple_simplify_161', 'gimple_simplify_122', 'gimple_simplify_106'] ['gimple_simplify_CFN_LDEXP', 'gimple_simplify_CFN_BUILT_IN_SCALBNL', 'gimple_simplify_CFN_BUILT_IN_SCALBNF', 'gimple_simplify_CFN_BUILT_IN_SCALBN', 'gimple_simplify_CFN_BUILT_IN_SCALBLNL', 'gimple_simplify_CFN_BUILT_IN_SCALBLNF', 'gimple_simplify_CFN_BUILT_IN_SCALBLN', 'gimple_simplify_CFN_BUILT_IN_LDEXPL', 'gimple_simplify_CFN_BUILT_IN_LDEXPF', 'gimple_simplify_CFN_BUILT_IN_LDEXP', 'gimple_simplify_46', 'gimple_simplify_119'] ['gimple_simplify_BIT_NOT_EXPR', 'gimple_simplify_75', 'gimple_simplify_61', 'gimple_simplify_302', 'gimple_simplify_282', 'gimple_simplify_247', 'gimple_simplify_24', 'gimple_simplify_207', 'gimple_simplify_167', 'gimple_simplify_144', 'gimple_simplify_143', 'gimple_simplify_126', 'gimple_simplify_123'] ['gimple_simplify_CFN_LOG2', 'gimple_simplify_CFN_LOG10', 'gimple_simplify_CFN_LOG', 'gimple_simplify_CFN_BUILT_IN_LOGL', 'gimple_simplify_CFN_BUILT_IN_LOGF', 'gimple_simplify_CFN_BUILT_IN_LOG2L', 'gimple_simplify_CFN_BUILT_IN_LOG2F', 'gimple_simplify_CFN_BUILT_IN_LOG2', 'gimple_simplify_CFN_BUILT_IN_LOG10L', 'gimple_simplify_CFN_BUILT_IN_LOG10F', 'gimple_simplify_CFN_BUILT_IN_LOG10', 'gimple_simplify_CFN_BUILT_IN_LOG', 'gimple_simplify_93'] ['gimple_simplify_TRUNC_MOD_EXPR', 'gimple_simplify_ROUND_MOD_EXPR', 'gimple_simplify_FLOOR_MOD_EXPR', 'gimple_simplify_CEIL_MOD_EXPR', 'gimple_simplify_91', 'gimple_simplify_9', 'gimple_simplify_84', 'gimple_simplify_76', 'gimple_simplify_57', 'gimple_simplify_290', 'gimple_simplify_213', 'gimple_simplify_194', 'gimple_simplify_131'] ['gimple_simplify_RSHIFT_EXPR', 'gimple_simplify_RROTATE_EXPR', 'gimple_simplify_LSHIFT_EXPR', 'gimple_simplify_LROTATE_EXPR', 'gimple_simplify_73', 'gimple_simplify_59', 'gimple_simplify_22', 'gimple_simplify_190', 'gimple_simplify_179', 'gimple_simplify_170', 'gimple_simplify_115', 'gimple_simplify_107', 'gimple_simplify_101'] ['gimple_simplify_CFN_COPYSIGN', 'gimple_simplify_CFN_BUILT_IN_COPYSIGNL', 'gimple_simplify_CFN_BUILT_IN_COPYSIGNF64X', 'gimple_simplify_CFN_BUILT_IN_COPYSIGNF64', 'gimple_simplify_CFN_BUILT_IN_COPYSIGNF32X', 'gimple_simplify_CFN_BUILT_IN_COPYSIGNF32', 'gimple_simplify_CFN_BUILT_IN_COPYSIGNF16', 'gimple_simplify_CFN_BUILT_IN_COPYSIGNF128X', 'gimple_simplify_CFN_BUILT_IN_COPYSIGNF128', 'gimple_simplify_CFN_BUILT_IN_COPYSIGNF', 'gimple_simplify_CFN_BUILT_IN_COPYSIGN', 'gimple_simplify_49', 'gimple_simplify_38', 'gimple_simplify_260', 'gimple_simplify_136', 'gimple_simplify_125'] ['gimple_simplify_CFN_BUILT_IN_LROUNDL', 'gimple_simplify_CFN_BUILT_IN_LROUND', 'gimple_simplify_CFN_BUILT_IN_LRINTL', 'gimple_simplify_CFN_BUILT_IN_LRINT', 'gimple_simplify_CFN_BUILT_IN_LLROUNDL', 'gimple_simplify_CFN_BUILT_IN_LLROUND', 'gimple_simplify_CFN_BUILT_IN_LLRINTL', 'gimple_simplify_CFN_BUILT_IN_LLRINT', 'gimple_simplify_CFN_BUILT_IN_LLFLOORL', 'gimple_simplify_CFN_BUILT_IN_LLFLOOR', 'gimple_simplify_CFN_BUILT_IN_LLCEILL', 'gimple_simplify_CFN_BUILT_IN_LLCEIL', 'gimple_simplify_CFN_BUILT_IN_LFLOORL', 'gimple_simplify_CFN_BUILT_IN_LFLOOR', 'gimple_simplify_CFN_BUILT_IN_LCEILL', 'gimple_simplify_CFN_BUILT_IN_LCEIL', 'gimple_simplify_CFN_BUILT_IN_IROUNDL', 'gimple_simplify_CFN_BUILT_IN_IROUND', 'gimple_simplify_CFN_BUILT_IN_IRINTL', 'gimple_simplify_CFN_BUILT_IN_IRINT', 'gimple_simplify_CFN_BUILT_IN_IFLOORL', 'gimple_simplify_CFN_BUILT_IN_IFLOOR', 'gimple_simplify_CFN_BUILT_IN_ICEILL', 'gimple_simplify_CFN_BUILT_IN_ICEIL', 'gimple_simplify_205', 'gimple_simplify_158'] ['gimple_simplify_TRUNC_DIV_EXPR', 'gimple_simplify_ROUND_DIV_EXPR', 'gimple_simplify_MULT_EXPR', 'gimple_simplify_FLOOR_DIV_EXPR', 'gimple_simplify_EXACT_DIV_EXPR', 'gimple_simplify_CEIL_DIV_EXPR', 'gimple_simplify_92', 'gimple_simplify_72', 'gimple_simplify_35', 'gimple_simplify_294', 'gimple_simplify_273', 'gimple_simplify_27', 'gimple_simplify_264', 'gimple_simplify_262', 'gimple_simplify_26', 'gimple_simplify_243', 'gimple_simplify_240', 'gimple_simplify_222', 'gimple_simplify_20', 'gimple_simplify_192', 'gimple_simplify_189', 'gimple_simplify_181', 'gimple_simplify_18', 'gimple_simplify_155', 'gimple_simplify_145', 'gimple_simplify_141', 'gimple_simplify_132', 'gimple_simplify_129', 'gimple_simplify_128', 'gimple_simplify_111'] ['gimple_simplify_MIN_EXPR', 'gimple_simplify_MAX_EXPR', 'gimple_simplify_CFN_FMIN', 'gimple_simplify_CFN_FMAX', 'gimple_simplify_CFN_BUILT_IN_FMINL', 'gimple_simplify_CFN_BUILT_IN_FMINF64X', 'gimple_simplify_CFN_BUILT_IN_FMINF64', 'gimple_simplify_CFN_BUILT_IN_FMINF32X', 'gimple_simplify_CFN_BUILT_IN_FMINF32', 'gimple_simplify_CFN_BUILT_IN_FMINF16', 'gimple_simplify_CFN_BUILT_IN_FMINF128X', 'gimple_simplify_CFN_BUILT_IN_FMINF128', 'gimple_simplify_CFN_BUILT_IN_FMINF', 'gimple_simplify_CFN_BUILT_IN_FMIN', 'gimple_simplify_CFN_BUILT_IN_FMAXL', 'gimple_simplify_CFN_BUILT_IN_FMAXF64X', 'gimple_simplify_CFN_BUILT_IN_FMAXF64', 'gimple_simplify_CFN_BUILT_IN_FMAXF32X', 'gimple_simplify_CFN_BUILT_IN_FMAXF32', 'gimple_simplify_CFN_BUILT_IN_FMAXF16', 'gimple_simplify_CFN_BUILT_IN_FMAXF128X', 'gimple_simplify_CFN_BUILT_IN_FMAXF128', 'gimple_simplify_CFN_BUILT_IN_FMAXF', 'gimple_simplify_CFN_BUILT_IN_FMAX', 'gimple_simplify_89', 'gimple_simplify_82', 'gimple_simplify_299', 'gimple_simplify_295', 'gimple_simplify_248', 'gimple_simplify_246', 'gimple_simplify_245', 'gimple_simplify_149', 'gimple_simplify_11'] ['gimple_simplify_CFN_TRUNC', 'gimple_simplify_CFN_ROUND', 'gimple_simplify_CFN_RINT', 'gimple_simplify_CFN_NEARBYINT', 'gimple_simplify_CFN_FLOOR', 'gimple_simplify_CFN_CEIL', 'gimple_simplify_CFN_BUILT_IN_TRUNCL', 'gimple_simplify_CFN_BUILT_IN_TRUNCF64X', 'gimple_simplify_CFN_BUILT_IN_TRUNCF64', 'gimple_simplify_CFN_BUILT_IN_TRUNCF32X', 'gimple_simplify_CFN_BUILT_IN_TRUNCF32', 'gimple_simplify_CFN_BUILT_IN_TRUNCF16', 'gimple_simplify_CFN_BUILT_IN_TRUNCF128X', 'gimple_simplify_CFN_BUILT_IN_TRUNCF128', 'gimple_simplify_CFN_BUILT_IN_TRUNCF', 'gimple_simplify_CFN_BUILT_IN_TRUNC', 'gimple_simplify_CFN_BUILT_IN_ROUNDL', 'gimple_simplify_CFN_BUILT_IN_ROUNDF64X', 'gimple_simplify_CFN_BUILT_IN_ROUNDF64', 'gimple_simplify_CFN_BUILT_IN_ROUNDF32X', 'gimple_simplify_CFN_BUILT_IN_ROUNDF32', 'gimple_simplify_CFN_BUILT_IN_ROUNDF16', 'gimple_simplify_CFN_BUILT_IN_ROUNDF128X', 'gimple_simplify_CFN_BUILT_IN_ROUNDF128', 'gimple_simplify_CFN_BUILT_IN_ROUNDF', 'gimple_simplify_CFN_BUILT_IN_ROUND', 'gimple_simplify_CFN_BUILT_IN_RINTL', 'gimple_simplify_CFN_BUILT_IN_RINTF64X', 'gimple_simplify_CFN_BUILT_IN_RINTF64', 'gimple_simplify_CFN_BUILT_IN_RINTF32X', 'gimple_simplify_CFN_BUILT_IN_RINTF32', 'gimple_simplify_CFN_BUILT_IN_RINTF16', 'gimple_simplify_CFN_BUILT_IN_RINTF128X', 'gimple_simplify_CFN_BUILT_IN_RINTF128', 'gimple_simplify_CFN_BUILT_IN_RINTF', 'gimple_simplify_CFN_BUILT_IN_RINT', 'gimple_simplify_CFN_BUILT_IN_NEARBYINTL', 'gimple_simplify_CFN_BUILT_IN_NEARBYINTF64X', 'gimple_simplify_CFN_BUILT_IN_NEARBYINTF64', 'gimple_simplify_CFN_BUILT_IN_NEARBYINTF32X', 'gimple_simplify_CFN_BUILT_IN_NEARBYINTF32', 'gimple_simplify_CFN_BUILT_IN_NEARBYINTF16', 'gimple_simplify_CFN_BUILT_IN_NEARBYINTF128X', 'gimple_simplify_CFN_BUILT_IN_NEARBYINTF128', 'gimple_simplify_CFN_BUILT_IN_NEARBYINTF', 'gimple_simplify_CFN_BUILT_IN_NEARBYINT', 'gimple_simplify_CFN_BUILT_IN_FLOORL', 'gimple_simplify_CFN_BUILT_IN_FLOORF64X', 'gimple_simplify_CFN_BUILT_IN_FLOORF64', 'gimple_simplify_CFN_BUILT_IN_FLOORF32X', 'gimple_simplify_CFN_BUILT_IN_FLOORF32', 'gimple_simplify_CFN_BUILT_IN_FLOORF16', 'gimple_simplify_CFN_BUILT_IN_FLOORF128X', 'gimple_simplify_CFN_BUILT_IN_FLOORF128', 'gimple_simplify_CFN_BUILT_IN_FLOORF', 'gimple_simplify_CFN_BUILT_IN_FLOOR', 'gimple_simplify_CFN_BUILT_IN_CEILL', 'gimple_simplify_CFN_BUILT_IN_CEILF64X', 'gimple_simplify_CFN_BUILT_IN_CEILF64', 'gimple_simplify_CFN_BUILT_IN_CEILF32X', 'gimple_simplify_CFN_BUILT_IN_CEILF32', 'gimple_simplify_CFN_BUILT_IN_CEILF16', 'gimple_simplify_CFN_BUILT_IN_CEILF128X', 'gimple_simplify_CFN_BUILT_IN_CEILF128', 'gimple_simplify_CFN_BUILT_IN_CEILF', 'gimple_simplify_CFN_BUILT_IN_CEIL', 'gimple_simplify_297', 'gimple_simplify_25', 'gimple_simplify_201', 'gimple_simplify_177', 'gimple_simplify_113'] ['gimple_simplify_UNORDERED_EXPR', 'gimple_simplify_UNLT_EXPR', 'gimple_simplify_UNLE_EXPR', 'gimple_simplify_UNGT_EXPR', 'gimple_simplify_UNGE_EXPR', 'gimple_simplify_UNEQ_EXPR', 'gimple_simplify_ORDERED_EXPR', 'gimple_simplify_NE_EXPR', 'gimple_simplify_LT_EXPR', 'gimple_simplify_LTGT_EXPR', 'gimple_simplify_LE_EXPR', 'gimple_simplify_GT_EXPR', 'gimple_simplify_GE_EXPR', 'gimple_simplify_EQ_EXPR', 'gimple_simplify_95', 'gimple_simplify_94', 'gimple_simplify_90', 'gimple_simplify_88', 'gimple_simplify_78', 'gimple_simplify_7', 'gimple_simplify_68', 'gimple_simplify_64', 'gimple_simplify_6', 'gimple_simplify_55', 'gimple_simplify_52', 'gimple_simplify_51', 'gimple_simplify_50', 'gimple_simplify_47', 'gimple_simplify_41', 'gimple_simplify_39', 'gimple_simplify_37', 'gimple_simplify_36', 'gimple_simplify_32', 'gimple_simplify_31', 'gimple_simplify_3', 'gimple_simplify_293', 'gimple_simplify_291', 'gimple_simplify_289', 'gimple_simplify_284', 'gimple_simplify_283', 'gimple_simplify_28', 'gimple_simplify_270', 'gimple_simplify_263', 'gimple_simplify_258', 'gimple_simplify_257', 'gimple_simplify_254', 'gimple_simplify_253', 'gimple_simplify_252', 'gimple_simplify_230', 'gimple_simplify_23', 'gimple_simplify_220', 'gimple_simplify_216', 'gimple_simplify_210', 'gimple_simplify_204', 'gimple_simplify_199', 'gimple_simplify_198', 'gimple_simplify_197', 'gimple_simplify_193', 'gimple_simplify_191', 'gimple_simplify_188', 'gimple_simplify_187', 'gimple_simplify_186', 'gimple_simplify_183', 'gimple_simplify_180', 'gimple_simplify_178', 'gimple_simplify_176', 'gimple_simplify_172', 'gimple_simplify_169', 'gimple_simplify_168', 'gimple_simplify_166', 'gimple_simplify_157', 'gimple_simplify_154', 'gimple_simplify_152', 'gimple_simplify_15', 'gimple_simplify_147', 'gimple_simplify_146', 'gimple_simplify_142', 'gimple_simplify_140', 'gimple_simplify_14', 'gimple_simplify_138', 'gimple_simplify_135', 'gimple_simplify_134', 'gimple_simplify_127', 'gimple_simplify_121', 'gimple_simplify_120', 'gimple_simplify_12', 'gimple_simplify_118', 'gimple_simplify_117', 'gimple_simplify_110', 'gimple_simplify_104', 'gimple_simplify_103', 'gimple_simplify_100', 'gimple_simplify_10', 'gimple_simplify_1'] ['gimple_simplify_PLUS_EXPR', 'gimple_simplify_MINUS_EXPR', 'gimple_simplify_BIT_XOR_EXPR', 'gimple_simplify_BIT_IOR_EXPR', 'gimple_simplify_BIT_AND_EXPR', 'gimple_simplify_99', 'gimple_simplify_98', 'gimple_simplify_97', 'gimple_simplify_96', 'gimple_simplify_87', 'gimple_simplify_86', 'gimple_simplify_85', 'gimple_simplify_83', 'gimple_simplify_81', 'gimple_simplify_80', 'gimple_simplify_8', 'gimple_simplify_79', 'gimple_simplify_69', 'gimple_simplify_67', 'gimple_simplify_66', 'gimple_simplify_65', 'gimple_simplify_63', 'gimple_simplify_62', 'gimple_simplify_60', 'gimple_simplify_54', 'gimple_simplify_53', 'gimple_simplify_5', 'gimple_simplify_48', 'gimple_simplify_44', 'gimple_simplify_43', 'gimple_simplify_42', 'gimple_simplify_34', 'gimple_simplify_33', 'gimple_simplify_303', 'gimple_simplify_301', 'gimple_simplify_300', 'gimple_simplify_30', 'gimple_simplify_298', 'gimple_simplify_296', 'gimple_simplify_292', 'gimple_simplify_288', 'gimple_simplify_281', 'gimple_simplify_280', 'gimple_simplify_279', 'gimple_simplify_278', 'gimple_simplify_277', 'gimple_simplify_276', 'gimple_simplify_271', 'gimple_simplify_267', 'gimple_simplify_265', 'gimple_simplify_256', 'gimple_simplify_251', 'gimple_simplify_250', 'gimple_simplify_249', 'gimple_simplify_244', 'gimple_simplify_242', 'gimple_simplify_241', 'gimple_simplify_238', 'gimple_simplify_237', 'gimple_simplify_235', 'gimple_simplify_233', 'gimple_simplify_232', 'gimple_simplify_228', 'gimple_simplify_227', 'gimple_simplify_226', 'gimple_simplify_225', 'gimple_simplify_223', 'gimple_simplify_221', 'gimple_simplify_218', 'gimple_simplify_217', 'gimple_simplify_215', 'gimple_simplify_211', 'gimple_simplify_208', 'gimple_simplify_206', 'gimple_simplify_203', 'gimple_simplify_200', 'gimple_simplify_2', 'gimple_simplify_196', 'gimple_simplify_19', 'gimple_simplify_185', 'gimple_simplify_184', 'gimple_simplify_182', 'gimple_simplify_175', 'gimple_simplify_173', 'gimple_simplify_17', 'gimple_simplify_163', 'gimple_simplify_162', 'gimple_simplify_160', 'gimple_simplify_16', 'gimple_simplify_159', 'gimple_simplify_156', 'gimple_simplify_153', 'gimple_simplify_151', 'gimple_simplify_150', 'gimple_simplify_148', 'gimple_simplify_139', 'gimple_simplify_137', 'gimple_simplify_133', 'gimple_simplify_130', 'gimple_simplify_124', 'gimple_simplify_116', 'gimple_simplify_114', 'gimple_simplify_112', 'gimple_simplify_109', 'gimple_simplify_105', 'gimple_simplify_102'] SCC components size: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 3 3 4 4 5 5 5 6 7 7 9 9 12 13 13 13 13 16 26 30 33 71 94 106