remove unused/broken interprocedural view
[libfirm] / ir / ana / irscc.c
1 /*
2  * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief    Compute the strongly connected regions and build
23  *              backedge/loop datastructures.
24  *              A variation on the Tarjan algorithm. See also [Trapp:99],
25  *              Chapter 5.2.1.2.
26  * @author   Goetz Lindenmaier
27  * @date     7.2002
28  * @version  $Id$
29  */
30 #include "config.h"
31
32 #include <string.h>
33 #include <stdlib.h>
34
35 #include "irloop_t.h"
36
37 #include "irprog_t.h"
38 #include "irgraph_t.h"
39 #include "irnode_t.h"
40 #include "irgwalk.h"
41 #include "irdump.h"
42 #include "array.h"
43 #include "pmap.h"
44
45 /* A variant of the loop tree that avoids loops without head.
46    This reduces the depth of the loop tree. */
47 #define NO_LOOPS_WITHOUT_HEAD 1
48
49 /** The outermost graph the scc is computed for. */
50 static ir_graph *outermost_ir_graph;
51 /** Current loop construction is working on. */
52 static ir_loop *current_loop;
53 /** Counts the number of allocated loop nodes.
54  *  Each loop node gets a unique number.
55  *  @todo What for? ev. remove.
56  */
57 static int loop_node_cnt = 0;
58 /** Counter to generate depth first numbering of visited nodes. */
59 static int current_dfn = 1;
60
61 static int max_loop_depth = 0;
62
63 void link_to_reg_end(ir_node *n, void *env);
64 void set_projx_link(ir_node *cb_projx, ir_node *end_projx);
65 ir_node *get_projx_link(ir_node *cb_projx);
66
67 /**********************************************************************/
68 /* Node attributes                                                   **/
69 /**********************************************************************/
70
71 /**********************************************************************/
72 /* Node attributes needed for the construction.                      **/
73 /**********************************************************************/
74
75 typedef struct scc_info {
76         int in_stack;          /**< Marks whether node is on the stack. */
77         int dfn;               /**< Depth first search number. */
78         int uplink;            /**< dfn number of ancestor. */
79         /*  ir_loop *loop;         *//* Refers to the containing loop. */
80         /*
81             struct section *section;
82             xset def;
83             xset use;
84         */
85 } scc_info;
86
87 /**
88  * Allocates a new SCC info on the given obstack.
89  */
90 static inline scc_info *new_scc_info(struct obstack *obst)
91 {
92         return OALLOCZ(obst, scc_info);
93 }
94
95 /**
96  * Mark node n being on the SCC stack.
97  */
98 static inline void mark_irn_in_stack(ir_node *n)
99 {
100         scc_info *scc = get_irn_link(n);
101         assert(scc);
102         scc->in_stack = 1;
103 }
104
105 /**
106 * Mark node n NOT being on the SCC stack.
107 */
108 static inline void mark_irn_not_in_stack(ir_node *n)
109 {
110         scc_info *scc = get_irn_link(n);
111         assert(scc);
112         scc->in_stack = 0;
113 }
114
115 /**
116  * Checks if a node is on the SCC stack.
117  */
118 static inline int irn_is_in_stack(ir_node *n)
119 {
120         scc_info *scc = get_irn_link(n);
121         assert(scc);
122         return scc->in_stack;
123 }
124
125 /**
126  * Sets the uplink number for a node.
127  */
128 static inline void set_irn_uplink(ir_node *n, int uplink)
129 {
130         scc_info *scc = get_irn_link(n);
131         assert(scc);
132         scc->uplink = uplink;
133 }
134
135 /**
136  * Returns the uplink number for a node.
137  */
138 static int get_irn_uplink(ir_node *n)
139 {
140         scc_info *scc = get_irn_link(n);
141         assert(scc);
142         return scc->uplink;
143 }
144
145 /**
146  * Sets the depth-first-search number for a node.
147  */
148 static inline void set_irn_dfn(ir_node *n, int dfn)
149 {
150         scc_info *scc = get_irn_link(n);
151         assert(scc);
152         scc->dfn = dfn;
153 }
154
155 /**
156  * Returns the depth-first-search number of a node.
157  */
158 static int get_irn_dfn(ir_node *n)
159 {
160         scc_info *scc = get_irn_link(n);
161         assert(scc);
162         return scc->dfn;
163 }
164
165 #if 0
166 static ir_loop *find_nodes_loop(ir_node *n, ir_loop *l)
167 {
168         int i;
169         ir_loop *res = NULL;
170
171         /* Test whether n is contained in this loop. */
172         for (i = 0; i < get_loop_n_nodes(l); i++)
173                 if (n == get_loop_node(l, i)) return l;
174
175         /* Is this a leave in the loop tree? If so loop not found. */
176         if (get_loop_n_sons(l) == 0) return NULL;
177
178         /* Else descend in the loop tree. */
179         for (i = 0; i < get_loop_n_sons(l); i++) {
180                 res = find_nodes_loop(n, get_loop_son(l, i));
181                 if (res) break;
182         }
183         return res;
184 }
185
186 /* @@@ temporary implementation, costly!!! */
187 ir_loop * get_irn_loop(ir_node *n)
188 {
189         ir_loop *l = get_irg_loop(current_ir_graph);
190         l = find_nodes_loop(n, l);
191         return l;
192 }
193 #endif
194
195 /**********************************************************************/
196 /* A stack.                                                          **/
197 /**********************************************************************/
198
199 static ir_node **stack = NULL;
200 static int tos = 0;                /* top of stack */
201
202 /**
203  * initializes the stack
204  */
205 static inline void init_stack(void)
206 {
207         if (stack) {
208                 ARR_RESIZE(ir_node *, stack, 1000);
209         } else {
210                 stack = NEW_ARR_F(ir_node *, 1000);
211         }
212         tos = 0;
213 }
214
215 /**
216  * Frees the stack.
217  */
218 static void finish_stack(void)
219 {
220         DEL_ARR_F(stack);
221         stack = NULL;
222 }
223
224 /**
225  * push a node onto the stack
226  *
227  * @param n  The node to push
228  */
229 static inline void push(ir_node *n)
230 {
231         if (tos == ARR_LEN(stack)) {
232                 int nlen = ARR_LEN(stack) * 2;
233                 ARR_RESIZE(ir_node *, stack, nlen);
234         }
235         stack [tos++] = n;
236         mark_irn_in_stack(n);
237 }
238
239 /**
240  * pop a node from the stack
241  *
242  * @return  The topmost node
243  */
244 static inline ir_node *pop(void)
245 {
246         ir_node *n = stack[--tos];
247         mark_irn_not_in_stack(n);
248         return n;
249 }
250
251 /**
252  * The nodes up to n belong to the current loop.
253  * Removes them from the stack and adds them to the current loop.
254  */
255 static inline void pop_scc_to_loop(ir_node *n)
256 {
257         ir_node *m;
258
259         do {
260                 m = pop();
261
262                 loop_node_cnt++;
263                 set_irn_dfn(m, loop_node_cnt);
264                 add_loop_node(current_loop, m);
265                 set_irn_loop(m, current_loop);
266         } while (m != n);
267 }
268
269 /* GL ??? my last son is my grandson???  Removes loops with no
270    ir_nodes in them.  Such loops have only another loop as son. (Why
271    can't they have two loops as sons? Does it never get that far? ) */
272 static void close_loop(ir_loop *l)
273 {
274         int last = get_loop_n_elements(l) - 1;
275         loop_element lelement = get_loop_element(l, last);
276         ir_loop *last_son = lelement.son;
277
278         if (get_kind(last_son) == k_ir_loop &&
279                 get_loop_n_elements(last_son) == 1) {
280                         ir_loop *gson;
281
282                         lelement = get_loop_element(last_son, 0);
283                         gson = lelement.son;
284
285                         if (get_kind(gson) == k_ir_loop) {
286                                 loop_element new_last_son;
287
288                                 gson->outer_loop = l;
289                                 new_last_son.son = gson;
290                                 l->children[last] = new_last_son;
291                         }
292         }
293
294         current_loop = l;
295 }
296
297 /* Removes and unmarks all nodes up to n from the stack.
298    The nodes must be visited once more to assign them to a scc. */
299 static inline void pop_scc_unmark_visit(ir_node *n)
300 {
301         ir_node *m = NULL;
302
303         while (m != n) {
304                 m = pop();
305                 set_irn_visited(m, 0);
306         }
307 }
308
309 /**********************************************************************/
310 /* The loop datastructure.                                           **/
311 /**********************************************************************/
312
313 /* Allocates a new loop as son of current_loop.  Sets current_loop
314    to the new loop and returns the father. */
315 static ir_loop *new_loop(void)
316 {
317         ir_loop *father = current_loop;
318         ir_loop *son    = alloc_loop(father, outermost_ir_graph->obst);
319
320         if (son->depth > max_loop_depth) max_loop_depth = son->depth;
321         current_loop = son;
322         return father;
323 }
324
325 /**********************************************************************/
326 /* Constructing and destructing the loop/backedge information.       **/
327 /**********************************************************************/
328
329 /* Initialization steps. **********************************************/
330
331 static inline void init_node(ir_node *n, void *env)
332 {
333         struct obstack *obst = env;
334         set_irn_link(n, new_scc_info(obst));
335         clear_backedges(n);
336 }
337
338 static inline void init_scc_common(void)
339 {
340         current_dfn = 1;
341         loop_node_cnt = 0;
342         init_stack();
343 }
344
345 static inline void init_scc(ir_graph *irg, struct obstack *obst)
346 {
347         init_scc_common();
348         irg_walk_graph(irg, init_node, NULL, obst);
349         /*
350         irg_walk (irg, link_to_reg_end, NULL, NULL);
351         */
352 }
353
354 static inline void finish_scc(void)
355 {
356         finish_stack();
357 }
358
359 /**
360  * Check weather a given node represents the outer most Start
361  * block. In intra-procedural view this is the start block of the
362  * current graph, in interprocedural view it is the start block
363  * of the outer most graph.
364  *
365  * @param n  the node to check
366  *
367  * This is the condition for breaking the scc recursion.
368  */
369 static int is_outermost_Start(ir_node *n)
370 {
371         /* Test whether this is the outermost Start node. */
372         if (is_Block(n) && get_Block_n_cfgpreds(n) == 1) {
373                 ir_node *pred = skip_Proj(get_Block_cfgpred(n, 0));
374             if (is_Start(pred) && get_nodes_block(pred) == n)
375                         return 1;
376         }
377         return 0;
378 }
379
380 /* When to walk from nodes to blocks. Only for Control flow operations? */
381 static inline int get_start_index(ir_node *n)
382 {
383 #undef BLOCK_BEFORE_NODE
384 #define BLOCK_BEFORE_NODE 1
385
386 #if BLOCK_BEFORE_NODE
387
388         /* This version assures, that all nodes are ordered absolutely.  This allows
389            to undef all nodes in the heap analysis if the block is false, which
390            means not reachable.
391            I.e., with this code, the order on the loop tree is correct. But a
392            (single) test showed the loop tree is deeper. */
393         if (get_irn_op(n) == op_Phi  ||
394             is_Block(n)              ||
395             (get_irg_pinned(get_irn_irg(n)) == op_pin_state_floats &&
396               get_irn_pinned(n)              == op_pin_state_floats))
397                 // Here we could test for backedge at -1 which is illegal
398                 return 0;
399         else
400                 return -1;
401
402 #else
403
404         /* This version causes deeper loop trees (at least we verified this
405            for Polymor).
406            But it guarantees that Blocks are analysed before nodes contained in the
407            block.  If so, we can set the value to undef if the block is not \
408            executed. */
409         if (is_cfop(n) || is_fragile_op(n) || is_Start(n))
410                 return -1;
411         else
412                 return 0;
413
414 #endif
415 }
416
417 /**
418  * Return non-zero if the given node is a legal loop header:
419  * Block, Phi, Filter.
420  *
421  * @param n  the node to check
422  */
423 static inline int is_possible_loop_head(ir_node *n)
424 {
425         ir_op *op = get_irn_op(n);
426         return ((op == op_Block) ||
427                 (op == op_Phi));
428 }
429
430 /**
431  * Returns non-zero if n is a loop header, i.e., it is a Block, Phi
432  * or Filter node and has predecessors within the loop and out
433  * of the loop.
434  *
435  * @param n    the node to check
436  * @param root only needed for assertion.
437  */
438 static int is_head(ir_node *n, ir_node *root)
439 {
440         int i, arity;
441         int some_outof_loop = 0, some_in_loop = 0;
442
443         /* Test for legal loop header: Block, Phi, ... */
444         if (!is_possible_loop_head(n))
445                 return 0;
446
447         if (!is_outermost_Start(n)) {
448 #ifndef NDEBUG
449                 int uplink = get_irn_uplink(root);
450 #else
451                 (void) root;
452 #endif
453                 arity = get_irn_arity(n);
454                 for (i = get_start_index(n); i < arity; i++) {
455                         ir_node *pred;
456                         if (is_backedge(n, i))
457                                 continue;
458                         pred = get_irn_n(n, i);
459                         if (! irn_is_in_stack(pred)) {
460                                 some_outof_loop = 1;
461                         } else {
462                                 assert(get_irn_uplink(pred) >= uplink);
463                                 some_in_loop = 1;
464                         }
465                 }
466         }
467         return some_outof_loop & some_in_loop;
468 }
469
470 /**
471  * Returns non-zero if n is possible loop head of an endless loop.
472  * I.e., it is a Block, Phi or Filter node and has only predecessors
473  * within the loop.
474  *
475  * @param n    the node to check
476  * @param root only needed for assertion.
477  */
478 static int is_endless_head(ir_node *n, ir_node *root)
479 {
480         int i, arity;
481         int none_outof_loop = 1, some_in_loop = 0;
482
483         /* Test for legal loop header: Block, Phi, ... */
484         if (!is_possible_loop_head(n))
485                 return 0;
486
487         if (!is_outermost_Start(n)) {
488 #ifndef NDEBUG
489                 int uplink = get_irn_uplink(root);
490 #else
491                 (void) root;
492 #endif
493                 arity = get_irn_arity(n);
494                 for (i = get_start_index(n); i < arity; i++) {
495                         ir_node *pred;
496                         if (is_backedge(n, i))
497                                 continue;
498                         pred = get_irn_n(n, i);
499                         if (!irn_is_in_stack(pred)) {
500                                 none_outof_loop = 0;
501                         } else {
502                                 assert(get_irn_uplink(pred) >= uplink);
503                                 some_in_loop = 1;
504                         }
505                 }
506         }
507         return none_outof_loop & some_in_loop;
508 }
509
510 /** Returns index of the predecessor with the smallest dfn number
511     greater-equal than limit. */
512 static int smallest_dfn_pred(ir_node *n, int limit)
513 {
514         int i, index = -2, min = -1;
515
516         if (!is_outermost_Start(n)) {
517                 int arity = get_irn_arity(n);
518                 for (i = get_start_index(n); i < arity; i++) {
519                         ir_node *pred = get_irn_n(n, i);
520                         if (is_backedge(n, i) || !irn_is_in_stack(pred))
521                                 continue;
522                         if (get_irn_dfn(pred) >= limit && (min == -1 || get_irn_dfn(pred) < min)) {
523                                 index = i;
524                                 min = get_irn_dfn(pred);
525                         }
526                 }
527         }
528         return index;
529 }
530
531 /**
532  * Returns index of the predecessor with the largest dfn number.
533  */
534 static int largest_dfn_pred(ir_node *n)
535 {
536         int i, index = -2, max = -1;
537
538         if (!is_outermost_Start(n)) {
539                 int arity = get_irn_arity(n);
540                 for (i = get_start_index(n); i < arity; i++) {
541                         ir_node *pred = get_irn_n(n, i);
542                         if (is_backedge (n, i) || !irn_is_in_stack(pred))
543                                 continue;
544                         if (get_irn_dfn(pred) > max) {
545                                 index = i;
546                                 max = get_irn_dfn(pred);
547                         }
548                 }
549         }
550         return index;
551 }
552
553 /**
554  * Searches the stack for possible loop heads.  Tests these for backedges.
555  * If it finds a head with an unmarked backedge it marks this edge and
556  * returns the tail of the loop.
557  * If it finds no backedge returns NULL.
558  * ("disable_backedge" in fiasco)
559  *
560  * @param n  A node where uplink == dfn.
561  */
562 static ir_node *find_tail(ir_node *n)
563 {
564         ir_node *m;
565         int i, res_index = -2;
566
567         /*
568         if (!icfg && rm_cyclic_phis && remove_cyclic_phis (n)) return NULL;
569          */
570         m = stack[tos-1];  /* tos = top of stack */
571         if (is_head(m, n)) {
572                 res_index = smallest_dfn_pred(m, 0);
573                 if ((res_index == -2) &&  /* no smallest dfn pred found. */
574                         (n ==  m))
575                         return NULL;
576         } else {
577                 if (m == n) return NULL;    // Is this to catch Phi - self loops?
578                 for (i = tos-2; i >= 0; --i) {
579                         m = stack[i];
580
581                         if (is_head(m, n)) {
582                                 res_index = smallest_dfn_pred(m, get_irn_dfn(m) + 1);
583                                 if (res_index == -2)  /* no smallest dfn pred found. */
584                                         res_index = largest_dfn_pred(m);
585
586                                 if ((m == n) && (res_index == -2)) {  /* don't walk past loop head. */
587                                         i = -1;
588                                 }
589                                 break;
590                         }
591
592                         /* We should not walk past our selves on the stack:  The upcoming nodes
593                            are not in this loop. We assume a loop not reachable from Start. */
594                         if (m == n) {
595                                 i = -1;
596                                 break;
597                         }
598                 }
599
600                 if (i < 0) {
601                         /* A dead loop not reachable from Start. */
602                         for (i = tos-2; i >= 0; --i) {
603                                 m = stack[i];
604                                 if (is_endless_head(m, n)) {
605                                         res_index = smallest_dfn_pred(m, get_irn_dfn(m) + 1);
606                                         if (res_index == -2)  /* no smallest dfn pred found. */
607                                                 res_index = largest_dfn_pred (m);
608                                         break;
609                                 }
610                                 if (m == n) { break; }  /* It's not an unreachable loop, either. */
611                         }
612                         //assert(0 && "no head found on stack");
613                 }
614
615         }
616         if (res_index <= -2) {
617                 /* It's a completely bad loop: without Phi/Block nodes that can
618                    be a head. I.e., the code is "dying".  We break the loop by
619                    setting Bad nodes. */
620                 int arity = get_irn_arity(n);
621                 ir_node *bad = get_irg_bad(get_irn_irg(n));
622                 for (i = -1; i < arity; ++i) {
623                         set_irn_n(n, i, bad);
624                 }
625                 return NULL;
626         }
627         assert(res_index > -2);
628
629         set_backedge(m, res_index);
630         return is_outermost_Start(n) ? NULL : get_irn_n(m, res_index);
631 }
632
633
634 #if EXPERIMENTAL_LOOP_TREE
635
636 /*  ----------------------------------------------------------------
637     AS:  This is experimental code to build loop trees suitable for
638     the heap analysis. Does not work correctly right now... :-(
639
640
641     Search in stack for the corresponding first Call-End-ProjX that
642     corresponds to one of the control flow predecessors of the given
643     block, that is the possible callers.
644     returns: the control predecessor to chose\
645     or       -1 if no corresponding Call-End-Node could be found
646              on the stack.
647     - -------------------------------------------------------------- */
648
649 int search_endproj_in_stack(ir_node *start_block)
650 {
651         int i, j;
652         assert(is_Block(start_block));
653         for (i = tos - 1; i >= 0; --i)
654         {
655                 if (get_irn_op(stack[i]) == op_Proj && get_irn_mode(stack[i]) == mode_X &&
656                         get_irn_op(get_irn_n(stack[i], 0)) == op_EndReg)
657                 {
658                         printf("FOUND PROJ!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
659                         ir_node *end_projx = stack[i];
660
661                         int arity = get_irn_arity(start_block);
662                         for (j = 0; j < arity; j++)
663                         {
664                                 ir_node *begin_projx = get_Block_cfgpred(get_irg_start_block(get_irn_irg(end_projx)),
665                                         get_Proj_proj(end_projx));
666                                 if (get_irn_n(start_block, j) == begin_projx)
667                                 {
668                                         printf("FOUND IT!!!!!!!!!!!!!!!!!!\n");
669                                         return(j);
670                                 }
671                         }
672                 }
673         }
674         return(-1);
675 }
676
677
678 static pmap *projx_link = NULL;
679
680 void link_to_reg_end (ir_node *n, void *env)
681 {
682         if (get_irn_op(n) == op_Proj &&
683                 get_irn_mode(n) == mode_X &&
684                 get_irn_op(get_irn_n(n, 0)) == op_EndReg) {
685                         /* Reg End Projx -> Find the CallBegin Projx and hash it */
686                         ir_node *end_projx = n;
687                         ir_node *begin_projx = get_Block_cfgpred(get_irg_start_block(get_irn_irg(end_projx)),
688                                 get_Proj_proj(end_projx));
689                         set_projx_link(begin_projx, end_projx);
690         }
691 }
692
693 void set_projx_link(ir_node *cb_projx, ir_node *end_projx)
694 {
695         if (projx_link == NULL)
696                 projx_link = pmap_create();
697         pmap_insert(projx_link, (void *)cb_projx, (void *)end_projx);
698 }
699
700 ir_node *get_projx_link(ir_node *cb_projx)
701 {
702         return((ir_node *) pmap_get(projx_link, (void *)cb_projx));
703 }
704
705 #endif
706
707 static inline int is_outermost_loop(ir_loop *l)
708 {
709         return l == get_loop_outer_loop(l);
710 }
711
712
713 /*-----------------------------------------------------------*
714  *                   The core algorithm.                     *
715  *-----------------------------------------------------------*/
716
717 /**
718  * The core algorithm: Find strongly coupled components.
719  *
720  * @param n  node to start
721  */
722 static void scc(ir_node *n)
723 {
724         if (irn_visited_else_mark(n))
725                 return;
726
727         /* Initialize the node */
728         set_irn_dfn(n, current_dfn);      /* Depth first number for this node */
729         set_irn_uplink(n, current_dfn);   /* ... is default uplink. */
730         set_irn_loop(n, NULL);
731         ++current_dfn;
732         push(n);
733
734         /* AS: get_start_index might return -1 for Control Flow Nodes, and thus a negative
735            array index would be passed to is_backedge(). But CFG Nodes dont't have a backedge array,
736            so is_backedge does not access array[-1] but correctly returns false! */
737
738         if (!is_outermost_Start(n)) {
739                 int i, arity = get_irn_arity(n);
740
741                 for (i = get_start_index(n); i < arity; ++i) {
742                         ir_node *m;
743                         if (is_backedge(n, i))
744                                 continue;
745                         m = get_irn_n(n, i);
746                         scc(m);
747                         if (irn_is_in_stack(m)) {
748                                 /* Uplink of m is smaller if n->m is a backedge.
749                                    Propagate the uplink to mark the loop. */
750                                 if (get_irn_uplink(m) < get_irn_uplink(n))
751                                         set_irn_uplink(n, get_irn_uplink(m));
752                         }
753                 }
754         }
755
756         if (get_irn_dfn(n) == get_irn_uplink(n)) {
757                 /* This condition holds for
758                    1) the node with the incoming backedge.
759                       That is: We found a loop!
760                    2) Straight line code, because no uplink has been propagated, so the
761                       uplink still is the same as the dfn.
762
763                    But n might not be a proper loop head for the analysis. Proper loop
764                    heads are Block and Phi nodes. find_tail() searches the stack for
765                    Block's and Phi's and takes those nodes as loop heads for the current
766                    loop instead and marks the incoming edge as backedge. */
767
768                 ir_node *tail = find_tail(n);
769                 if (tail != NULL) {
770                         /* We have a loop, that is no straight line code,
771                            because we found a loop head!
772                            Next actions: Open a new loop on the loop tree and
773                                          try to find inner loops */
774
775 #if NO_LOOPS_WITHOUT_HEAD
776                         /* This is an adaption of the algorithm from fiasco / optscc to
777                          * avoid loops without Block or Phi as first node.  This should
778                          * severely reduce the number of evaluations of nodes to detect
779                          * a fixpoint in the heap analysis.
780                          * Further it avoids loops without firm nodes that cause errors
781                          * in the heap analyses.
782                          * But attention:  don't do it for the outermost loop:  This loop
783                          * is not iterated.  A first block can be a loop head in case of
784                          * an endless recursion. */
785
786                         ir_loop *l;
787                         int close;
788                         if ((get_loop_n_elements(current_loop) > 0) || (is_outermost_loop(current_loop))) {
789                                 l = new_loop();
790                                 close = 1;
791                         } else {
792                                 l = current_loop;
793                                 close = 0;
794                         }
795 #else
796                         ir_loop *l = new_loop();
797 #endif
798
799                         /* Remove the loop from the stack ... */
800                         pop_scc_unmark_visit(n);
801
802                         /* The current backedge has been marked, that is temporarily eliminated,
803                            by find tail. Start the scc algorithm
804                            again on the subgraph that is left (the current loop without the backedge)
805                            in order to find more inner loops. */
806                         scc(tail);
807
808                         assert(irn_visited(n));
809 #if NO_LOOPS_WITHOUT_HEAD
810                         if (close)
811 #endif
812                                 close_loop(l);
813                 } else {
814                         /* No loop head was found, that is we have straight line code.
815                            Pop all nodes from the stack to the current loop. */
816                         pop_scc_to_loop(n);
817                 }
818         }
819 }
820
821 /* Constructs backedge information for irg. In interprocedural view constructs
822    backedges for all methods called by irg, too. */
823 int construct_backedges(ir_graph *irg)
824 {
825         ir_graph *rem = current_ir_graph;
826         ir_loop *head_rem;
827         struct obstack temp;
828
829         max_loop_depth = 0;
830         current_ir_graph   = irg;
831         outermost_ir_graph = irg;
832
833         obstack_init(&temp);
834         init_scc(irg, &temp);
835
836         current_loop = NULL;
837         new_loop();  /* sets current_loop */
838         head_rem = current_loop; /* Just for assertion */
839
840         inc_irg_visited(irg);
841
842         scc(get_irg_end(irg));
843
844         finish_scc();
845         obstack_free(&temp, NULL);
846
847         assert(head_rem == current_loop);
848         mature_loops(current_loop, irg->obst);
849         set_irg_loop(irg, current_loop);
850         set_irg_loopinfo_state(irg, loopinfo_consistent);
851         assert(get_irg_loop(irg)->kind == k_ir_loop);
852         current_ir_graph = rem;
853         return max_loop_depth;
854 }
855
856 static void reset_backedges(ir_node *n)
857 {
858         if (is_possible_loop_head(n)) {
859                 clear_backedges(n);
860         }
861 }
862
863 /*
864 static void loop_reset_backedges(ir_loop *l)
865 {
866         int i;
867         reset_backedges(get_loop_node(l, 0));
868         for (i = 0; i < get_loop_n_nodes(l); ++i)
869                 set_irn_loop(get_loop_node(l, i), NULL);
870         for (i = 0; i < get_loop_n_sons(l); ++i) {
871                 loop_reset_backedges(get_loop_son(l, i));
872         }
873 }
874 */
875
876 static void loop_reset_node(ir_node *n, void *env)
877 {
878         (void) env;
879         set_irn_loop(n, NULL);
880         reset_backedges(n);
881 }
882
883 /** Removes all loop information.
884     Resets all backedges */
885 void free_loop_information(ir_graph *irg)
886 {
887         /* We can not use this recursion, as the loop might contain
888            illegal nodes by now.  Why else would we throw away the
889            representation?
890         if (get_irg_loop(irg)) loop_reset_backedges(get_irg_loop(irg));
891         */
892         irg_walk_graph(irg, loop_reset_node, NULL, NULL);
893         set_irg_loop(irg, NULL);
894         set_irg_loopinfo_state(current_ir_graph, loopinfo_none);
895         /* We cannot free the loop nodes, they are on the obstack. */
896 }
897
898 void free_all_loop_information(void)
899 {
900         int i;
901         for (i = 0; i < get_irp_n_irgs(); i++) {
902                 free_loop_information(get_irp_irg(i));
903         }
904 }
905
906 /* ------------------------------------------------------------------- */
907 /* Simple analyses based on the loop information                       */
908 /* ------------------------------------------------------------------- */
909
910 static int is_loop_variant(ir_loop *l, ir_loop *b)
911 {
912         int i, n_elems;
913
914         if (l == b) return 1;
915
916         n_elems = get_loop_n_elements(l);
917         for (i = 0; i < n_elems; ++i) {
918                 loop_element e = get_loop_element(l, i);
919                 if (is_ir_loop(e.kind))
920                         if (is_loop_variant(e.son, b))
921                                 return 1;
922         }
923
924         return 0;
925 }
926
927 /* Test whether a value is loop invariant.
928  *
929  * @param n      The node to be tested.
930  * @param block  A block node.  We pass the block, not the loop as we must
931  *               start off with a block loop to find all proper uses.
932  *
933  * Returns non-zero, if the node n is not changed in the loop block
934  * belongs to or in inner loops of this blocks loop. */
935 int is_loop_invariant(const ir_node *n, const ir_node *block)
936 {
937         ir_loop *l = get_irn_loop(block);
938         const ir_node *b = is_Block(n) ? n : get_nodes_block(n);
939         return !is_loop_variant(l, get_irn_loop(b));
940 }