Use is_Bad() where appropriate
[libfirm] / ir / ir / irnode_t.h
index 016e93f..0fb6d84 100644 (file)
@@ -29,6 +29,7 @@
 #include "irdom_t.h" /* For size of struct dom_info. */
 #include "dbginfo.h"
 #include "irloop.h"
+#include "iredgekinds.h"
 #include "array.h"
 
 #include "set.h"
@@ -39,7 +40,7 @@
 #include "irextbb_t.h"
 
 
-/** IR node attributes **/
+/** ir node attributes **/
 
 /** Block attributes */
 typedef struct {
@@ -97,6 +98,9 @@ typedef struct {
 
 /** Exception attributes. */
 typedef struct {
+  op_pin_state   pin_state;     /**< the pin state for operations that might generate a exception:
+                                     If it's know that no exception will be generated, could be set to
+                                     op_pin_state_floats. */
 #if PRECISE_EXC_CONTEXT
   struct ir_node **frag_arr;    /**< For Phi node construction in case of exception */
 #endif
@@ -155,13 +159,13 @@ typedef struct {
 typedef struct {
   except_attr    exc;           /**< The exception attribute. MUST be the first one. */
   ir_mode        *load_mode;    /**< The mode of this Load operation. */
-  ent_volatility volatility;     /**< The volatility of a Load/Store operation. */
+  ir_volatility volatility;      /**< The volatility of a Load/Store operation. */
 } load_attr;
 
 /** Store attributes. */
 typedef struct {
   except_attr    exc;           /**< the exception attribute. MUST be the first one. */
-  ent_volatility volatility;     /**< the volatility of a Store operation */
+  ir_volatility volatility;      /**< the volatility of a Store operation */
 } store_attr;
 
 typedef pn_Cmp confirm_attr;    /**< Attribute to hold compare operation */
@@ -182,15 +186,6 @@ typedef struct {
   char           strict;        /**< If set, this is a strict Conv that cannot be removed. */
 } conv_attr;
 
-/**
- * Edge info to put into an irn.
- */
-typedef struct _irn_edge_info_t {
-  struct list_head outs_head;  /**< The list of all outs. */
-  int out_count;               /**< Number of outs in the list. */
-} irn_edge_info_t;
-
-
 /** Some IR-nodes just have one attribute, these are stored here,
    some have more. Their name is 'irnodename_attr' */
 typedef union {
@@ -226,6 +221,15 @@ typedef union {
   conv_attr      conv;          /**< For Conv operation */
 } attr;
 
+/**
+* Edge info to put into an irn.
+*/
+typedef struct _irn_edge_kind_info_t {
+       struct list_head outs_head;  /**< The list of all outs. */
+       int out_count;               /**< Number of outs in the list. */
+} irn_edge_info_t;
+
+typedef irn_edge_info_t irn_edges_info_t[EDGE_KIND_LAST];
 
 /** common structure of an irnode
     if the node has some attributes, they are stored in attr */
@@ -237,7 +241,6 @@ struct ir_node {
   struct ir_node **in;     /**< The array of predecessors / operands. */
   unsigned long visited;   /**< Visited counter for walks of the graph. */
   unsigned node_idx;       /**< The node index of this node in its graph. */
-  unsigned pinned : 1;     /**< A node is either pinned or not. */
   void *link;              /**< To attach additional information to the node, e.g.
                               used while construction to link Phi0 nodes and
                               during optimization to link to nodes that
@@ -257,7 +260,8 @@ struct ir_node {
   struct abstval *av;      /**< the abstract value of this node */
   struct section *sec;
 #endif
-  irn_edge_info_t edge_info;  /**< everlasting out edges */
+  struct ir_node **deps;   /**< Additional dependencies induced by state. */
+  irn_edges_info_t edge_info;  /**< everlasting out edges */
   /* ------- Opcode depending fields -------- */
   attr attr;               /**< attribute of this node. Depends on opcode.
                               Must be last field of struct ir_node. */
@@ -453,6 +457,44 @@ _get_irn_inter_n(const ir_node *node, int n) {
  */
 extern ir_node *(*_get_irn_n)(const ir_node *node, int n);
 
+static INLINE int _get_irn_deps(const ir_node *node)
+{
+       return node->deps ? ARR_LEN(node->deps) : 0;
+}
+
+static INLINE ir_node *_get_irn_dep(const ir_node *node, int pos)
+{
+       assert(node->deps && "dependency array node yet allocated. use add_irn_dep()");
+       assert(pos >= 0 && pos < ARR_LEN(node->deps) && "dependency index out of range");
+       return node->deps[pos];
+}
+
+static INLINE void
+_set_irn_dep(ir_node *node, int pos, ir_node *dep)
+{
+       ir_node *old;
+
+       assert(node->deps && "dependency array node yet allocated. use add_irn_dep()");
+       assert(pos >= 0 && pos < ARR_LEN(node->deps) && "dependency index out of range");
+       old = node->deps[pos];
+       node->deps[pos] = dep;
+       edges_notify_edge_kind(node, pos, dep, old, EDGE_KIND_DEP, get_irn_irg(node));
+}
+
+
+static INLINE int
+_get_irn_ins_or_deps(const ir_node *irn)
+{
+       return _get_irn_deps(irn) + _get_irn_arity(irn);
+}
+
+static INLINE ir_node *
+_get_irn_in_or_dep(const ir_node *irn, int pos)
+{
+       int n_in = get_irn_arity(irn);
+       return pos < n_in ? get_irn_n(irn, pos) : get_irn_dep(irn, pos - n_in);
+}
+
 /**
  * Gets the mode of a node.
  * Intern version for libFirm.
@@ -561,14 +603,14 @@ _get_irn_pinned(const ir_node *node) {
   state = _get_op_pinned(_get_irn_op(node));
 
   if (state >= op_pin_state_exc_pinned)
-    return get_opt_fragile_ops() ? (op_pin_state)node->pinned : op_pin_state_pinned;
-  return (op_pin_state)node->pinned;
+    return get_opt_fragile_ops() ? node->attr.except.pin_state : op_pin_state_pinned;
+  return state;
 }
 
 static INLINE op_pin_state
 _is_irn_pinned_in_irg(const ir_node *node) {
-  if (_get_irg_pinned(get_irn_irg(node)) == op_pin_state_floats)
-    return _get_irn_pinned(node);
+  if (get_irg_pinned(get_irn_irg(node)) == op_pin_state_floats)
+    return get_irn_pinned(node);
   return op_pin_state_pinned;
 }
 
@@ -590,6 +632,36 @@ _is_Bad(const ir_node *node) {
   return (_get_irn_op(node) == op_Bad);
 }
 
+static INLINE int
+_is_NoMem(const ir_node *node) {
+       assert(node);
+       return (_get_irn_op(node) == op_NoMem);
+}
+
+static INLINE int
+_is_Mod(const ir_node *node) {
+       assert(node);
+       return (_get_irn_op(node) == op_Mod);
+}
+
+static INLINE int
+_is_Div(const ir_node *node) {
+       assert(node);
+       return (_get_irn_op(node) == op_Div);
+}
+
+static INLINE int
+_is_DivMod(const ir_node *node) {
+       assert(node);
+       return (_get_irn_op(node) == op_DivMod);
+}
+
+static INLINE int
+_is_Start(const ir_node *node) {
+  assert(node);
+  return (_get_irn_op(node) == op_Start);
+}
+
 static INLINE int
 _is_Const(const ir_node *node) {
   assert(node);
@@ -648,6 +720,48 @@ _is_Confirm(const ir_node *node) {
   return (_get_irn_op(node) == op_Confirm);
 }
 
+static INLINE int
+_is_Pin(const ir_node *node) {
+  assert(node);
+  return (_get_irn_op(node) == op_Pin);
+}
+
+static INLINE int
+_is_SymConst(const ir_node *node) {
+  assert(node);
+  return (_get_irn_op(node) == op_SymConst);
+}
+
+static INLINE int
+_is_Cond(const ir_node *node) {
+  assert(node);
+  return (_get_irn_op(node) == op_Cond);
+}
+
+static INLINE int
+_is_Cmp(const ir_node *node) {
+  assert(node);
+  return (_get_irn_op(node) == op_Cmp);
+}
+
+static INLINE int
+_is_Alloc(const ir_node *node) {
+  assert(node);
+  return (_get_irn_op(node) == op_Alloc);
+}
+
+static INLINE int
+_is_Jmp(const ir_node *node) {
+  assert(node);
+  return (_get_irn_op(node) == op_Jmp);
+}
+
+static INLINE int
+_is_Raise(const ir_node *node) {
+  assert(node);
+  return (_get_irn_op(node) == op_Raise);
+}
+
 static INLINE int
 _is_no_Block(const ir_node *node) {
   assert(node && _is_ir_node(node));
@@ -661,7 +775,7 @@ _is_Block(const ir_node *node) {
 }
 
 static INLINE int
-_get_Block_n_cfgpreds(ir_node *node) {
+_get_Block_n_cfgpreds(const ir_node *node) {
   assert(_is_Block(node));
   return _get_irn_arity(node);
 }
@@ -736,8 +850,8 @@ _is_Block_dead(const ir_node *block) {
   }
 }
 
-static INLINE tarval *_get_Const_tarval (ir_node *node) {
-  assert (_get_irn_op(node) == op_Const);
+static INLINE tarval *_get_Const_tarval(ir_node *node) {
+  assert(_get_irn_op(node) == op_Const);
   return node->attr.con.tv;
 }
 
@@ -783,6 +897,10 @@ static INLINE int _is_irn_keep(const ir_node *node) {
   return is_op_keep(_get_irn_op(node));
 }
 
+static INLINE int _is_irn_start_block_placed(const ir_node *node) {
+  return is_op_start_block_placed(_get_irn_op(node));
+}
+
 static INLINE int _is_irn_machine_op(const ir_node *node) {
   return is_op_machine(_get_irn_op(node));
 }
@@ -796,12 +914,12 @@ static INLINE int _is_irn_machine_user(const ir_node *node, unsigned n) {
 }
 
 static INLINE cond_jmp_predicate _get_Cond_jmp_pred(ir_node *node) {
-  assert (_get_irn_op(node) == op_Cond);
+  assert(_get_irn_op(node) == op_Cond);
   return node->attr.cond.pred;
 }
 
 static INLINE void _set_Cond_jmp_pred(ir_node *node, cond_jmp_predicate pred) {
-  assert (_get_irn_op(node) == op_Cond);
+  assert(_get_irn_op(node) == op_Cond);
   node->attr.cond.pred = pred;
 }
 
@@ -847,7 +965,19 @@ static INLINE unsigned _get_irn_idx(const ir_node *node) {
 #define is_Load(node)                         _is_Load(node)
 #define is_Sync(node)                         _is_Sync(node)
 #define is_Confirm(node)                      _is_Confirm(node)
+#define is_Pin(node)                          _is_Pin(node)
+#define is_SymConst(node)                     _is_SymConst(node)
+#define is_Cond(node)                         _is_Cond(node)
+#define is_Cmp(node)                          _is_Cmp(node)
+#define is_Alloc(node)                        _is_Alloc(node)
+#define is_Jmp(node)                          _is_Jmp(node)
+#define is_Raise(node)                        _is_Raise(node)
 #define is_Bad(node)                          _is_Bad(node)
+#define is_NoMem(node)                        _is_NoMem(node)
+#define is_Start(node)                        _is_Start(node)
+#define is_Mod(node)                          _is_Mod(node)
+#define is_Div(node)                          _is_Div(node)
+#define is_DivMod(node)                       _is_DivMod(node)
 #define is_no_Block(node)                     _is_no_Block(node)
 #define is_Block(node)                        _is_Block(node)
 #define get_Block_n_cfgpreds(node)            _get_Block_n_cfgpreds(node)
@@ -868,6 +998,7 @@ static INLINE unsigned _get_irn_idx(const ir_node *node) {
 #define is_irn_constlike(node)                _is_irn_constlike(node)
 #define is_irn_always_opt(node)               _is_irn_always_opt(node)
 #define is_irn_keep(node)                     _is_irn_keep(node)
+#define is_irn_start_block_placed(node)       _is_irn_start_block_placed(node)
 #define is_irn_machine_op(node)               _is_irn_machine_op(node)
 #define is_irn_machine_operand(node)          _is_irn_machine_operand(node)
 #define is_irn_machine_user(node, n)          _is_irn_machine_user(node, n)
@@ -876,4 +1007,11 @@ static INLINE unsigned _get_irn_idx(const ir_node *node) {
 #define get_Psi_n_conds(node)                 _get_Psi_n_conds(node)
 #define get_irn_idx(node)                     _get_irn_idx(node)
 
-# endif /* _IRNODE_T_H_ */
+#define get_irn_deps(node)                    _get_irn_deps(node)
+#define set_irn_dep(node, pos, dep)           _set_irn_dep(node, pos, dep)
+#define get_irn_dep(node, pos)                _get_irn_dep(node, pos)
+
+#define get_irn_ins_or_deps(node)             _get_irn_ins_or_deps(node)
+#define get_irn_in_or_dep(node, pos)          _get_irn_in_or_dep(node, pos)
+
+#endif /* _IRNODE_T_H_ */