renamed set_value/clear_value(): these names clash with the construction functions
[libfirm] / ir / be / betranshlp.c
index 3057264..4af94e0 100644 (file)
@@ -165,6 +165,7 @@ void be_enqueue_preds(ir_node *node) {
  */
 static void fix_loops(ir_node *node) {
        int i, arity;
+       int changed;
 
        assert(node_is_in_irgs_storage(env.irg, node));
 
@@ -173,6 +174,7 @@ static void fix_loops(ir_node *node) {
 
        mark_irn_visited(node);
 
+       changed = 0;
        if (! is_Block(node)) {
                ir_node *block     = get_nodes_block(node);
                ir_node *new_block = get_irn_link(block);
@@ -180,6 +182,7 @@ static void fix_loops(ir_node *node) {
                if (new_block != NULL) {
                        set_nodes_block(node, new_block);
                        block = new_block;
+                       changed = 1;
                }
 
                fix_loops(block);
@@ -193,10 +196,16 @@ static void fix_loops(ir_node *node) {
                if (nw != NULL && nw != in) {
                        set_irn_n(node, i, nw);
                        in = nw;
+                       changed = 1;
                }
 
                fix_loops(in);
        }
+       /* fix proj block */
+       if(is_Proj(node)) {
+               set_nodes_block(node, get_nodes_block(get_Proj_pred(node)));
+               changed = 1;
+       }
 
        arity = get_irn_deps(node);
        for (i = 0; i < arity; ++i) {
@@ -206,10 +215,15 @@ static void fix_loops(ir_node *node) {
                if (nw != NULL && nw != in) {
                        set_irn_dep(node, i, nw);
                        in = nw;
+                       changed = 1;
                }
 
                fix_loops(in);
        }
+
+       if(changed) {
+               identify_remember(current_ir_graph->value_table, node);
+       }
 }
 
 ir_node *be_pre_transform_node(ir_node *place) {
@@ -231,6 +245,15 @@ static void pre_transform_anchor(int anchor)
        set_irg_anchor(current_ir_graph, anchor, transformed);
 }
 
+static void kill_unused_anchor(int anchor)
+{
+       ir_node *old_anchor_node = get_irn_n(env.old_anchor, anchor);
+       ir_node *old_bad         = get_irn_n(env.old_anchor, anchor_bad);
+       if(old_anchor_node != NULL && get_irn_n_edges(old_anchor_node) <= 1) {
+               set_irn_n(env.old_anchor, anchor, old_bad);
+       }
+}
+
 /**
  * Transforms all nodes. Deletes the old obstack and creates a new one.
  */
@@ -270,6 +293,7 @@ static void transform_nodes(ir_graph *irg, arch_pretrans_nodes *pre_transform,
        pre_transform_anchor(anchor_start_block);
        pre_transform_anchor(anchor_start);
        pre_transform_anchor(anchor_frame);
+       kill_unused_anchor(anchor_tls);
 
        if (pre_transform)
                (*pre_transform)(cg);