#include "irnode_t.h"
#include "irgraph_t.h"
#include "pset.h"
+#include "pdeq.h"
#include "irprog.h"
#include "irgwalk.h"
#include "counter.h"
+#include "irhooks.h"
/*
* just be make some things clear :-), the
typedef pset hmap_ir_op;
typedef pset hmap_distrib_entry_t;
+/**
+ * possible address marker values
+ */
+enum adr_marker_t {
+ MARK_ADDRESS_CALC = 1, /**< the node is an address expression */
+ MARK_REF_ADR = 2, /**< the node is referenced by an address expression */
+ MARK_REF_NON_ADR = 4, /**< the node is referenced by a non-address expression */
+};
+
+/**
+ * An entry in the address_mark set
+ */
+typedef struct _address_mark_entry_t {
+ ir_node *node; /**< the node which this entry belongs to, needed for compare */
+ unsigned mark; /**< the mark, a bitmask of enum adr_marker_t */
+} address_mark_entry_t;
/**
* An entry for ir_nodes, used in ir_graph statistics.
const ir_op *op; /**< the op for this entry */
} node_entry_t;
+enum leaf_call_state_t {
+ LCS_UNKNOWN = 0, /**< state is unknown yet */
+ LCS_LEAF_CALL = 1, /**< only leaf functions will be called */
+ LCS_NON_LEAF_CALL = 2, /**< at least one non-leaf function will be called or indetermined */
+};
+
/**
* An entry for ir_graphs
*/
counter_t cnt_got_inlined; /**< number of times this graph was inlined */
counter_t cnt_strength_red; /**< number of times strength reduction was successful on this graph */
counter_t cnt_edges; /**< number of DF edges in this graph */
- HASH_MAP(opt_entry_t) *opt_hash[STAT_OPT_MAX]; /**< hash maps containing opcode counter for optimizations */
+ counter_t cnt_all_calls; /**< number of all calls */
+ counter_t cnt_indirect_calls; /**< number of indirect calls */
+ HASH_MAP(opt_entry_t) *opt_hash[HOOK_OPT_LAST]; /**< hash maps containing opcode counter for optimizations */
ir_graph *irg; /**< the graph of this object */
entity *ent; /**< the entity of this graph if one exists */
- int deleted; /**< set if this irg was deleted */
+ set *address_mark; /**< a set containing the address marks of the nodes */
+ unsigned is_deleted:1; /**< set if this irg was deleted */
+ unsigned is_leaf:1; /**< set, if this irg is a leaf function */
+ unsigned is_leaf_call:2; /**< set, if this irg calls only leaf functions */
+ unsigned is_recursive:1; /**< set, if this irg has recursive calls */
+ unsigned is_chain_call:1; /**< set, if this irg is a chain call */
+ unsigned is_analyzed:1; /**< helper: set, if this irg was already analysed */
} graph_entry_t;
/**
typedef void (*dump_finish_FUNC)(dumper_t *dmp);
+/**
+ * statistics info
+ */
+typedef struct _statistic_info_t {
+ struct obstack cnts; /**< obstack containing the counters */
+ HASH_MAP(graph_entry_t) *irg_hash; /**< hash map containing the counter for irgs */
+ HASH_MAP(ir_op) *ir_op_hash; /**< hash map containing all ir_ops (accessible by op_codes) */
+ pdeq *wait_q; /**< wait queue for leaf call decision */
+ int recursive; /**< flag for detecting recursive hook calls */
+ int in_dead_node_elim; /**< set, if dead node elimination runs */
+ ir_op *op_Phi0; /**< pseudo op for Phi0 */
+ ir_op *op_PhiM; /**< pseudo op for memory Phi */
+ ir_op *op_ProjM; /**< pseudo op for memory Proj */
+ ir_op *op_MulC; /**< pseudo op for multiplication by const */
+ ir_op *op_DivC; /**< pseudo op for division by const */
+ ir_op *op_ModC; /**< pseudo op for modulo by const */
+ ir_op *op_DivModC; /**< pseudo op for DivMod by const */
+ dumper_t *dumper; /**< list of dumper */
+ int reassoc_run; /**< if set, reassociation is running */
+ int stat_options; /**< statistic options */
+} stat_info_t;
+
/**
* a dumper description
*/
dump_init_FUNC init; /**< handler for init */
dump_finish_FUNC finish; /**< handler for finish */
FILE *f; /**< the file to dump to */
+ stat_info_t *status; /**< access to the global status */
dumper_t *next; /**< link to the next dumper */
};
/**
- * statistics info
+ * helper: get an ir_op from an opcode
*/
-typedef struct _statistic_info_t {
- struct obstack cnts; /**< obstack containing the counters */
- HASH_MAP(graph_entry_t) *irg_hash; /**< hash map containing the counter for irgs */
- HASH_MAP(ir_op) *ir_op_hash; /**< hash map containing all ir_ops (accessible by op_codes) */
- int recursive; /**< flag for detecting recursive hook calls */
- int in_dead_node_elim; /**< set, if dead node elimination runs */
- ir_op *op_Phi0; /**< needed pseudo op */
- ir_op *op_PhiM; /**< needed pseudo op */
- dumper_t *dumper; /**< list of dumper */
- int enable; /**< if set, statistic is enabled */
-} stat_info_t;
+ir_op *stat_get_op_from_opcode(opcode code);
/**
* An entry in a distribution table