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