- add ir_graph to loop element, preventing the ugly casting
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Tue, 6 May 2008 21:23:28 +0000 (21:23 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Tue, 6 May 2008 21:23:28 +0000 (21:23 +0000)
[r19537]

include/libfirm/irloop.h
ir/ana/callgraph.c
ir/ana/irloop.c

index 969ff77..f448d83 100644 (file)
@@ -67,8 +67,9 @@ void clear_backedges(ir_node *n);
 /** Loop elements: loop nodes and ir nodes */
 typedef union {
        firm_kind *kind;    /**< is either k_ir_node or k_ir_loop */
-       ir_node *node;      /**< Pointer to an ir_node element */
-       ir_loop *son;       /**< Pointer to an ir_loop element */
+       ir_node  *node;     /**< Pointer to an ir_node element */
+       ir_loop  *son;      /**< Pointer to an ir_loop element */
+       ir_graph *irg;      /**< Pointer to an ir_graph element (only callgraph loop trees) */
 } loop_element;
 
 int      is_ir_loop(const void *thing);
index ffef4d0..e0a2431 100644 (file)
@@ -567,7 +567,7 @@ static INLINE void pop_scc_to_loop(ir_graph *irg) {
                m = pop();
                loop_node_cnt++;
                set_irg_dfn(m, loop_node_cnt);
-               add_loop_node(current_loop, (ir_node *)m);
+               add_loop_irg(current_loop, m);
                m->l = current_loop;
                //m->callgraph_loop_depth = current_loop->depth;
        } while(m != irg);
index f1774a4..27243cf 100644 (file)
@@ -51,7 +51,14 @@ void add_loop_node(ir_loop *loop, ir_node *n) {
        loop_element ln;
        ln.node = n;
        assert(loop && loop->kind == k_ir_loop);
-       assert(get_kind(n) == k_ir_node || get_kind(n) == k_ir_graph);  /* used in callgraph.c */
+       ARR_APP1(loop_element, loop->children, ln);
+       loop->n_nodes++;
+}
+
+void add_loop_irg(ir_loop *loop, ir_graph *irg) {
+       loop_element ln;
+       ln.irg = irg;
+       assert(loop && loop->kind == k_ir_loop);
        ARR_APP1(loop_element, loop->children, ln);
        loop->n_nodes++;
 }