#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"
#include "irextbb_t.h"
-/** IR node attributes **/
+/** ir node attributes **/
/** Block attributes */
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
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 */
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 {
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 */
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
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. */
*/
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.
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;
}
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);
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));
}
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);
}
}
}
-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;
}
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));
}
}
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;
}
#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)
#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)
#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_ */