X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fstat%2Ffirmstat.h;h=dd1ba44d7faeb61bb0303dc51e109088e9d3c927;hb=f73f5c542edb2e4ff58a4bdc4f9d53415a14c4a1;hp=09a8f4cc3ac1af9441f4c8c71f93e737b70bbc60;hpb=c538647fc8da66f18e53e6ec69c7d42cd9553131;p=libfirm diff --git a/ir/stat/firmstat.h b/ir/stat/firmstat.h index 09a8f4cc3..dd1ba44d7 100644 --- a/ir/stat/firmstat.h +++ b/ir/stat/firmstat.h @@ -18,33 +18,57 @@ #include "irnode.h" #include "irgraph.h" +/** + * Statistic options, can be or'ed. + */ +enum firmstat_options_t { + FIRMSTAT_ENABLED = 0x00000001, /**< enable statistics */ + FIRMSTAT_PATTERN_ENABLED = 0x00000002, /**< enable pattern calculation */ + FIRMSTAT_COUNT_STRONG_OP = 0x00000004, /**< if set, count Mul/Div/Mod/DivMod by constant */ + FIRMSTAT_COUNT_DAG = 0x00000008, /**< if set, count DAG statistics */ + FIRMSTAT_COUNT_DELETED = 0x00000010, /**< if set, count deleted graphs */ + FIRMSTAT_CSV_OUTPUT = 0x10000000 /**< CSV output of some mini-statistic */ +}; + +/** + * Finish the statistics. + * Never called from libFirm should be called from user. + * + * @param name basename of the statistic output file + */ +void stat_finish(const char *name); + #ifdef FIRM_STATISTICS typedef enum { - STAT_OPT_STG = 0, /**< straightening optimization */ - STAT_OPT_IFSIM = 1, /**< if simplification */ - STAT_OPT_ALGSIM = 2, /**< algebraic simplification */ - STAT_OPT_PHI = 3, /**< Phi optmization */ - STAT_OPT_WAW = 4, /**< Write-After-Write optimization */ - STAT_OPT_WAR = 5, /**< Write-After-Read optimization */ - STAT_OPT_TUPLE = 6, /**< Tuple optimization */ - STAT_OPT_ID = 7, /**< ID optimization */ - STAT_OPT_CONST_EVAL = 8, /**< constant evaluation */ - STAT_LOWERED = 9, /**< lowered */ - - STAT_OPT_MAX = 10 -} -stat_opt_kind; + STAT_OPT_STG, /**< straightening optimization */ + STAT_OPT_IFSIM, /**< if simplification */ + STAT_OPT_CONST_EVAL, /**< constant evaluation */ + STAT_OPT_ALGSIM, /**< algebraic simplification */ + STAT_OPT_PHI, /**< Phi optmization */ + STAT_OPT_WAW, /**< Write-After-Write optimization */ + STAT_OPT_WAR, /**< Write-After-Read optimization */ + STAT_OPT_RAW, /**< Read-After-Write optimization */ + STAT_OPT_RAR, /**< Read-After-Read optimization */ + STAT_OPT_RC, /**< Read-a-Const optimization */ + STAT_OPT_TUPLE, /**< Tuple optimization */ + STAT_OPT_ID, /**< ID optimization */ + STAT_OPT_CSE, /**< common subexpression elimination */ + STAT_OPT_STRENGTH_RED, /**< strength reduction */ + STAT_OPT_ARCH_DEP, /**< architecture dependent optimization */ + STAT_OPT_REASSOC, /**< reassociation */ + STAT_OPT_POLY_CALL, /**< polymorphic call optimization */ + STAT_LOWERED, /**< lowered */ + + STAT_OPT_MAX +} stat_opt_kind; /** * initialize the statistics module. + * + * @param enable_options Bitmask containing the statistic options */ -void stat_init(void); - -/** - * Finish the statistics. - */ -void stat_finish(void); +void init_stat(unsigned enable_options); /** * A new IR op is registered. @@ -59,12 +83,12 @@ void stat_free_ir_op(const ir_op *op); /** * A new node is created. */ -void stat_new_node(const ir_node *node); +void stat_new_node(ir_node *node); /** * A node is changed into a Id node */ -void stat_turn_into_id(const ir_node *node); +void stat_turn_into_id(ir_node *node); /** * A new graph was created @@ -81,6 +105,11 @@ void stat_free_graph(ir_graph *irg); */ void stat_irg_walk(ir_graph *irg, void *pre, void *post); +/** + * A walk over a graph in block-wise order is initiated + */ +void stat_irg_walk_blkwise(ir_graph *irg, void *pre, void *post); + /** * A walk over the graph's blocks is initiated */ @@ -94,6 +123,11 @@ void stat_merge_nodes( ir_node **old_node_array, int old_num_entries, stat_opt_kind opt); +/** + * Reassociation of nodes started/stopped. + */ +void stat_reassociate(int start); + /** * A node was lowered into other nodes */ @@ -109,6 +143,11 @@ void stat_inline(ir_node *call, ir_graph *irg); */ void stat_tail_rec(ir_graph *irg); +/** + * Strength reduction was performed on an iteration variable. + */ +void stat_strength_red(ir_graph *irg, ir_node *strong, ir_node *cmp); + /** * Start the dead node elimination. */ @@ -119,10 +158,39 @@ void stat_dead_node_elim_start(ir_graph *irg); */ void stat_dead_node_elim_stop(ir_graph *irg); +/** + * A multiply was replaced by a series of Shifts/Adds/Subs + */ +void stat_arch_dep_replace_mul_with_shifts(ir_node *mul); + +/** + * A division was replaced by a series of Shifts/Muls + */ +void stat_arch_dep_replace_div_by_const(ir_node *div); + +/** + * A modulo was replaced by a series of Shifts/Muls + */ +void stat_arch_dep_replace_mod_by_const(ir_node *mod); + +/** + * A Divod was replaced by a series of Shifts/Muls + */ +void stat_arch_dep_replace_DivMod_by_const(ir_node *divmod); + +/** + * helper: get an ir_op from an opcode + * + * @param code the opcode + * + * @return The associated ir_op or NULL if the opcode could not be found. + */ +ir_op *stat_get_op_from_opcode(opcode code); + #else -#define stat_init() -#define stat_finish() +#define init_stat(enable_options) +#define stat_finish(name) #define stat_new_ir_op(op) #define stat_free_ir_op(op) #define stat_new_node(node) @@ -130,13 +198,20 @@ void stat_dead_node_elim_stop(ir_graph *irg); #define stat_new_graph(irg, ent) #define stat_free_graph(irg) #define stat_irg_walk(irg, pre, post) +#define stat_irg_walk_blkwise(irg, pre, post) #define stat_irg_block_walk(irg, node, pre, post) #define stat_merge_nodes(new_node_array, new_num_entries, old_node_array, old_num_entries, opt) +#define stat_reassociate(start) #define stat_lower(node) #define stat_inline(call, irg) #define stat_tail_rec(irg) +#define stat_strength_red(irg, strong, cmp) #define stat_dead_node_elim_start(irg) #define stat_dead_node_elim_stop(irg) +#define stat_arch_dep_replace_mul_with_shifts(irn) +#define stat_arch_dep_replace_div_by_const(irn) +#define stat_arch_dep_replace_mod_by_const(irn) +#define stat_arch_dep_replace_DivMod_by_const(irn) #endif