irgmod: Pass the new inputs to turn_into_tuple() instead of initialising them with...
[libfirm] / ir / ana / irscc.c
index 7295ebe..e97911d 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.
  *
@@ -25,7 +25,6 @@
  *              Chapter 5.2.1.2.
  * @author   Goetz Lindenmaier
  * @date     7.2002
- * @version  $Id$
  */
 #include "config.h"
 
 #include "irdump.h"
 #include "array.h"
 #include "pmap.h"
-
-/* A variant of the loop tree that avoids loops without head.
-   This reduces the depth of the loop tree. */
-#define NO_LOOPS_WITHOUT_HEAD 1
+#include "ircons.h"
 
 /** The outermost graph the scc is computed for. */
 static ir_graph *outermost_ir_graph;
@@ -58,16 +54,6 @@ static int loop_node_cnt = 0;
 /** Counter to generate depth first numbering of visited nodes. */
 static int current_dfn = 1;
 
-static int max_loop_depth = 0;
-
-void link_to_reg_end(ir_node *n, void *env);
-void set_projx_link(ir_node *cb_projx, ir_node *end_projx);
-ir_node *get_projx_link(ir_node *cb_projx);
-
-/**********************************************************************/
-/* Node attributes                                                   **/
-/**********************************************************************/
-
 /**********************************************************************/
 /* Node attributes needed for the construction.                      **/
 /**********************************************************************/
@@ -76,12 +62,6 @@ typedef struct scc_info {
        int in_stack;          /**< Marks whether node is on the stack. */
        int dfn;               /**< Depth first search number. */
        int uplink;            /**< dfn number of ancestor. */
-       /*  ir_loop *loop;         *//* Refers to the containing loop. */
-       /*
-           struct section *section;
-           xset def;
-           xset use;
-       */
 } scc_info;
 
 /**
@@ -97,7 +77,7 @@ static inline scc_info *new_scc_info(struct obstack *obst)
  */
 static inline void mark_irn_in_stack(ir_node *n)
 {
-       scc_info *scc = get_irn_link(n);
+       scc_info *scc = (scc_info*) get_irn_link(n);
        assert(scc);
        scc->in_stack = 1;
 }
@@ -107,7 +87,7 @@ static inline void mark_irn_in_stack(ir_node *n)
 */
 static inline void mark_irn_not_in_stack(ir_node *n)
 {
-       scc_info *scc = get_irn_link(n);
+       scc_info *scc = (scc_info*) get_irn_link(n);
        assert(scc);
        scc->in_stack = 0;
 }
@@ -117,7 +97,7 @@ static inline void mark_irn_not_in_stack(ir_node *n)
  */
 static inline int irn_is_in_stack(ir_node *n)
 {
-       scc_info *scc = get_irn_link(n);
+       scc_info *scc = (scc_info*) get_irn_link(n);
        assert(scc);
        return scc->in_stack;
 }
@@ -127,7 +107,7 @@ static inline int irn_is_in_stack(ir_node *n)
  */
 static inline void set_irn_uplink(ir_node *n, int uplink)
 {
-       scc_info *scc = get_irn_link(n);
+       scc_info *scc = (scc_info*) get_irn_link(n);
        assert(scc);
        scc->uplink = uplink;
 }
@@ -137,7 +117,7 @@ static inline void set_irn_uplink(ir_node *n, int uplink)
  */
 static int get_irn_uplink(ir_node *n)
 {
-       scc_info *scc = get_irn_link(n);
+       scc_info *scc = (scc_info*) get_irn_link(n);
        assert(scc);
        return scc->uplink;
 }
@@ -147,7 +127,7 @@ static int get_irn_uplink(ir_node *n)
  */
 static inline void set_irn_dfn(ir_node *n, int dfn)
 {
-       scc_info *scc = get_irn_link(n);
+       scc_info *scc = (scc_info*) get_irn_link(n);
        assert(scc);
        scc->dfn = dfn;
 }
@@ -157,47 +137,17 @@ static inline void set_irn_dfn(ir_node *n, int dfn)
  */
 static int get_irn_dfn(ir_node *n)
 {
-       scc_info *scc = get_irn_link(n);
+       scc_info *scc = (scc_info*) get_irn_link(n);
        assert(scc);
        return scc->dfn;
 }
 
-#if 0
-static ir_loop *find_nodes_loop(ir_node *n, ir_loop *l)
-{
-       int i;
-       ir_loop *res = NULL;
-
-       /* Test whether n is contained in this loop. */
-       for (i = 0; i < get_loop_n_nodes(l); i++)
-               if (n == get_loop_node(l, i)) return l;
-
-       /* Is this a leave in the loop tree? If so loop not found. */
-       if (get_loop_n_sons(l) == 0) return NULL;
-
-       /* Else descend in the loop tree. */
-       for (i = 0; i < get_loop_n_sons(l); i++) {
-               res = find_nodes_loop(n, get_loop_son(l, i));
-               if (res) break;
-       }
-       return res;
-}
-
-/* @@@ temporary implementation, costly!!! */
-ir_loop * get_irn_loop(ir_node *n)
-{
-       ir_loop *l = get_irg_loop(current_ir_graph);
-       l = find_nodes_loop(n, l);
-       return l;
-}
-#endif
-
 /**********************************************************************/
 /* A stack.                                                          **/
 /**********************************************************************/
 
 static ir_node **stack = NULL;
-static int tos = 0;                /* top of stack */
+static size_t tos = 0;                /* top of stack */
 
 /**
  * initializes the stack
@@ -229,10 +179,10 @@ static void finish_stack(void)
 static inline void push(ir_node *n)
 {
        if (tos == ARR_LEN(stack)) {
-               int nlen = ARR_LEN(stack) * 2;
+               size_t nlen = ARR_LEN(stack) * 2;
                ARR_RESIZE(ir_node *, stack, nlen);
        }
-       stack [tos++] = n;
+       stack[tos++] = n;
        mark_irn_in_stack(n);
 }
 
@@ -243,7 +193,10 @@ static inline void push(ir_node *n)
  */
 static inline ir_node *pop(void)
 {
-       ir_node *n = stack[--tos];
+       ir_node *n;
+
+       assert(tos > 0);
+       n = stack[--tos];
        mark_irn_not_in_stack(n);
        return n;
 }
@@ -271,7 +224,7 @@ static inline void pop_scc_to_loop(ir_node *n)
    can't they have two loops as sons? Does it never get that far? ) */
 static void close_loop(ir_loop *l)
 {
-       int last = get_loop_n_elements(l) - 1;
+       size_t last = get_loop_n_elements(l) - 1;
        loop_element lelement = get_loop_element(l, last);
        ir_loop *last_son = lelement.son;
 
@@ -315,9 +268,8 @@ static inline void pop_scc_unmark_visit(ir_node *n)
 static ir_loop *new_loop(void)
 {
        ir_loop *father = current_loop;
-       ir_loop *son    = alloc_loop(father, outermost_ir_graph->obst);
+       ir_loop *son    = alloc_loop(father, get_irg_obstack(outermost_ir_graph));
 
-       if (son->depth > max_loop_depth) max_loop_depth = son->depth;
        current_loop = son;
        return father;
 }
@@ -330,7 +282,7 @@ static ir_loop *new_loop(void)
 
 static inline void init_node(ir_node *n, void *env)
 {
-       struct obstack *obst = env;
+       struct obstack *obst = (struct obstack*) env;
        set_irn_link(n, new_scc_info(obst));
        clear_backedges(n);
 }
@@ -346,9 +298,6 @@ static inline void init_scc(ir_graph *irg, struct obstack *obst)
 {
        init_scc_common();
        irg_walk_graph(irg, init_node, NULL, obst);
-       /*
-       irg_walk (irg, link_to_reg_end, NULL, NULL);
-       */
 }
 
 static inline void finish_scc(void)
@@ -356,20 +305,8 @@ static inline void finish_scc(void)
        finish_stack();
 }
 
-#ifdef INTERPROCEDURAL_VIEW
-static inline void init_ip_scc(struct obstack *obst)
-{
-       init_scc_common();
-       cg_walk(init_node, NULL, obst);
-
-#if EXPERIMENTAL_LOOP_TREE
-       cg_walk(link_to_reg_end, NULL, NULL);
-#endif
-}
-#endif
-
 /**
- * Check weather a given node represents the outer most Start
+ * Check whether a given node represents the outermost Start
  * block. In intra-procedural view this is the start block of the
  * current graph, in interprocedural view it is the start block
  * of the outer most graph.
@@ -389,73 +326,38 @@ static int is_outermost_Start(ir_node *n)
        return 0;
 }
 
-static inline int is_ip_Filter(ir_node *n)
-{
-#ifdef INTERPROCEDURAL_VIEW
-       return is_Filter(n) && get_interprocedural_view();
-#else
-       (void) n;
-       return 0;
-#endif
-}
-
 /* When to walk from nodes to blocks. Only for Control flow operations? */
 static inline int get_start_index(ir_node *n)
 {
-#undef BLOCK_BEFORE_NODE
-#define BLOCK_BEFORE_NODE 1
-
-#if BLOCK_BEFORE_NODE
-
        /* This version assures, that all nodes are ordered absolutely.  This allows
           to undef all nodes in the heap analysis if the block is false, which
           means not reachable.
           I.e., with this code, the order on the loop tree is correct. But a
           (single) test showed the loop tree is deeper. */
-       if (get_irn_op(n) == op_Phi  ||
-           is_Block(n)              ||
-           (is_ip_Filter(n))        || (
-             get_irg_pinned(get_irn_irg(n)) == op_pin_state_floats &&
-             get_irn_pinned(n)              == op_pin_state_floats
-           ))
+       if (is_Phi(n)   ||
+           is_Block(n) ||
+           (get_irg_pinned(get_irn_irg(n)) == op_pin_state_floats &&
+             get_irn_pinned(n)              == op_pin_state_floats))
                // Here we could test for backedge at -1 which is illegal
                return 0;
        else
                return -1;
-
-#else
-
-       /* This version causes deeper loop trees (at least we verified this
-          for Polymor).
-          But it guarantees that Blocks are analysed before nodes contained in the
-          block.  If so, we can set the value to undef if the block is not \
-          executed. */
-       if (is_cfop(n) || is_fragile_op(n) || is_Start(n))
-               return -1;
-       else
-               return 0;
-
-#endif
 }
 
 /**
  * Return non-zero if the given node is a legal loop header:
- * Block, Phi, Filter.
+ * Block, Phi
  *
  * @param n  the node to check
  */
 static inline int is_possible_loop_head(ir_node *n)
 {
-       ir_op *op = get_irn_op(n);
-       return ((op == op_Block) ||
-               (op == op_Phi) ||
-               (is_ip_Filter(n)));
+       return is_Block(n) || is_Phi(n);
 }
 
 /**
- * Returns non-zero if n is a loop header, i.e., it is a Block, Phi
- * or Filter node and has predecessors within the loop and out
- * of the loop.
+ * Returns non-zero if n is a loop header, i.e., it is a Block or Phi
+ * node and has predecessors within the loop and out of the loop.
  *
  * @param n    the node to check
  * @param root only needed for assertion.
@@ -494,7 +396,7 @@ static int is_head(ir_node *n, ir_node *root)
 
 /**
  * Returns non-zero if n is possible loop head of an endless loop.
- * I.e., it is a Block, Phi or Filter node and has only predecessors
+ * I.e., it is a Block or Phi node and has only predecessors
  * within the loop.
  *
  * @param n    the node to check
@@ -589,9 +491,6 @@ static ir_node *find_tail(ir_node *n)
        ir_node *m;
        int i, res_index = -2;
 
-       /*
-       if (!icfg && rm_cyclic_phis && remove_cyclic_phis (n)) return NULL;
-        */
        m = stack[tos-1];  /* tos = top of stack */
        if (is_head(m, n)) {
                res_index = smallest_dfn_pred(m, 0);
@@ -632,7 +531,9 @@ static ir_node *find_tail(ir_node *n)
                                                res_index = largest_dfn_pred (m);
                                        break;
                                }
-                               if (m == n) { break; }  /* It's not an unreachable loop, either. */
+                               /* It's not an unreachable loop, either. */
+                               if (m == n)
+                                       break;
                        }
                        //assert(0 && "no head found on stack");
                }
@@ -642,8 +543,10 @@ static ir_node *find_tail(ir_node *n)
                /* It's a completely bad loop: without Phi/Block nodes that can
                   be a head. I.e., the code is "dying".  We break the loop by
                   setting Bad nodes. */
-               int arity = get_irn_arity(n);
-               ir_node *bad = get_irg_bad(get_irn_irg(n));
+               ir_graph *irg   = get_irn_irg(n);
+               ir_mode  *mode  = get_irn_mode(n);
+               ir_node  *bad   = new_r_Bad(irg, mode);
+               int       arity = get_irn_arity(n);
                for (i = -1; i < arity; ++i) {
                        set_irn_n(n, i, bad);
                }
@@ -655,86 +558,11 @@ static ir_node *find_tail(ir_node *n)
        return is_outermost_Start(n) ? NULL : get_irn_n(m, res_index);
 }
 
-
-#if EXPERIMENTAL_LOOP_TREE
-
-/*  ----------------------------------------------------------------
-    AS:  This is experimental code to build loop trees suitable for
-    the heap analysis. Does not work correctly right now... :-(
-
-
-    Search in stack for the corresponding first Call-End-ProjX that
-    corresponds to one of the control flow predecessors of the given
-    block, that is the possible callers.
-    returns: the control predecessor to chose\
-    or       -1 if no corresponding Call-End-Node could be found
-             on the stack.
-    - -------------------------------------------------------------- */
-
-int search_endproj_in_stack(ir_node *start_block)
-{
-       int i, j;
-       assert(is_Block(start_block));
-       for (i = tos - 1; i >= 0; --i)
-       {
-               if (get_irn_op(stack[i]) == op_Proj && get_irn_mode(stack[i]) == mode_X &&
-                       get_irn_op(get_irn_n(stack[i], 0)) == op_EndReg)
-               {
-                       printf("FOUND PROJ!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
-                       ir_node *end_projx = stack[i];
-
-                       int arity = get_irn_arity(start_block);
-                       for (j = 0; j < arity; j++)
-                       {
-                               ir_node *begin_projx = get_Block_cfgpred(get_irg_start_block(get_irn_irg(end_projx)),
-                                       get_Proj_proj(end_projx));
-                               if (get_irn_n(start_block, j) == begin_projx)
-                               {
-                                       printf("FOUND IT!!!!!!!!!!!!!!!!!!\n");
-                                       return(j);
-                               }
-                       }
-               }
-       }
-       return(-1);
-}
-
-
-static pmap *projx_link = NULL;
-
-void link_to_reg_end (ir_node *n, void *env)
-{
-       if (get_irn_op(n) == op_Proj &&
-               get_irn_mode(n) == mode_X &&
-               get_irn_op(get_irn_n(n, 0)) == op_EndReg) {
-                       /* Reg End Projx -> Find the CallBegin Projx and hash it */
-                       ir_node *end_projx = n;
-                       ir_node *begin_projx = get_Block_cfgpred(get_irg_start_block(get_irn_irg(end_projx)),
-                               get_Proj_proj(end_projx));
-                       set_projx_link(begin_projx, end_projx);
-       }
-}
-
-void set_projx_link(ir_node *cb_projx, ir_node *end_projx)
-{
-       if (projx_link == NULL)
-               projx_link = pmap_create();
-       pmap_insert(projx_link, (void *)cb_projx, (void *)end_projx);
-}
-
-ir_node *get_projx_link(ir_node *cb_projx)
-{
-       return((ir_node *) pmap_get(projx_link, (void *)cb_projx));
-}
-
-#endif
-
 static inline int is_outermost_loop(ir_loop *l)
 {
        return l == get_loop_outer_loop(l);
 }
 
-
 /*-----------------------------------------------------------*
  *                   The core algorithm.                     *
  *-----------------------------------------------------------*/
@@ -797,7 +625,6 @@ static void scc(ir_node *n)
                           Next actions: Open a new loop on the loop tree and
                                         try to find inner loops */
 
-#if NO_LOOPS_WITHOUT_HEAD
                        /* This is an adaption of the algorithm from fiasco / optscc to
                         * avoid loops without Block or Phi as first node.  This should
                         * severely reduce the number of evaluations of nodes to detect
@@ -817,9 +644,6 @@ static void scc(ir_node *n)
                                l = current_loop;
                                close = 0;
                        }
-#else
-                       ir_loop *l = new_loop();
-#endif
 
                        /* Remove the loop from the stack ... */
                        pop_scc_unmark_visit(n);
@@ -831,9 +655,7 @@ static void scc(ir_node *n)
                        scc(tail);
 
                        assert(irn_visited(n));
-#if NO_LOOPS_WITHOUT_HEAD
                        if (close)
-#endif
                                close_loop(l);
                } else {
                        /* No loop head was found, that is we have straight line code.
@@ -843,119 +665,12 @@ static void scc(ir_node *n)
        }
 }
 
-#ifdef INTERPROCEDURAL_VIEW
-static void my_scc(ir_node *n)
-{
-       int i;
-       if (irn_visited_else_mark(n))
-               return;
-
-       /* Initialize the node */
-       set_irn_dfn(n, current_dfn);      /* Depth first number for this node */
-       set_irn_uplink(n, current_dfn);   /* ... is default uplink. */
-       set_irn_loop(n, NULL);
-       current_dfn ++;
-       push(n);
-
-       /* AS: get_start_index might return -1 for Control Flow Nodes, and thus a negative
-          array index would be passed to is_backedge(). But CFG Nodes dont't have a backedge array,
-          so is_backedge does not access array[-1] but correctly returns false! */
-
-       if (!is_outermost_Start(n)) {
-               int arity = get_irn_arity(n);
-
-               for (i = get_start_index(n); i < arity; i++) {
-                       ir_node *m;
-                       if (is_backedge(n, i)) continue;
-                       m = get_irn_n(n, i); /* get_irn_ip_pred(n, i); */
-                       /* if (!m || is_Unknown(m)) continue; */
-                       my_scc(m);
-                       if (irn_is_in_stack(m)) {
-                               /* Uplink of m is smaller if n->m is a backedge.
-                                  Propagate the uplink to mark the loop. */
-                               if (get_irn_uplink(m) < get_irn_uplink(n))
-                                       set_irn_uplink(n, get_irn_uplink(m));
-                       }
-               }
-       }
-
-       if (get_irn_dfn(n) == get_irn_uplink(n)) {
-               /* This condition holds for
-                  1) the node with the incoming backedge.
-                     That is: We found a loop!
-                  2) Straight line code, because no uplink has been propagated, so the
-                     uplink still is the same as the dfn.
-
-                  But n might not be a proper loop head for the analysis. Proper loop
-                  heads are Block and Phi nodes. find_tail searches the stack for
-                  Block's and Phi's and takes those nodes as loop heads for the current
-                  loop instead and marks the incoming edge as backedge. */
-
-               ir_node *tail = find_tail(n);
-               if (tail) {
-                       /* We have a loop, that is no straight line code,
-                          because we found a loop head!
-                          Next actions: Open a new loop on the loop tree and
-                                        try to find inner loops */
-
-#if NO_LOOPS_WITHOUT_HEAD
-                       /* This is an adaption of the algorithm from fiasco / optscc to
-                        * avoid loops without Block or Phi as first node.  This should
-                        * severely reduce the number of evaluations of nodes to detect
-                        * a fixpoint in the heap analysis.
-                        * Further it avoids loops without firm nodes that cause errors
-                        * in the heap analyses. */
-
-                       ir_loop *l;
-                       int close;
-                       if ((get_loop_n_elements(current_loop) > 0) || (is_outermost_loop(current_loop))) {
-                               l = new_loop();
-                               close = 1;
-                       } else {
-                               l = current_loop;
-                               close = 0;
-                       }
-#else
-                       ir_loop *l = new_loop();
-#endif
-
-                       /* Remove the loop from the stack ... */
-                       pop_scc_unmark_visit(n);
-
-                       /* The current backedge has been marked, that is temporarily eliminated,
-                          by find tail. Start the scc algorithm
-                          anew on the subgraph that is left (the current loop without the backedge)
-                          in order to find more inner loops. */
-                       my_scc(tail);
-
-                       assert(irn_visited(n));
-#if NO_LOOPS_WITHOUT_HEAD
-                       if (close)
-#endif
-                               close_loop(l);
-               } else {
-                       /* No loop head was found, that is we have straightline code.
-                          Pop all nodes from the stack to the current loop. */
-                       pop_scc_to_loop(n);
-               }
-       }
-}
-#endif /* INTERPROCEDURAL_VIEW */
-
-/* Constructs backedge information for irg. In interprocedural view constructs
-   backedges for all methods called by irg, too. */
-int construct_backedges(ir_graph *irg)
+void construct_backedges(ir_graph *irg)
 {
        ir_graph *rem = current_ir_graph;
        ir_loop *head_rem;
        struct obstack temp;
 
-#ifdef INTERPROCEDURAL_VIEW
-       assert(!get_interprocedural_view() &&
-              "not implemented, use construct_ip_backedges()");
-#endif
-
-       max_loop_depth = 0;
        current_ir_graph   = irg;
        outermost_ir_graph = irg;
 
@@ -974,193 +689,19 @@ int construct_backedges(ir_graph *irg)
        obstack_free(&temp, NULL);
 
        assert(head_rem == current_loop);
-       mature_loops(current_loop, irg->obst);
+       mature_loops(current_loop, get_irg_obstack(irg));
        set_irg_loop(irg, current_loop);
-       set_irg_loopinfo_state(irg, loopinfo_consistent);
+       add_irg_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_LOOPINFO);
        assert(get_irg_loop(irg)->kind == k_ir_loop);
        current_ir_graph = rem;
-       return max_loop_depth;
-}
-
-
-#ifdef INTERPROCEDURAL_VIEW
-int construct_ip_backedges(void)
-{
-       ir_graph *rem = current_ir_graph;
-       int rem_ipv = get_interprocedural_view();
-       int i;
-       strcut obstack temp;
-
-       max_loop_depth = 0;
-       assert(get_irp_ip_view_state() == ip_view_valid);
-
-       outermost_ir_graph = get_irp_main_irg();
-
-       obstack_init(&temp);
-       init_ip_scc(&temp);
-
-       current_loop = NULL;
-       new_loop();  /* sets current_loop */
-       set_interprocedural_view(1);
-
-       inc_max_irg_visited();
-       for (i = 0; i < get_irp_n_irgs(); i++)
-               set_irg_visited(get_irp_irg(i), get_max_irg_visited());
-
-       /** We have to start the walk at the same nodes as cg_walk. **/
-       /* Walk starting at unreachable procedures. Only these
-        * have End blocks visible in interprocedural view. */
-       for (i = 0; i < get_irp_n_irgs(); i++) {
-               ir_node *sb;
-               current_ir_graph = get_irp_irg(i);
-
-               sb = get_irg_start_block(current_ir_graph);
-
-               if ((get_Block_n_cfgpreds(sb) > 1) ||
-                   (get_nodes_block(get_Block_cfgpred(sb, 0)) != sb))
-                       continue;
-
-               scc(get_irg_end(current_ir_graph));
-       }
-
-       /* Check whether we walked all procedures: there could be procedures
-          with cyclic calls but no call from the outside. */
-       for (i = 0; i < get_irp_n_irgs(); i++) {
-               ir_node *sb;
-               current_ir_graph = get_irp_irg(i);
-
-               /* Test start block: if inner procedure end and end block are not
-                * visible and therefore not marked. */
-               sb = get_irg_start_block(current_ir_graph);
-               if (get_irn_visited(sb) < get_irg_visited(current_ir_graph)) scc(sb);
-       }
-
-       /* Walk all endless loops in inner procedures.
-        * We recognize an inner procedure if the End node is not visited. */
-       for (i = 0; i < get_irp_n_irgs(); i++) {
-               ir_node *e;
-               current_ir_graph = get_irp_irg(i);
-
-               e = get_irg_end(current_ir_graph);
-               if (get_irn_visited(e) < get_irg_visited(current_ir_graph)) {
-                       int j;
-                       /* Don't visit the End node. */
-                       for (j = 0; j < get_End_n_keepalives(e); j++)
-                               scc(get_End_keepalive(e, j));
-               }
-       }
-
-       set_irg_loop(outermost_ir_graph, current_loop);
-       set_irg_loopinfo_state(current_ir_graph, loopinfo_ip_consistent);
-       assert(get_irg_loop(outermost_ir_graph)->kind == k_ir_loop);
-
-       obstack_free(&temp, NULL);
-       current_ir_graph = rem;
-       set_interprocedural_view(rem_ipv);
-       return max_loop_depth;
-}
-
-void my_construct_ip_backedges(void)
-{
-       ir_graph *rem = current_ir_graph;
-       int rem_ipv = get_interprocedural_view();
-       int i;
-
-       assert(get_irp_ip_view_state() == ip_view_valid);
-
-       outermost_ir_graph = get_irp_main_irg();
-
-       init_ip_scc();
-
-       current_loop = NULL;
-       new_loop();  /* sets current_loop */
-       set_interprocedural_view(1);
-
-       inc_max_irg_visited();
-       for (i = 0; i < get_irp_n_irgs(); i++)
-               set_irg_visited(get_irp_irg(i), get_max_irg_visited());
-
-       /** We have to start the walk at the same nodes as cg_walk. **/
-       /* Walk starting at unreachable procedures. Only these
-        * have End blocks visible in interprocedural view. */
-       for (i = 0; i < get_irp_n_irgs(); i++) {
-               ir_node *sb;
-               current_ir_graph = get_irp_irg(i);
-
-               sb = get_irg_start_block(current_ir_graph);
-
-               if ((get_Block_n_cfgpreds(sb) > 1) ||
-                   (get_nodes_block(get_Block_cfgpred(sb, 0)) != sb)) continue;
-
-               my_scc(get_irg_end(current_ir_graph));
-       }
-
-       /* Check whether we walked all procedures: there could be procedures
-          with cyclic calls but no call from the outside. */
-       for (i = 0; i < get_irp_n_irgs(); i++) {
-               ir_node *sb;
-               current_ir_graph = get_irp_irg(i);
-
-               /* Test start block: if inner procedure end and end block are not
-                * visible and therefore not marked. */
-               sb = get_irg_start_block(current_ir_graph);
-               if (get_irn_visited(sb) < get_irg_visited(current_ir_graph))
-                       scc(sb);
-       }
-
-       /* Walk all endless loops in inner procedures.
-        * We recognize an inner procedure if the End node is not visited. */
-       for (i = 0; i < get_irp_n_irgs(); i++) {
-               ir_node *e;
-               current_ir_graph = get_irp_irg(i);
-
-               e = get_irg_end(current_ir_graph);
-               if (get_irn_visited(e) < get_irg_visited(current_ir_graph)) {
-                       int j;
-                       /* Don't visit the End node. */
-                       for (j = 0; j < get_End_n_keepalives(e); j++) scc(get_End_keepalive(e, j));
-               }
-       }
-
-       set_irg_loop(outermost_ir_graph, current_loop);
-       set_irg_loopinfo_state(current_ir_graph, loopinfo_ip_consistent);
-       assert(get_irg_loop(outermost_ir_graph)->kind == k_ir_loop);
-
-       current_ir_graph = rem;
-       set_interprocedural_view(rem_ipv);
 }
-#endif
 
 static void reset_backedges(ir_node *n)
 {
        if (is_possible_loop_head(n)) {
-#ifdef INTERPROCEDURAL_VIEW
-               int rem = get_interprocedural_view();
-
-               set_interprocedural_view(1);
-               clear_backedges(n);
-               set_interprocedural_view(1);
-               clear_backedges(n);
-               set_interprocedural_view(rem);
-#else
                clear_backedges(n);
-#endif
-       }
-}
-
-
-/*
-static void loop_reset_backedges(ir_loop *l)
-{
-       int i;
-       reset_backedges(get_loop_node(l, 0));
-       for (i = 0; i < get_loop_n_nodes(l); ++i)
-               set_irn_loop(get_loop_node(l, i), NULL);
-       for (i = 0; i < get_loop_n_sons(l); ++i) {
-               loop_reset_backedges(get_loop_son(l, i));
        }
 }
-*/
 
 static void loop_reset_node(ir_node *n, void *env)
 {
@@ -1169,36 +710,20 @@ static void loop_reset_node(ir_node *n, void *env)
        reset_backedges(n);
 }
 
-
-/** Removes all loop information.
-    Resets all backedges */
 void free_loop_information(ir_graph *irg)
 {
-       /* We can not use this recursion, as the loop might contain
-          illegal nodes by now.  Why else would we throw away the
-          representation?
-       if (get_irg_loop(irg)) loop_reset_backedges(get_irg_loop(irg));
-       */
        irg_walk_graph(irg, loop_reset_node, NULL, NULL);
        set_irg_loop(irg, NULL);
-       set_irg_loopinfo_state(current_ir_graph, loopinfo_none);
+       clear_irg_properties(current_ir_graph, IR_GRAPH_PROPERTY_CONSISTENT_LOOPINFO);
        /* We cannot free the loop nodes, they are on the obstack. */
 }
 
-
 void free_all_loop_information(void)
 {
-       int i;
-#ifdef INTERPROCEDURAL_VIEW
-       int rem = get_interprocedural_view();
-       set_interprocedural_view(1);  /* To visit all filter nodes */
-#endif
+       size_t i;
        for (i = 0; i < get_irp_n_irgs(); i++) {
                free_loop_information(get_irp_irg(i));
        }
-#ifdef INTERPROCEDURAL_VIEW
-       set_interprocedural_view(rem);
-#endif
 }
 
 /* ------------------------------------------------------------------- */
@@ -1207,7 +732,7 @@ void free_all_loop_information(void)
 
 static int is_loop_variant(ir_loop *l, ir_loop *b)
 {
-       int i, n_elems;
+       size_t i, n_elems;
 
        if (l == b) return 1;
 
@@ -1222,14 +747,6 @@ static int is_loop_variant(ir_loop *l, ir_loop *b)
        return 0;
 }
 
-/* Test whether a value is loop invariant.
- *
- * @param n      The node to be tested.
- * @param block  A block node.  We pass the block, not the loop as we must
- *               start off with a block loop to find all proper uses.
- *
- * Returns non-zero, if the node n is not changed in the loop block
- * belongs to or in inner loops of this blocks loop. */
 int is_loop_invariant(const ir_node *n, const ir_node *block)
 {
        ir_loop *l = get_irn_loop(block);