*/
extern unsigned firm_add_node_size;
-/**
- * Sets the get_type operation for an ir_op_ops.
- *
- * @param code the opcode for the default operation
- * @param ops the operations initialized
- *
- * @return
- * The operations.
- */
-ir_op_ops *firm_set_default_get_type(ir_opcode code, ir_op_ops *ops);
-
/**
* Sets the get_type_attr operation for an ir_op_ops.
*
* @return
* The operations.
*/
-ir_op_ops *firm_set_default_get_type_attr(ir_opcode code, ir_op_ops *ops);
+ir_op_ops *firm_set_default_get_type_attr(unsigned code, ir_op_ops *ops);
/**
* Sets the get_entity_attr operation for an ir_op_ops.
* @return
* The operations.
*/
-ir_op_ops *firm_set_default_get_entity_attr(ir_opcode code, ir_op_ops *ops);
+ir_op_ops *firm_set_default_get_entity_attr(unsigned code, ir_op_ops *ops);
/**
* Returns an array with the predecessors of the Block. Depending on
* Returns the number of predecessors without the block predecessor.
* Intern version for libFirm.
*/
-static inline int _get_irn_intra_arity(const ir_node *node)
+static inline int _get_irn_arity(const ir_node *node)
{
- assert(node);
return ARR_LEN(node->in) - 1;
}
-/**
- * Returns the number of predecessors without the block predecessor.
- * Intern version for libFirm.
- */
-static inline int _get_irn_inter_arity(const ir_node *node)
-{
- assert(node);
- if (_get_irn_op(node) == op_Filter) {
- assert(node->attr.filter.in_cg);
- return ARR_LEN(node->attr.filter.in_cg) - 1;
- } else if (_get_irn_op(node) == op_Block && node->attr.block.in_cg) {
- return ARR_LEN(node->attr.block.in_cg) - 1;
- }
- return _get_irn_intra_arity(node);
-}
-
-#ifdef INTERPROCEDURAL_VIEW
-/**
- * Returns the number of predecessors without the block predecessor.
- * Intern version for libFirm.
- */
-extern int (*_get_irn_arity)(const ir_node *node);
-
-#else
-
-#define _get_irn_arity(n) _get_irn_intra_arity(n)
-#endif
-
/**
* Intern version for libFirm.
*/
-static inline ir_node *_get_irn_intra_n(const ir_node *node, int n)
+static inline ir_node *_get_irn_n(const ir_node *node, int n)
{
ir_node *nn;
- assert(node);
- assert(-1 <= n && n < _get_irn_intra_arity(node));
+ assert(-1 <= n && n < _get_irn_arity(node));
nn = node->in[n + 1];
if (nn == NULL) {
/* only block and Anchor inputs are allowed to be NULL */
- assert((node->op == op_Anchor || n == -1) && "NULL input of a node");
+ assert((is_Anchor(node) || n == -1) && "NULL input of a node");
return NULL;
}
if (nn->op != op_Id) return nn;
return (node->in[n + 1] = skip_Id(nn));
}
-/**
- * Intern version for libFirm.
- */
-static inline ir_node *_get_irn_inter_n(const ir_node *node, int n)
-{
- assert(node); assert(-1 <= n && n < _get_irn_inter_arity(node));
-
- /* handle Filter and Block specially */
- if (_get_irn_op(node) == op_Filter) {
- assert(node->attr.filter.in_cg);
- return (node->attr.filter.in_cg[n + 1] = skip_Id(node->attr.filter.in_cg[n + 1]));
- } else if (_get_irn_op(node) == op_Block && node->attr.block.in_cg) {
- return (node->attr.block.in_cg[n + 1] = skip_Id(node->attr.block.in_cg[n + 1]));
- }
-
- return _get_irn_intra_n(node, n);
-}
-
/**
* returns a hash value for a node
*/
return (unsigned) get_irn_idx(node);
}
-/**
- * Access to the predecessors of a node.
- * To iterate over the operands iterate from 0 to i < get_irn_arity(),
- * to iterate including the Block predecessor iterate from i = -1 to
- * i < get_irn_arity.
- * If it is a block, the entry -1 is NULL.
- * Intern version for libFirm.
- */
-#ifdef INTERPROCEDURAL_VIEW
-extern ir_node *(*_get_irn_n)(const ir_node *node, int n);
-#else
-#define _get_irn_n(n,i) _get_irn_intra_n(n,i)
-#endif
-
static inline int _get_irn_deps(const ir_node *node) {
return node->deps ? ARR_LEN(node->deps) : 0;
}
node->mode = mode;
}
+static inline int ir_has_irg_ref(const ir_node *node)
+{
+ return is_Block(node) || is_Bad(node) || is_Anchor(node);
+}
+
static inline ir_graph *_get_irn_irg(const ir_node *node)
{
/*
- * Do not use get_nodes_Block() here, because this
+ * Do not use get_nodes_block() here, because this
* will check the pinned state.
- * However even a 'wrong' block is always in the proper
- * irg.
+ * However even a 'wrong' block is always in the proper irg.
*/
if (! is_Block(node))
node = get_irn_n(node, -1);
- /* note that get_Block_irg() can handle Bad nodes */
- return get_Block_irg(node);
+ assert(ir_has_irg_ref(node));
+ return node->attr.irg.irg;
+}
+
+static inline ir_node *_get_nodes_block(const ir_node *node)
+{
+ assert(!is_Block(node));
+ return get_irn_n(node, -1);
}
/**
state = _get_op_pinned(_get_irn_op(node));
if (state >= op_pin_state_exc_pinned)
- return get_opt_fragile_ops() ? node->attr.except.pin_state : op_pin_state_pinned;
+ return node->attr.except.pin_state;
+
return state;
}
return (node->op->opar == oparity_binary);
}
-static inline int _is_Phi(const ir_node *node)
-{
- ir_op *op;
- assert(node);
-
- op = get_irn_op(node);
-#ifdef INTERPROCEDURAL_VIEW
- if (op == op_Filter) return get_interprocedural_view();
-#endif
- return (op == op_Phi);
-}
-
-static inline int _is_Proj(const ir_node *node)
-{
- ir_op *op;
- assert(node);
-
- op = _get_irn_op(node);
-#ifdef INTERPROCEDURAL_VIEW
- if (op == op_Filter) return !get_interprocedural_view();
-#endif
- return (op == op_Proj);
-}
-
static inline int _is_strictConv(const ir_node *node)
{
return _is_Conv(node) && get_Conv_strict(node);
return is_SymConst(node) && get_SymConst_kind(node) == symconst_addr_ent;
}
-static inline int _is_no_Block(const ir_node *node)
-{
- assert(node && _is_ir_node(node));
- return (_get_irn_op(node) != op_Block);
-}
-
static inline int _get_Block_n_cfgpreds(const ir_node *node)
{
assert(_is_Block(node));
static inline ir_visited_t _get_Block_block_visited(const ir_node *node)
{
- assert(node->op == op_Block);
+ assert(is_Block(node));
return node->attr.block.block_visited;
}
static inline void _set_Block_block_visited(ir_node *node, ir_visited_t visit)
{
- assert(node->op == op_Block);
+ assert(is_Block(node));
node->attr.block.block_visited = visit;
}
-/* For this current_ir_graph must be set. */
static inline void _mark_Block_block_visited(ir_node *node)
{
ir_graph *irg = get_Block_irg(node);
{
ir_op *op = _get_irn_op(block);
- if (op == op_Bad)
+ /* we can have Bad, Anchor and Block nodes as block input */
+ if (op == op_Bad) {
return 1;
- else {
+ } else if (op == op_Anchor) {
+ return 0;
+ } else {
assert(op == op_Block);
return block->attr.block.is_dead;
}
static inline ir_graph *_get_Block_irg(const ir_node *block)
{
- assert(is_Block(block) || is_Bad(block));
+ assert(is_Block(block));
return block->attr.irg.irg;
}
-static inline tarval *_get_Const_tarval(const ir_node *node) {
+static inline ir_tarval *_get_Const_tarval(const ir_node *node) {
assert(_get_irn_op(node) == op_Const);
return node->attr.con.tarval;
}
return is_op_forking(_get_irn_op(node));
}
-static inline ir_type *_get_irn_type(ir_node *node) {
- return _get_irn_op(node)->ops.get_type(node);
-}
-
static inline ir_type *_get_irn_type_attr(ir_node *node) {
return _get_irn_op(node)->ops.get_type_attr(node);
}
return pn_Start_T_args == get_Proj_proj(node) && is_Start(get_Proj_pred(node));
}
+static inline pn_Cmp _get_Proj_pn_cmp(const ir_node *node)
+{
+ assert(is_Cmp(get_Proj_pred(node)));
+ return (pn_Cmp)get_Proj_proj(node);
+}
+
/** initialize ir_node module */
void init_irnode(void);
/* this section MUST contain all inline functions */
#define is_ir_node(thing) _is_ir_node(thing)
-#define get_irn_intra_arity(node) _get_irn_intra_arity(node)
-#define get_irn_inter_arity(node) _get_irn_inter_arity(node)
#define get_irn_arity(node) _get_irn_arity(node)
-#define get_irn_intra_n(node, n) _get_irn_intra_n(node, n)
-#define get_irn_inter_n(node, n) _get_irn_inter_n(node, n)
#define get_irn_n(node, n) _get_irn_n(node, n)
#define get_irn_mode(node) _get_irn_mode(node)
#define set_irn_mode(node, mode) _set_irn_mode(node, mode)
#define get_irn_irg(node) _get_irn_irg(node)
+#define get_nodes_block(node) _get_nodes_block(node)
#define get_irn_op(node) _get_irn_op(node)
#define set_irn_op(node, op) _set_irn_op(node, op)
#define get_irn_opcode(node) _get_irn_opcode(node)
#define is_Phi(node) _is_Phi(node)
#define is_strictConv(node) _is_strictConv(node)
#define is_SymConst_addr_ent(node) _is_SymConst_addr_ent(node)
-#define is_no_Block(node) _is_no_Block(node)
#define get_Block_n_cfgpreds(node) _get_Block_n_cfgpreds(node)
#define get_Block_cfgpred(node, pos) _get_Block_cfgpred(node, pos)
#define get_Block_cfgpred_block(node, pos) _get_Block_cfgpred_block(node, pos)
#define is_arg_Proj(node) _is_arg_Proj(node)
+#define get_Proj_pn_cmp(node) _get_Proj_pn_cmp(node)
+
#endif