Simplify control flow.
[libfirm] / ir / common / irtools.c
index 3b3b490..5a10a8a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
+ * Copyright (C) 1995-2011 University of Karlsruhe.  All right reserved.
  *
  * This file is part of libFirm.
  *
@@ -21,7 +21,6 @@
  * @file
  * @brief     Some often needed tool-functions
  * @author    Michael Beck
- * @version   $Id$
  */
 #include "config.h"
 
@@ -51,6 +50,23 @@ void firm_clear_node_and_phi_links(ir_node *n, void *env)
                set_Phi_next(n, NULL);
 }
 
+void firm_clear_block_phis(ir_node *node, void *env)
+{
+       (void) env;
+       if (is_Block(node)) {
+               set_Block_phis(node, NULL);
+       } else if (is_Phi(node)) {
+               set_Phi_next(node, NULL);
+       }
+}
+
+void firm_collect_block_phis(ir_node *node, void *env)
+{
+       (void) env;
+       if (is_Phi(node))
+               add_Block_phi(get_nodes_block(node), node);
+}
+
 void copy_irn_to_irg(ir_node *n, ir_graph *irg)
 {
        ir_op *op = get_irn_op(n);
@@ -58,9 +74,7 @@ void copy_irn_to_irg(ir_node *n, ir_graph *irg)
        ir_node *nn = NULL;
 
        /* do not copy standard nodes */
-       if (op == op_Bad)
-               nn = get_irg_bad(irg);
-       else if (op == op_NoMem)
+       if (op == op_NoMem)
                n = get_irg_no_mem(irg);
        else if (op == op_Block) {
                old_irg = get_irn_irg(n);
@@ -166,6 +180,7 @@ void irn_rewire_inputs(ir_node *node)
 {
        ir_node *new_node;
        int      arity;
+       int      n_deps;
        int      i;
 
        new_node = get_new_node(node);
@@ -183,15 +198,20 @@ void irn_rewire_inputs(ir_node *node)
                set_irn_n(new_node, i, new_in);
        }
 
+       n_deps = get_irn_deps(new_node);
+       for (i = 0; i < n_deps; ++i) {
+               ir_node *dep     = get_irn_dep(node, i);
+               ir_node *new_dep = get_new_node(dep);
+               set_irn_dep(new_node, i, new_dep);
+       }
+
        /* Now the new node is complete. We can add it to the hash table for CSE. */
        add_identities(new_node);
 }
 
 void firm_pset_dump(pset *set)
 {
-       void *obj;
-
-       foreach_pset(set, obj) {
+       foreach_pset(set, void, obj) {
                ir_fprintf(stderr, "%+F\n", obj);
        }
 }