- cleanup and simplify inlining code
[libfirm] / ir / ir / irgwalk.c
index 1f5ba6c..51bf3ec 100644 (file)
@@ -144,12 +144,11 @@ static void collect_irgs(ir_node * node, pset_new_t *irg_set)
  *
  * @return number of visited nodes
  */
-static unsigned
-irg_walk_2_pre(ir_node *node, irg_walk_func *pre, void * env)
+static unsigned irg_walk_2_pre(ir_node *node, irg_walk_func *pre, void *env)
 {
        int i;
        unsigned cnt = 1;
-       ir_graph *irg = current_ir_graph;
+       ir_graph *irg = get_irn_irg(node);
 
        set_irn_visited(node, irg->visited);
 
@@ -173,12 +172,11 @@ irg_walk_2_pre(ir_node *node, irg_walk_func *pre, void * env)
  *
  * @return number of visited nodes
  */
-static unsigned
-irg_walk_2_post(ir_node *node, irg_walk_func *post, void * env)
+static unsigned irg_walk_2_post(ir_node *node, irg_walk_func *post, void *env)
 {
        int i;
        unsigned cnt = 1;
-       ir_graph *irg = current_ir_graph;
+       ir_graph *irg = get_irn_irg(node);
 
        set_irn_visited(node, irg->visited);
 
@@ -203,12 +201,12 @@ irg_walk_2_post(ir_node *node, irg_walk_func *post, void * env)
  *
  * @return number of visited nodes
  */
-static unsigned
-irg_walk_2_both(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void * env)
+static unsigned irg_walk_2_both(ir_node *node, irg_walk_func *pre,
+                                irg_walk_func *post, void *env)
 {
        int i;
        unsigned cnt = 1;
-       ir_graph *irg = current_ir_graph;
+       ir_graph *irg = get_irn_irg(node);
 
        set_irn_visited(node, irg->visited);
 
@@ -238,21 +236,19 @@ irg_walk_2_both(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void * e
 unsigned irg_walk_2(ir_node *node, irg_walk_func *pre, irg_walk_func *post,
                     void *env)
 {
-       if (node->visited < current_ir_graph->visited) {
-               if      (!post) return irg_walk_2_pre (node, pre, env);
-               else if (!pre)  return irg_walk_2_post(node, post, env);
-               else            return irg_walk_2_both(node, pre, post, env);
-       }
-       return 0;
+       if (irn_visited(node))
+               return 0;
+
+       if      (!post) return irg_walk_2_pre (node, pre, env);
+       else if (!pre)  return irg_walk_2_post(node, post, env);
+       else            return irg_walk_2_both(node, pre, post, env);
 }
 
 /* a counter */
 static unsigned nodes_touched = 0;
 
-/*
- * generic graph walker
- */
-void irg_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void *env)
+void irg_walk_core(ir_node *node, irg_walk_func *pre, irg_walk_func *post,
+                   void *env)
 {
        assert(is_ir_node(node));
 
@@ -278,15 +274,22 @@ void irg_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void *env)
                pset_new_destroy(&irg_set);
        } else {
 #endif
-               ir_reserve_resources(current_ir_graph, IR_RESOURCE_IRN_VISITED);
-               inc_irg_visited(current_ir_graph);
                nodes_touched = irg_walk_2(node, pre, post, env);
-               ir_free_resources(current_ir_graph, IR_RESOURCE_IRN_VISITED);
 #ifdef INTERPROCEDURAL_VIEW
        }
 #endif
 }
 
+void irg_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post,
+              void *env)
+{
+       ir_reserve_resources(current_ir_graph, IR_RESOURCE_IRN_VISITED);
+       inc_irg_visited(current_ir_graph);
+       assert(current_ir_graph == get_irn_irg(node));
+       irg_walk_core(node, pre, post, env);
+       ir_free_resources(current_ir_graph, IR_RESOURCE_IRN_VISITED);
+}
+
 /*
  * walk over a graph
  */
@@ -322,12 +325,11 @@ void all_irg_walk(irg_walk_func *pre, irg_walk_func *post, void *env)
  *
  * @return number of visited nodes
  */
-static unsigned
-irg_walk_in_or_dep_2_pre(ir_node *node, irg_walk_func *pre, void *env)
+static unsigned irg_walk_in_or_dep_2_pre(ir_node *node, irg_walk_func *pre, void *env)
 {
        int i;
        unsigned cnt = 1;
-       ir_graph *irg = current_ir_graph;
+       ir_graph *irg = get_irn_irg(node);
 
        set_irn_visited(node, irg->visited);
 
@@ -351,12 +353,11 @@ irg_walk_in_or_dep_2_pre(ir_node *node, irg_walk_func *pre, void *env)
  *
  * @return number of visited nodes
  */
-static unsigned
-irg_walk_in_or_dep_2_post(ir_node *node, irg_walk_func *post, void *env)
+static unsigned irg_walk_in_or_dep_2_post(ir_node *node, irg_walk_func *post, void *env)
 {
        int i;
        unsigned cnt = 1;
-       ir_graph *irg = current_ir_graph;
+       ir_graph *irg = get_irn_irg(node);
 
        set_irn_visited(node, irg->visited);
 
@@ -381,12 +382,11 @@ irg_walk_in_or_dep_2_post(ir_node *node, irg_walk_func *post, void *env)
  *
  * @return number of visited nodes
  */
-static unsigned
-irg_walk_in_or_dep_2_both(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void *env)
+static unsigned irg_walk_in_or_dep_2_both(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void *env)
 {
        int i;
        unsigned cnt = 1;
-       ir_graph *irg = current_ir_graph;
+       ir_graph *irg = get_irn_irg(node);
 
        set_irn_visited(node, irg->visited);
 
@@ -413,15 +413,14 @@ irg_walk_in_or_dep_2_both(ir_node *node, irg_walk_func *pre, irg_walk_func *post
  *
  * @return number of visited nodes
  */
-static unsigned
-irg_walk_in_or_dep_2(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void *env)
+static unsigned irg_walk_in_or_dep_2(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void *env)
 {
-       if (node->visited < current_ir_graph->visited) {
-               if      (! post) return irg_walk_in_or_dep_2_pre (node, pre, env);
-               else if (! pre)  return irg_walk_in_or_dep_2_post(node, post, env);
-               else             return irg_walk_in_or_dep_2_both(node, pre, post, env);
-       }
-       return 0;
+       if (irn_visited(node))
+               return 0;
+
+       if      (! post) return irg_walk_in_or_dep_2_pre (node, pre, env);
+       else if (! pre)  return irg_walk_in_or_dep_2_post(node, post, env);
+       else             return irg_walk_in_or_dep_2_both(node, pre, post, env);
 }
 
 /*
@@ -461,8 +460,7 @@ void irg_walk_in_or_dep_graph(ir_graph *irg, irg_walk_func *pre, irg_walk_func *
  * Returns current_ir_graph and sets it to the irg of predecessor index
  * of node n.
  */
-static inline ir_graph *
-switch_irg(ir_node *n, int index)
+static inline ir_graph * switch_irg(ir_node *n, int index)
 {
        ir_graph *old_current = current_ir_graph;
 
@@ -482,8 +480,7 @@ switch_irg(ir_node *n, int index)
 }
 
 #ifdef INTERPROCEDURAL_VIEW
-static void
-cg_walk_2(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void * env)
+static void cg_walk_2(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void * env)
 {
        int i;
        ir_graph *rem = NULL;
@@ -582,30 +579,32 @@ static ir_node *get_cf_op(ir_node *n)
        return n;
 }
 
-static void irg_block_walk_2(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void *env)
+static void irg_block_walk_2(ir_node *node, irg_walk_func *pre,
+                             irg_walk_func *post, void *env)
 {
        int i;
 
-       if (!Block_block_visited(node)) {
-               mark_Block_block_visited(node);
+       if (Block_block_visited(node))
+               return;
+       mark_Block_block_visited(node);
 
-               if (pre) pre(node, env);
+       if (pre)
+               pre(node, env);
 
-               for(i = get_Block_n_cfgpreds(node) - 1; i >= 0; --i) {
-                       /* find the corresponding predecessor block. */
-                       ir_node *pred = get_cf_op(get_Block_cfgpred(node, i));
-                       pred = get_nodes_block(pred);
-                       if (get_irn_opcode(pred) == iro_Block) {
-                               /* recursion */
-                               irg_block_walk_2(pred, pre, post, env);
-                       }
-                       else {
-                               assert(get_irn_opcode(pred) == iro_Bad);
-                       }
+       for (i = get_Block_n_cfgpreds(node) - 1; i >= 0; --i) {
+               /* find the corresponding predecessor block. */
+               ir_node *pred = get_cf_op(get_Block_cfgpred(node, i));
+               pred = get_nodes_block(pred);
+               if (get_irn_opcode(pred) == iro_Block) {
+                       /* recursion */
+                       irg_block_walk_2(pred, pre, post, env);
+               } else {
+                       assert(get_irn_opcode(pred) == iro_Bad);
                }
-
-               if (post) post(node, env);
        }
+
+       if (post)
+               post(node, env);
 }
 
 
@@ -613,7 +612,7 @@ static void irg_block_walk_2(ir_node *node, irg_walk_func *pre, irg_walk_func *p
    flag, so that it can be interleaved with the other walker.         */
 void irg_block_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void *env)
 {
-       ir_graph *irg = current_ir_graph;
+       ir_graph *irg = get_irn_irg(node);
        ir_node *block, *pred;
        int i;
 
@@ -653,7 +652,8 @@ void irg_block_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void
  * walk over a graph block wise
  */
 void irg_block_walk_graph(ir_graph *irg, irg_walk_func *pre,
-              irg_walk_func *post, void *env) {
+                          irg_walk_func *post, void *env)
+{
        ir_graph * rem = current_ir_graph;
        current_ir_graph = irg;
        irg_block_walk(get_irg_end(irg), pre, post, env);
@@ -684,7 +684,7 @@ typedef struct walk_env {
 
 static void walk_initializer(ir_initializer_t *initializer, walk_env *env)
 {
-       switch(initializer->kind) {
+       switch (initializer->kind) {
     case IR_INITIALIZER_CONST:
        irg_walk(initializer->consti.value, env->pre, env->post, env->env);
         return;
@@ -694,7 +694,7 @@ static void walk_initializer(ir_initializer_t *initializer, walk_env *env)
 
     case IR_INITIALIZER_COMPOUND: {
         size_t i;
-        for(i = 0; i < initializer->compound.n_initializers; ++i) {
+        for (i = 0; i < initializer->compound.n_initializers; ++i) {
             ir_initializer_t *subinitializer
                 = initializer->compound.initializers[i];
             walk_initializer(subinitializer, env);