class cast states implemented
[libfirm] / ir / stat / firmstat_t.h
index 0318ee9..2c515e3 100644 (file)
 #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
@@ -37,38 +39,67 @@ typedef pset hmap_block_entry_t;
 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.
  */
 typedef struct _node_entry_t {
-  counter_t   cnt_alive;               /**< amount of nodes in this entry */
-  counter_t   new_node;                        /**< amount of new nodes for this entry */
-  counter_t   into_Id;                 /**< amount of nodes that turned into Id's for this entry */
-  const ir_op *op;                     /**< the op for this entry */
+  counter_t   cnt_alive;    /**< amount of nodes in this entry */
+  counter_t   new_node;            /**< amount of new nodes for this entry */
+  counter_t   into_Id;     /**< amount of nodes that turned into Id's for this entry */
+  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
+ * An entry for ir_graphs. These numbers are calculated for every IR graph.
  */
 typedef struct _graph_entry_t {
-  HASH_MAP(node_entry_t)  *opcode_hash;                        /**< hash map containing the opcode counter */
-  HASH_MAP(block_entry_t) *block_hash;                 /**< hash map countaining the block counter */
-  counter_t               cnt_walked;                  /**< walker walked over the graph */
-  counter_t               cnt_walked_blocks;           /**< walker walked over the graph blocks */
-  counter_t               cnt_was_inlined;             /**< number of times other graph were inlined */
-  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(node_entry_t)  *opcode_hash;                 /**< hash map containing the opcode counter */
+  HASH_MAP(block_entry_t) *block_hash;                  /**< hash map containing the block counter */
+  counter_t               cnt_walked;                    /**< walker walked over the graph */
+  counter_t               cnt_walked_blocks;            /**< walker walked over the graph blocks */
+  counter_t               cnt_was_inlined;              /**< number of times other graph were inlined */
+  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 */
   counter_t               cnt_all_calls;                /**< number of all calls */
+  counter_t               cnt_call_with_cnst_arg;       /**< number of calls with const args */
   counter_t               cnt_indirect_calls;           /**< number of indirect calls */
-  HASH_MAP(opt_entry_t)   *opt_hash[STAT_OPT_MAX];     /**< 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 */
-  unsigned                is_deleted:1;                        /**< set if this irg was deleted */
-  unsigned                is_leaf:1;                   /**< set, if this irg is a leaf function */
-  unsigned                is_recursive:1;              /**< set, if this irg has recursive calls */
-  unsigned                is_chain_call:1;             /**< set, if this irg is a chain call */
+  counter_t               cnt_if_conv[IF_RESULT_LAST];  /**< number of if conversions */
+  counter_t               cnt_real_func_call;           /**< number real function call optimization */
+  unsigned                num_tail_recursion;           /**< number of tail recursion optimizations */
+  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 */
+  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;
 
 /**
@@ -87,6 +118,7 @@ typedef struct _block_entry_t {
   counter_t  cnt_edges;                        /**< the counter of edges in this block */
   counter_t  cnt_in_edges;             /**< the counter of edges incoming from other blocks to this block */
   counter_t  cnt_out_edges;            /**< the counter of edges outgoing from this block to other blocks */
+  counter_t  cnt_phi_data;              /**< the counter of data Phi nodes in this block */
   long       block_nr;                 /**< block nr */
 } block_entry_t;
 
@@ -124,17 +156,21 @@ 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 */
+  ir_op                   *op_SelSel;          /**< pseudo op for Sel(Sel) */
+  ir_op                   *op_SelSelSel;       /**< pseudo op for Sel(Sel(Sel)) */
   dumper_t                *dumper;             /**< list of dumper */
   int                     reassoc_run;          /**< if set, reassociation is running */
-  int                     enable;              /**< if set, statistic is enabled */
+  int                     stat_options;                /**< statistic options */
 } stat_info_t;
 
 /**
@@ -149,6 +185,10 @@ struct _dumper_t {
   dumper_t                *next;               /**< link to the next dumper */
 };
 
+/**
+ * helper: get an ir_op from an opcode
+ */
+ir_op *stat_get_op_from_opcode(opcode code);
 
 /**
  * An entry in a distribution table