X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode.c;h=8f445b3521d149fdcbae0d9da817f1ea19b37b78;hb=8f355cb9b3d20c10f71d1b1e17cbf59a51ced83b;hp=ddcfec18228411ad4767ff38c563af4701f73cec;hpb=1ce363f80e6a204d4011f85813362d9bd1d0e7e4;p=libfirm diff --git a/ir/ir/irnode.c b/ir/ir/irnode.c index ddcfec182..8f445b352 100644 --- a/ir/ir/irnode.c +++ b/ir/ir/irnode.c @@ -41,6 +41,7 @@ #include "irprog_t.h" #include "iredgekinds.h" #include "iredges_t.h" +#include "ircons.h" #include "irhooks.h" #include "irtools.h" @@ -227,40 +228,41 @@ get_irn_in(const ir_node *node) { void set_irn_in(ir_node *node, int arity, ir_node **in) { int i; - ir_node *** arr; + ir_node *** pOld_in; ir_graph *irg = current_ir_graph; assert(node); if (get_interprocedural_view()) { /* handle Filter and Block specially */ - if (get_irn_opcode(node) == iro_Filter) { + ir_opcode code = get_irn_opcode(node); + if (code == iro_Filter) { assert(node->attr.filter.in_cg); - arr = &node->attr.filter.in_cg; - } else if (get_irn_opcode(node) == iro_Block && node->attr.block.in_cg) { - arr = &node->attr.block.in_cg; + pOld_in = &node->attr.filter.in_cg; + } else if (code == iro_Block && node->attr.block.in_cg) { + pOld_in = &node->attr.block.in_cg; } else { - arr = &node->in; + pOld_in = &node->in; } } else { - arr = &node->in; + pOld_in = &node->in; } for (i = 0; i < arity; i++) { - if (i < ARR_LEN(*arr)-1) - edges_notify_edge(node, i, in[i], (*arr)[i+1], irg); + if (i < ARR_LEN(*pOld_in)-1) + edges_notify_edge(node, i, in[i], (*pOld_in)[i+1], irg); else - edges_notify_edge(node, i, in[i], NULL, irg); + edges_notify_edge(node, i, in[i], NULL, irg); } - for(;i < ARR_LEN(*arr)-1; i++) { - edges_notify_edge(node, i, NULL, (*arr)[i+1], irg); + for (;i < ARR_LEN(*pOld_in)-1; i++) { + edges_notify_edge(node, i, NULL, (*pOld_in)[i+1], irg); } - if (arity != ARR_LEN(*arr) - 1) { - ir_node * block = (*arr)[0]; - *arr = NEW_ARR_D(ir_node *, irg->obst, arity + 1); - (*arr)[0] = block; + if (arity != ARR_LEN(*pOld_in) - 1) { + ir_node * block = (*pOld_in)[0]; + *pOld_in = NEW_ARR_D(ir_node *, irg->obst, arity + 1); + (*pOld_in)[0] = block; } fix_backedges(irg->obst, node); - memcpy((*arr) + 1, in, sizeof(ir_node *) * arity); + memcpy((*pOld_in) + 1, in, sizeof(ir_node *) * arity); } ir_node * @@ -877,6 +879,17 @@ ir_node *get_Block_MacroBlock(const ir_node *block) { return mbh; } +/* returns the macro block header of a node. */ +ir_node *get_irn_MacroBlock(const ir_node *n) { + if (! is_Block(n)) { + n = get_nodes_block(n); + /* if the Block is Bad, do NOT try to get it's MB, it will fail. */ + if (is_Bad(n)) + return (ir_node *)n; + } + return get_Block_MacroBlock(n); +} + /* returns the graph of a Block. */ ir_graph *get_Block_irg(const ir_node *block) { assert(is_Block(block)); @@ -1286,6 +1299,10 @@ get_Sel_entity(const ir_node *node) { return node->attr.sel.ent; } +ir_entity *_get_Sel_entity(ir_node *node) { + return get_Sel_entity(node); +} + void set_Sel_entity(ir_node *node, ir_entity *ent) { assert(node->op == op_Sel); @@ -2539,9 +2556,10 @@ ir_node *skip_Confirm(ir_node *node) { } /* skip all high-level ops */ -ir_node *skip_HighLevel(ir_node *node) { - if (is_op_highlevel(get_irn_op(node))) - return get_irn_n(node, 0); +ir_node *skip_HighLevel_ops(ir_node *node) { + while (is_op_highlevel(get_irn_op(node))) { + node = get_irn_n(node, 0); + } return node; } @@ -2692,6 +2710,11 @@ int return _is_Tuple(node); } +int +(is_Bound)(const ir_node *node) { + return _is_Bound(node); +} + int (is_Start)(const ir_node *node) { return _is_Start(node); @@ -3058,7 +3081,7 @@ static ir_entity *get_Null_ent(ir_node *n) { ir_op_ops *firm_set_default_get_entity_attr(ir_opcode code, ir_op_ops *ops) { switch (code) { case iro_SymConst: ops->get_entity_attr = get_SymConst_attr_entity; break; - case iro_Sel: ops->get_entity_attr = get_Sel_entity; break; + case iro_Sel: ops->get_entity_attr = _get_Sel_entity; break; default: /* not allowed to be NULL */ if (! ops->get_entity_attr)