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.
21 #ifdef FIRM_STATISTICS
25 # include "irnode_t.h"
26 # include "irgraph_t.h"
34 * just be make some things clear :-), the
37 #define HASH_MAP(type) pset_##type
39 typedef pset pset_node_entry_t;
40 typedef pset pset_graph_entry_t;
41 typedef pset pset_opt_entry_t;
42 typedef pset pset_block_entry_t;
45 * An entry for ir_nodes
47 typedef struct _node_entry_t {
48 counter_t cnt_alive; /**< amount of nodes in this entry */
49 counter_t new_node; /**< amount of new nodes for this entry */
50 counter_t into_Id; /**< amount of nodes that turned into Id's for this entry */
51 const ir_op *op; /**< the op for this entry */
55 * An entry for ir_graphs
57 typedef struct _graph_entry_t {
58 HASH_MAP(node_entry_t) *opcode_hash; /**< hash map containing the opcode counter */
59 HASH_MAP(block_entry_t) *block_hash; /**< hash map countaining the block counter */
60 counter_t cnt_walked; /**< walker walked over the graph */
61 counter_t cnt_walked_blocks; /**< walker walked over the graph blocks */
62 counter_t cnt_was_inlined; /**< number of times other graph were inlined */
63 counter_t cnt_got_inlined; /**< number of times this graph was inlined */
64 counter_t cnt_edges; /**< number of DF edges in this graph */
65 HASH_MAP(opt_entry_t) *opt_hash[STAT_OPT_MAX]; /**< hash maps containing opcode counter for optimizations */
66 ir_graph *irg; /**< the graph of this object */
67 entity *ent; /**< the entity of this graph if one exists */
68 int deleted; /**< set if this irg was deleted */
72 * An entry for optimized ir_nodes
74 typedef struct _opt_entry_t {
75 counter_t count; /**< optimization counter */
76 const ir_op *op; /**< the op for this entry */
80 * An entry for a block in a ir-graph
82 typedef struct _block_entry_t {
83 counter_t cnt_nodes; /**< the counter of nodes in this block */
84 counter_t cnt_edges; /**< the counter of edges in this block */
85 counter_t cnt_in_edges; /**< the counter of edges incoming from other blocks to this block */
86 counter_t cnt_out_edges; /**< the counter of edges outgoing from this block to other blocks */
87 long block_nr; /**< block nr */
91 typedef struct _dumper_t dumper_t;
94 * handler for dumping an IRG
96 * @param dmp the dumper
97 * @param entry the IR-graph hash map entry
99 typedef void (*dump_graph_FUNC)(dumper_t *dmp, graph_entry_t *entry);
102 * handler for dumper init
104 * @param dmp the dumper
105 * @param name name of the file to dump to
107 typedef void (*dump_init_FUNC)(dumper_t *dmp, const char *name);
110 * handler for dumper finish
112 * @param dmp the dumper
114 typedef void (*dump_finish_FUNC)(dumper_t *dmp);
118 * a dumper description
121 dump_graph_FUNC dump_graph; /**< handler for dumping an irg */
122 dump_init_FUNC init; /**< handler for init */
123 dump_finish_FUNC finish; /**< handler for finish */
124 FILE *f; /**< the file to dump to */
125 dumper_t *next; /**< link to the next dumper */
131 typedef struct _statistic_info_t {
132 struct obstack cnts; /**< obstack containing the counters */
133 HASH_MAP(graph_entry_t) *irg_hash; /**< hash map containing the counter for irgs */
134 int recursive; /**< flag for detecting recursive hook calls */
135 int in_dead_node_elim; /**< set, if dead node elimination runs */
136 ir_op *op_Phi0; /**< needed pseudo op */
137 ir_op *op_PhiM; /**< needed pseudo op */
138 dumper_t *dumper; /**< list of dumper */
139 int enable; /**< if set, statistic is enabled */
143 * names of the optimizations
145 static const char *opt_names[] = {
146 "straightening optimization",
148 "algebraic simplification",
150 "Write-After-Write optimization",
151 "Write-After-Read optimization",
152 "Tuple optimization",
154 "Constant evaluation",
159 * need this to be static
161 static ir_op _op_Phi0, _op_PhiM;
163 /* ---------------------------------------------------------------------------------- */
165 #define STAT_ENTER ++status->recursive
166 #define STAT_LEAVE --status->recursive
167 #define STAT_ENTER_SINGLE do { if (status->recursive > 0) return; ++status->recursive; } while (0)
172 static stat_info_t _status, *status = &_status;
175 * compare two elements of the opcode hash
177 static int opcode_cmp(const void *elt, const void *key)
179 const node_entry_t *e1 = elt;
180 const node_entry_t *e2 = key;
182 return e1->op->code - e2->op->code;
186 * compare two elements of the graph hash
188 static int graph_cmp(const void *elt, const void *key)
190 const graph_entry_t *e1 = elt;
191 const graph_entry_t *e2 = key;
193 return e1->irg != e2->irg;
197 * compare two elements of the optimization hash
199 static int opt_cmp(const void *elt, const void *key)
201 const opt_entry_t *e1 = elt;
202 const opt_entry_t *e2 = key;
204 return e1->op->code != e2->op->code;
208 * compare two elements of the block hash
210 static int block_cmp(const void *elt, const void *key)
212 const block_entry_t *e1 = elt;
213 const block_entry_t *e2 = key;
215 return e1->block_nr != e2->block_nr;
219 * Returns the associates node_entry_t for an ir_op
221 static node_entry_t *opcode_get_entry(const ir_op *op, pset *set)
228 elem = pset_find(set, &key, op->code);
232 elem = obstack_alloc(&status->cnts, sizeof(*elem));
235 cnt_clr(&elem->cnt_alive);
236 cnt_clr(&elem->new_node);
237 cnt_clr(&elem->into_Id);
241 return pset_insert(set, elem, op->code);
245 * calculates a hash value for an irg
246 * Addresses are typically aligned at 32bit, so we ignore the lowest bits
248 static INLINE unsigned irg_hash(const ir_graph *irg)
250 return (unsigned)irg >> 3;
254 * Returns the acssociates graph_entry_t for an irg
256 static graph_entry_t *graph_get_entry(ir_graph *irg, pset *set)
264 elem = pset_find(set, &key, irg_hash(irg));
268 elem = obstack_alloc(&status->cnts, sizeof(*elem));
270 cnt_clr(&elem->cnt_walked);
271 cnt_clr(&elem->cnt_walked_blocks);
272 cnt_clr(&elem->cnt_got_inlined);
273 cnt_clr(&elem->cnt_was_inlined);
274 cnt_clr(&elem->cnt_edges);
276 /* new hash table for opcodes here */
277 elem->opcode_hash = new_pset(opcode_cmp, 5);
278 elem->block_hash = new_pset(block_cmp, 5);
281 for (i = 0; i < sizeof(elem->opt_hash)/sizeof(elem->opt_hash[0]); ++i)
282 elem->opt_hash[i] = new_pset(opt_cmp, 4);
284 return pset_insert(set, elem, irg_hash(irg));
288 * Returns the associates opt_entry_t for an ir_op
290 static opt_entry_t *opt_get_entry(const ir_op *op, pset *set)
297 elem = pset_find(set, &key, op->code);
301 elem = obstack_alloc(&status->cnts, sizeof(*elem));
303 /* clear new counter */
304 cnt_clr(&elem->count);
308 return pset_insert(set, elem, op->code);
312 * Returns the associates block_entry_t for an block
314 static block_entry_t *block_get_entry(long block_nr, pset *set)
319 key.block_nr = block_nr;
321 elem = pset_find(set, &key, block_nr);
325 elem = obstack_alloc(&status->cnts, sizeof(*elem));
327 /* clear new counter */
328 cnt_clr(&elem->cnt_nodes);
329 cnt_clr(&elem->cnt_edges);
330 cnt_clr(&elem->cnt_in_edges);
331 cnt_clr(&elem->cnt_out_edges);
333 elem->block_nr = block_nr;
335 return pset_insert(set, elem, block_nr);
340 * Returns the ir_op for an IR-node,
341 * handles special cases and return pseudo op codes
343 static ir_op *stat_get_irn_op(const ir_node *node)
345 ir_op *op = get_irn_op(node);
347 if (op->code == iro_Phi && get_irn_arity(node) == 0) {
348 /* special case, a Phi0 node, count on extra counter */
349 op = status->op_Phi0;
351 else if (op->code == iro_Phi && get_irn_mode(node) == mode_M) {
352 /* special case, a Memory Phi node, count on extra counter */
353 op = status->op_PhiM;
359 * update the block counter
361 static void count_block_info(ir_node *node, graph_entry_t *graph)
363 ir_op *op = get_irn_op(node);
365 block_entry_t *b_entry;
368 /* check for block */
369 if (op == op_Block) {
370 arity = get_irn_arity(node);
371 b_entry = block_get_entry(get_irn_node_nr(node), graph->block_hash);
373 /* count all incoming edges */
374 for (i = 0; i < arity; ++i) {
375 ir_node *pred = get_irn_n(node, i);
376 ir_node *other_block = get_nodes_Block(pred);
377 block_entry_t *b_entry_other = block_get_entry(get_irn_node_nr(other_block), graph->block_hash);
379 cnt_inc(&b_entry->cnt_in_edges); /* an edge coming from another block */
380 cnt_inc(&b_entry_other->cnt_out_edges);
384 else if (op == op_Call) {
388 block = get_nodes_Block(node);
389 b_entry = block_get_entry(get_irn_node_nr(block), graph->block_hash);
391 /* we have a new nodes */
392 cnt_inc(&b_entry->cnt_nodes);
394 arity = get_irn_arity(node);
396 for (i = 0; i < arity; ++i) {
397 ir_node *pred = get_irn_n(node, i);
398 ir_node *other_block;
400 if (get_irn_op(pred) == op_Block)
403 other_block = get_nodes_Block(pred);
405 if (other_block == block)
406 cnt_inc(&b_entry->cnt_edges); /* a in block edge */
408 block_entry_t *b_entry_other = block_get_entry(get_irn_node_nr(other_block), graph->block_hash);
410 cnt_inc(&b_entry->cnt_in_edges); /* an edge coming from another block */
411 cnt_inc(&b_entry_other->cnt_out_edges);
417 * walker for reachable nodes count
419 static void count_nodes(ir_node *node, void *env)
421 graph_entry_t *graph = env;
424 ir_op *op = stat_get_irn_op(node);
425 int arity = get_irn_arity(node);
427 entry = opcode_get_entry(op, graph->opcode_hash);
429 cnt_inc(&entry->cnt_alive);
430 cnt_add_i(&graph->cnt_edges, arity);
432 /* count block edges */
433 count_block_info(node, graph);
437 * count all alive nodes and edges in a graph
439 static void count_nodes_in_graph(graph_entry_t *global, graph_entry_t *graph)
443 irg_walk_graph(graph->irg, count_nodes, NULL, graph);
445 /* assume we walk every graph only ONCE, we could sum here the global count */
446 for (entry = pset_first(graph->opcode_hash); entry; entry = pset_next(graph->opcode_hash)) {
447 node_entry_t *g_entry = opcode_get_entry(entry->op, global->opcode_hash);
449 /* update the node counter */
450 cnt_add(&g_entry->cnt_alive, &entry->cnt_alive);
453 /* update the edge counter */
454 cnt_add(&global->cnt_edges, &graph->cnt_edges);
460 static void stat_register_dumper(dumper_t *dumper, const char *name)
462 dumper->next = status->dumper;
463 status->dumper = dumper;
466 dumper->init(dumper, name);
472 static void dump_graph(graph_entry_t *entry)
476 for (dumper = status->dumper; dumper; dumper = dumper->next) {
477 if (dumper->dump_graph)
478 dumper->dump_graph(dumper, entry);
485 static void dump_finish(void)
489 for (dumper = status->dumper; dumper; dumper = dumper->next) {
491 dumper->finish(dumper);
495 /* ---------------------------------------------------------------------- */
498 * dumps a opcode hash into human readable form
500 static void simple_dump_opcode_hash(dumper_t *dmp, pset *set)
504 counter_t f_new_node;
508 cnt_clr(&f_new_node);
511 fprintf(dmp->f, "%-16s %-8s %-8s %-8s\n", "Opcode", "alive", "created", "->Id");
512 for (entry = pset_first(set); entry; entry = pset_next(set)) {
513 fprintf(dmp->f, "%-16s %8d %8d %8d\n",
514 get_id_str(entry->op->name), entry->cnt_alive.cnt[0], entry->new_node.cnt[0], entry->into_Id.cnt[0]);
516 cnt_add(&f_alive, &entry->cnt_alive);
517 cnt_add(&f_new_node, &entry->new_node);
518 cnt_add(&f_Id, &entry->into_Id);
520 fprintf(dmp->f, "-------------------------------------------\n");
521 fprintf(dmp->f, "%-16s %8d %8d %8d\n", "Sum",
528 * dumps a optimization hash into human readable form
530 static void simple_dump_opt_hash(dumper_t *dmp, pset *set, int index)
532 opt_entry_t *entry = pset_first(set);
535 fprintf(dmp->f, "\n%s:\n", opt_names[index]);
536 fprintf(dmp->f, "%-16s %-8s\n", "Opcode", "deref");
538 for (; entry; entry = pset_next(set)) {
539 fprintf(dmp->f, "%-16s %8d\n",
540 get_id_str(entry->op->name), entry->count.cnt[0]);
546 * dumps the endges count
548 static void simple_dump_edges(dumper_t *dmp, counter_t *cnt)
550 fprintf(dmp->f, "%-16s %8d\n", "Edges", cnt->cnt[0]);
556 static void simple_dump_graph(dumper_t *dmp, graph_entry_t *entry)
559 block_entry_t *b_entry;
562 ir_graph *const_irg = get_const_code_irg();
564 if (entry->irg == const_irg) {
565 fprintf(dmp->f, "\nConst code Irg %p", (void *)entry->irg);
569 fprintf(dmp->f, "\nEntity %s, Irg %p", get_entity_name(entry->ent), (void *)entry->irg);
571 fprintf(dmp->f, "\nIrg %p", (void *)entry->irg);
574 fprintf(dmp->f, " %swalked %d over blocks %d was inlined %d got inlined %d:\n",
575 entry->deleted ? "DELETED " : "",
576 entry->cnt_walked.cnt[0], entry->cnt_walked_blocks.cnt[0],
577 entry->cnt_was_inlined.cnt[0],
578 entry->cnt_got_inlined.cnt[0]
582 fprintf(dmp->f, "\nGlobals counts:\n");
586 simple_dump_opcode_hash(dmp, entry->opcode_hash);
587 simple_dump_edges(dmp, &entry->cnt_edges);
589 /* effects of optimizations */
593 for (i = 0; i < sizeof(entry->opt_hash)/sizeof(entry->opt_hash[0]); ++i) {
594 simple_dump_opt_hash(dmp, entry->opt_hash[i], i);
598 /* dump block info */
599 fprintf(dmp->f, "\n%12s %12s %12s %12s %12s %12s\n", "Block Nr", "Nodes", "intern", "incoming", "outgoing", "quot");
600 for (b_entry = pset_first(entry->block_hash);
602 b_entry = pset_next(entry->block_hash)) {
603 fprintf(dmp->f, "%12ld %12u %12u %12u %12u %4.8f\n",
605 b_entry->cnt_nodes.cnt[0],
606 b_entry->cnt_edges.cnt[0],
607 b_entry->cnt_in_edges.cnt[0],
608 b_entry->cnt_out_edges.cnt[0],
609 (double)b_entry->cnt_edges.cnt[0] / (double)b_entry->cnt_nodes.cnt[0]
615 * initialise the simple dumper
617 static void simple_init(dumper_t *dmp, const char *name)
619 dmp->f = fopen(name, "w");
623 * finishes the simple dumper
625 static void simple_finish(dumper_t *dmp)
632 * the simple human readable dumper
634 static dumper_t simple_dumper = {
642 /* ---------------------------------------------------------------------- */
645 * count the nodes as needed:
647 * 1 normal (data) Phi's
652 static void csv_count_nodes(graph_entry_t *graph, counter_t cnt[])
657 for (i = 0; i < 4; ++i)
660 for (entry = pset_first(graph->opcode_hash); entry; entry = pset_next(graph->opcode_hash)) {
661 if (entry->op == op_Phi) {
663 cnt_add(&cnt[1], &entry->cnt_alive);
665 else if (entry->op == status->op_PhiM) {
667 cnt_add(&cnt[2], &entry->cnt_alive);
669 else if (entry->op == op_Proj) {
671 cnt_add(&cnt[3], &entry->cnt_alive);
674 /* all other nodes */
675 cnt_add(&cnt[0], &entry->cnt_alive);
683 static void csv_dump_graph(dumper_t *dmp, graph_entry_t *entry)
690 ir_graph *const_irg = get_const_code_irg();
692 if (entry->irg == const_irg) {
693 name = "<Const code Irg>";
698 name = get_entity_name(entry->ent);
700 name = "<UNKNOWN IRG>";
703 csv_count_nodes(entry, cnt);
705 fprintf(dmp->f, "%-40s, %p, %d, %d, %d, %d\n",
717 * initialise the simple dumper
719 static void csv_init(dumper_t *dmp, const char *name)
721 dmp->f = fopen(name, "a");
725 * finishes the simple dumper
727 static void csv_finish(dumper_t *dmp)
734 * the simple human readable dumper
736 static dumper_t csv_dumper = {
745 /* ---------------------------------------------------------------------- */
747 /* initialize the statistics module. */
750 #define X(a) a, sizeof(a)-1
754 /* enable statistics */
757 if (! status->enable)
760 obstack_init(&status->cnts);
762 /* build the pseudo-ops */
763 _op_Phi0.code = --pseudo_id;
764 _op_Phi0.name = id_from_str(X("Phi0"));
766 _op_PhiM.code = --pseudo_id;
767 _op_PhiM.name = id_from_str(X("PhiM"));
769 /* create the hash-tables */
770 status->irg_hash = new_pset(graph_cmp, 8);
772 status->op_Phi0 = &_op_Phi0;
773 status->op_PhiM = &_op_PhiM;
775 stat_register_dumper(&simple_dumper, "firmstat.txt");
776 stat_register_dumper(&csv_dumper, "firmstat.csv");
778 /* initialize the pattern hash */
779 stat_init_pattern_history(status->enable & 0);
783 /* A new IR op is registered. */
784 void stat_new_ir_op(const ir_op *op)
786 if (! status->enable)
791 graph_entry_t *graph = graph_get_entry(NULL, status->irg_hash);
793 /* execute for side effect :-) */
794 opcode_get_entry(op, graph->opcode_hash);
799 /* An IR op is freed. */
800 void stat_free_ir_op(const ir_op *op)
802 if (! status->enable)
811 /* A new node is created. */
812 void stat_new_node(const ir_node *node)
814 if (! status->enable)
817 /* do NOT count during dead node elimination */
818 if (status->in_dead_node_elim > 0)
824 graph_entry_t *graph;
825 ir_op *op = stat_get_irn_op(node);
827 /* increase global value */
828 graph = graph_get_entry(NULL, status->irg_hash);
829 entry = opcode_get_entry(op, graph->opcode_hash);
830 cnt_inc(&entry->new_node);
832 /* increase local value */
833 graph = graph_get_entry(current_ir_graph, status->irg_hash);
834 entry = opcode_get_entry(op, graph->opcode_hash);
835 cnt_inc(&entry->new_node);
840 /* A node is changed into a Id node */
841 void stat_turn_into_id(const ir_node *node)
843 if (! status->enable)
849 graph_entry_t *graph;
850 ir_op *op = stat_get_irn_op(node);
852 /* increase global value */
853 graph = graph_get_entry(NULL, status->irg_hash);
854 entry = opcode_get_entry(op, graph->opcode_hash);
855 cnt_inc(&entry->into_Id);
857 /* increase local value */
858 graph = graph_get_entry(current_ir_graph, status->irg_hash);
859 entry = opcode_get_entry(op, graph->opcode_hash);
860 cnt_inc(&entry->into_Id);
865 /* A new graph was created */
866 void stat_new_graph(ir_graph *irg, entity *ent)
868 if (! status->enable)
873 /* execute for side effect :-) */
874 graph_entry_t * graph = graph_get_entry(irg, status->irg_hash);
883 * A graph was deleted
885 void stat_free_graph(ir_graph *irg)
887 if (! status->enable)
892 graph_entry_t *graph = graph_get_entry(irg, status->irg_hash);
893 graph_entry_t *global = graph_get_entry(NULL, status->irg_hash);
897 /* count the nodes of the graph yet, it will be destroyed later */
898 count_nodes_in_graph(global, graph);
900 /* calculate the pattern */
901 stat_calc_pattern_history(irg);
907 * A walk over a graph is initiated. Do not count walks from statistic code.
909 void stat_irg_walk(ir_graph *irg, void *pre, void *post)
911 if (! status->enable)
916 graph_entry_t *graph = graph_get_entry(irg, status->irg_hash);
918 cnt_inc(&graph->cnt_walked);
924 * A walk over the graph's blocks is initiated. Do not count walks from statistic code.
926 void stat_irg_block_walk(ir_graph *irg, const ir_node *node, void *pre, void *post)
928 if (! status->enable)
933 graph_entry_t *graph = graph_get_entry(irg, status->irg_hash);
935 cnt_inc(&graph->cnt_walked_blocks);
941 * called for every node that is removed due to an optimization
943 static void removed_due_opt(ir_node *n, pset *set)
945 ir_op *op = get_irn_op(n);
946 opt_entry_t *entry = opt_get_entry(op, set);
948 /* increase global value */
949 cnt_inc(&entry->count);
953 * Some nodes were optimized into some others due to an optimization
955 void stat_merge_nodes(
956 ir_node **new_node_array, int new_num_entries,
957 ir_node **old_node_array, int old_num_entries,
960 if (! status->enable)
966 graph_entry_t *graph = graph_get_entry(current_ir_graph, status->irg_hash);
968 for (i = 0; i < old_num_entries; ++i) {
969 for (j = 0; j < new_num_entries; ++j)
970 if (old_node_array[i] == new_node_array[j])
973 /* nodes might be in new and old, these are NOT removed */
974 if (j >= new_num_entries) {
975 removed_due_opt(old_node_array[i], graph->opt_hash[opt]);
983 * A node was lowered into other nodes
985 void stat_lower(ir_node *node)
987 if (! status->enable)
992 graph_entry_t *graph = graph_get_entry(current_ir_graph, status->irg_hash);
994 removed_due_opt(node, graph->opt_hash[STAT_LOWERED]);
1000 * A graph was inlined
1002 void stat_inline(ir_node *call, ir_graph *called_irg)
1004 if (! status->enable)
1009 ir_graph *irg = get_irn_irg(call);
1010 graph_entry_t *i_graph = graph_get_entry(called_irg, status->irg_hash);
1011 graph_entry_t *graph = graph_get_entry(irg, status->irg_hash);
1013 cnt_inc(&graph->cnt_got_inlined);
1014 cnt_inc(&i_graph->cnt_was_inlined);
1020 * Start the dead node elimination.
1022 void stat_dead_node_elim_start(ir_graph *irg)
1024 if (! status->enable)
1027 ++status->in_dead_node_elim;
1031 * Stops the dead node elimination.
1033 void stat_dead_node_elim_stop(ir_graph *irg)
1035 if (! status->enable)
1038 --status->in_dead_node_elim;
1041 /* Finish the statistics */
1042 void stat_finish(void)
1044 if (! status->enable)
1049 graph_entry_t *entry;
1050 graph_entry_t *global = graph_get_entry(NULL, status->irg_hash);
1052 /* dump per graph */
1053 for (entry = pset_first(status->irg_hash); entry; entry = pset_next(status->irg_hash)) {
1055 if (entry->irg == NULL) {
1056 /* special entry for the global count */
1060 if (! entry->deleted) {
1061 /* the graph is still alive, count the nodes on it */
1062 count_nodes_in_graph(global, entry);
1064 /* calculate the pattern */
1065 stat_calc_pattern_history(entry->irg);
1075 stat_finish_pattern_history();
1085 /* need this for prototypes */
1086 #define FIRM_STATISTICS
1087 #include "firmstat.h"
1089 void stat_init(void) {}
1091 void stat_finish(void) {}
1093 void stat_new_ir_op(const ir_op *op) {}
1095 void stat_free_ir_op(const ir_op *op) {}
1097 void stat_new_node(const ir_node *node) {}
1099 void stat_turn_into_id(const ir_node *node) {}
1101 void stat_new_graph(ir_graph *irg, entity *ent) {}
1103 void stat_free_graph(ir_graph *irg) {}
1105 void stat_irg_walk(ir_graph *irg, void *pre, void *post) {}
1107 void stat_irg_block_walk(ir_graph *irg, const ir_node *node, void *pre, void *post) {}
1109 void stat_merge_nodes(
1110 ir_node **new_node_array, int new_num_entries,
1111 ir_node **old_node_array, int old_num_entries,
1112 stat_opt_kind opt) {}
1114 void stat_lower(ir_node *node) {}
1116 void stat_inline(ir_node *call, ir_graph *irg) {}
1118 void stat_dead_node_elim_start(ir_graph *irg) {}
1120 void stat_dead_node_elim_stop(ir_graph *irg) {}