fix warnings
[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   (void) env;
527   set_irn_link (n, new_scc_info());
528   clear_backedges(n);
529 }
530
531 static INLINE void
532 init_scc_common (void) {
533   current_dfn = 1;
534   loop_node_cnt = 0;
535   init_stack();
536 }
537
538 static INLINE void
539 init_scc (ir_graph *irg) {
540   init_scc_common();
541   irg_walk_graph (irg, init_node, NULL, NULL);
542   /*
543   irg_walk (irg, link_to_reg_end, NULL, NULL);
544   */
545 }
546
547 static INLINE void
548 init_ip_scc (void) {
549   init_scc_common();
550   cg_walk (init_node, NULL, NULL);
551
552 #if EXPERIMENTAL_LOOP_TREE
553   cg_walk (link_to_reg_end, NULL, NULL);
554 #endif
555 }
556
557 /* Condition for breaking the recursion. */
558 static int is_outermost_Start(ir_node *n) {
559   /* Test whether this is the outermost Start node.  If so
560      recursion must end. */
561   if ((get_irn_op(n) == op_Block)     &&
562       (get_Block_n_cfgpreds(n) == 1)  &&
563       (get_irn_op(skip_Proj(get_Block_cfgpred(n, 0))) == op_Start) &&
564       (get_nodes_block(skip_Proj(get_Block_cfgpred(n, 0))) == n)) {
565     return 1;
566   }
567 #if 0
568   /*  @@@ Bad condition:
569       not possible in interprocedural view as outermost_graph is
570       not necessarily the only with a dead-end start block.
571       Besides current_ir_graph is not set properly. */
572   if ((get_irn_op(n) == op_Block) &&
573       (n == get_irg_start_block(current_ir_graph))) {
574     if ((!get_interprocedural_view())  ||
575     (current_ir_graph == outermost_ir_graph))
576       return 1;
577   }
578 #endif
579   return 0;
580 }
581
582 /* When to walk from nodes to blocks. Only for Control flow operations? */
583 static INLINE int
584 get_start_index(ir_node *n) {
585 #undef BLOCK_BEFORE_NODE
586 #define BLOCK_BEFORE_NODE 1
587
588 #if BLOCK_BEFORE_NODE
589
590   /* This version assures, that all nodes are ordered absolutely.  This allows
591      to undef all nodes in the heap analysis if the block is false, which means
592      not reachable.
593      I.e., with this code, the order on the loop tree is correct. But a (single)
594      test showed the loop tree is deeper.   */
595   if (get_irn_op(n) == op_Phi   ||
596       get_irn_op(n) == op_Block ||
597       (get_irn_op(n) == op_Filter && get_interprocedural_view()) ||
598       (get_irg_pinned(get_irn_irg(n)) == op_pin_state_floats &&
599        get_irn_pinned(n) == op_pin_state_floats))
600     // Here we could test for backedge at -1 which is illegal
601     return 0;
602   else
603     return -1;
604
605 #else
606
607   /* This version causes deeper loop trees (at least we verified this
608      for Polymor).
609      But it guarantees that Blocks are analysed before nodes contained in the
610      block.  If so, we can set the value to undef if the block is not \
611      executed. */
612    if (is_cfop(n) || is_fragile_op(n) || get_irn_op(n) == op_Start)
613      return -1;
614    else
615      return 0;
616
617 #endif
618 }
619
620 /* Test for legal loop header: Block, Phi, ... */
621 static INLINE int is_possible_loop_head(ir_node *n) {
622   ir_op *op = get_irn_op(n);
623   return ((op == op_Block) ||
624           (op == op_Phi) ||
625           ((op == op_Filter) && get_interprocedural_view()));
626 }
627
628 /* Returns non-zero if n is a loop header, i.e., it is a Block, Phi
629    or Filter node and has predecessors within the loop and out
630    of the loop.
631    @arg root: only needed for assertion. */
632 static int
633 is_head (ir_node *n, ir_node *root)
634 {
635   int i, arity;
636   int some_outof_loop = 0, some_in_loop = 0;
637
638   /* Test for legal loop header: Block, Phi, ... */
639   if (!is_possible_loop_head(n))
640     return 0;
641
642   if (!is_outermost_Start(n)) {
643     arity = get_irn_arity(n);
644     for (i = get_start_index(n); i < arity; i++) {
645       ir_node *pred = get_irn_n(n, i);
646       assert(pred);
647       if (is_backedge(n, i)) continue;
648       if (!irn_is_in_stack(pred)) {
649         some_outof_loop = 1;
650       } else {
651         if(get_irn_uplink(pred) < get_irn_uplink(root)) {
652           assert(get_irn_uplink(pred) >= get_irn_uplink(root));
653         }
654         some_in_loop = 1;
655       }
656     }
657   }
658   return some_outof_loop && some_in_loop;
659 }
660
661 /**
662  * Returns non-zero if n is possible loop head of an endless loop.
663  * I.e., it is a Block, Phi or Filter node and has only predecessors
664  * within the loop.
665  * @param root: only needed for assertion.
666  */
667 static int
668 is_endless_head (ir_node *n, ir_node *root)
669 {
670   int i, arity;
671   int some_outof_loop = 0, some_in_loop = 0;
672
673   /* Test for legal loop header: Block, Phi, ... */
674   if (!is_possible_loop_head(n))
675     return 0;
676
677   if (!is_outermost_Start(n)) {
678     arity = get_irn_arity(n);
679     for (i = get_start_index(n); i < arity; i++) {
680       ir_node *pred = get_irn_n(n, i);
681       assert(pred);
682       if (is_backedge(n, i)) { continue; }
683       if (!irn_is_in_stack(pred)) {
684         some_outof_loop = 1; //printf(" some out of loop ");
685       } else {
686         if(get_irn_uplink(pred) < get_irn_uplink(root)) {
687           assert(get_irn_uplink(pred) >= get_irn_uplink(root));
688         }
689         some_in_loop = 1;
690       }
691     }
692   }
693   return !some_outof_loop && some_in_loop;
694 }
695
696 /* Returns index of the predecessor with the smallest dfn number
697    greater-equal than limit. */
698 static int
699 smallest_dfn_pred (ir_node *n, int limit)
700 {
701   int i, index = -2, min = -1;
702
703   if (!is_outermost_Start(n)) {
704     int arity = get_irn_arity(n);
705     for (i = get_start_index(n); i < arity; i++) {
706       ir_node *pred = get_irn_n(n, i);
707       assert(pred);
708       if (is_backedge(n, i) || !irn_is_in_stack(pred)) continue;
709       if (get_irn_dfn(pred) >= limit && (min == -1 || get_irn_dfn(pred) < min)) {
710         index = i;
711         min = get_irn_dfn(pred);
712       }
713     }
714   }
715   return index;
716 }
717
718 /* Returns index of the predecessor with the largest dfn number. */
719 static int
720 largest_dfn_pred (ir_node *n)
721 {
722   int i, index = -2, max = -1;
723
724   if (!is_outermost_Start(n)) {
725     int arity = get_irn_arity(n);
726     for (i = get_start_index(n); i < arity; i++) {
727       ir_node *pred = get_irn_n(n, i);
728       if (is_backedge (n, i) || !irn_is_in_stack(pred)) continue;
729       if (get_irn_dfn(pred) > max) {
730         index = i;
731         max = get_irn_dfn(pred);
732       }
733     }
734   }
735   return index;
736 }
737
738 /** Searches the stack for possible loop heads.  Tests these for backedges.
739     If it finds a head with an unmarked backedge it marks this edge and
740     returns the tail of the loop.
741     If it finds no backedge returns NULL.
742     ("disable_backedge" in fiasco)
743 *
744 *  @param n  A node where uplink == dfn.
745 **/
746
747 static ir_node *
748 find_tail (ir_node *n) {
749   ir_node *m;
750   int i, res_index = -2;
751
752   /*
753     if (!icfg && rm_cyclic_phis && remove_cyclic_phis (n)) return NULL;
754   */
755   m = stack[tos-1];  /* tos = top of stack */
756   if (is_head (m, n)) {
757     res_index = smallest_dfn_pred(m, 0);
758     if ((res_index == -2) &&  /* no smallest dfn pred found. */
759     (n ==  m))
760       return NULL;
761   } else {
762     if (m == n) return NULL;    // Is this to catch Phi - self loops?
763     for (i = tos-2; i >= 0; --i) {
764       m = stack[i];
765
766       if (is_head (m, n)) {
767         res_index = smallest_dfn_pred (m, get_irn_dfn(m) + 1);
768         if (res_index == -2)  /* no smallest dfn pred found. */
769           res_index = largest_dfn_pred (m);
770
771         if ((m == n) && (res_index == -2)) {  /* dont walk past loop head. */
772           i = -1;
773         }
774         break;
775       }
776
777       /* We should not walk past our selves on the stack:  The upcoming nodes
778          are not in this loop. We assume a loop not reachable from Start. */
779       if (m == n) {
780         i = -1;
781         break;
782       }
783
784     }
785
786     if (i < 0) {
787       /* A dead loop not reachable from Start. */
788       for (i = tos-2; i >= 0; --i) {
789         m = stack[i];
790         if (is_endless_head (m, n)) {
791           res_index = smallest_dfn_pred (m, get_irn_dfn(m) + 1);
792           if (res_index == -2)  /* no smallest dfn pred found. */
793             res_index = largest_dfn_pred (m);
794           break;
795         }
796         if (m == n) { break; }  /* It's not an unreachable loop, either. */
797       }
798       //assert(0 && "no head found on stack");
799     }
800
801   }
802   if (res_index <= -2) {
803     /* It's a completely bad loop: without Phi/Block nodes that can
804        be a head. I.e., the code is "dying".  We break the loop by
805        setting Bad nodes. */
806     int arity = get_irn_arity(n);
807     for (i = -1; i < arity; ++i) {
808       set_irn_n(n, i, get_irg_bad(get_irn_irg(n)));
809     }
810     return NULL;
811   }
812   assert (res_index > -2);
813
814   set_backedge (m, res_index);
815   return is_outermost_Start(n) ? NULL : get_irn_n(m, res_index);
816 }
817
818
819 #if EXPERIMENTAL_LOOP_TREE
820
821 /*  ----------------------------------------------------------------
822     AS:  This is experimental code to build loop trees suitable for
823     the heap analysis. Does not work correctly right now... :-(
824
825
826     Search in stack for the corresponding first Call-End-ProjX that
827     corresponds to one of the control flow predecessors of the given
828     block, that is the possible callers.
829     returns: the control predecessor to chose\
830     or       -1 if no corresponding Call-End-Node could be found
831              on the stack.
832     - -------------------------------------------------------------- */
833
834 int search_endproj_in_stack(ir_node *start_block)
835 {
836   int i, j;
837   assert(is_Block(start_block));
838   for(i = tos - 1; i >= 0; --i)
839   {
840     if(get_irn_op(stack[i]) == op_Proj && get_irn_mode(stack[i]) == mode_X &&
841        get_irn_op(get_irn_n(stack[i], 0)) == op_EndReg)
842     {
843       printf("FOUND PROJ!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
844       ir_node *end_projx = stack[i];
845
846       int arity = get_irn_arity(start_block);
847       for(j = 0; j < arity; j++)
848       {
849         ir_node *begin_projx = get_Block_cfgpred(get_irg_start_block(get_irn_irg(end_projx)),
850                                                  get_Proj_proj(end_projx));
851         if(get_irn_n(start_block, j) == begin_projx)
852               {
853                 printf("FOUND IT!!!!!!!!!!!!!!!!!!\n");
854                 return(j);
855               }
856       }
857     }
858   }
859   return(-1);
860 }
861
862
863 static pmap *projx_link = NULL;
864
865 void link_to_reg_end (ir_node *n, void *env) {
866   if(get_irn_op(n) == op_Proj &&
867      get_irn_mode(n) == mode_X &&
868      get_irn_op(get_irn_n(n, 0)) == op_EndReg) {
869       /* Reg End Projx -> Find the CallBegin Projx and hash it */
870       ir_node *end_projx = n;
871       ir_node *begin_projx = get_Block_cfgpred(get_irg_start_block(get_irn_irg(end_projx)),
872                                                get_Proj_proj(end_projx));
873       set_projx_link(begin_projx, end_projx);
874     }
875 }
876
877 void set_projx_link(ir_node *cb_projx, ir_node *end_projx)
878 {
879   if(projx_link == NULL)
880     projx_link = pmap_create();
881   pmap_insert(projx_link, (void *)cb_projx, (void *)end_projx);
882 }
883
884 ir_node *get_projx_link(ir_node *cb_projx)
885 {
886   return((ir_node *) pmap_get(projx_link, (void *)cb_projx));
887 }
888
889 #endif
890
891 static INLINE int
892 is_outermost_loop(ir_loop *l) {
893   return l == get_loop_outer_loop(l);
894 }
895
896
897 /*-----------------------------------------------------------*
898  *                   The core algorithm.                     *
899  *-----------------------------------------------------------*/
900
901 static void scc (ir_node *n) {
902   int i;
903   if (irn_visited(n)) return;
904   mark_irn_visited(n);
905
906   /* Initialize the node */
907   set_irn_dfn(n, current_dfn);      /* Depth first number for this node */
908   set_irn_uplink(n, current_dfn);   /* ... is default uplink. */
909   set_irn_loop(n, NULL);
910   current_dfn ++;
911   push(n);
912
913   /* AS: get_start_index might return -1 for Control Flow Nodes, and thus a negative
914      array index would be passed to is_backedge(). But CFG Nodes dont't have a backedge array,
915      so is_backedge does not access array[-1] but correctly returns false! */
916
917   if (!is_outermost_Start(n)) {
918     int arity = get_irn_arity(n);
919
920     for (i = get_start_index(n); i < arity; i++) {
921       ir_node *m;
922       if (is_backedge(n, i)) continue;
923       m = get_irn_n(n, i); /* get_irn_ip_pred(n, i); */
924       /* if ((!m) || (get_irn_op(m) == op_Unknown)) continue; */
925       scc (m);
926       if (irn_is_in_stack(m)) {
927         /* Uplink of m is smaller if n->m is a backedge.
928            Propagate the uplink to mark the loop. */
929         if (get_irn_uplink(m) < get_irn_uplink(n))
930           set_irn_uplink(n, get_irn_uplink(m));
931       }
932     }
933   }
934
935   if (get_irn_dfn(n) == get_irn_uplink(n)) {
936     /* This condition holds for
937        1) the node with the incoming backedge.
938           That is: We found a loop!
939        2) Straight line code, because no uplink has been propagated, so the
940           uplink still is the same as the dfn.
941
942        But n might not be a proper loop head for the analysis. Proper loop
943        heads are Block and Phi nodes. find_tail searches the stack for
944        Block's and Phi's and takes those nodes as loop heads for the current
945        loop instead and marks the incoming edge as backedge. */
946
947     ir_node *tail = find_tail(n);
948     if (tail) {
949       /* We have a loop, that is no straight line code,
950          because we found a loop head!
951          Next actions: Open a new loop on the loop tree and
952                        try to find inner loops */
953
954 #if NO_LOOPS_WITHOUT_HEAD
955       /* This is an adaption of the algorithm from fiasco / optscc to
956        * avoid loops without Block or Phi as first node.  This should
957        * severely reduce the number of evaluations of nodes to detect
958        * a fixpoint in the heap analysis.
959        * Further it avoids loops without firm nodes that cause errors
960        * in the heap analyses.
961        * But attention:  don't do it for the outermost loop:  This loop
962        * is not iterated.  A first block can be a loop head in case of
963        * an endless recursion. */
964
965       ir_loop *l;
966       int close;
967       if ((get_loop_n_elements(current_loop) > 0) || (is_outermost_loop(current_loop))) {
968         l = new_loop();
969         close = 1;
970       } else {
971         l = current_loop;
972         close = 0;
973       }
974 #else
975       ir_loop *l = new_loop();
976 #endif
977
978       /* Remove the loop from the stack ... */
979       pop_scc_unmark_visit (n);
980
981       /* The current backedge has been marked, that is temporarily eliminated,
982          by find tail. Start the scc algorithm
983          anew on the subgraph that is left (the current loop without the backedge)
984          in order to find more inner loops. */
985       scc (tail);
986
987       assert (irn_visited(n));
988 #if NO_LOOPS_WITHOUT_HEAD
989       if (close)
990 #endif
991         close_loop(l);
992     }
993     else
994     {
995       /* No loop head was found, that is we have straightline code.
996          Pop all nodes from the stack to the current loop. */
997       pop_scc_to_loop(n);
998     }
999   }
1000 }
1001
1002 static void my_scc (ir_node *n) {
1003   int i;
1004   if (irn_visited(n)) return;
1005   mark_irn_visited(n);
1006
1007   /* Initialize the node */
1008   set_irn_dfn(n, current_dfn);      /* Depth first number for this node */
1009   set_irn_uplink(n, current_dfn);   /* ... is default uplink. */
1010   set_irn_loop(n, NULL);
1011   current_dfn ++;
1012   push(n);
1013
1014   /* AS: get_start_index might return -1 for Control Flow Nodes, and thus a negative
1015      array index would be passed to is_backedge(). But CFG Nodes dont't have a backedge array,
1016      so is_backedge does not access array[-1] but correctly returns false! */
1017
1018   if (!is_outermost_Start(n)) {
1019     int arity = get_irn_arity(n);
1020
1021     for (i = get_start_index(n); i < arity; i++) {
1022       ir_node *m;
1023       if (is_backedge(n, i)) continue;
1024       m = get_irn_n(n, i); /* get_irn_ip_pred(n, i); */
1025       /* if ((!m) || (get_irn_op(m) == op_Unknown)) continue; */
1026       my_scc (m);
1027       if (irn_is_in_stack(m)) {
1028         /* Uplink of m is smaller if n->m is a backedge.
1029            Propagate the uplink to mark the loop. */
1030         if (get_irn_uplink(m) < get_irn_uplink(n))
1031           set_irn_uplink(n, get_irn_uplink(m));
1032       }
1033     }
1034   }
1035
1036   if (get_irn_dfn(n) == get_irn_uplink(n)) {
1037     /* This condition holds for
1038        1) the node with the incoming backedge.
1039           That is: We found a loop!
1040        2) Straight line code, because no uplink has been propagated, so the
1041           uplink still is the same as the dfn.
1042
1043        But n might not be a proper loop head for the analysis. Proper loop
1044        heads are Block and Phi nodes. find_tail searches the stack for
1045        Block's and Phi's and takes those nodes as loop heads for the current
1046        loop instead and marks the incoming edge as backedge. */
1047
1048     ir_node *tail = find_tail(n);
1049     if (tail) {
1050       /* We have a loop, that is no straight line code,
1051          because we found a loop head!
1052          Next actions: Open a new loop on the loop tree and
1053                        try to find inner loops */
1054
1055 #if NO_LOOPS_WITHOUT_HEAD
1056       /* This is an adaption of the algorithm from fiasco / optscc to
1057        * avoid loops without Block or Phi as first node.  This should
1058        * severely reduce the number of evaluations of nodes to detect
1059        * a fixpoint in the heap analysis.
1060        * Further it avoids loops without firm nodes that cause errors
1061        * in the heap analyses. */
1062
1063       ir_loop *l;
1064       int close;
1065       if ((get_loop_n_elements(current_loop) > 0) || (is_outermost_loop(current_loop))) {
1066         l = new_loop();
1067         close = 1;
1068       } else {
1069         l = current_loop;
1070         close = 0;
1071       }
1072 #else
1073       ir_loop *l = new_loop();
1074 #endif
1075
1076       /* Remove the loop from the stack ... */
1077       pop_scc_unmark_visit (n);
1078
1079       /* The current backedge has been marked, that is temporarily eliminated,
1080          by find tail. Start the scc algorithm
1081          anew on the subgraph that is left (the current loop without the backedge)
1082          in order to find more inner loops. */
1083       my_scc (tail);
1084
1085       assert (irn_visited(n));
1086 #if NO_LOOPS_WITHOUT_HEAD
1087       if (close)
1088 #endif
1089         close_loop(l);
1090     }
1091     else
1092     {
1093       /* No loop head was found, that is we have straightline code.
1094          Pop all nodes from the stack to the current loop. */
1095       pop_scc_to_loop(n);
1096     }
1097   }
1098 }
1099
1100 /* Constructs backedge information for irg. In interprocedural view constructs
1101    backedges for all methods called by irg, too. */
1102 int construct_backedges(ir_graph *irg) {
1103   ir_graph *rem = current_ir_graph;
1104   ir_loop *head_rem;
1105
1106   assert(!get_interprocedural_view() &&
1107      "not implemented, use construct_ip_backedges");
1108
1109   max_loop_depth = 0;
1110   current_ir_graph   = irg;
1111   outermost_ir_graph = irg;
1112
1113   init_scc(current_ir_graph);
1114
1115   current_loop = NULL;
1116   new_loop();  /* sets current_loop */
1117   head_rem = current_loop; /* Just for assertion */
1118
1119   inc_irg_visited(current_ir_graph);
1120
1121   scc(get_irg_end(current_ir_graph));
1122
1123   assert(head_rem == current_loop);
1124   set_irg_loop(current_ir_graph, current_loop);
1125   set_irg_loopinfo_state(current_ir_graph, loopinfo_consistent);
1126   assert(get_irg_loop(current_ir_graph)->kind == k_ir_loop);
1127   /*
1128   irg->loops = current_loop;
1129   if (icfg == 1) {
1130     int count = 0;
1131     int depth = 0;
1132     count_loop (the_loop, &count, &depth);
1133     }
1134   }
1135   */
1136   current_ir_graph = rem;
1137
1138   return max_loop_depth;
1139 }
1140
1141
1142 int construct_ip_backedges (void) {
1143   ir_graph *rem = current_ir_graph;
1144   int rem_ipv = get_interprocedural_view();
1145   int i;
1146
1147   max_loop_depth = 0;
1148   assert(get_irp_ip_view_state() == ip_view_valid);
1149
1150   outermost_ir_graph = get_irp_main_irg();
1151
1152   init_ip_scc();
1153
1154   current_loop = NULL;
1155   new_loop();  /* sets current_loop */
1156   set_interprocedural_view(1);
1157
1158   inc_max_irg_visited();
1159   for (i = 0; i < get_irp_n_irgs(); i++)
1160     set_irg_visited(get_irp_irg(i), get_max_irg_visited());
1161
1162   /** We have to start the walk at the same nodes as cg_walk. **/
1163   /* Walk starting at unreachable procedures. Only these
1164    * have End blocks visible in interprocedural view. */
1165   for (i = 0; i < get_irp_n_irgs(); i++) {
1166     ir_node *sb;
1167     current_ir_graph = get_irp_irg(i);
1168
1169     sb = get_irg_start_block(current_ir_graph);
1170
1171     if ((get_Block_n_cfgpreds(sb) > 1) ||
1172     (get_nodes_block(get_Block_cfgpred(sb, 0)) != sb)) continue;
1173
1174     scc(get_irg_end(current_ir_graph));
1175   }
1176
1177   /* Check whether we walked all procedures: there could be procedures
1178      with cyclic calls but no call from the outside. */
1179   for (i = 0; i < get_irp_n_irgs(); i++) {
1180     ir_node *sb;
1181     current_ir_graph = get_irp_irg(i);
1182
1183     /* Test start block: if inner procedure end and end block are not
1184      * visible and therefore not marked. */
1185     sb = get_irg_start_block(current_ir_graph);
1186     if (get_irn_visited(sb) < get_irg_visited(current_ir_graph)) scc(sb);
1187   }
1188
1189   /* Walk all endless loops in inner procedures.
1190    * We recognize an inner procedure if the End node is not visited. */
1191   for (i = 0; i < get_irp_n_irgs(); i++) {
1192     ir_node *e;
1193     current_ir_graph = get_irp_irg(i);
1194
1195     e = get_irg_end(current_ir_graph);
1196     if (get_irn_visited(e) < get_irg_visited(current_ir_graph)) {
1197       int j;
1198       /* Don't visit the End node. */
1199       for (j = 0; j < get_End_n_keepalives(e); j++) scc(get_End_keepalive(e, j));
1200     }
1201   }
1202
1203   set_irg_loop(outermost_ir_graph, current_loop);
1204   set_irg_loopinfo_state(current_ir_graph, loopinfo_ip_consistent);
1205   assert(get_irg_loop(outermost_ir_graph)->kind == k_ir_loop);
1206
1207   current_ir_graph = rem;
1208   set_interprocedural_view(rem_ipv);
1209   return max_loop_depth;
1210 }
1211
1212 void my_construct_ip_backedges (void) {
1213   ir_graph *rem = current_ir_graph;
1214   int rem_ipv = get_interprocedural_view();
1215   int i;
1216
1217   assert(get_irp_ip_view_state() == ip_view_valid);
1218
1219   outermost_ir_graph = get_irp_main_irg();
1220
1221   init_ip_scc();
1222
1223   current_loop = NULL;
1224   new_loop();  /* sets current_loop */
1225   set_interprocedural_view(1);
1226
1227   inc_max_irg_visited();
1228   for (i = 0; i < get_irp_n_irgs(); i++)
1229     set_irg_visited(get_irp_irg(i), get_max_irg_visited());
1230
1231   /** We have to start the walk at the same nodes as cg_walk. **/
1232   /* Walk starting at unreachable procedures. Only these
1233    * have End blocks visible in interprocedural view. */
1234   for (i = 0; i < get_irp_n_irgs(); i++) {
1235     ir_node *sb;
1236     current_ir_graph = get_irp_irg(i);
1237
1238     sb = get_irg_start_block(current_ir_graph);
1239
1240     if ((get_Block_n_cfgpreds(sb) > 1) ||
1241     (get_nodes_block(get_Block_cfgpred(sb, 0)) != sb)) continue;
1242
1243     my_scc(get_irg_end(current_ir_graph));
1244   }
1245
1246   /* Check whether we walked all procedures: there could be procedures
1247      with cyclic calls but no call from the outside. */
1248   for (i = 0; i < get_irp_n_irgs(); i++) {
1249     ir_node *sb;
1250     current_ir_graph = get_irp_irg(i);
1251
1252     /* Test start block: if inner procedure end and end block are not
1253      * visible and therefore not marked. */
1254     sb = get_irg_start_block(current_ir_graph);
1255     if (get_irn_visited(sb) < get_irg_visited(current_ir_graph)) scc(sb);
1256   }
1257
1258   /* Walk all endless loops in inner procedures.
1259    * We recognize an inner procedure if the End node is not visited. */
1260   for (i = 0; i < get_irp_n_irgs(); i++) {
1261     ir_node *e;
1262     current_ir_graph = get_irp_irg(i);
1263
1264     e = get_irg_end(current_ir_graph);
1265     if (get_irn_visited(e) < get_irg_visited(current_ir_graph)) {
1266       int j;
1267       /* Don't visit the End node. */
1268       for (j = 0; j < get_End_n_keepalives(e); j++) scc(get_End_keepalive(e, j));
1269     }
1270   }
1271
1272   set_irg_loop(outermost_ir_graph, current_loop);
1273   set_irg_loopinfo_state(current_ir_graph, loopinfo_ip_consistent);
1274   assert(get_irg_loop(outermost_ir_graph)->kind == k_ir_loop);
1275
1276   current_ir_graph = rem;
1277   set_interprocedural_view(rem_ipv);
1278 }
1279
1280 static void reset_backedges(ir_node *n) {
1281   if (is_possible_loop_head(n)) {
1282     int rem = get_interprocedural_view();
1283
1284     set_interprocedural_view(1);
1285     clear_backedges(n);
1286     set_interprocedural_view(1);
1287     clear_backedges(n);
1288     set_interprocedural_view(rem);
1289   }
1290 }
1291
1292
1293 /*
1294 static void loop_reset_backedges(ir_loop *l) {
1295   int i;
1296   reset_backedges(get_loop_node(l, 0));
1297   for (i = 0; i < get_loop_n_nodes(l); ++i)
1298     set_irn_loop(get_loop_node(l, i), NULL);
1299   for (i = 0; i < get_loop_n_sons(l); ++i) {
1300     loop_reset_backedges(get_loop_son(l, i));
1301   }
1302 }
1303 */
1304
1305 static void loop_reset_node(ir_node *n, void *env) {
1306   (void) env;
1307   set_irn_loop(n, NULL);
1308   reset_backedges(n);
1309 }
1310
1311
1312 /** Removes all loop information.
1313     Resets all backedges */
1314 void free_loop_information(ir_graph *irg) {
1315   /* We can not use this recursion, as the loop might contain
1316      illegal nodes by now.  Why else would we throw away the
1317      representation?
1318   if (get_irg_loop(irg)) loop_reset_backedges(get_irg_loop(irg));
1319   */
1320   irg_walk_graph(irg, loop_reset_node, NULL, NULL);
1321   set_irg_loop(irg, NULL);
1322   set_irg_loopinfo_state(current_ir_graph, loopinfo_none);
1323   /* We cannot free the loop nodes, they are on the obstack. */
1324 }
1325
1326
1327 void free_all_loop_information (void) {
1328   int i;
1329   int rem = get_interprocedural_view();
1330   set_interprocedural_view(1);  /* To visit all filter nodes */
1331   for (i = 0; i < get_irp_n_irgs(); i++) {
1332     free_loop_information(get_irp_irg(i));
1333   }
1334   set_interprocedural_view(rem);
1335 }
1336
1337
1338
1339
1340
1341 /* Debug stuff *************************************************/
1342
1343 static int test_loop_node(ir_loop *l) {
1344   int i, has_node = 0, found_problem = 0;
1345   loop_element le;
1346
1347   assert(l && l->kind == k_ir_loop);
1348
1349   if (get_loop_n_elements(l) == 0) {
1350     found_problem = 1;
1351     dump_loop(l, "-ha");
1352   }
1353
1354   le = get_loop_element(l, 0);
1355   if (*(le.kind) != k_ir_node) {
1356     assert(le.kind && *(le.kind) == k_ir_loop);
1357
1358     found_problem = 1;
1359     dump_loop(l, "-ha");
1360   }
1361
1362   if ((*(le.kind) == k_ir_node) && !is_possible_loop_head(le.node)) {
1363     found_problem = 1;
1364     dump_loop(l, "-ha");
1365   }
1366
1367   if ((get_loop_depth(l) != 0) &&
1368       (*(le.kind) == k_ir_node) && !has_backedges(le.node)) {
1369     found_problem = 1;
1370     dump_loop(l, "-ha");
1371   }
1372
1373   /* Recur */
1374   has_node = 0;
1375   for (i = 0; i < get_loop_n_elements(l); ++i) {
1376     le = get_loop_element(l, i);
1377     if (*(le.kind) == k_ir_node)
1378       has_node++;
1379     else
1380       if (test_loop_node(le.son)) found_problem = 1;
1381   }
1382
1383   if (has_node == 0) {
1384     found_problem = 1;
1385     dump_loop(l, "-ha");
1386   }
1387
1388   return found_problem;
1389 }
1390
1391 /** Prints all loop nodes that
1392  *  - do not have any firm nodes, only loop sons
1393  *  - the header is not a Phi, Block or Filter.
1394  */
1395 void find_strange_loop_nodes(ir_loop *l) {
1396   int found_problem = 0;
1397   found_problem = test_loop_node(l);
1398   printf("Finished Test\n\n");
1399   if (found_problem) exit(0);
1400
1401 }
1402
1403 /* ------------------------------------------------------------------- */
1404 /* Simple analyses based on the loop information                       */
1405 /* ------------------------------------------------------------------- */
1406
1407 int is_loop_variant(ir_loop *l, ir_loop *b) {
1408   int i, n_elems;
1409
1410   if (l == b) return 1;
1411
1412   n_elems = get_loop_n_elements(l);
1413   for (i = 0; i < n_elems; ++i) {
1414     loop_element e = get_loop_element(l, i);
1415     if (is_ir_loop(e.kind))
1416       if (is_loop_variant(e.son, b))
1417         return 1;
1418   }
1419
1420   return 0;
1421 }
1422
1423 /* Test whether a value is loop invariant.
1424  *
1425  * @param n      The node to be tested.
1426  * @param block  A block node.  We pass the block, not the loop as we must
1427  *               start off with a block loop to find all proper uses.
1428  *
1429  * Returns non-zero, if the node n is not changed in the loop block
1430  * belongs to or in inner loops of this blocks loop. */
1431 int is_loop_invariant(ir_node *n, ir_node *block) {
1432   ir_loop *l = get_irn_loop(block);
1433   ir_node *b = (is_Block(n)) ? n : get_nodes_block(n);
1434   return !is_loop_variant(l, get_irn_loop(b));
1435 }