ir_node *be_duplicate_node(ir_node *node) { ir_node *block = be_transform_node(get_nodes_block(node)); ir_graph *irg = env.irg; dbg_info *dbgi = get_irn_dbg_info(node); ir_mode *mode = get_irn_mode(node); ir_op *op = get_irn_op(node); ir_node *new_node; int arity = get_irn_arity(node); if (op->opar == oparity_dynamic) { new_node = new_ir_node(dbgi, irg, block, op, mode, -1, NULL); for (int i = 0; i < arity; ++i) { ir_node *in = get_irn_n(node, i); in = be_transform_node(in); add_irn_n(new_node, in); } } else { ir_node **ins = ALLOCAN(ir_node*, arity); for (int i = 0; i < arity; ++i) { ir_node *in = get_irn_n(node, i); ins[i] = be_transform_node(in); } new_node = new_ir_node(dbgi, irg, block, op, mode, arity, ins); } copy_node_attr(irg, node, new_node); be_duplicate_deps(node, new_node); new_node->node_nr = node->node_nr; return new_node; }
ir_node *be_duplicate_node(ir_node *const node) { int const arity = get_irn_arity(node); ir_node **const ins = ALLOCAN(ir_node*, arity); foreach_irn_in(node, i, in) { ins[i] = be_transform_node(in); }
ir_node *be_transform_phi(ir_node *node, const arch_register_req_t *req) { ir_node *block = be_transform_node(get_nodes_block(node)); ir_graph *irg = get_Block_irg(block); dbg_info *dbgi = get_irn_dbg_info(node); /* phi nodes allow loops, so we use the old arguments for now * and fix this later */ ir_node **ins = get_irn_in(node)+1; int arity = get_irn_arity(node); ir_mode *mode = req->cls != NULL ? req->cls->mode : get_irn_mode(node); ir_node *phi = new_ir_node(dbgi, irg, block, op_Phi, mode, arity, ins); copy_node_attr(irg, node, phi); be_duplicate_deps(node, phi); backend_info_t *info = be_get_info(phi); struct obstack *obst = be_get_be_obst(irg); info->in_reqs = OALLOCN(obst, const arch_register_req_t*, arity); for (int i = 0; i < arity; ++i) { info->in_reqs[i] = req; } arch_set_irn_register_req_out(phi, 0, req); be_enqueue_preds(node); return phi; }
void be_duplicate_deps(ir_node *old_node, ir_node *new_node) { int deps = get_irn_deps(old_node); for (int i = 0; i < deps; ++i) { ir_node *dep = get_irn_dep(old_node, i); ir_node *new_dep = be_transform_node(dep); add_irn_dep(new_node, new_dep); } }
static ir_node *transform_Proj_ASM(ir_node *const node) { ir_node *const pred = get_Proj_pred(node); ir_node *const new_pred = be_transform_node(pred); ir_mode *const mode = get_irn_mode(node); unsigned const num = mode == mode_M ? arch_get_irn_n_outs(new_pred) - 1 : get_Proj_num(node); return be_new_Proj(new_pred, num); }
static ir_node *transform_end(ir_node *node) { /* end has to be duplicated manually because we need a dynamic in array */ ir_graph *irg = get_irn_irg(node); dbg_info *dbgi = get_irn_dbg_info(node); ir_node *block = be_transform_node(get_nodes_block(node)); ir_node *new_end = new_ir_node(dbgi, irg, block, op_End, mode_X, -1, NULL); copy_node_attr(irg, node, new_end); be_duplicate_deps(node, new_end); set_irg_end(irg, new_end); /* do not transform predecessors yet to keep the pre-transform * phase from visiting all the graph */ int arity = get_irn_arity(node); for (int i = 0; i < arity; ++i) { ir_node *in = get_irn_n(node, i); add_End_keepalive(new_end, in); } be_enqueue_preds(node); return new_end; }