X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode.c;h=502c6330157232183f6ab7708b7772da6f6e13ea;hb=c2de0a9d9eb3e3d6ed3ec7e9141570199b286a93;hp=62bce90e085afc84741697c24b92f3e811f85ee9;hpb=0cef5937cbb4edb2c36356087a7c049bf10e2db2;p=libfirm diff --git a/ir/ir/irnode.c b/ir/ir/irnode.c index 62bce90e0..502c63301 100644 --- a/ir/ir/irnode.c +++ b/ir/ir/irnode.c @@ -159,16 +159,16 @@ new_ir_node (dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mo #if FIRM_EDGES_INPLACE { - int i, n; - int not_a_block = is_no_Block(res); + int i; + int is_bl = is_Block(res); INIT_LIST_HEAD(&res->edge_info.outs_head); - if(!not_a_block) + if(is_bl) INIT_LIST_HEAD(&res->attr.block.succ_head); - for (i = 0, n = arity + not_a_block; i < n; ++i) - edges_notify_edge(res, i - not_a_block, res->in[i], NULL, irg); + for (i = is_bl; i <= arity; ++i) + edges_notify_edge(res, i - 1, res->in[i], NULL, irg); } #endif @@ -631,12 +631,12 @@ get_Block_cfgpred_arr (ir_node *node) int (get_Block_n_cfgpreds)(ir_node *node) { - return get_Block_n_cfgpreds(node); + return _get_Block_n_cfgpreds(node); } ir_node * (get_Block_cfgpred)(ir_node *node, int pos) { - return get_Block_cfgpred(node, pos); + return _get_Block_cfgpred(node, pos); } void @@ -749,22 +749,19 @@ int (is_Block_dead)(const ir_node *block) { } ir_extblk *get_Block_extbb(const ir_node *block) { + ir_extblk *res; assert(is_Block(block)); - return block->attr.block.extblk; + res = block->attr.block.extblk; + assert(res == NULL || is_ir_extbb(res)); + return res; } void set_Block_extbb(ir_node *block, ir_extblk *extblk) { assert(is_Block(block)); + assert(extblk == NULL || is_ir_extbb(extblk)); block->attr.block.extblk = extblk; } -void -set_Start_irg(ir_node *node, ir_graph *irg) { - assert(node->op == op_Start); - assert(is_ir_graph(irg)); - assert(0 && " Why set irg? -- use set_irn_irg"); -} - int get_End_n_keepalives(ir_node *end) { assert (end->op == op_End); @@ -1950,30 +1947,105 @@ ir_node *get_Filter_cg_pred(ir_node *node, int pos) { /* Mux support */ ir_node *get_Mux_sel (ir_node *node) { + if (node->op == op_Psi) { + assert(get_irn_arity(node) == 3); + return get_Psi_cond(node, 0); + } assert(node->op == op_Mux); return node->in[1]; } void set_Mux_sel (ir_node *node, ir_node *sel) { - assert(node->op == op_Mux); - node->in[1] = sel; + if (node->op == op_Psi) { + assert(get_irn_arity(node) == 3); + set_Psi_cond(node, 0, sel); + } + else { + assert(node->op == op_Mux); + node->in[1] = sel; + } } ir_node *get_Mux_false (ir_node *node) { + if (node->op == op_Psi) { + assert(get_irn_arity(node) == 3); + return get_Psi_default(node); + } assert(node->op == op_Mux); return node->in[2]; } void set_Mux_false (ir_node *node, ir_node *ir_false) { - assert(node->op == op_Mux); - node->in[2] = ir_false; + if (node->op == op_Psi) { + assert(get_irn_arity(node) == 3); + set_Psi_default(node, ir_false); + } + else { + assert(node->op == op_Mux); + node->in[2] = ir_false; + } } ir_node *get_Mux_true (ir_node *node) { + if (node->op == op_Psi) { + assert(get_irn_arity(node) == 3); + return get_Psi_val(node, 0); + } assert(node->op == op_Mux); return node->in[3]; } void set_Mux_true (ir_node *node, ir_node *ir_true) { - assert(node->op == op_Mux); - node->in[3] = ir_true; + if (node->op == op_Psi) { + assert(get_irn_arity(node) == 3); + set_Psi_val(node, 0, ir_true); + } + else { + assert(node->op == op_Mux); + node->in[3] = ir_true; + } +} + +/* Psi support */ +ir_node *get_Psi_cond (ir_node *node, int pos) { + int num_conds = get_Psi_n_conds(node); + assert(node->op == op_Psi); + assert(pos < num_conds); + return node->in[1 + 2 * pos]; +} + +void set_Psi_cond (ir_node *node, int pos, ir_node *cond) { + int num_conds = get_Psi_n_conds(node); + assert(node->op == op_Psi); + assert(pos < num_conds); + node->in[1 + 2 * pos] = cond; +} + +ir_node *get_Psi_val (ir_node *node, int pos) { + int num_vals = get_Psi_n_conds(node); + assert(node->op == op_Psi); + assert(pos < num_vals); + return node->in[1 + 2 * pos + 1]; +} + +void set_Psi_val (ir_node *node, int pos, ir_node *val) { + int num_vals = get_Psi_n_conds(node); + assert(node->op == op_Psi); + assert(pos < num_vals); + node->in[1 + 2 * pos + 1] = val; +} + +ir_node *get_Psi_default(ir_node *node) { + int def_pos = get_irn_arity(node); + assert(node->op == op_Psi); + return node->in[def_pos]; +} + +void set_Psi_default(ir_node *node, ir_node *val) { + int def_pos = get_irn_arity(node); + assert(node->op == op_Psi); + node->in[def_pos] = node; +} + +int (get_Psi_n_conds)(ir_node *node) { + return _get_Psi_n_conds(node); } /* CopyB support */ @@ -2338,6 +2410,12 @@ int return _is_Sel(node); } +/* returns true if node is a Mux node or a Psi with only one condition. */ +int +(is_Mux)(const ir_node *node) { + return _is_Mux(node); +} + int is_Proj (const ir_node *node) { assert(node);