Add irn_visited_else_mark(), which combines irn_visited() and mark_irn_visited().
[libfirm] / ir / ana / callgraph.c
index 372a978..dac267e 100644 (file)
 
 #include "irgwalk.h"
 
-static unsigned long master_cg_visited = 0;
-static INLINE int cg_irg_visited     (ir_graph *n);
+static ir_visited_t master_cg_visited = 0;
+static INLINE int cg_irg_visited      (ir_graph *n);
 static INLINE void mark_cg_irg_visited(ir_graph *n);
-static INLINE void set_cg_irg_visited (ir_graph *n, unsigned long i);
+static INLINE void set_cg_irg_visited (ir_graph *n, ir_visited_t i);
 
 /** Returns the callgraph state of the program representation. */
 irp_callgraph_state get_irp_callgraph_state(void) {
@@ -386,32 +386,23 @@ static void do_walk(ir_graph *irg, callgraph_walk_func *pre, callgraph_walk_func
                post(irg, env);
 }
 
-void callgraph_walk(ir_entity **roots, unsigned n_roots,
-               callgraph_walk_func *pre, callgraph_walk_func *post, void *env) {
-       //int i, n_irgs = get_irp_n_irgs();
-       unsigned r;
+void callgraph_walk(callgraph_walk_func *pre, callgraph_walk_func *post, void *env) {
+       int i, n_irgs = get_irp_n_irgs();
        ++master_cg_visited;
 
-       for (r = 0; r < n_roots; ++r) {
-               ir_graph *irg = get_entity_irg(roots[r]);
-               if (irg == NULL)
-                       continue;
-
-               do_walk(irg, pre, post, env);
-       }
-
-#if 0
-       for (i = 0; i < n_irgs; i++) {
+       /* roots are methods which have no callers in the current program */
+       for (i = 0; i < n_irgs; ++i) {
                ir_graph *irg = get_irp_irg(i);
-               if (!cg_irg_visited(irg) && get_irg_n_callers(irg) == 0)
+
+               if (get_irg_n_callers(irg) == 0)
                        do_walk(irg, pre, post, env);
        }
+
+       /* in case of unreachable call loops we haven't visited some irgs yet */
        for (i = 0; i < n_irgs; i++) {
                ir_graph *irg = get_irp_irg(i);
-               if (!cg_irg_visited(irg))
-                       do_walk(irg, pre, post, env);
+               do_walk(irg, pre, post, env);
        }
-#endif
 }
 
 /* ----------------------------------------------------------------------------------- */
@@ -465,14 +456,14 @@ static INLINE void mark_cg_irg_visited(ir_graph *irg) {
 /**
  * Set a graphs visited flag to i.
  */
-static INLINE void set_cg_irg_visited(ir_graph *irg, unsigned long i) {
+static INLINE void set_cg_irg_visited(ir_graph *irg, ir_visited_t i) {
        irg->self_visited = i;
 }
 
 /**
  * Returns the visited flag of a graph.
  */
-static INLINE unsigned long get_cg_irg_visited(ir_graph *irg) {
+static INLINE ir_visited_t get_cg_irg_visited(ir_graph *irg) {
        return irg->self_visited;
 }
 
@@ -1018,7 +1009,7 @@ static void reset_isbe(void) {
 static void compute_loop_depth(ir_graph *irg, void *env) {
        int current_nesting = *(int *) env;
        int old_nesting = irg->callgraph_loop_depth;
-       unsigned long old_visited = get_cg_irg_visited(irg);
+       ir_visited_t old_visited = get_cg_irg_visited(irg);
        int i, n_callees;
 
        //return ;