irgmod: Pass the new inputs to turn_into_tuple() instead of initialising them with...
[libfirm] / ir / be / betranshlp.c
index 5428ee4..32f346e 100644 (file)
@@ -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);