3 * File name: ir/ir/firmstat.c
4 * Purpose: Statistics for Firm.
8 * Copyright: (c) 2004 Universität Karlsruhe
9 * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
16 #ifdef FIRM_STATISTICS
22 #include "firmstat_t.h"
27 * names of the optimizations
29 static const char *opt_names[] = {
30 "straightening optimization",
32 "algebraic simplification",
34 "Write-After-Write optimization",
35 "Write-After-Read optimization",
36 "Read-After-Write optimization",
37 "Read-After-Read optimization",
40 "Constant evaluation",
46 * need this to be static
48 static ir_op _op_Phi0, _op_PhiM;
50 /* ---------------------------------------------------------------------------------- */
52 #define STAT_ENTER ++status->recursive
53 #define STAT_LEAVE --status->recursive
54 #define STAT_ENTER_SINGLE do { if (status->recursive > 0) return; ++status->recursive; } while (0)
59 static stat_info_t _status, *status = &_status;
62 * compare two elements of the opcode hash
64 static int opcode_cmp(const void *elt, const void *key)
66 const node_entry_t *e1 = elt;
67 const node_entry_t *e2 = key;
69 return e1->op->code - e2->op->code;
73 * compare two elements of the graph hash
75 static int graph_cmp(const void *elt, const void *key)
77 const graph_entry_t *e1 = elt;
78 const graph_entry_t *e2 = key;
80 return e1->irg != e2->irg;
84 * compare two elements of the optimization hash
86 static int opt_cmp(const void *elt, const void *key)
88 const opt_entry_t *e1 = elt;
89 const opt_entry_t *e2 = key;
91 return e1->op->code != e2->op->code;
95 * compare two elements of the block hash
97 static int block_cmp(const void *elt, const void *key)
99 const block_entry_t *e1 = elt;
100 const block_entry_t *e2 = key;
102 return e1->block_nr != e2->block_nr;
106 * compare two elements of the ir_op hash
108 static int opcode_cmp_2(const void *elt, const void *key)
110 const ir_op *e1 = elt;
111 const ir_op *e2 = key;
113 return e1->code != e2->code;
117 * clears all counter in a node_entry_t
119 static void opcode_clear_entry(node_entry_t *elem)
121 cnt_clr(&elem->cnt_alive);
122 cnt_clr(&elem->new_node);
123 cnt_clr(&elem->into_Id);
127 * Returns the associates node_entry_t for an ir_op
129 static node_entry_t *opcode_get_entry(const ir_op *op, pset *set)
136 elem = pset_find(set, &key, op->code);
140 elem = obstack_alloc(&status->cnts, sizeof(*elem));
143 opcode_clear_entry(elem);
147 return pset_insert(set, elem, op->code);
151 * Returns the associates ir_op for an opcode
153 static ir_op *opcode_find_entry(opcode code, pset *set)
158 return pset_find(set, &key, code);
162 * calculates a hash value for an irg
163 * Addresses are typically aligned at 32bit, so we ignore the lowest bits
165 static INLINE unsigned irg_hash(const ir_graph *irg)
167 return (unsigned)irg >> 3;
171 * clears all counter in a graph_entry_t
173 static void graph_clear_entry(graph_entry_t *elem)
175 cnt_clr(&elem->cnt_walked);
176 cnt_clr(&elem->cnt_walked_blocks);
177 cnt_clr(&elem->cnt_was_inlined);
178 cnt_clr(&elem->cnt_got_inlined);
179 cnt_clr(&elem->cnt_strength_red);
180 cnt_clr(&elem->cnt_edges);
184 * Returns the acssociates graph_entry_t for an irg
186 static graph_entry_t *graph_get_entry(ir_graph *irg, pset *set)
194 elem = pset_find(set, &key, irg_hash(irg));
198 elem = obstack_alloc(&status->cnts, sizeof(*elem));
201 graph_clear_entry(elem);
203 /* new hash table for opcodes here */
204 elem->opcode_hash = new_pset(opcode_cmp, 5);
205 elem->block_hash = new_pset(block_cmp, 5);
208 for (i = 0; i < sizeof(elem->opt_hash)/sizeof(elem->opt_hash[0]); ++i)
209 elem->opt_hash[i] = new_pset(opt_cmp, 4);
211 return pset_insert(set, elem, irg_hash(irg));
215 * clears all counter in an opt_entry_t
217 static void opt_clear_entry(opt_entry_t *elem)
219 cnt_clr(&elem->count);
223 * Returns the associates opt_entry_t for an ir_op
225 static opt_entry_t *opt_get_entry(const ir_op *op, pset *set)
232 elem = pset_find(set, &key, op->code);
236 elem = obstack_alloc(&status->cnts, sizeof(*elem));
238 /* clear new counter */
239 opt_clear_entry(elem);
243 return pset_insert(set, elem, op->code);
247 * clears all counter in a block_entry_t
249 static void block_clear_entry(block_entry_t *elem)
251 cnt_clr(&elem->cnt_nodes);
252 cnt_clr(&elem->cnt_edges);
253 cnt_clr(&elem->cnt_in_edges);
254 cnt_clr(&elem->cnt_out_edges);
258 * Returns the associates block_entry_t for an block
260 static block_entry_t *block_get_entry(long block_nr, pset *set)
265 key.block_nr = block_nr;
267 elem = pset_find(set, &key, block_nr);
271 elem = obstack_alloc(&status->cnts, sizeof(*elem));
273 /* clear new counter */
274 block_clear_entry(elem);
276 elem->block_nr = block_nr;
278 return pset_insert(set, elem, block_nr);
283 * Returns the ir_op for an IR-node,
284 * handles special cases and return pseudo op codes
286 static ir_op *stat_get_irn_op(const ir_node *node)
288 ir_op *op = get_irn_op(node);
290 if (op->code == iro_Phi && get_irn_arity(node) == 0) {
291 /* special case, a Phi0 node, count on extra counter */
292 op = status->op_Phi0;
294 else if (op->code == iro_Phi && get_irn_mode(node) == mode_M) {
295 /* special case, a Memory Phi node, count on extra counter */
296 op = status->op_PhiM;
302 * update the block counter
304 static void count_block_info(ir_node *node, graph_entry_t *graph)
306 ir_op *op = get_irn_op(node);
308 block_entry_t *b_entry;
311 /* check for block */
312 if (op == op_Block) {
313 arity = get_irn_arity(node);
314 b_entry = block_get_entry(get_irn_node_nr(node), graph->block_hash);
316 /* count all incoming edges */
317 for (i = 0; i < arity; ++i) {
318 ir_node *pred = get_irn_n(node, i);
319 ir_node *other_block = get_nodes_block(pred);
320 block_entry_t *b_entry_other = block_get_entry(get_irn_node_nr(other_block), graph->block_hash);
322 cnt_inc(&b_entry->cnt_in_edges); /* an edge coming from another block */
323 cnt_inc(&b_entry_other->cnt_out_edges);
327 else if (op == op_Call) {
331 block = get_nodes_block(node);
332 b_entry = block_get_entry(get_irn_node_nr(block), graph->block_hash);
334 /* we have a new nodes */
335 cnt_inc(&b_entry->cnt_nodes);
337 arity = get_irn_arity(node);
339 for (i = 0; i < arity; ++i) {
340 ir_node *pred = get_irn_n(node, i);
341 ir_node *other_block;
343 if (get_irn_op(pred) == op_Block)
346 other_block = get_nodes_block(pred);
348 if (other_block == block)
349 cnt_inc(&b_entry->cnt_edges); /* a in block edge */
351 block_entry_t *b_entry_other = block_get_entry(get_irn_node_nr(other_block), graph->block_hash);
353 cnt_inc(&b_entry->cnt_in_edges); /* an edge coming from another block */
354 cnt_inc(&b_entry_other->cnt_out_edges);
360 * walker for reachable nodes count
362 static void count_nodes(ir_node *node, void *env)
364 graph_entry_t *graph = env;
367 ir_op *op = stat_get_irn_op(node);
368 int arity = get_irn_arity(node);
370 entry = opcode_get_entry(op, graph->opcode_hash);
372 cnt_inc(&entry->cnt_alive);
373 cnt_add_i(&graph->cnt_edges, arity);
375 /* count block edges */
376 count_block_info(node, graph);
380 * count all alive nodes and edges in a graph
382 static void count_nodes_in_graph(graph_entry_t *global, graph_entry_t *graph)
386 /* clear first the alive counter in the graph */
387 for (entry = pset_first(graph->opcode_hash); entry; entry = pset_next(graph->opcode_hash)) {
388 cnt_clr(&entry->cnt_alive);
391 /* count the nodes in the graph */
392 irg_walk_graph(graph->irg, count_nodes, NULL, graph);
394 /* assume we walk every graph only ONCE, we could sum here the global count */
395 for (entry = pset_first(graph->opcode_hash); entry; entry = pset_next(graph->opcode_hash)) {
396 node_entry_t *g_entry = opcode_get_entry(entry->op, global->opcode_hash);
398 /* update the node counter */
399 cnt_add(&g_entry->cnt_alive, &entry->cnt_alive);
402 /* update the edge counter */
403 cnt_add(&global->cnt_edges, &graph->cnt_edges);
409 static void stat_register_dumper(dumper_t *dumper)
411 dumper->next = status->dumper;
412 status->dumper = dumper;
418 static void dump_graph(graph_entry_t *entry)
422 for (dumper = status->dumper; dumper; dumper = dumper->next) {
423 if (dumper->dump_graph)
424 dumper->dump_graph(dumper, entry);
429 * initialise the dumper
431 static void dump_init(const char *name)
435 for (dumper = status->dumper; dumper; dumper = dumper->next) {
437 dumper->init(dumper, name);
444 static void dump_finish(void)
448 for (dumper = status->dumper; dumper; dumper = dumper->next) {
450 dumper->finish(dumper);
454 /* ---------------------------------------------------------------------- */
457 * dumps a opcode hash into human readable form
459 static void simple_dump_opcode_hash(dumper_t *dmp, pset *set)
463 counter_t f_new_node;
467 cnt_clr(&f_new_node);
470 fprintf(dmp->f, "%-16s %-8s %-8s %-8s\n", "Opcode", "alive", "created", "->Id");
471 for (entry = pset_first(set); entry; entry = pset_next(set)) {
472 fprintf(dmp->f, "%-16s %8d %8d %8d\n",
473 get_id_str(entry->op->name), entry->cnt_alive.cnt[0], entry->new_node.cnt[0], entry->into_Id.cnt[0]);
475 cnt_add(&f_alive, &entry->cnt_alive);
476 cnt_add(&f_new_node, &entry->new_node);
477 cnt_add(&f_Id, &entry->into_Id);
479 fprintf(dmp->f, "-------------------------------------------\n");
480 fprintf(dmp->f, "%-16s %8d %8d %8d\n", "Sum",
487 * dumps a optimization hash into human readable form
489 static void simple_dump_opt_hash(dumper_t *dmp, pset *set, int index)
491 opt_entry_t *entry = pset_first(set);
494 fprintf(dmp->f, "\n%s:\n", opt_names[index]);
495 fprintf(dmp->f, "%-16s %-8s\n", "Opcode", "deref");
497 for (; entry; entry = pset_next(set)) {
498 fprintf(dmp->f, "%-16s %8d\n",
499 get_id_str(entry->op->name), entry->count.cnt[0]);
505 * dumps the endges count
507 static void simple_dump_edges(dumper_t *dmp, counter_t *cnt)
509 fprintf(dmp->f, "%-16s %8d\n", "Edges", cnt->cnt[0]);
515 static void simple_dump_graph(dumper_t *dmp, graph_entry_t *entry)
518 block_entry_t *b_entry;
521 ir_graph *const_irg = get_const_code_irg();
523 if (entry->irg == const_irg) {
524 fprintf(dmp->f, "\nConst code Irg %p", (void *)entry->irg);
528 fprintf(dmp->f, "\nEntity %s, Irg %p", get_entity_name(entry->ent), (void *)entry->irg);
530 fprintf(dmp->f, "\nIrg %p", (void *)entry->irg);
533 fprintf(dmp->f, " %swalked %d over blocks %d was inlined %d got inlined %d strength red %d:\n",
534 entry->deleted ? "DELETED " : "",
535 entry->cnt_walked.cnt[0], entry->cnt_walked_blocks.cnt[0],
536 entry->cnt_was_inlined.cnt[0],
537 entry->cnt_got_inlined.cnt[0],
538 entry->cnt_strength_red.cnt[0]
542 fprintf(dmp->f, "\nGlobals counts:\n");
543 fprintf(dmp->f, "--------------\n");
547 simple_dump_opcode_hash(dmp, entry->opcode_hash);
548 simple_dump_edges(dmp, &entry->cnt_edges);
550 /* effects of optimizations */
554 for (i = 0; i < sizeof(entry->opt_hash)/sizeof(entry->opt_hash[0]); ++i) {
555 simple_dump_opt_hash(dmp, entry->opt_hash[i], i);
558 /* dump block info */
559 fprintf(dmp->f, "\n%12s %12s %12s %12s %12s %12s\n", "Block Nr", "Nodes", "intern E", "incoming E", "outgoing E", "quot");
560 for (b_entry = pset_first(entry->block_hash);
562 b_entry = pset_next(entry->block_hash)) {
563 fprintf(dmp->f, "BLK %12ld %12u %12u %12u %12u %4.8f\n",
565 b_entry->cnt_nodes.cnt[0],
566 b_entry->cnt_edges.cnt[0],
567 b_entry->cnt_in_edges.cnt[0],
568 b_entry->cnt_out_edges.cnt[0],
569 (double)b_entry->cnt_edges.cnt[0] / (double)b_entry->cnt_nodes.cnt[0]
576 * initialise the simple dumper
578 static void simple_init(dumper_t *dmp, const char *name)
582 snprintf(fname, sizeof(fname), "%s.txt", name);
583 dmp->f = fopen(fname, "w");
587 * finishes the simple dumper
589 static void simple_finish(dumper_t *dmp)
596 * the simple human readable dumper
598 static dumper_t simple_dumper = {
606 /* ---------------------------------------------------------------------- */
609 * count the nodes as needed:
611 * 1 normal (data) Phi's
616 static void csv_count_nodes(graph_entry_t *graph, counter_t cnt[])
621 for (i = 0; i < 4; ++i)
624 for (entry = pset_first(graph->opcode_hash); entry; entry = pset_next(graph->opcode_hash)) {
625 if (entry->op == op_Phi) {
627 cnt_add(&cnt[1], &entry->cnt_alive);
629 else if (entry->op == status->op_PhiM) {
631 cnt_add(&cnt[2], &entry->cnt_alive);
633 else if (entry->op == op_Proj) {
635 cnt_add(&cnt[3], &entry->cnt_alive);
638 /* all other nodes */
639 cnt_add(&cnt[0], &entry->cnt_alive);
647 static void csv_dump_graph(dumper_t *dmp, graph_entry_t *entry)
653 if (entry->irg && !entry->deleted) {
654 ir_graph *const_irg = get_const_code_irg();
656 if (entry->irg == const_irg) {
657 name = "<Const code Irg>";
662 name = get_entity_name(entry->ent);
664 name = "<UNKNOWN IRG>";
667 csv_count_nodes(entry, cnt);
669 fprintf(dmp->f, "%-40s, %p, %d, %d, %d, %d\n",
681 * initialise the simple dumper
683 static void csv_init(dumper_t *dmp, const char *name)
687 snprintf(fname, sizeof(fname), "%s.csv", name);
688 dmp->f = fopen(fname, "a");
692 * finishes the simple dumper
694 static void csv_finish(dumper_t *dmp)
701 * the simple human readable dumper
703 static dumper_t csv_dumper = {
712 /* ---------------------------------------------------------------------- */
715 * helper: get an ir_op from an opcode
717 ir_op *stat_get_op_from_opcode(opcode code)
719 return opcode_find_entry(code, status->ir_op_hash);
722 /* initialize the statistics module. */
723 void init_stat(unsigned enable_options)
725 #define X(a) a, sizeof(a)-1
729 /* enable statistics */
730 status->enable = enable_options & FIRMSTAT_ENABLED;
732 if (! status->enable)
735 obstack_init(&status->cnts);
737 /* build the pseudo-ops */
738 _op_Phi0.code = --pseudo_id;
739 _op_Phi0.name = new_id_from_chars(X("Phi0"));
741 _op_PhiM.code = --pseudo_id;
742 _op_PhiM.name = new_id_from_chars(X("PhiM"));
744 /* create the hash-tables */
745 status->irg_hash = new_pset(graph_cmp, 8);
746 status->ir_op_hash = new_pset(opcode_cmp_2, 1);
748 status->op_Phi0 = &_op_Phi0;
749 status->op_PhiM = &_op_PhiM;
751 stat_register_dumper(&simple_dumper);
752 stat_register_dumper(&csv_dumper);
754 /* initialize the pattern hash */
755 stat_init_pattern_history(enable_options & FIRMSTAT_PATTERN_ENABLED);
759 /* A new IR op is registered. */
760 void stat_new_ir_op(const ir_op *op)
762 if (! status->enable)
767 graph_entry_t *graph = graph_get_entry(NULL, status->irg_hash);
769 /* execute for side effect :-) */
770 opcode_get_entry(op, graph->opcode_hash);
772 pset_insert(status->ir_op_hash, op, op->code);
777 /* An IR op is freed. */
778 void stat_free_ir_op(const ir_op *op)
780 if (! status->enable)
789 /* A new node is created. */
790 void stat_new_node(const ir_node *node)
792 if (! status->enable)
795 /* do NOT count during dead node elimination */
796 if (status->in_dead_node_elim > 0)
802 graph_entry_t *graph;
803 ir_op *op = stat_get_irn_op(node);
805 /* increase global value */
806 graph = graph_get_entry(NULL, status->irg_hash);
807 entry = opcode_get_entry(op, graph->opcode_hash);
808 cnt_inc(&entry->new_node);
810 /* increase local value */
811 graph = graph_get_entry(current_ir_graph, status->irg_hash);
812 entry = opcode_get_entry(op, graph->opcode_hash);
813 cnt_inc(&entry->new_node);
818 /* A node is changed into a Id node */
819 void stat_turn_into_id(const ir_node *node)
821 if (! status->enable)
827 graph_entry_t *graph;
828 ir_op *op = stat_get_irn_op(node);
830 /* increase global value */
831 graph = graph_get_entry(NULL, status->irg_hash);
832 entry = opcode_get_entry(op, graph->opcode_hash);
833 cnt_inc(&entry->into_Id);
835 /* increase local value */
836 graph = graph_get_entry(current_ir_graph, status->irg_hash);
837 entry = opcode_get_entry(op, graph->opcode_hash);
838 cnt_inc(&entry->into_Id);
843 /* A new graph was created */
844 void stat_new_graph(ir_graph *irg, entity *ent)
846 if (! status->enable)
851 /* execute for side effect :-) */
852 graph_entry_t * graph = graph_get_entry(irg, status->irg_hash);
861 * A graph was deleted
863 void stat_free_graph(ir_graph *irg)
865 if (! status->enable)
870 graph_entry_t *graph = graph_get_entry(irg, status->irg_hash);
871 graph_entry_t *global = graph_get_entry(NULL, status->irg_hash);
875 /* count the nodes of the graph yet, it will be destroyed later */
876 count_nodes_in_graph(global, graph);
878 /* count the DAG's */
879 // count_dags_in_graph(global, graph);
881 /* calculate the pattern */
882 stat_calc_pattern_history(irg);
888 * A walk over a graph is initiated. Do not count walks from statistic code.
890 void stat_irg_walk(ir_graph *irg, void *pre, void *post)
892 if (! status->enable)
897 graph_entry_t *graph = graph_get_entry(irg, status->irg_hash);
899 cnt_inc(&graph->cnt_walked);
905 * A walk over a graph in block-wise order is initiated. Do not count walks from statistic code.
907 void stat_irg_walk_blkwise(ir_graph *irg, void *pre, void *post)
909 /* for now, do NOT differentiate between blockwise and normal */
910 stat_irg_walk(irg, pre, post);
914 * A walk over the graph's blocks is initiated. Do not count walks from statistic code.
916 void stat_irg_block_walk(ir_graph *irg, const ir_node *node, void *pre, void *post)
918 if (! status->enable)
923 graph_entry_t *graph = graph_get_entry(irg, status->irg_hash);
925 cnt_inc(&graph->cnt_walked_blocks);
931 * called for every node that is removed due to an optimization
933 static void removed_due_opt(ir_node *n, pset *set)
935 ir_op *op = get_irn_op(n);
936 opt_entry_t *entry = opt_get_entry(op, set);
938 /* increase global value */
939 cnt_inc(&entry->count);
943 * Some nodes were optimized into some others due to an optimization
945 void stat_merge_nodes(
946 ir_node **new_node_array, int new_num_entries,
947 ir_node **old_node_array, int old_num_entries,
950 if (! status->enable)
956 graph_entry_t *graph = graph_get_entry(current_ir_graph, status->irg_hash);
958 for (i = 0; i < old_num_entries; ++i) {
959 for (j = 0; j < new_num_entries; ++j)
960 if (old_node_array[i] == new_node_array[j])
963 /* nodes might be in new and old, these are NOT removed */
964 if (j >= new_num_entries) {
965 removed_due_opt(old_node_array[i], graph->opt_hash[opt]);
973 * A node was lowered into other nodes
975 void stat_lower(ir_node *node)
977 if (! status->enable)
982 graph_entry_t *graph = graph_get_entry(current_ir_graph, status->irg_hash);
984 removed_due_opt(node, graph->opt_hash[STAT_LOWERED]);
990 * A graph was inlined
992 void stat_inline(ir_node *call, ir_graph *called_irg)
994 if (! status->enable)
999 ir_graph *irg = get_irn_irg(call);
1000 graph_entry_t *i_graph = graph_get_entry(called_irg, status->irg_hash);
1001 graph_entry_t *graph = graph_get_entry(irg, status->irg_hash);
1003 cnt_inc(&graph->cnt_got_inlined);
1004 cnt_inc(&i_graph->cnt_was_inlined);
1010 * A graph with tail-recursions was optimized.
1012 void stat_tail_rec(ir_graph *irg)
1014 if (! status->enable)
1024 * Strength reduction was performed on an iteration variable.
1026 void stat_strength_red(ir_graph *irg, ir_node *strong, ir_node *cmp)
1028 if (! status->enable)
1033 graph_entry_t *graph = graph_get_entry(irg, status->irg_hash);
1034 cnt_inc(&graph->cnt_strength_red);
1036 removed_due_opt(strong, graph->opt_hash[STAT_OPT_STRENGTH_RED]);
1042 * Start the dead node elimination.
1044 void stat_dead_node_elim_start(ir_graph *irg)
1046 if (! status->enable)
1049 ++status->in_dead_node_elim;
1053 * Stops the dead node elimination.
1055 void stat_dead_node_elim_stop(ir_graph *irg)
1057 if (! status->enable)
1060 --status->in_dead_node_elim;
1063 /* Finish the statistics */
1064 void stat_finish(const char *name)
1066 if (! status->enable)
1071 graph_entry_t *entry;
1072 graph_entry_t *global = graph_get_entry(NULL, status->irg_hash);
1076 /* dump per graph */
1077 for (entry = pset_first(status->irg_hash); entry; entry = pset_next(status->irg_hash)) {
1079 if (entry->irg == NULL) {
1080 /* special entry for the global count */
1084 if (! entry->deleted) {
1085 /* the graph is still alive, count the nodes on it */
1086 count_nodes_in_graph(global, entry);
1088 /* count the DAG's */
1089 // count_dags_in_graph(global, entry);
1091 /* calculate the pattern */
1092 stat_calc_pattern_history(entry->irg);
1097 /* clear the counter here:
1098 * we need only the edge counter to be cleared, all others are cumulative
1100 cnt_clr(&entry->cnt_edges);
1104 // dump_graph(global);
1107 stat_finish_pattern_history();
1109 /* clear the global counter here */
1111 node_entry_t *entry;
1113 for (entry = pset_first(global->opcode_hash); entry; entry = pset_next(global->opcode_hash)) {
1114 opcode_clear_entry(entry);
1116 graph_clear_entry(global);
1120 // status->enable = 0;
1127 /* need this for prototypes */
1128 #define FIRM_STATISTICS
1129 #include "firmstat.h"
1131 void init_stat(unsigned enable_options) {}
1133 void stat_finish(const char *name) {}
1135 void stat_new_ir_op(const ir_op *op) {}
1137 void stat_free_ir_op(const ir_op *op) {}
1139 void stat_new_node(const ir_node *node) {}
1141 void stat_turn_into_id(const ir_node *node) {}
1143 void stat_new_graph(ir_graph *irg, entity *ent) {}
1145 void stat_free_graph(ir_graph *irg) {}
1147 void stat_irg_walk(ir_graph *irg, void *pre, void *post) {}
1149 void stat_irg_block_walk(ir_graph *irg, const ir_node *node, void *pre, void *post) {}
1151 void stat_merge_nodes(
1152 ir_node **new_node_array, int new_num_entries,
1153 ir_node **old_node_array, int old_num_entries,
1154 stat_opt_kind opt) {}
1156 void stat_lower(ir_node *node) {}
1158 void stat_inline(ir_node *call, ir_graph *irg) {}
1160 void stat_tail_rec(ir_graph *irg) {}
1162 void stat_strength_red(ir_graph *irg, ir_node *strong, ir_node *cmp) {}
1164 void stat_dead_node_elim_start(ir_graph *irg) {}
1166 void stat_dead_node_elim_stop(ir_graph *irg) {}