3 * File name: ir/ana/irscc.c
4 * Purpose: Compute the strongly connected regions and build
5 * backedge/loop datastructures.
6 * Author: Goetz Lindenmaier
10 * Copyright: (c) 2002-2003 Universität Karlsruhe
11 * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
22 #include "irgraph_t.h"
28 ir_graph *outermost_ir_graph; /* The outermost graph the scc is computed
30 static ir_loop *current_loop; /* Current loop construction is working
32 static int loop_node_cnt = 0; /* Counts the number of allocated loop nodes.
33 Each loop node gets a unique number.
34 What for? ev. remove. @@@ */
35 static int current_dfn = 1; /* Counter to generate depth first numbering
38 /**********************************************************************/
39 /* Node attributes **/
40 /**********************************************************************/
42 /* A map to get from irnodes to loop nodes. */
43 static pmap *node_loop_map = NULL;
45 /**********************************************************************/
46 /* Node attributes needed for the construction. **/
47 /**********************************************************************/
49 typedef struct scc_info {
50 bool in_stack; /* Marks whether node is on the stack. */
51 int dfn; /* Depth first search number. */
52 int uplink; /* dfn number of ancestor. */
53 // ir_loop *loop; /* Refers to the containing loop. */
55 struct section *section;
61 static INLINE scc_info* new_scc_info(void) {
62 scc_info *info = obstack_alloc (outermost_ir_graph->obst, sizeof (scc_info));
63 memset (info, 0, sizeof (scc_info));
68 mark_irn_in_stack (ir_node *n) {
69 assert(get_irn_link(n));
70 ((scc_info *)get_irn_link(n))->in_stack = true;
74 mark_irn_not_in_stack (ir_node *n) {
75 assert(get_irn_link(n));
76 ((scc_info *)get_irn_link(n))->in_stack = false;
80 irn_is_in_stack (ir_node *n) {
81 assert(get_irn_link(n));
82 return ((scc_info *)get_irn_link(n))->in_stack;
86 set_irn_uplink (ir_node *n, int uplink) {
87 assert(get_irn_link(n));
88 ((scc_info *)get_irn_link(n))->uplink = uplink;
92 get_irn_uplink (ir_node *n) {
93 assert(get_irn_link(n));
94 return ((scc_info *)get_irn_link(n))->uplink;
98 set_irn_dfn (ir_node *n, int dfn) {
99 if (! get_irn_link(n)) { DDMN(n); DDME(get_irg_ent(current_ir_graph));}
100 assert(get_irn_link(n));
101 ((scc_info *)get_irn_link(n))->dfn = dfn;
105 get_irn_dfn (ir_node *n) {
106 assert(get_irn_link(n));
107 return ((scc_info *)get_irn_link(n))->dfn;
110 /* Uses temporary information to set the loop */
112 set_irn_loop (ir_node *n, ir_loop* loop) {
113 //assert(get_irn_link(n));
114 //((scc_info *)get_irn_link(n))->loop = loop;
115 assert(node_loop_map && "not initialized!");
116 pmap_insert(node_loop_map, (void *)n, (void *)loop);
119 /* Uses temporary information to get the loop */
121 get_irn_loop (ir_node *n) {
123 //assert(get_irn_link(n));
124 //return ((scc_info *)get_irn_link(n))->loop;
125 assert(node_loop_map && "not initialized!");
127 if (pmap_contains(node_loop_map, (void *)n))
128 res = (ir_loop *) pmap_get(node_loop_map, (void *)n);
134 static ir_loop *find_nodes_loop (ir_node *n, ir_loop *l) {
138 /* Test whether n is contained in this loop. */
139 for (i = 0; i < get_loop_n_nodes(l); i++)
140 if (n == get_loop_node(l, i)) return l;
142 /* Is this a leave in the loop tree? If so loop not found. */
143 if (get_loop_n_sons(l) == 0) return NULL;
145 /* Else descend in the loop tree. */
146 for (i = 0; i < get_loop_n_sons(l); i++) {
147 res = find_nodes_loop(n, get_loop_son(l, i));
153 /* @@@ temporary implementation, costly!!! */
154 ir_loop * get_irn_loop(ir_node *n) {
155 ir_loop *l = get_irg_loop(current_ir_graph);
156 l = find_nodes_loop(n, l);
161 /**********************************************************************/
163 /**********************************************************************/
165 static ir_node **stack = NULL;
166 static int tos = 0; /* top of stack */
168 static INLINE void init_stack(void) {
170 ARR_RESIZE (ir_node *, stack, 1000);
172 stack = NEW_ARR_F (ir_node *, 1000);
178 static INLINE void free_stack(void) {
190 if (tos == ARR_LEN (stack)) {
191 int nlen = ARR_LEN (stack) * 2;
192 ARR_RESIZE (ir_node *, stack, nlen);
195 mark_irn_in_stack(n);
198 static INLINE ir_node *
201 ir_node *n = stack[--tos];
202 mark_irn_not_in_stack(n);
206 /* The nodes up to n belong to the current loop.
207 Removes them from the stack and adds them to the current loop. */
209 pop_scc_to_loop (ir_node *n)
219 set_irn_dfn(m, loop_node_cnt);
220 add_loop_node(current_loop, m);
221 set_irn_loop(m, current_loop);
223 /* if (m==n) break;*/
227 printf("Mehr als eine Iteration!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
230 /* GL ??? my last son is my grandson??? Removes loops with no
231 ir_nodes in them. Such loops have only another loop as son. (Why
232 can't they have two loops as sons? Does it never get that far? ) */
233 void close_loop (ir_loop *l)
235 int last = get_loop_n_elements(l) - 1;
236 loop_element lelement = get_loop_element(l, last);
237 ir_loop *last_son = lelement.son;
239 if (get_kind(last_son) == k_ir_loop &&
240 get_loop_n_elements(last_son) == 1)
244 lelement = get_loop_element(last_son, 0);
246 if(get_kind(gson) == k_ir_loop)
248 loop_element new_last_son;
250 gson -> outer_loop = l;
251 new_last_son.son = gson;
252 l -> children[last] = new_last_son;
259 /* Removes and unmarks all nodes up to n from the stack.
260 The nodes must be visited once more to assign them to a scc. */
262 pop_scc_unmark_visit (ir_node *n)
268 set_irn_visited(m, 0);
272 /**********************************************************************/
273 /* The loop datastructure. **/
274 /**********************************************************************/
276 /* Allocates a new loop as son of current_loop. Sets current_loop
277 to the new loop and returns the father. */
278 static ir_loop *new_loop (void) {
279 ir_loop *father, *son;
281 father = current_loop;
283 son = (ir_loop *) obstack_alloc (outermost_ir_graph->obst, sizeof (ir_loop));
284 memset (son, 0, sizeof (ir_loop));
285 son->kind = k_ir_loop;
286 son->children = NEW_ARR_F (loop_element, 0);
290 son->outer_loop = father;
291 add_loop_son(father, son);
292 son->depth = father->depth+1;
293 } else { /* The root loop */
294 son->outer_loop = son;
303 /* Finishes the datastructures, copies the arrays to the obstack
305 A. Schoesser: Caution: loop -> sons is gone. */
306 static void mature_loop (ir_loop *loop) {
309 new_sons = NEW_ARR_D (ir_loop *, current_ir_graph->obst, ARR_LEN(loop->sons));
310 memcpy (new_sons, loop->sons, sizeof (ir_loop *) * ARR_LEN(loop->sons));
311 DEL_ARR_F(loop->sons);
312 loop->sons = new_sons;
316 /* Returns outer loop, itself if outermost. */
317 ir_loop *get_loop_outer_loop (ir_loop *loop) {
318 assert(loop && loop->kind == k_ir_loop);
319 return loop->outer_loop;
322 /* Returns nesting depth of this loop */
323 int get_loop_depth (ir_loop *loop) {
324 assert(loop); assert(loop->kind == k_ir_loop);
328 /* Returns the number of inner loops */
329 int get_loop_n_sons (ir_loop *loop) {
330 assert(loop && loop->kind == k_ir_loop);
331 return(loop -> n_sons);
334 /* Returns the pos`th loop_node-child *
335 * TODO: This method isn`t very efficient ! *
336 * Returns NULL if there isnt`t a pos`th loop_node */
337 ir_loop *get_loop_son (ir_loop *loop, int pos) {
338 int child_nr = 0, loop_nr = -1;
340 assert(loop && loop->kind == k_ir_loop);
341 while(child_nr < ARR_LEN(loop->children))
343 if(*(loop -> children[child_nr].kind) == k_ir_loop)
346 return(loop -> children[child_nr].son);
352 /* Use EXCLUSIVELY this function to add sons, otherwise the loop->n_sons
356 add_loop_son(ir_loop *loop, ir_loop *son) {
359 assert(loop && loop->kind == k_ir_loop);
360 assert(get_kind(son) == k_ir_loop);
361 ARR_APP1 (loop_element, loop->children, lson);
365 /* Returns the number of nodes in the loop */
366 int get_loop_n_nodes (ir_loop *loop) {
367 assert(loop); assert(loop->kind == k_ir_loop);
368 return loop -> n_nodes;
369 /* return ARR_LEN(loop->nodes); */
372 /* Returns the pos`th ir_node-child *
373 * TODO: This method isn`t very efficient ! *
374 * Returns NULL if there isnt`t a pos`th ir_node */
375 ir_node *get_loop_node (ir_loop *loop, int pos) {
376 int child_nr, node_nr = -1;
378 assert(loop && loop->kind == k_ir_loop);
379 assert(pos < get_loop_n_nodes(loop));
381 for (child_nr = 0; child_nr < ARR_LEN(loop->children); child_nr++) {
382 if(*(loop -> children[child_nr].kind) == k_ir_node)
385 return(loop -> children[child_nr].node);
387 assert(0 && "no child at pos found");
391 /* Use EXCLUSIVELY this function to add nodes, otherwise the loop->n_nodes
395 add_loop_node(ir_loop *loop, ir_node *n) {
398 assert(loop && loop->kind == k_ir_loop);
399 assert(get_kind(n) == k_ir_node);
400 ARR_APP1 (loop_element, loop->children, ln);
404 /** Returns the number of elements contained in loop. */
405 int get_loop_n_elements (ir_loop *loop) {
406 assert(loop && loop->kind == k_ir_loop);
407 return(ARR_LEN(loop->children));
411 Returns the pos`th loop element.
412 This may be a loop_node or a ir_node. The caller of this function has
413 to check the *(loop_element.kind) field for "k_ir_node" or "k_ir_loop"
414 and then select the apropriate "loop_element.node" or "loop_element.son".
417 loop_element get_loop_element (ir_loop *loop, int pos) {
418 assert(loop && loop->kind == k_ir_loop && pos < ARR_LEN(loop->children));
420 return(loop -> children[pos]);
423 /* The outermost loop is remarked in the surrounding graph. */
424 void set_irg_loop(ir_graph *irg, ir_loop *loop) {
428 ir_loop *get_irg_loop(ir_graph *irg) {
434 /**********************************************************************/
435 /* Constructing and destructing the loop/backedge information. **/
436 /**********************************************************************/
438 /* Initialization steps. **********************************************/
441 init_node (ir_node *n, void *env) {
442 set_irn_link (n, new_scc_info());
445 /* Also init nodes not visible in intraproc_view. */
446 /* @@@ init_node is called for too many nodes -- this wastes memory!.
447 The mem is not lost as its on the obstack. */
448 if (get_irn_op(n) == op_Filter) {
449 for (i = 0; i < get_Filter_n_cg_preds(n); i++)
450 init_node(get_Filter_cg_pred(n, i), NULL);
452 if (get_irn_op(n) == op_Block) {
453 for (i = 0; i < get_Block_cg_n_cfgpreds(n); i++) {
454 init_node(get_Block_cg_cfgpred(n, i), NULL);
457 /* The following pattern matches only after a call from above pattern. */
458 if ((get_irn_op(n) == op_Proj) /*&& (get_Proj_proj(n) == 0)*/) {
459 /* @@@ init_node is called for every proj -- this wastes memory!.
460 The mem is not lost as its on the obstack. */
461 ir_node *cb = get_Proj_pred(n);
462 if ((get_irn_op(cb) == op_CallBegin) ||
463 (get_irn_op(cb) == op_EndReg) ||
464 (get_irn_op(cb) == op_EndExcept)) {
466 init_node(get_nodes_Block(cb), NULL);
473 init_scc_common (void) {
476 if (!node_loop_map) node_loop_map = pmap_create();
481 init_scc (ir_graph *irg) {
483 irg_walk_graph (irg, init_node, NULL, NULL);
485 irg_walk (irg, link_to_reg_end, NULL, NULL);
492 cg_walk (init_node, NULL, NULL);
496 Works, but is inefficient.
500 interprocedural_view = 1;
504 for (i = 0; i < get_irp_n_irgs(); i++) {
505 current_ir_graph = get_irp_irg(i);
506 irg_walk_graph (current_ir_graph, init_node, NULL, NULL);
507 /* @@@ decrease max_visited to avoide double walks */
512 /* Condition for breaking the recursion. */
513 static bool is_outermost_Start(ir_node *n) {
514 /* Test whether this is the outermost Start node. If so
515 recursion must end. */
516 if ((get_irn_op(n) == op_Block) &&
517 (get_Block_n_cfgpreds(n) == 1) &&
518 (get_irn_op(skip_Proj(get_Block_cfgpred(n, 0))) == op_Start) &&
519 (get_nodes_Block(skip_Proj(get_Block_cfgpred(n, 0))) == n)) {
523 /* @@@ Bad condition:
524 not possible in interprocedural view as outermost_graph is
525 not necessarily the only with a dead-end start block.
526 Besides current_ir_graph is not set properly. */
527 if ((get_irn_op(n) == op_Block) &&
528 (n == get_irg_start_block(current_ir_graph))) {
529 if ((!interprocedural_view) ||
530 (current_ir_graph == outermost_ir_graph))
537 /* Don't walk from nodes to blocks except for Control flow operations. */
539 get_start_index(ir_node *n) {
540 if (is_cfop(n) || is_fragile_op(n) || get_irn_op(n) == op_Start)
546 /* Returns current_ir_graph and set it to the irg of predecessor index
548 static INLINE ir_graph *
549 switch_irg (ir_node *n, int index) {
550 ir_graph *old_current = current_ir_graph;
552 if (interprocedural_view) {
553 /* Only Filter and Block nodes can have predecessors in other graphs. */
554 if (get_irn_op(n) == op_Filter)
555 n = get_nodes_Block(n);
556 if (get_irn_op(n) == op_Block) {
557 ir_node *cfop = skip_Proj(get_Block_cfgpred(n, index));
558 if (is_ip_cfop(cfop)) {
559 current_ir_graph = get_irn_irg(cfop);
560 set_irg_visited(current_ir_graph, get_max_irg_visited());
568 /* Walks up the stack passing n and then finding the node
569 where we walked into the irg n is contained in.
570 Here we switch the irg. */
572 find_irg_on_stack (ir_node *n) {
574 ir_graph *old_current = current_ir_graph;
577 if (interprocedural_view) {
578 for (i = tos; i >= 0; i--) {
579 if (stack[i] == n) break;
584 for (; i >= 0; i--) {
586 /*printf(" Visiting %d ", i); DDMN(m);*/
588 current_ir_graph = get_irn_irg(m);
591 if (get_irn_op(m) == op_Filter) {
592 /* Find the corresponding ip_cfop */
593 ir_node *pred = stack[i+1];
595 for (j = 0; j < get_Filter_n_cg_preds(m); j++)
596 if (get_Filter_cg_pred(m, j) == pred) break;
597 if (j >= get_Filter_n_cg_preds(m))
598 /* It is a filter we didn't pass as the predecessors are marked. */
600 assert(get_Filter_cg_pred(m, j) == pred);
611 static void test(ir_node *pred, ir_node *root, ir_node *this) {
613 if (get_irn_uplink(pred) >= get_irn_uplink(root)) return;
615 printf("this: %d ", get_irn_uplink(this)); DDMN(this);
616 printf("pred: %d ", get_irn_uplink(pred)); DDMN(pred);
617 printf("root: %d ", get_irn_uplink(root)); DDMN(root);
619 printf("tos: %d\n", tos);
621 for (i = tos; i >= 0; i--) {
622 ir_node *n = stack[i];
624 printf(" uplink: %d, pos: %d ", get_irn_uplink(n), i); DDMN(n);
629 /* Test for legal loop header: Block, Phi, ... */
630 INLINE static bool is_possible_loop_head(ir_node *n) {
631 return ((get_irn_op(n) == op_Block) ||
632 (get_irn_op(n) == op_Phi) ||
633 ((get_irn_op(n) == op_Filter) && interprocedural_view));
636 /* Returns true if n is a loop header, i.e., it is a Block, Phi
637 or Filter node and has predecessors within the loop and out
639 @arg root: only needed for assertion. */
641 is_head (ir_node *n, ir_node *root)
644 int some_outof_loop = 0, some_in_loop = 0;
646 /* Test for legal loop header: Block, Phi, ... */
647 if (!is_possible_loop_head(n))
650 if (!is_outermost_Start(n)) {
651 for (i = get_start_index(n); i < get_irn_arity(n); i++) {
652 ir_node *pred = get_irn_n(n, i);
654 if (is_backedge(n, i)) continue;
655 if (!irn_is_in_stack(pred)) {
658 assert(get_irn_uplink(pred) >= get_irn_uplink(root));
663 return some_outof_loop && some_in_loop;
666 /* Returns index of the predecessor with the smallest dfn number
667 greater-equal than limit. */
669 smallest_dfn_pred (ir_node *n, int limit)
671 int i, index = -2, min = -1;
673 if (!is_outermost_Start(n)) {
674 for (i = get_start_index(n); i < get_irn_arity(n); i++) {
675 ir_node *pred = get_irn_n(n, i);
677 if (is_backedge(n, i) || !irn_is_in_stack(pred)) continue;
678 if (get_irn_dfn(pred) >= limit && (min == -1 || get_irn_dfn(pred) < min)) {
680 min = get_irn_dfn(pred);
687 /* Returns index of the predecessor with the largest dfn number. */
689 largest_dfn_pred (ir_node *n)
691 int i, index = -2, max = -1;
693 if (!is_outermost_Start(n)) {
694 for (i = get_start_index(n); i < get_irn_arity(n); i++) {
695 ir_node *pred = get_irn_n(n, i);
696 if (is_backedge (n, i) || !irn_is_in_stack(pred)) continue;
697 if (get_irn_dfn(pred) > max) {
699 max = get_irn_dfn(pred);
706 /* Searches the stack for possible loop heads. Tests these for backedges.
707 If it finds a head with an unmarked backedge it marks this edge and
708 returns the tail of the loop.
709 If it finds no backedge returns NULL.
710 ("disable_backedge" in fiasco) */
713 find_tail (ir_node *n) {
715 int i, res_index = -2;
718 if (!icfg && rm_cyclic_phis && remove_cyclic_phis (n)) return NULL;
721 m = stack[tos-1]; /* tos = top of stack */
722 if (is_head (m, n)) {
723 res_index = smallest_dfn_pred(m, 0);
724 if ((res_index == -2) && /* no smallest dfn pred found. */
728 if (m == n) return NULL;
729 for (i = tos-2; ; --i) {
731 if (is_head (m, n)) {
732 res_index = smallest_dfn_pred (m, get_irn_dfn(m) + 1);
733 if (res_index == -2) /* no smallest dfn pred found. */
734 res_index = largest_dfn_pred (m);
739 assert (res_index > -2);
741 set_backedge (m, res_index);
742 return is_outermost_Start(n) ? NULL : get_irn_n(m, res_index);
746 /* The core algorithm. *****************************************/
748 static void scc (ir_node *n) {
752 if (irn_visited(n)) return;
754 /*printf("mark: %d ", get_irn_visited(n)); DDMN(n);
755 DDME(get_irg_ent(current_ir_graph));*/
757 /* Initialize the node */
758 set_irn_dfn(n, current_dfn); /* Depth first number for this node */
759 set_irn_uplink(n, current_dfn); /* ... is default uplink. */
760 set_irn_loop(n, NULL);
763 /* What's this good for?
764 n->ana.scc.section = NULL;
769 /* AS: get_start_index might return -1 for Control Flow Nodes, and thus a negative
770 array index would be passed to is_backedge(). But CFG Nodes dont't have a backedge array,
771 so is_backedge does not access array[-1] but correctly returns false! */
773 if (!is_outermost_Start(n)) {
774 for (i = get_start_index(n); i < get_irn_arity(n); i++) {
776 if (is_backedge(n, i)) continue;
778 m = get_irn_n(n, i); /*get_irn_ip_pred(n, i);*/
779 if ((!m) || (get_irn_op(m) == op_Unknown)) continue;
781 /*return_recur(n, i);*/
783 if (irn_is_in_stack(m)) {
784 /* Uplink of m is smaller if n->m is a backedge.
785 Propagate the uplink to mark the loop. */
786 if (get_irn_uplink(m) < get_irn_uplink(n))
787 set_irn_uplink(n, get_irn_uplink(m));
792 if (get_irn_dfn(n) == get_irn_uplink(n)) {
793 /* This condition holds for the node with the incoming backedge.
794 AS: That is: For the loop head. */
795 ir_node *tail = find_tail(n);
797 /* We found a new inner loop! */
798 ir_loop *l = new_loop();
800 /* Remove the loop from the stack ... */
801 pop_scc_unmark_visit (n);
802 /* and recompute it in a better order; and so that it goes into
804 rem = find_irg_on_stack(tail);
807 current_ir_graph = rem;
809 assert (irn_visited(n));
812 /* AS: No inner loop was found. Pop all nodes from the stack
813 to the current loop. */
819 /* Constructs backedge information for irg. In interprocedural view constructs
820 backedges for all methods called by irg, too. */
821 void construct_backedges(ir_graph *irg) {
822 ir_graph *rem = current_ir_graph;
826 assert(!interprocedural_view &&
827 "not implemented, use construct_ip_backedges");
829 current_ir_graph = irg;
830 outermost_ir_graph = irg;
835 new_loop(); /* sets current_loop */
836 head_rem = current_loop; /* Just for assertion */
838 if (interprocedural_view) {
839 set_irg_visited(irg, inc_max_irg_visited());
842 inc_irg_visited(irg);
845 scc(get_irg_end(irg));
846 for (i = 0; i < get_End_n_keepalives(get_irg_end(irg)); i++)
847 scc(get_End_keepalive(get_irg_end(irg), i));
849 if (interprocedural_view) finish_ip_walk();
851 assert(head_rem == current_loop);
852 set_irg_loop(irg, current_loop);
853 assert(get_irg_loop(irg)->kind == k_ir_loop);
855 irg->loops = current_loop;
859 count_loop (the_loop, &count, &depth);
863 current_ir_graph = rem;
868 void construct_ip_backedges (void) {
869 ir_graph *rem = current_ir_graph;
870 int rem_ipv = interprocedural_view;
873 outermost_ir_graph = get_irp_main_irg();
878 new_loop(); /* sets current_loop */
879 interprocedural_view = 1;
881 inc_max_irg_visited();
882 for (i = 0; i < get_irp_n_irgs(); i++)
883 set_irg_visited(get_irp_irg(i), get_max_irg_visited());
885 for (i = 0; i < get_irp_n_irgs(); i++) {
887 current_ir_graph = get_irp_irg(i);
888 /*DDME(get_irg_ent(current_ir_graph));*/
889 /* Find real entry points */
890 sb = get_irg_start_block(current_ir_graph);
891 if ((get_Block_n_cfgpreds(sb) > 1) ||
892 (get_nodes_Block(get_Block_cfgpred(sb, 0)) != sb)) continue;
893 /* printf("running scc for "); DDME(get_irg_ent(current_ir_graph)); */
894 /* Compute scc for this graph */
895 outermost_ir_graph = current_ir_graph;
896 set_irg_visited(outermost_ir_graph, get_max_irg_visited());
897 scc(get_irg_end(current_ir_graph));
898 for (j = 0; j < get_End_n_keepalives(get_irg_end(outermost_ir_graph)); j++)
899 scc(get_End_keepalive(get_irg_end(outermost_ir_graph), j));
902 set_irg_loop(outermost_ir_graph, current_loop);
903 assert(get_irg_loop(outermost_ir_graph)->kind == k_ir_loop);
905 current_ir_graph = rem;
906 interprocedural_view = rem_ipv;
910 static void reset_backedges(ir_node *n, void *env) {
911 if (is_possible_loop_head(n))
915 /** Removes all loop information.
916 Resets all backedges */
917 void free_loop_information(ir_graph *irg) {
918 set_irg_loop(irg, NULL);
919 /* We cannot free the loop nodes, they are on the obstack. */
920 irg_walk_graph(irg, NULL, reset_backedges, NULL);
924 void free_all_loop_information (void) {
926 int rem = interprocedural_view;
927 interprocedural_view = 1; /* To visit all filter nodes */
928 for (i = 0; i < get_irp_n_irgs(); i++) {
929 free_loop_information(get_irp_irg(i));
931 pmap_destroy(node_loop_map);
932 node_loop_map = NULL;
933 interprocedural_view = rem;