ignore last scheduled node on reordering after a perm if it is not colorable
[libfirm] / ir / be / betranshlp.c
index 95602f8..b79d3fa 100644 (file)
@@ -123,16 +123,13 @@ ir_node *be_duplicate_node(ir_node *node)
                new_node = new_ir_node(dbgi, irg, block, op, mode, arity, ins);
        }
 
-       copy_node_attr(node, new_node);
+       copy_node_attr(irg, node, new_node);
        be_duplicate_deps(node, new_node);
 
        new_node->node_nr = node->node_nr;
        return new_node;
 }
 
-/**
- * Calls transformation function for given node and marks it visited.
- */
 ir_node *be_transform_node(ir_node *node)
 {
        ir_op   *op;
@@ -158,9 +155,6 @@ ir_node *be_transform_node(ir_node *node)
        return new_node;
 }
 
-/**
- * enqueue all inputs into the transform queue.
- */
 void be_enqueue_preds(ir_node *node)
 {
        int i, arity;
@@ -358,7 +352,7 @@ static ir_node *gen_Block(ir_node *node)
 
        block = new_ir_node(dbgi, irg, NULL, get_irn_op(node), get_irn_mode(node),
                            get_irn_arity(node), get_irn_in(node) + 1);
-       copy_node_attr(node, block);
+       copy_node_attr(irg, node, block);
        block->node_nr = node->node_nr;
 
        if (node == macroblock) {
@@ -385,7 +379,7 @@ static ir_node *gen_End(ir_node *node)
        ir_node  *new_end;
 
        new_end = new_ir_node(dbgi, irg, block, op_End, mode_X, -1, NULL);
-       copy_node_attr(node, new_end);
+       copy_node_attr(irg, node, new_end);
        be_duplicate_deps(node, new_end);
 
        set_irg_end(irg, new_end);
@@ -402,12 +396,12 @@ static ir_node *gen_End(ir_node *node)
        return new_end;
 }
 
-void be_transform_graph(be_irg_t *birg, arch_pretrans_nodes *func)
+void be_transform_graph(ir_graph *irg, arch_pretrans_nodes *func)
 {
-       ir_graph *irg = birg->irg;
        ir_graph *old_current_ir_graph = current_ir_graph;
        struct obstack *old_obst = NULL;
        struct obstack *new_obst = NULL;
+       be_irg_t       *birg     = be_birg_from_irg(irg);
 
        current_ir_graph = irg;
 
@@ -418,6 +412,11 @@ void be_transform_graph(be_irg_t *birg, arch_pretrans_nodes *func)
        irg->obst = new_obst;
        irg->last_node_idx = 0;
 
+       /* invalidate phase info as (at least vrp info) is used inside the
+        * equivalent/compute_value functions and might replace our newly
+        * created nodes with middleend nodes */
+       irg_invalidate_phases(irg);
+
        /* create new value table for CSE */
        del_identities(irg->value_table);
        irg->value_table = new_identities();