Added support for out edges.
[libfirm] / ir / stat / firmstat_t.h
index 9c1ef50..63e48e1 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
@@ -64,6 +66,12 @@ typedef struct _node_entry_t {
   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
  */
@@ -78,14 +86,16 @@ typedef struct _graph_entry_t {
   counter_t               cnt_edges;                   /**< number of DF edges in this graph */
   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[STAT_OPT_MAX];     /**< hash maps containing opcode counter for 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;
 
 /**
@@ -141,18 +151,19 @@ 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                     enable;              /**< if set, statistic is enabled */
-  int                     dag_options;          /**< DAG counting options */
+  int                     stat_options;                /**< statistic options */
 } stat_info_t;
 
 /**
@@ -167,6 +178,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