#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"
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 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.
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_no_Block(const ir_node *node) {
assert(node && _is_ir_node(node));
#define is_Confirm(node) _is_Confirm(node)
#define is_SymConst(node) _is_SymConst(node)
#define is_Cond(node) _is_Cond(node)
-#define is_Cmp(node) _is_Cmpd(node)
+#define is_Cmp(node) _is_Cmp(node)
+#define is_Alloc(node) _is_Alloc(node)
#define is_Bad(node) _is_Bad(node)
#define is_no_Block(node) _is_no_Block(node)
#define is_Block(node) _is_Block(node)
#define get_Psi_n_conds(node) _get_Psi_n_conds(node)
#define get_irn_idx(node) _get_irn_idx(node)
+#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_ */