0a68337274366cf61eec0e70bad87182ea4b6427
[libfirm] / ir / ana / irscc.c
1 /*
2  * Copyright (C) 1995-2007 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 #ifdef HAVE_CONFIG_H
31 # include "config.h"
32 #endif
33
34 #ifdef HAVE_STRING_H
35 # include <string.h>
36 #endif
37 #ifdef HAVE_STDLIB_H
38 # include <stdlib.h>
39 #endif
40
41 #include "irloop_t.h"
42
43 #include "irprog_t.h"
44 #include "irgraph_t.h"
45 #include "irnode_t.h"
46 #include "irgwalk.h"
47 #include "array.h"
48 #include "pmap.h"
49
50 #include "irdump.h"
51
52 /* A variant of the loop tree that avoids loops without head.
53    This reduces the depth of the loop tree. */
54 #define NO_LOOPS_WITHOUT_HEAD 1
55
56 static ir_graph *outermost_ir_graph;      /* The outermost graph the scc is computed
57                                              for */
58 static ir_loop *current_loop;      /* Current loop construction is working
59                                       on. */
60 static int loop_node_cnt = 0;      /* Counts the number of allocated loop nodes.
61                                       Each loop node gets a unique number.
62                                       What for? ev. remove. @@@ */
63 static int current_dfn = 1;        /* Counter to generate depth first numbering
64                                       of visited nodes.  */
65
66 static int max_loop_depth = 0;
67
68 void link_to_reg_end (ir_node *n, void *env);
69 void set_projx_link(ir_node *cb_projx, ir_node *end_projx);
70 ir_node *get_projx_link(ir_node *cb_projx);
71
72 /**********************************************************************/
73 /* Node attributes                                                   **/
74 /**********************************************************************/
75
76 /**********************************************************************/
77 /* Node attributes needed for the construction.                      **/
78 /**********************************************************************/
79
80 typedef struct scc_info {
81   int in_stack;          /**< Marks whether node is on the stack. */
82   int dfn;               /**< Depth first search number. */
83   int uplink;            /**< dfn number of ancestor. */
84   /*  ir_loop *loop;         *//* Refers to the containing loop. */
85   /*
86       struct section *section;
87       xset def;
88       xset use;
89   */
90 } scc_info;
91
92 static INLINE scc_info* new_scc_info(void) {
93   scc_info *info = obstack_alloc (outermost_ir_graph->obst, sizeof (scc_info));
94   memset (info, 0, sizeof (scc_info));
95   return info;
96 }
97
98 static INLINE void
99 mark_irn_in_stack (ir_node *n) {
100   scc_info *scc = get_irn_link(n);
101   assert(scc);
102   scc->in_stack = 1;
103 }
104
105 static INLINE void
106 mark_irn_not_in_stack (ir_node *n) {
107   scc_info *scc = get_irn_link(n);
108   assert(scc);
109   scc->in_stack = 0;
110 }
111
112 static INLINE int
113 irn_is_in_stack (ir_node *n) {
114   scc_info *scc = get_irn_link(n);
115   assert(scc);
116   return scc->in_stack;
117 }
118
119 static INLINE void
120 set_irn_uplink (ir_node *n, int uplink) {
121   scc_info *scc = get_irn_link(n);
122   assert(scc);
123   scc->uplink = uplink;
124 }
125
126 int
127 get_irn_uplink (ir_node *n) {
128   scc_info *scc = get_irn_link(n);
129   assert(scc);
130   return scc->uplink;
131 }
132
133 static INLINE void
134 set_irn_dfn (ir_node *n, int dfn) {
135   scc_info *scc = get_irn_link(n);
136   assert(scc);
137   scc->dfn = dfn;
138 }
139
140 int
141 get_irn_dfn (ir_node *n) {
142   scc_info *scc = get_irn_link(n);
143   assert(scc);
144   return scc->dfn;
145 }
146
147
148 void
149 set_irn_loop (ir_node *n, ir_loop *loop) {
150   n->loop = loop;
151 }
152
153 /* Uses temporary information to get the loop */
154 ir_loop *(get_irn_loop)(const ir_node *n) {
155   return _get_irn_loop(n);
156 }
157
158
159 #if 0
160 static ir_loop *find_nodes_loop (ir_node *n, ir_loop *l) {
161   int i;
162   ir_loop *res = NULL;
163
164   /* Test whether n is contained in this loop. */
165   for (i = 0; i < get_loop_n_nodes(l); i++)
166     if (n == get_loop_node(l, i)) return l;
167
168   /* Is this a leave in the loop tree? If so loop not found. */
169   if (get_loop_n_sons(l) == 0) return NULL;
170
171   /* Else descend in the loop tree. */
172   for (i = 0; i < get_loop_n_sons(l); i++) {
173     res = find_nodes_loop(n, get_loop_son(l, i));
174     if (res) break;
175   }
176   return res;
177 }
178
179 /* @@@ temporary implementation, costly!!! */
180 ir_loop * get_irn_loop(ir_node *n) {
181   ir_loop *l = get_irg_loop(current_ir_graph);
182   l = find_nodes_loop(n, l);
183   return l;
184 }
185 #endif
186
187 /**********************************************************************/
188 /* A stack.                                                          **/
189 /**********************************************************************/
190
191 static ir_node **stack = NULL;
192 static int tos = 0;                /* top of stack */
193
194 /**
195  * initializes the stack
196  */
197 static INLINE void init_stack(void) {
198   if (stack) {
199     ARR_RESIZE (ir_node *, stack, 1000);
200   } else {
201     stack = NEW_ARR_F (ir_node *, 1000);
202   }
203   tos = 0;
204 }
205
206 #if 0
207 static INLINE void free_stack(void) {
208   DEL_ARR_F(stack);
209   stack = NULL;
210   tos = 0;
211 }
212 #endif
213
214 /**
215  * push a node onto the stack
216  *
217  * @param n  The node to push
218  */
219 static INLINE void
220 push (ir_node *n)
221 {
222   if (tos == ARR_LEN (stack)) {
223     int nlen = ARR_LEN (stack) * 2;
224     ARR_RESIZE (ir_node *, stack, nlen);
225   }
226   stack [tos++] = n;
227   mark_irn_in_stack(n);
228 }
229
230 /**
231  * pop a node from the stack
232  *
233  * @return  The topmost node
234  */
235 static INLINE ir_node *
236 pop (void)
237 {
238   ir_node *n = stack[--tos];
239   mark_irn_not_in_stack(n);
240   return n;
241 }
242
243 /**
244  * The nodes up to n belong to the current loop.
245  * Removes them from the stack and adds them to the current loop.
246  */
247 static INLINE void
248 pop_scc_to_loop (ir_node *n)
249 {
250   ir_node *m;
251   int i = 0;
252
253   do {
254     m = pop();
255
256     loop_node_cnt++;
257     set_irn_dfn(m, loop_node_cnt);
258     add_loop_node(current_loop, m);
259     set_irn_loop(m, current_loop);
260     i++;
261
262     /*    if (m==n) break;*/
263   } while(m != n);
264
265   /* i might be bigger than 1 for dead (and that's why bad) loops */
266   /* if(i > 1)
267     printf("Mehr als eine Iteration!!!!!!!!!!!!!!!!!!!!!!!!!!!!11111\n");
268    */
269 }
270
271 /* GL ??? my last son is my grandson???  Removes loops with no
272    ir_nodes in them.  Such loops have only another loop as son. (Why
273    can't they have two loops as sons? Does it never get that far? ) */
274 static void close_loop (ir_loop *l)
275 {
276   int last = get_loop_n_elements(l) - 1;
277   loop_element lelement = get_loop_element(l, last);
278   ir_loop *last_son = lelement.son;
279
280   if (get_kind(last_son) == k_ir_loop &&
281       get_loop_n_elements(last_son) == 1) {
282     ir_loop *gson;
283
284     lelement = get_loop_element(last_son, 0);
285     gson = lelement.son;
286
287     if (get_kind(gson) == k_ir_loop) {
288       loop_element new_last_son;
289
290       gson->outer_loop = l;
291       new_last_son.son = gson;
292       l->children[last] = new_last_son;
293     }
294   }
295
296   current_loop = l;
297 }
298
299 /* Removes and unmarks all nodes up to n from the stack.
300    The nodes must be visited once more to assign them to a scc. */
301 static INLINE void
302 pop_scc_unmark_visit (ir_node *n)
303 {
304   ir_node *m = NULL;
305
306   while (m != n) {
307     m = pop();
308     set_irn_visited(m, 0);
309   }
310 }
311
312 /**********************************************************************/
313 /* The loop datastructure.                                           **/
314 /**********************************************************************/
315
316 /* Allocates a new loop as son of current_loop.  Sets current_loop
317    to the new loop and returns the father. */
318 ir_loop *new_loop (void) {
319   ir_loop *father, *son;
320
321   father = current_loop;
322
323   son = (ir_loop *) obstack_alloc (outermost_ir_graph->obst, sizeof (ir_loop));
324   memset (son, 0, sizeof (ir_loop));
325   son->kind = k_ir_loop;
326   son->children = NEW_ARR_F (loop_element, 0);
327   son->n_nodes = 0;
328   son->n_sons=0;
329   if (father) {
330     son->outer_loop = father;
331     add_loop_son(father, son);
332     son->depth = father->depth+1;
333     if (son->depth > max_loop_depth) max_loop_depth = son->depth;
334   } else {  /* The root loop */
335     son->outer_loop = son;
336     son->depth = 0;
337   }
338
339 #ifdef DEBUG_libfirm
340   son->loop_nr = get_irp_new_node_nr();
341   son->link = NULL;
342 #endif
343
344   current_loop = son;
345   return father;
346 }
347
348 #if 0
349 /* Finishes the datastructures, copies the arrays to the obstack
350    of current_ir_graph.
351    A. Schoesser: Caution: loop -> sons is gone. */
352 static void mature_loop (ir_loop *loop) {
353   ir_loop **new_sons;
354
355   new_sons = NEW_ARR_D (ir_loop *, current_ir_graph->obst, ARR_LEN(loop->sons));
356   memcpy (new_sons, loop->sons, sizeof (ir_loop *) * ARR_LEN(loop->sons));
357   DEL_ARR_F(loop->sons);
358   loop->sons = new_sons;
359 }
360 #endif
361
362 /* Returns outer loop, itself if outermost. */
363 ir_loop *(get_loop_outer_loop)(const ir_loop *loop) {
364   return _get_loop_outer_loop(loop);
365 }
366
367 /* Returns nesting depth of this loop */
368 int (get_loop_depth)(const ir_loop *loop) {
369   return _get_loop_depth(loop);
370 }
371
372 /* Returns the number of inner loops */
373 int (get_loop_n_sons)(const ir_loop *loop) {
374   return _get_loop_n_sons(loop);
375 }
376
377 /* Returns the pos`th loop_node-child              *
378  * TODO: This method isn`t very efficient !        *
379  * Returns NULL if there isn`t a pos`th loop_node */
380 ir_loop *get_loop_son (ir_loop *loop, int pos) {
381   int child_nr = 0, loop_nr = -1;
382
383   assert(loop && loop->kind == k_ir_loop);
384   while(child_nr < ARR_LEN(loop->children))
385    {
386     if(*(loop -> children[child_nr].kind) == k_ir_loop)
387       loop_nr++;
388     if(loop_nr == pos)
389       return(loop -> children[child_nr].son);
390     child_nr++;
391    }
392   return NULL;
393 }
394
395 /* Use EXCLUSIVELY this function to add sons, otherwise the loop->n_sons
396    is invalid! */
397
398 void
399 add_loop_son(ir_loop *loop, ir_loop *son) {
400   loop_element lson;
401   lson.son = son;
402   assert(loop && loop->kind == k_ir_loop);
403   assert(get_kind(son) == k_ir_loop);
404   ARR_APP1 (loop_element, loop->children, lson);
405   loop -> n_sons++;
406 }
407
408 /* Returns the number of nodes in the loop */
409 int      get_loop_n_nodes (ir_loop *loop) {
410   assert(loop); assert(loop->kind == k_ir_loop);
411   return loop -> n_nodes;
412 /*  return ARR_LEN(loop->nodes); */
413 }
414
415 /* Returns the pos`th ir_node-child                *
416  * TODO: This method isn`t very efficient !        *
417  * Returns NULL if there isn`t a pos`th ir_node   */
418 ir_node *get_loop_node (ir_loop *loop, int pos) {
419   int child_nr, node_nr = -1;
420
421   assert(loop && loop->kind == k_ir_loop);
422   assert(pos < get_loop_n_nodes(loop));
423
424   for (child_nr = 0; child_nr < ARR_LEN(loop->children); child_nr++) {
425     if(*(loop -> children[child_nr].kind) == k_ir_node)
426       node_nr++;
427     if(node_nr == pos)
428       return(loop -> children[child_nr].node);
429   }
430
431   assert(0 && "no child at pos found");
432   return NULL;
433 }
434
435 /* Use EXCLUSIVELY this function to add nodes, otherwise the loop->n_nodes
436    is invalid! */
437
438 void
439 add_loop_node(ir_loop *loop, ir_node *n) {
440   loop_element ln;
441   ln.node = n;
442   assert(loop && loop->kind == k_ir_loop);
443   assert(get_kind(n) == k_ir_node || get_kind(n) == k_ir_graph);  /* used in callgraph.c */
444   ARR_APP1 (loop_element, loop->children, ln);
445   loop->n_nodes++;
446 }
447
448 /* Returns the number of elements contained in loop.  */
449 int get_loop_n_elements (const ir_loop *loop) {
450   assert(loop && loop->kind == k_ir_loop);
451   return(ARR_LEN(loop->children));
452 }
453
454 /*
455  Returns the pos`th loop element.
456  This may be a loop_node or a ir_node. The caller of this function has
457  to check the *(loop_element.kind) field for "k_ir_node" or "k_ir_loop"
458  and then select the appropriate "loop_element.node" or "loop_element.son".
459 */
460
461 loop_element get_loop_element(const ir_loop *loop, int pos) {
462   assert(loop && loop->kind == k_ir_loop && pos < ARR_LEN(loop->children));
463   return(loop -> children[pos]);
464 }
465
466 int get_loop_element_pos(const ir_loop *loop, void *le) {
467   int i, n;
468   assert(loop && loop->kind == k_ir_loop);
469
470   n = get_loop_n_elements(loop);
471   for (i = 0; i < n; i++)
472     if (get_loop_element(loop, i).node == le) return i;
473   return -1;
474 }
475
476 int get_loop_loop_nr(const ir_loop *loop) {
477   assert(loop && loop->kind == k_ir_loop);
478 #ifdef DEBUG_libfirm
479   return loop->loop_nr;
480 #else
481   return (int)loop;
482 #endif
483 }
484
485
486 /** A field to connect additional information to a loop.  Only valid
487     if libfirm_debug is set. */
488 void  set_loop_link (ir_loop *loop, void *link) {
489   assert(loop && loop->kind == k_ir_loop);
490 #ifdef DEBUG_libfirm
491   loop->link = link;
492 #endif
493 }
494 void *get_loop_link (const ir_loop *loop) {
495   assert(loop && loop->kind == k_ir_loop);
496 #ifdef DEBUG_libfirm
497   return loop->link;
498 #else
499   return NULL;
500 #endif
501 }
502
503 int (is_ir_loop)(const void *thing) {
504   return _is_ir_loop(thing);
505 }
506
507 /* The outermost loop is remarked in the surrounding graph. */
508 void (set_irg_loop)(ir_graph *irg, ir_loop *loop) {
509   _set_irg_loop(irg, loop);
510 }
511
512 /* Returns the root loop info (if exists) for an irg. */
513 ir_loop *(get_irg_loop)(ir_graph *irg) {
514   return _get_irg_loop(irg);
515 }
516
517
518 /**********************************************************************/
519 /* Constructing and destructing the loop/backedge information.       **/
520 /**********************************************************************/
521
522 /* Initialization steps. **********************************************/
523
524 static INLINE void
525 init_node (ir_node *n, void *env) {
526   set_irn_link (n, new_scc_info());
527   clear_backedges(n);
528 }
529
530 static INLINE void
531 init_scc_common (void) {
532   current_dfn = 1;
533   loop_node_cnt = 0;
534   init_stack();
535 }
536
537 static INLINE void
538 init_scc (ir_graph *irg) {
539   init_scc_common();
540   irg_walk_graph (irg, init_node, NULL, NULL);
541   /*
542   irg_walk (irg, link_to_reg_end, NULL, NULL);
543   */
544 }
545
546 static INLINE void
547 init_ip_scc (void) {
548   init_scc_common();
549   cg_walk (init_node, NULL, NULL);
550
551 #if EXPERIMENTAL_LOOP_TREE
552   cg_walk (link_to_reg_end, NULL, NULL);
553 #endif
554 }
555
556 /* Condition for breaking the recursion. */
557 static int is_outermost_Start(ir_node *n) {
558   /* Test whether this is the outermost Start node.  If so
559      recursion must end. */
560   if ((get_irn_op(n) == op_Block)     &&
561       (get_Block_n_cfgpreds(n) == 1)  &&
562       (get_irn_op(skip_Proj(get_Block_cfgpred(n, 0))) == op_Start) &&
563       (get_nodes_block(skip_Proj(get_Block_cfgpred(n, 0))) == n)) {
564     return 1;
565   }
566 #if 0
567   /*  @@@ Bad condition:
568       not possible in interprocedural view as outermost_graph is
569       not necessarily the only with a dead-end start block.
570       Besides current_ir_graph is not set properly. */
571   if ((get_irn_op(n) == op_Block) &&
572       (n == get_irg_start_block(current_ir_graph))) {
573     if ((!get_interprocedural_view())  ||
574     (current_ir_graph == outermost_ir_graph))
575       return 1;
576   }
577 #endif
578   return 0;
579 }
580
581 /* When to walk from nodes to blocks. Only for Control flow operations? */
582 static INLINE int
583 get_start_index(ir_node *n) {
584 #undef BLOCK_BEFORE_NODE
585 #define BLOCK_BEFORE_NODE 1
586
587 #if BLOCK_BEFORE_NODE
588
589   /* This version assures, that all nodes are ordered absolutely.  This allows
590      to undef all nodes in the heap analysis if the block is false, which means
591      not reachable.
592      I.e., with this code, the order on the loop tree is correct. But a (single)
593      test showed the loop tree is deeper.   */
594   if (get_irn_op(n) == op_Phi   ||
595       get_irn_op(n) == op_Block ||
596       (get_irn_op(n) == op_Filter && get_interprocedural_view()) ||
597       (get_irg_pinned(get_irn_irg(n)) == op_pin_state_floats &&
598        get_irn_pinned(n) == op_pin_state_floats))
599     // Here we could test for backedge at -1 which is illegal
600     return 0;
601   else
602     return -1;
603
604 #else
605
606   /* This version causes deeper loop trees (at least we verified this
607      for Polymor).
608      But it guarantees that Blocks are analysed before nodes contained in the
609      block.  If so, we can set the value to undef if the block is not \
610      executed. */
611    if (is_cfop(n) || is_fragile_op(n) || get_irn_op(n) == op_Start)
612      return -1;
613    else
614      return 0;
615
616 #endif
617 }
618
619 /* Test for legal loop header: Block, Phi, ... */
620 static INLINE int is_possible_loop_head(ir_node *n) {
621   ir_op *op = get_irn_op(n);
622   return ((op == op_Block) ||
623           (op == op_Phi) ||
624           ((op == op_Filter) && get_interprocedural_view()));
625 }
626
627 /* Returns non-zero if n is a loop header, i.e., it is a Block, Phi
628    or Filter node and has predecessors within the loop and out
629    of the loop.
630    @arg root: only needed for assertion. */
631 static int
632 is_head (ir_node *n, ir_node *root)
633 {
634   int i, arity;
635   int some_outof_loop = 0, some_in_loop = 0;
636
637   /* Test for legal loop header: Block, Phi, ... */
638   if (!is_possible_loop_head(n))
639     return 0;
640
641   if (!is_outermost_Start(n)) {
642     arity = get_irn_arity(n);
643     for (i = get_start_index(n); i < arity; i++) {
644       ir_node *pred = get_irn_n(n, i);
645       assert(pred);
646       if (is_backedge(n, i)) continue;
647       if (!irn_is_in_stack(pred)) {
648         some_outof_loop = 1;
649       } else {
650         if(get_irn_uplink(pred) < get_irn_uplink(root)) {
651           assert(get_irn_uplink(pred) >= get_irn_uplink(root));
652         }
653         some_in_loop = 1;
654       }
655     }
656   }
657   return some_outof_loop && some_in_loop;
658 }
659
660 /**
661  * Returns non-zero if n is possible loop head of an endless loop.
662  * I.e., it is a Block, Phi or Filter node and has only predecessors
663  * within the loop.
664  * @param root: only needed for assertion.
665  */
666 static int
667 is_endless_head (ir_node *n, ir_node *root)
668 {
669   int i, arity;
670   int some_outof_loop = 0, some_in_loop = 0;
671
672   /* Test for legal loop header: Block, Phi, ... */
673   if (!is_possible_loop_head(n))
674     return 0;
675
676   if (!is_outermost_Start(n)) {
677     arity = get_irn_arity(n);
678     for (i = get_start_index(n); i < arity; i++) {
679       ir_node *pred = get_irn_n(n, i);
680       assert(pred);
681       if (is_backedge(n, i)) { continue; }
682       if (!irn_is_in_stack(pred)) {
683         some_outof_loop = 1; //printf(" some out of loop ");
684       } else {
685         if(get_irn_uplink(pred) < get_irn_uplink(root)) {
686           assert(get_irn_uplink(pred) >= get_irn_uplink(root));
687         }
688         some_in_loop = 1;
689       }
690     }
691   }
692   return !some_outof_loop && some_in_loop;
693 }
694
695 /* Returns index of the predecessor with the smallest dfn number
696    greater-equal than limit. */
697 static int
698 smallest_dfn_pred (ir_node *n, int limit)
699 {
700   int i, index = -2, min = -1;
701
702   if (!is_outermost_Start(n)) {
703     int arity = get_irn_arity(n);
704     for (i = get_start_index(n); i < arity; i++) {
705       ir_node *pred = get_irn_n(n, i);
706       assert(pred);
707       if (is_backedge(n, i) || !irn_is_in_stack(pred)) continue;
708       if (get_irn_dfn(pred) >= limit && (min == -1 || get_irn_dfn(pred) < min)) {
709         index = i;
710         min = get_irn_dfn(pred);
711       }
712     }
713   }
714   return index;
715 }
716
717 /* Returns index of the predecessor with the largest dfn number. */
718 static int
719 largest_dfn_pred (ir_node *n)
720 {
721   int i, index = -2, max = -1;
722
723   if (!is_outermost_Start(n)) {
724     int arity = get_irn_arity(n);
725     for (i = get_start_index(n); i < arity; i++) {
726       ir_node *pred = get_irn_n(n, i);
727       if (is_backedge (n, i) || !irn_is_in_stack(pred)) continue;
728       if (get_irn_dfn(pred) > max) {
729         index = i;
730         max = get_irn_dfn(pred);
731       }
732     }
733   }
734   return index;
735 }
736
737 /** Searches the stack for possible loop heads.  Tests these for backedges.
738     If it finds a head with an unmarked backedge it marks this edge and
739     returns the tail of the loop.
740     If it finds no backedge returns NULL.
741     ("disable_backedge" in fiasco)
742 *
743 *  @param n  A node where uplink == dfn.
744 **/
745
746 static ir_node *
747 find_tail (ir_node *n) {
748   ir_node *m;
749   int i, res_index = -2;
750
751   /*
752     if (!icfg && rm_cyclic_phis && remove_cyclic_phis (n)) return NULL;
753   */
754   m = stack[tos-1];  /* tos = top of stack */
755   if (is_head (m, n)) {
756     res_index = smallest_dfn_pred(m, 0);
757     if ((res_index == -2) &&  /* no smallest dfn pred found. */
758     (n ==  m))
759       return NULL;
760   } else {
761     if (m == n) return NULL;    // Is this to catch Phi - self loops?
762     for (i = tos-2; i >= 0; --i) {
763       m = stack[i];
764
765       if (is_head (m, n)) {
766         res_index = smallest_dfn_pred (m, get_irn_dfn(m) + 1);
767         if (res_index == -2)  /* no smallest dfn pred found. */
768           res_index = largest_dfn_pred (m);
769
770         if ((m == n) && (res_index == -2)) {  /* dont walk past loop head. */
771           i = -1;
772         }
773         break;
774       }
775
776       /* We should not walk past our selves on the stack:  The upcoming nodes
777          are not in this loop. We assume a loop not reachable from Start. */
778       if (m == n) {
779         i = -1;
780         break;
781       }
782
783     }
784
785     if (i < 0) {
786       /* A dead loop not reachable from Start. */
787       for (i = tos-2; i >= 0; --i) {
788         m = stack[i];
789         if (is_endless_head (m, n)) {
790           res_index = smallest_dfn_pred (m, get_irn_dfn(m) + 1);
791           if (res_index == -2)  /* no smallest dfn pred found. */
792             res_index = largest_dfn_pred (m);
793           break;
794         }
795         if (m == n) { break; }  /* It's not an unreachable loop, either. */
796       }
797       //assert(0 && "no head found on stack");
798     }
799
800   }
801   if (res_index <= -2) {
802     /* It's a completely bad loop: without Phi/Block nodes that can
803        be a head. I.e., the code is "dying".  We break the loop by
804        setting Bad nodes. */
805     int arity = get_irn_arity(n);
806     for (i = -1; i < arity; ++i) {
807       set_irn_n(n, i, get_irg_bad(get_irn_irg(n)));
808     }
809     return NULL;
810   }
811   assert (res_index > -2);
812
813   set_backedge (m, res_index);
814   return is_outermost_Start(n) ? NULL : get_irn_n(m, res_index);
815 }
816
817
818 #if EXPERIMENTAL_LOOP_TREE
819
820 /*  ----------------------------------------------------------------
821     AS:  This is experimental code to build loop trees suitable for
822     the heap analysis. Does not work correctly right now... :-(
823
824
825     Search in stack for the corresponding first Call-End-ProjX that
826     corresponds to one of the control flow predecessors of the given
827     block, that is the possible callers.
828     returns: the control predecessor to chose\
829     or       -1 if no corresponding Call-End-Node could be found
830              on the stack.
831     - -------------------------------------------------------------- */
832
833 int search_endproj_in_stack(ir_node *start_block)
834 {
835   int i, j;
836   assert(is_Block(start_block));
837   for(i = tos - 1; i >= 0; --i)
838   {
839     if(get_irn_op(stack[i]) == op_Proj && get_irn_mode(stack[i]) == mode_X &&
840        get_irn_op(get_irn_n(stack[i], 0)) == op_EndReg)
841     {
842       printf("FOUND PROJ!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
843       ir_node *end_projx = stack[i];
844
845       int arity = get_irn_arity(start_block);
846       for(j = 0; j < arity; j++)
847       {
848         ir_node *begin_projx = get_Block_cfgpred(get_irg_start_block(get_irn_irg(end_projx)),
849                                                  get_Proj_proj(end_projx));
850         if(get_irn_n(start_block, j) == begin_projx)
851               {
852                 printf("FOUND IT!!!!!!!!!!!!!!!!!!\n");
853                 return(j);
854               }
855       }
856     }
857   }
858   return(-1);
859 }
860
861
862 static pmap *projx_link = NULL;
863
864 void link_to_reg_end (ir_node *n, void *env) {
865   if(get_irn_op(n) == op_Proj &&
866      get_irn_mode(n) == mode_X &&
867      get_irn_op(get_irn_n(n, 0)) == op_EndReg) {
868       /* Reg End Projx -> Find the CallBegin Projx and hash it */
869       ir_node *end_projx = n;
870       ir_node *begin_projx = get_Block_cfgpred(get_irg_start_block(get_irn_irg(end_projx)),
871                                                get_Proj_proj(end_projx));
872       set_projx_link(begin_projx, end_projx);
873     }
874 }
875
876 void set_projx_link(ir_node *cb_projx, ir_node *end_projx)
877 {
878   if(projx_link == NULL)
879     projx_link = pmap_create();
880   pmap_insert(projx_link, (void *)cb_projx, (void *)end_projx);
881 }
882
883 ir_node *get_projx_link(ir_node *cb_projx)
884 {
885   return((ir_node *) pmap_get(projx_link, (void *)cb_projx));
886 }
887
888 #endif
889
890 static INLINE int
891 is_outermost_loop(ir_loop *l) {
892   return l == get_loop_outer_loop(l);
893 }
894
895
896 /*-----------------------------------------------------------*
897  *                   The core algorithm.                     *
898  *-----------------------------------------------------------*/
899
900 static void scc (ir_node *n) {
901   int i;
902   if (irn_visited(n)) return;
903   mark_irn_visited(n);
904
905   /* Initialize the node */
906   set_irn_dfn(n, current_dfn);      /* Depth first number for this node */
907   set_irn_uplink(n, current_dfn);   /* ... is default uplink. */
908   set_irn_loop(n, NULL);
909   current_dfn ++;
910   push(n);
911
912   /* AS: get_start_index might return -1 for Control Flow Nodes, and thus a negative
913      array index would be passed to is_backedge(). But CFG Nodes dont't have a backedge array,
914      so is_backedge does not access array[-1] but correctly returns false! */
915
916   if (!is_outermost_Start(n)) {
917     int arity = get_irn_arity(n);
918
919     for (i = get_start_index(n); i < arity; i++) {
920       ir_node *m;
921       if (is_backedge(n, i)) continue;
922       m = get_irn_n(n, i); /* get_irn_ip_pred(n, i); */
923       /* if ((!m) || (get_irn_op(m) == op_Unknown)) continue; */
924       scc (m);
925       if (irn_is_in_stack(m)) {
926         /* Uplink of m is smaller if n->m is a backedge.
927            Propagate the uplink to mark the loop. */
928         if (get_irn_uplink(m) < get_irn_uplink(n))
929           set_irn_uplink(n, get_irn_uplink(m));
930       }
931     }
932   }
933
934   if (get_irn_dfn(n) == get_irn_uplink(n)) {
935     /* This condition holds for
936        1) the node with the incoming backedge.
937           That is: We found a loop!
938        2) Straight line code, because no uplink has been propagated, so the
939           uplink still is the same as the dfn.
940
941        But n might not be a proper loop head for the analysis. Proper loop
942        heads are Block and Phi nodes. find_tail searches the stack for
943        Block's and Phi's and takes those nodes as loop heads for the current
944        loop instead and marks the incoming edge as backedge. */
945
946     ir_node *tail = find_tail(n);
947     if (tail) {
948       /* We have a loop, that is no straight line code,
949          because we found a loop head!
950          Next actions: Open a new loop on the loop tree and
951                        try to find inner loops */
952
953 #if NO_LOOPS_WITHOUT_HEAD
954       /* This is an adaption of the algorithm from fiasco / optscc to
955        * avoid loops without Block or Phi as first node.  This should
956        * severely reduce the number of evaluations of nodes to detect
957        * a fixpoint in the heap analysis.
958        * Further it avoids loops without firm nodes that cause errors
959        * in the heap analyses.
960        * But attention:  don't do it for the outermost loop:  This loop
961        * is not iterated.  A first block can be a loop head in case of
962        * an endless recursion. */
963
964       ir_loop *l;
965       int close;
966       if ((get_loop_n_elements(current_loop) > 0) || (is_outermost_loop(current_loop))) {
967         l = new_loop();
968         close = 1;
969       } else {
970         l = current_loop;
971         close = 0;
972       }
973 #else
974       ir_loop *l = new_loop();
975 #endif
976
977       /* Remove the loop from the stack ... */
978       pop_scc_unmark_visit (n);
979
980       /* The current backedge has been marked, that is temporarily eliminated,
981          by find tail. Start the scc algorithm
982          anew on the subgraph that is left (the current loop without the backedge)
983          in order to find more inner loops. */
984       scc (tail);
985
986       assert (irn_visited(n));
987 #if NO_LOOPS_WITHOUT_HEAD
988       if (close)
989 #endif
990         close_loop(l);
991     }
992     else
993     {
994       /* No loop head was found, that is we have straightline code.
995          Pop all nodes from the stack to the current loop. */
996       pop_scc_to_loop(n);
997     }
998   }
999 }
1000
1001 static void my_scc (ir_node *n) {
1002   int i;
1003   if (irn_visited(n)) return;
1004   mark_irn_visited(n);
1005
1006   /* Initialize the node */
1007   set_irn_dfn(n, current_dfn);      /* Depth first number for this node */
1008   set_irn_uplink(n, current_dfn);   /* ... is default uplink. */
1009   set_irn_loop(n, NULL);
1010   current_dfn ++;
1011   push(n);
1012
1013   /* AS: get_start_index might return -1 for Control Flow Nodes, and thus a negative
1014      array index would be passed to is_backedge(). But CFG Nodes dont't have a backedge array,
1015      so is_backedge does not access array[-1] but correctly returns false! */
1016
1017   if (!is_outermost_Start(n)) {
1018     int arity = get_irn_arity(n);
1019
1020     for (i = get_start_index(n); i < arity; i++) {
1021       ir_node *m;
1022       if (is_backedge(n, i)) continue;
1023       m = get_irn_n(n, i); /* get_irn_ip_pred(n, i); */
1024       /* if ((!m) || (get_irn_op(m) == op_Unknown)) continue; */
1025       my_scc (m);
1026       if (irn_is_in_stack(m)) {
1027         /* Uplink of m is smaller if n->m is a backedge.
1028            Propagate the uplink to mark the loop. */
1029         if (get_irn_uplink(m) < get_irn_uplink(n))
1030           set_irn_uplink(n, get_irn_uplink(m));
1031       }
1032     }
1033   }
1034
1035   if (get_irn_dfn(n) == get_irn_uplink(n)) {
1036     /* This condition holds for
1037        1) the node with the incoming backedge.
1038           That is: We found a loop!
1039        2) Straight line code, because no uplink has been propagated, so the
1040           uplink still is the same as the dfn.
1041
1042        But n might not be a proper loop head for the analysis. Proper loop
1043        heads are Block and Phi nodes. find_tail searches the stack for
1044        Block's and Phi's and takes those nodes as loop heads for the current
1045        loop instead and marks the incoming edge as backedge. */
1046
1047     ir_node *tail = find_tail(n);
1048     if (tail) {
1049       /* We have a loop, that is no straight line code,
1050          because we found a loop head!
1051          Next actions: Open a new loop on the loop tree and
1052                        try to find inner loops */
1053
1054 #if NO_LOOPS_WITHOUT_HEAD
1055       /* This is an adaption of the algorithm from fiasco / optscc to
1056        * avoid loops without Block or Phi as first node.  This should
1057        * severely reduce the number of evaluations of nodes to detect
1058        * a fixpoint in the heap analysis.
1059        * Further it avoids loops without firm nodes that cause errors
1060        * in the heap analyses. */
1061
1062       ir_loop *l;
1063       int close;
1064       if ((get_loop_n_elements(current_loop) > 0) || (is_outermost_loop(current_loop))) {
1065         l = new_loop();
1066         close = 1;
1067       } else {
1068         l = current_loop;
1069         close = 0;
1070       }
1071 #else
1072       ir_loop *l = new_loop();
1073 #endif
1074
1075       /* Remove the loop from the stack ... */
1076       pop_scc_unmark_visit (n);
1077
1078       /* The current backedge has been marked, that is temporarily eliminated,
1079          by find tail. Start the scc algorithm
1080          anew on the subgraph that is left (the current loop without the backedge)
1081          in order to find more inner loops. */
1082       my_scc (tail);
1083
1084       assert (irn_visited(n));
1085 #if NO_LOOPS_WITHOUT_HEAD
1086       if (close)
1087 #endif
1088         close_loop(l);
1089     }
1090     else
1091     {
1092       /* No loop head was found, that is we have straightline code.
1093          Pop all nodes from the stack to the current loop. */
1094       pop_scc_to_loop(n);
1095     }
1096   }
1097 }
1098
1099 /* Constructs backedge information for irg. In interprocedural view constructs
1100    backedges for all methods called by irg, too. */
1101 int construct_backedges(ir_graph *irg) {
1102   ir_graph *rem = current_ir_graph;
1103   ir_loop *head_rem;
1104
1105   assert(!get_interprocedural_view() &&
1106      "not implemented, use construct_ip_backedges");
1107
1108   max_loop_depth = 0;
1109   current_ir_graph   = irg;
1110   outermost_ir_graph = irg;
1111
1112   init_scc(current_ir_graph);
1113
1114   current_loop = NULL;
1115   new_loop();  /* sets current_loop */
1116   head_rem = current_loop; /* Just for assertion */
1117
1118   inc_irg_visited(current_ir_graph);
1119
1120   scc(get_irg_end(current_ir_graph));
1121
1122   assert(head_rem == current_loop);
1123   set_irg_loop(current_ir_graph, current_loop);
1124   set_irg_loopinfo_state(current_ir_graph, loopinfo_consistent);
1125   assert(get_irg_loop(current_ir_graph)->kind == k_ir_loop);
1126   /*
1127   irg->loops = current_loop;
1128   if (icfg == 1) {
1129     int count = 0;
1130     int depth = 0;
1131     count_loop (the_loop, &count, &depth);
1132     }
1133   }
1134   */
1135   current_ir_graph = rem;
1136
1137   return max_loop_depth;
1138 }
1139
1140
1141 int construct_ip_backedges (void) {
1142   ir_graph *rem = current_ir_graph;
1143   int rem_ipv = get_interprocedural_view();
1144   int i;
1145
1146   max_loop_depth = 0;
1147   assert(get_irp_ip_view_state() == ip_view_valid);
1148
1149   outermost_ir_graph = get_irp_main_irg();
1150
1151   init_ip_scc();
1152
1153   current_loop = NULL;
1154   new_loop();  /* sets current_loop */
1155   set_interprocedural_view(1);
1156
1157   inc_max_irg_visited();
1158   for (i = 0; i < get_irp_n_irgs(); i++)
1159     set_irg_visited(get_irp_irg(i), get_max_irg_visited());
1160
1161   /** We have to start the walk at the same nodes as cg_walk. **/
1162   /* Walk starting at unreachable procedures. Only these
1163    * have End blocks visible in interprocedural view. */
1164   for (i = 0; i < get_irp_n_irgs(); i++) {
1165     ir_node *sb;
1166     current_ir_graph = get_irp_irg(i);
1167
1168     sb = get_irg_start_block(current_ir_graph);
1169
1170     if ((get_Block_n_cfgpreds(sb) > 1) ||
1171     (get_nodes_block(get_Block_cfgpred(sb, 0)) != sb)) continue;
1172
1173     scc(get_irg_end(current_ir_graph));
1174   }
1175
1176   /* Check whether we walked all procedures: there could be procedures
1177      with cyclic calls but no call from the outside. */
1178   for (i = 0; i < get_irp_n_irgs(); i++) {
1179     ir_node *sb;
1180     current_ir_graph = get_irp_irg(i);
1181
1182     /* Test start block: if inner procedure end and end block are not
1183      * visible and therefore not marked. */
1184     sb = get_irg_start_block(current_ir_graph);
1185     if (get_irn_visited(sb) < get_irg_visited(current_ir_graph)) scc(sb);
1186   }
1187
1188   /* Walk all endless loops in inner procedures.
1189    * We recognize an inner procedure if the End node is not visited. */
1190   for (i = 0; i < get_irp_n_irgs(); i++) {
1191     ir_node *e;
1192     current_ir_graph = get_irp_irg(i);
1193
1194     e = get_irg_end(current_ir_graph);
1195     if (get_irn_visited(e) < get_irg_visited(current_ir_graph)) {
1196       int j;
1197       /* Don't visit the End node. */
1198       for (j = 0; j < get_End_n_keepalives(e); j++) scc(get_End_keepalive(e, j));
1199     }
1200   }
1201
1202   set_irg_loop(outermost_ir_graph, current_loop);
1203   set_irg_loopinfo_state(current_ir_graph, loopinfo_ip_consistent);
1204   assert(get_irg_loop(outermost_ir_graph)->kind == k_ir_loop);
1205
1206   current_ir_graph = rem;
1207   set_interprocedural_view(rem_ipv);
1208   return max_loop_depth;
1209 }
1210
1211 void my_construct_ip_backedges (void) {
1212   ir_graph *rem = current_ir_graph;
1213   int rem_ipv = get_interprocedural_view();
1214   int i;
1215
1216   assert(get_irp_ip_view_state() == ip_view_valid);
1217
1218   outermost_ir_graph = get_irp_main_irg();
1219
1220   init_ip_scc();
1221
1222   current_loop = NULL;
1223   new_loop();  /* sets current_loop */
1224   set_interprocedural_view(1);
1225
1226   inc_max_irg_visited();
1227   for (i = 0; i < get_irp_n_irgs(); i++)
1228     set_irg_visited(get_irp_irg(i), get_max_irg_visited());
1229
1230   /** We have to start the walk at the same nodes as cg_walk. **/
1231   /* Walk starting at unreachable procedures. Only these
1232    * have End blocks visible in interprocedural view. */
1233   for (i = 0; i < get_irp_n_irgs(); i++) {
1234     ir_node *sb;
1235     current_ir_graph = get_irp_irg(i);
1236
1237     sb = get_irg_start_block(current_ir_graph);
1238
1239     if ((get_Block_n_cfgpreds(sb) > 1) ||
1240     (get_nodes_block(get_Block_cfgpred(sb, 0)) != sb)) continue;
1241
1242     my_scc(get_irg_end(current_ir_graph));
1243   }
1244
1245   /* Check whether we walked all procedures: there could be procedures
1246      with cyclic calls but no call from the outside. */
1247   for (i = 0; i < get_irp_n_irgs(); i++) {
1248     ir_node *sb;
1249     current_ir_graph = get_irp_irg(i);
1250
1251     /* Test start block: if inner procedure end and end block are not
1252      * visible and therefore not marked. */
1253     sb = get_irg_start_block(current_ir_graph);
1254     if (get_irn_visited(sb) < get_irg_visited(current_ir_graph)) scc(sb);
1255   }
1256
1257   /* Walk all endless loops in inner procedures.
1258    * We recognize an inner procedure if the End node is not visited. */
1259   for (i = 0; i < get_irp_n_irgs(); i++) {
1260     ir_node *e;
1261     current_ir_graph = get_irp_irg(i);
1262
1263     e = get_irg_end(current_ir_graph);
1264     if (get_irn_visited(e) < get_irg_visited(current_ir_graph)) {
1265       int j;
1266       /* Don't visit the End node. */
1267       for (j = 0; j < get_End_n_keepalives(e); j++) scc(get_End_keepalive(e, j));
1268     }
1269   }
1270
1271   set_irg_loop(outermost_ir_graph, current_loop);
1272   set_irg_loopinfo_state(current_ir_graph, loopinfo_ip_consistent);
1273   assert(get_irg_loop(outermost_ir_graph)->kind == k_ir_loop);
1274
1275   current_ir_graph = rem;
1276   set_interprocedural_view(rem_ipv);
1277 }
1278
1279 static void reset_backedges(ir_node *n) {
1280   if (is_possible_loop_head(n)) {
1281     int rem = get_interprocedural_view();
1282
1283     set_interprocedural_view(1);
1284     clear_backedges(n);
1285     set_interprocedural_view(1);
1286     clear_backedges(n);
1287     set_interprocedural_view(rem);
1288   }
1289 }
1290
1291
1292 /*
1293 static void loop_reset_backedges(ir_loop *l) {
1294   int i;
1295   reset_backedges(get_loop_node(l, 0));
1296   for (i = 0; i < get_loop_n_nodes(l); ++i)
1297     set_irn_loop(get_loop_node(l, i), NULL);
1298   for (i = 0; i < get_loop_n_sons(l); ++i) {
1299     loop_reset_backedges(get_loop_son(l, i));
1300   }
1301 }
1302 */
1303
1304 static void loop_reset_node(ir_node *n, void *env) {
1305   set_irn_loop(n, NULL);
1306   reset_backedges(n);
1307 }
1308
1309
1310 /** Removes all loop information.
1311     Resets all backedges */
1312 void free_loop_information(ir_graph *irg) {
1313   /* We can not use this recursion, as the loop might contain
1314      illegal nodes by now.  Why else would we throw away the
1315      representation?
1316   if (get_irg_loop(irg)) loop_reset_backedges(get_irg_loop(irg));
1317   */
1318   irg_walk_graph(irg, loop_reset_node, NULL, NULL);
1319   set_irg_loop(irg, NULL);
1320   set_irg_loopinfo_state(current_ir_graph, loopinfo_none);
1321   /* We cannot free the loop nodes, they are on the obstack. */
1322 }
1323
1324
1325 void free_all_loop_information (void) {
1326   int i;
1327   int rem = get_interprocedural_view();
1328   set_interprocedural_view(1);  /* To visit all filter nodes */
1329   for (i = 0; i < get_irp_n_irgs(); i++) {
1330     free_loop_information(get_irp_irg(i));
1331   }
1332   set_interprocedural_view(rem);
1333 }
1334
1335
1336
1337
1338
1339 /* Debug stuff *************************************************/
1340
1341 static int test_loop_node(ir_loop *l) {
1342   int i, has_node = 0, found_problem = 0;
1343   loop_element le;
1344
1345   assert(l && l->kind == k_ir_loop);
1346
1347   if (get_loop_n_elements(l) == 0) {
1348     found_problem = 1;
1349     dump_loop(l, "-ha");
1350   }
1351
1352   le = get_loop_element(l, 0);
1353   if (*(le.kind) != k_ir_node) {
1354     assert(le.kind && *(le.kind) == k_ir_loop);
1355
1356     found_problem = 1;
1357     dump_loop(l, "-ha");
1358   }
1359
1360   if ((*(le.kind) == k_ir_node) && !is_possible_loop_head(le.node)) {
1361     found_problem = 1;
1362     dump_loop(l, "-ha");
1363   }
1364
1365   if ((get_loop_depth(l) != 0) &&
1366       (*(le.kind) == k_ir_node) && !has_backedges(le.node)) {
1367     found_problem = 1;
1368     dump_loop(l, "-ha");
1369   }
1370
1371   /* Recur */
1372   has_node = 0;
1373   for (i = 0; i < get_loop_n_elements(l); ++i) {
1374     le = get_loop_element(l, i);
1375     if (*(le.kind) == k_ir_node)
1376       has_node++;
1377     else
1378       if (test_loop_node(le.son)) found_problem = 1;
1379   }
1380
1381   if (has_node == 0) {
1382     found_problem = 1;
1383     dump_loop(l, "-ha");
1384   }
1385
1386   return found_problem;
1387 }
1388
1389 /** Prints all loop nodes that
1390  *  - do not have any firm nodes, only loop sons
1391  *  - the header is not a Phi, Block or Filter.
1392  */
1393 void find_strange_loop_nodes(ir_loop *l) {
1394   int found_problem = 0;
1395   found_problem = test_loop_node(l);
1396   printf("Finished Test\n\n");
1397   if (found_problem) exit(0);
1398
1399 }
1400
1401 /* ------------------------------------------------------------------- */
1402 /* Simple analyses based on the loop information                       */
1403 /* ------------------------------------------------------------------- */
1404
1405 int is_loop_variant(ir_loop *l, ir_loop *b) {
1406   int i, n_elems;
1407
1408   if (l == b) return 1;
1409
1410   n_elems = get_loop_n_elements(l);
1411   for (i = 0; i < n_elems; ++i) {
1412     loop_element e = get_loop_element(l, i);
1413     if (is_ir_loop(e.kind))
1414       if (is_loop_variant(e.son, b))
1415         return 1;
1416   }
1417
1418   return 0;
1419 }
1420
1421 /* Test whether a value is loop invariant.
1422  *
1423  * @param n      The node to be tested.
1424  * @param block  A block node.  We pass the block, not the loop as we must
1425  *               start off with a block loop to find all proper uses.
1426  *
1427  * Returns non-zero, if the node n is not changed in the loop block
1428  * belongs to or in inner loops of this blocks loop. */
1429 int is_loop_invariant(ir_node *n, ir_node *block) {
1430   ir_loop *l = get_irn_loop(block);
1431   ir_node *b = (is_Block(n)) ? n : get_nodes_block(n);
1432   return !is_loop_variant(l, get_irn_loop(b));
1433 }