Remove keep-edge hacks for endless loop.
[libfirm] / ir / ir / rm_tuples.c
index 951a42a..ad4d6b1 100644 (file)
@@ -39,9 +39,9 @@
  */
 static void exchange_tuple_projs(ir_node *node, void *env)
 {
-       bool *changed = (bool*)env;
        ir_node *pred;
        int proj;
+       (void)env;
 
        if (!is_Proj(node)) return;
 
@@ -52,12 +52,23 @@ static void exchange_tuple_projs(ir_node *node, void *env)
 
        pred = get_Tuple_pred(pred, proj);
        exchange(node, pred);
-       *changed = true;
 }
 
-int remove_tuples(ir_graph *irg)
+void remove_tuples(ir_graph *irg)
 {
-       bool changed = 0;
-       irg_walk_graph(irg, exchange_tuple_projs, NULL, &changed);
-       return changed;
+       irg_walk_graph(irg, exchange_tuple_projs, NULL, NULL);
+
+       ir_node *end          = get_irg_end(irg);
+       int      n_keepalives = get_End_n_keepalives(end);
+       int      i;
+
+       for (i = n_keepalives - 1; i >= 0; --i) {
+               ir_node *irn = get_End_keepalive(end, i);
+
+               if (is_Tuple(irn)) {
+                       remove_End_keepalive(end, irn);
+               }
+       }
+
+       add_irg_properties(irg, IR_GRAPH_PROPERTY_NO_TUPLES);
 }