X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbetranshlp.c;h=32f346ed2bb2dd6d8528b343ecac53dac2aaf62e;hb=b9a1bfdbce56c76bd4d5ff772963628523ecfc41;hp=5428ee441aeb20a9cfbee06e4e8ba8dde0d3b0eb;hpb=7f34faa1fcd5a4547f67ffb41c597921ea1d2d2f;p=libfirm diff --git a/ir/be/betranshlp.c b/ir/be/betranshlp.c index 5428ee441..32f346ed2 100644 --- a/ir/be/betranshlp.c +++ b/ir/be/betranshlp.c @@ -87,6 +87,34 @@ void be_duplicate_deps(ir_node *old_node, ir_node *new_node) } } +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_set_transform_function(ir_op *op, be_transform_func func) { /* shouldn't be assigned twice (except for exchanging the default @@ -186,9 +214,6 @@ ir_node *be_transform_node(ir_node *node) DEBUG_ONLY(be_set_transformed_node(node, NULL);) ir_op *op = get_irn_op(node); - if (op->ops.generic == NULL) { - panic("No transform function registered for node %+F.", node); - } be_transform_func *transform = (be_transform_func *)op->ops.generic; new_node = transform(node); @@ -354,10 +379,8 @@ void be_transform_graph(ir_graph *irg, arch_pretrans_nodes *func) current_ir_graph = irg; /* create a new obstack */ - struct obstack *old_obst = irg->obst; - struct obstack *new_obst = XMALLOC(struct obstack); - obstack_init(new_obst); - irg->obst = new_obst; + struct obstack old_obst = irg->obst; + obstack_init(&irg->obst); irg->last_node_idx = 0; free_vrp_data(irg); @@ -369,8 +392,7 @@ void be_transform_graph(ir_graph *irg, arch_pretrans_nodes *func) transform_nodes(irg, func); /* free the old obstack */ - obstack_free(old_obst, 0); - xfree(old_obst); + obstack_free(&old_obst, 0); /* restore state */ current_ir_graph = old_current_ir_graph; @@ -417,7 +439,6 @@ static bool and_upper_bits_clean(const ir_node *node, ir_mode *mode) static bool shr_upper_bits_clean(const ir_node *node, ir_mode *mode) { if (mode_is_signed(mode)) { - /* TODO */ return false; } else { const ir_node *right = get_Shr_right(node);