Clean up need_constraint_copy().
[libfirm] / ir / ana / irscc.c
1 /*
2  * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief    Compute the strongly connected regions and build
23  *              backedge/loop datastructures.
24  *              A variation on the Tarjan algorithm. See also [Trapp:99],
25  *              Chapter 5.2.1.2.
26  * @author   Goetz Lindenmaier
27  * @date     7.2002
28  * @version  $Id$
29  */
30 #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 "irdump.h"
48 #include "array.h"
49 #include "pmap.h"
50
51 /* A variant of the loop tree that avoids loops without head.
52    This reduces the depth of the loop tree. */
53 #define NO_LOOPS_WITHOUT_HEAD 1
54
55 /** The outermost graph the scc is computed for. */
56 static ir_graph *outermost_ir_graph;
57 /** Current loop construction is working on. */
58 static ir_loop *current_loop;
59 /** Counts the number of allocated loop nodes.
60  *  Each loop node gets a unique number.
61  *  @todo What for? ev. remove.
62  */
63 static int loop_node_cnt = 0;
64 /** Counter to generate depth first numbering of visited nodes. */
65 static int current_dfn = 1;
66
67 static int max_loop_depth = 0;
68
69 void link_to_reg_end(ir_node *n, void *env);
70 void set_projx_link(ir_node *cb_projx, ir_node *end_projx);
71 ir_node *get_projx_link(ir_node *cb_projx);
72
73 /**********************************************************************/
74 /* Node attributes                                                   **/
75 /**********************************************************************/
76
77 /**********************************************************************/
78 /* Node attributes needed for the construction.                      **/
79 /**********************************************************************/
80
81 typedef struct scc_info {
82         int in_stack;          /**< Marks whether node is on the stack. */
83         int dfn;               /**< Depth first search number. */
84         int uplink;            /**< dfn number of ancestor. */
85         /*  ir_loop *loop;         *//* Refers to the containing loop. */
86         /*
87             struct section *section;
88             xset def;
89             xset use;
90         */
91 } scc_info;
92
93 /**
94  * Allocates a new SCC info on the given obstack.
95  */
96 static INLINE scc_info *new_scc_info(struct obstack *obst) {
97         scc_info *info = obstack_alloc(obst, sizeof(*info));
98         memset(info, 0, sizeof(*info));
99         return info;
100 }
101
102 /**
103  * Mark node n being on the SCC stack.
104  */
105 static INLINE void mark_irn_in_stack(ir_node *n) {
106         scc_info *scc = get_irn_link(n);
107         assert(scc);
108         scc->in_stack = 1;
109 }
110
111 /**
112 * Mark node n NOT being on the SCC stack.
113 */
114 static INLINE void mark_irn_not_in_stack(ir_node *n) {
115         scc_info *scc = get_irn_link(n);
116         assert(scc);
117         scc->in_stack = 0;
118 }
119
120 /**
121  * Checks if a node is on the SCC stack.
122  */
123 static INLINE int irn_is_in_stack(ir_node *n) {
124         scc_info *scc = get_irn_link(n);
125         assert(scc);
126         return scc->in_stack;
127 }
128
129 /**
130  * Sets the uplink number for a node.
131  */
132 static INLINE void set_irn_uplink(ir_node *n, int uplink) {
133         scc_info *scc = get_irn_link(n);
134         assert(scc);
135         scc->uplink = uplink;
136 }
137
138 /**
139  * Returns the uplink number for a node.
140  */
141 static int get_irn_uplink(ir_node *n) {
142         scc_info *scc = get_irn_link(n);
143         assert(scc);
144         return scc->uplink;
145 }
146
147 /**
148  * Sets the depth-first-search number for a node.
149  */
150 static INLINE void set_irn_dfn(ir_node *n, int dfn) {
151         scc_info *scc = get_irn_link(n);
152         assert(scc);
153         scc->dfn = dfn;
154 }
155
156 /**
157  * Returns the depth-first-search number of a node.
158  */
159 static int get_irn_dfn(ir_node *n) {
160         scc_info *scc = get_irn_link(n);
161         assert(scc);
162         return scc->dfn;
163 }
164
165 #if 0
166 static ir_loop *find_nodes_loop(ir_node *n, ir_loop *l) {
167         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 /**
201  * initializes the stack
202  */
203 static INLINE void init_stack(void) {
204         if (stack) {
205                 ARR_RESIZE(ir_node *, stack, 1000);
206         } else {
207                 stack = NEW_ARR_F(ir_node *, 1000);
208         }
209         tos = 0;
210 }
211
212 /**
213  * Frees the stack.
214  */
215 static void finish_stack(void) {
216         DEL_ARR_F(stack);
217         stack = NULL;
218 }
219
220 /**
221  * push a node onto the stack
222  *
223  * @param n  The node to push
224  */
225 static INLINE void push(ir_node *n) {
226         if (tos == ARR_LEN(stack)) {
227                 int nlen = ARR_LEN(stack) * 2;
228                 ARR_RESIZE(ir_node *, stack, nlen);
229         }
230         stack [tos++] = n;
231         mark_irn_in_stack(n);
232 }
233
234 /**
235  * pop a node from the stack
236  *
237  * @return  The topmost node
238  */
239 static INLINE ir_node *pop(void) {
240         ir_node *n = stack[--tos];
241         mark_irn_not_in_stack(n);
242         return n;
243 }
244
245 /**
246  * The nodes up to n belong to the current loop.
247  * Removes them from the stack and adds them to the current loop.
248  */
249 static INLINE void pop_scc_to_loop(ir_node *n) {
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         } while (m != n);
262
263         /* i might be bigger than 1 for dead (and that's why bad) loops */
264         /* if(i > 1)
265                 printf("Mehr als eine Iteration!!!!!!!!!!!!!!!!!!!!!!!!!!!!11111\n");
266          */
267 }
268
269 /* GL ??? my last son is my grandson???  Removes loops with no
270    ir_nodes in them.  Such loops have only another loop as son. (Why
271    can't they have two loops as sons? Does it never get that far? ) */
272 static void close_loop(ir_loop *l) {
273         int last = get_loop_n_elements(l) - 1;
274         loop_element lelement = get_loop_element(l, last);
275         ir_loop *last_son = lelement.son;
276
277         if (get_kind(last_son) == k_ir_loop &&
278                 get_loop_n_elements(last_son) == 1) {
279                         ir_loop *gson;
280
281                         lelement = get_loop_element(last_son, 0);
282                         gson = lelement.son;
283
284                         if (get_kind(gson) == k_ir_loop) {
285                                 loop_element new_last_son;
286
287                                 gson->outer_loop = l;
288                                 new_last_son.son = gson;
289                                 l->children[last] = new_last_son;
290                         }
291         }
292
293         current_loop = l;
294 }
295
296 /* Removes and unmarks all nodes up to n from the stack.
297    The nodes must be visited once more to assign them to a scc. */
298 static INLINE void pop_scc_unmark_visit(ir_node *n) {
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 static ir_loop *new_loop(void) {
314         ir_loop *father = current_loop;
315         ir_loop *son    = alloc_loop(father, outermost_ir_graph->obst);
316
317         if (son->depth > max_loop_depth) max_loop_depth = son->depth;
318         current_loop = son;
319         return father;
320 }
321
322 /**********************************************************************/
323 /* Constructing and destructing the loop/backedge information.       **/
324 /**********************************************************************/
325
326 /* Initialization steps. **********************************************/
327
328 static INLINE void init_node(ir_node *n, void *env) {
329         struct obstack *obst = env;
330         set_irn_link(n, new_scc_info(obst));
331         clear_backedges(n);
332 }
333
334 static INLINE void init_scc_common(void) {
335         current_dfn = 1;
336         loop_node_cnt = 0;
337         init_stack();
338 }
339
340 static INLINE void init_scc(ir_graph *irg, struct obstack *obst) {
341         init_scc_common();
342         irg_walk_graph(irg, init_node, NULL, obst);
343         /*
344         irg_walk (irg, link_to_reg_end, NULL, NULL);
345         */
346 }
347
348 static INLINE void finish_scc(void)
349 {
350         finish_stack();
351 }
352
353 #ifdef INTERPROCEDURAL_VIEW
354 static INLINE void init_ip_scc(struct obstack *obst) {
355         init_scc_common();
356         cg_walk(init_node, NULL, obst);
357
358 #if EXPERIMENTAL_LOOP_TREE
359         cg_walk(link_to_reg_end, NULL, NULL);
360 #endif
361 }
362 #endif
363
364 /**
365  * Check weather a given node represents the outer most Start
366  * block. In intra-procedural view this is the start block of the
367  * current graph, in interprocedural view it is the start block
368  * of the outer most graph.
369  *
370  * @param n  the node to check
371  *
372  * This is the condition for breaking the scc recursion.
373  */
374 static int is_outermost_Start(ir_node *n) {
375         /* Test whether this is the outermost Start node. */
376         if (is_Block(n) && get_Block_n_cfgpreds(n) == 1) {
377                 ir_node *pred = skip_Proj(get_Block_cfgpred(n, 0));
378             if (is_Start(pred) && get_nodes_block(pred) == n)
379                         return 1;
380         }
381         return 0;
382 }
383
384 /* When to walk from nodes to blocks. Only for Control flow operations? */
385 static INLINE int get_start_index(ir_node *n) {
386 #undef BLOCK_BEFORE_NODE
387 #define BLOCK_BEFORE_NODE 1
388
389 #if BLOCK_BEFORE_NODE
390
391         /* This version assures, that all nodes are ordered absolutely.  This allows
392            to undef all nodes in the heap analysis if the block is false, which means
393            not reachable.
394            I.e., with this code, the order on the loop tree is correct. But a (single)
395            test showed the loop tree is deeper.   */
396         if (get_irn_op(n) == op_Phi                      ||
397             is_Block(n)                                  ||
398             (is_Filter(n) && get_interprocedural_view()) || (
399               get_irg_pinned(get_irn_irg(n)) == op_pin_state_floats &&
400               get_irn_pinned(n)              == op_pin_state_floats
401             ))
402                 // Here we could test for backedge at -1 which is illegal
403                 return 0;
404         else
405                 return -1;
406
407 #else
408
409         /* This version causes deeper loop trees (at least we verified this
410            for Polymor).
411            But it guarantees that Blocks are analysed before nodes contained in the
412            block.  If so, we can set the value to undef if the block is not \
413            executed. */
414         if (is_cfop(n) || is_fragile_op(n) || is_Start(n))
415                 return -1;
416         else
417                 return 0;
418
419 #endif
420 }
421
422 /**
423  * Return non-zero if the given node is a legal loop header:
424  * Block, Phi, Filter.
425  *
426  * @param n  the node to check
427  */
428 static INLINE int is_possible_loop_head(ir_node *n) {
429         ir_op *op = get_irn_op(n);
430         return ((op == op_Block) ||
431                 (op == op_Phi) ||
432                 ((op == op_Filter) && get_interprocedural_view()));
433 }
434
435 /**
436  * Returns non-zero if n is a loop header, i.e., it is a Block, Phi
437  * or Filter node and has predecessors within the loop and out
438  * of the loop.
439  *
440  * @param n    the node to check
441  * @param root only needed for assertion.
442  */
443 static int is_head(ir_node *n, ir_node *root) {
444         int i, arity;
445         int some_outof_loop = 0, some_in_loop = 0;
446
447         /* Test for legal loop header: Block, Phi, ... */
448         if (!is_possible_loop_head(n))
449                 return 0;
450
451         if (!is_outermost_Start(n)) {
452 #ifndef NDEBUG
453                 int uplink = get_irn_uplink(root);
454 #else
455                 (void) root;
456 #endif
457                 arity = get_irn_arity(n);
458                 for (i = get_start_index(n); i < arity; i++) {
459                         ir_node *pred;
460                         if (is_backedge(n, i))
461                                 continue;
462                         pred = get_irn_n(n, i);
463                         if (! irn_is_in_stack(pred)) {
464                                 some_outof_loop = 1;
465                         } else {
466                                 assert(get_irn_uplink(pred) >= uplink);
467                                 some_in_loop = 1;
468                         }
469                 }
470         }
471         return some_outof_loop & some_in_loop;
472 }
473
474 /**
475  * Returns non-zero if n is possible loop head of an endless loop.
476  * I.e., it is a Block, Phi or Filter node and has only predecessors
477  * within the loop.
478  *
479  * @param n    the node to check
480  * @param root only needed for assertion.
481  */
482 static int is_endless_head(ir_node *n, ir_node *root) {
483         int i, arity;
484         int none_outof_loop = 1, some_in_loop = 0;
485
486         /* Test for legal loop header: Block, Phi, ... */
487         if (!is_possible_loop_head(n))
488                 return 0;
489
490         if (!is_outermost_Start(n)) {
491 #ifndef NDEBUG
492                 int uplink = get_irn_uplink(root);
493 #else
494                 (void) root;
495 #endif
496                 arity = get_irn_arity(n);
497                 for (i = get_start_index(n); i < arity; i++) {
498                         ir_node *pred;
499                         if (is_backedge(n, i))
500                                 continue;
501                         pred = get_irn_n(n, i);
502                         if (!irn_is_in_stack(pred)) {
503                                 none_outof_loop = 0;
504                         } else {
505                                 assert(get_irn_uplink(pred) >= uplink);
506                                 some_in_loop = 1;
507                         }
508                 }
509         }
510         return none_outof_loop & some_in_loop;
511 }
512
513 /** Returns index of the predecessor with the smallest dfn number
514     greater-equal than limit. */
515 static int smallest_dfn_pred(ir_node *n, int limit) {
516         int i, index = -2, min = -1;
517
518         if (!is_outermost_Start(n)) {
519                 int arity = get_irn_arity(n);
520                 for (i = get_start_index(n); i < arity; i++) {
521                         ir_node *pred = get_irn_n(n, i);
522                         if (is_backedge(n, i) || !irn_is_in_stack(pred))
523                                 continue;
524                         if (get_irn_dfn(pred) >= limit && (min == -1 || get_irn_dfn(pred) < min)) {
525                                 index = i;
526                                 min = get_irn_dfn(pred);
527                         }
528                 }
529         }
530         return index;
531 }
532
533 /**
534  * Returns index of the predecessor with the largest dfn number.
535  */
536 static int largest_dfn_pred(ir_node *n) {
537         int i, index = -2, max = -1;
538
539         if (!is_outermost_Start(n)) {
540                 int arity = get_irn_arity(n);
541                 for (i = get_start_index(n); i < arity; i++) {
542                         ir_node *pred = get_irn_n(n, i);
543                         if (is_backedge (n, i) || !irn_is_in_stack(pred))
544                                 continue;
545                         if (get_irn_dfn(pred) > max) {
546                                 index = i;
547                                 max = get_irn_dfn(pred);
548                         }
549                 }
550         }
551         return index;
552 }
553
554 /**
555  * Searches the stack for possible loop heads.  Tests these for backedges.
556  * If it finds a head with an unmarked backedge it marks this edge and
557  * returns the tail of the loop.
558  * If it finds no backedge returns NULL.
559  * ("disable_backedge" in fiasco)
560  *
561  * @param n  A node where uplink == dfn.
562  */
563 static ir_node *find_tail(ir_node *n) {
564         ir_node *m;
565         int i, res_index = -2;
566
567         /*
568         if (!icfg && rm_cyclic_phis && remove_cyclic_phis (n)) return NULL;
569          */
570         m = stack[tos-1];  /* tos = top of stack */
571         if (is_head(m, n)) {
572                 res_index = smallest_dfn_pred(m, 0);
573                 if ((res_index == -2) &&  /* no smallest dfn pred found. */
574                         (n ==  m))
575                         return NULL;
576         } else {
577                 if (m == n) return NULL;    // Is this to catch Phi - self loops?
578                 for (i = tos-2; i >= 0; --i) {
579                         m = stack[i];
580
581                         if (is_head(m, n)) {
582                                 res_index = smallest_dfn_pred(m, get_irn_dfn(m) + 1);
583                                 if (res_index == -2)  /* no smallest dfn pred found. */
584                                         res_index = largest_dfn_pred(m);
585
586                                 if ((m == n) && (res_index == -2)) {  /* don't walk past loop head. */
587                                         i = -1;
588                                 }
589                                 break;
590                         }
591
592                         /* We should not walk past our selves on the stack:  The upcoming nodes
593                            are not in this loop. We assume a loop not reachable from Start. */
594                         if (m == n) {
595                                 i = -1;
596                                 break;
597                         }
598                 }
599
600                 if (i < 0) {
601                         /* A dead loop not reachable from Start. */
602                         for (i = tos-2; i >= 0; --i) {
603                                 m = stack[i];
604                                 if (is_endless_head(m, n)) {
605                                         res_index = smallest_dfn_pred(m, get_irn_dfn(m) + 1);
606                                         if (res_index == -2)  /* no smallest dfn pred found. */
607                                                 res_index = largest_dfn_pred (m);
608                                         break;
609                                 }
610                                 if (m == n) { break; }  /* It's not an unreachable loop, either. */
611                         }
612                         //assert(0 && "no head found on stack");
613                 }
614
615         }
616         if (res_index <= -2) {
617                 /* It's a completely bad loop: without Phi/Block nodes that can
618                    be a head. I.e., the code is "dying".  We break the loop by
619                    setting Bad nodes. */
620                 int arity = get_irn_arity(n);
621                 ir_node *bad = get_irg_bad(get_irn_irg(n));
622                 for (i = -1; i < arity; ++i) {
623                         set_irn_n(n, i, bad);
624                 }
625                 return NULL;
626         }
627         assert(res_index > -2);
628
629         set_backedge(m, res_index);
630         return is_outermost_Start(n) ? NULL : get_irn_n(m, res_index);
631 }
632
633
634 #if EXPERIMENTAL_LOOP_TREE
635
636 /*  ----------------------------------------------------------------
637     AS:  This is experimental code to build loop trees suitable for
638     the heap analysis. Does not work correctly right now... :-(
639
640
641     Search in stack for the corresponding first Call-End-ProjX that
642     corresponds to one of the control flow predecessors of the given
643     block, that is the possible callers.
644     returns: the control predecessor to chose\
645     or       -1 if no corresponding Call-End-Node could be found
646              on the stack.
647     - -------------------------------------------------------------- */
648
649 int search_endproj_in_stack(ir_node *start_block) {
650         int i, j;
651         assert(is_Block(start_block));
652         for(i = tos - 1; i >= 0; --i)
653         {
654                 if(get_irn_op(stack[i]) == op_Proj && get_irn_mode(stack[i]) == mode_X &&
655                         get_irn_op(get_irn_n(stack[i], 0)) == op_EndReg)
656                 {
657                         printf("FOUND PROJ!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
658                         ir_node *end_projx = stack[i];
659
660                         int arity = get_irn_arity(start_block);
661                         for(j = 0; j < arity; j++)
662                         {
663                                 ir_node *begin_projx = get_Block_cfgpred(get_irg_start_block(get_irn_irg(end_projx)),
664                                         get_Proj_proj(end_projx));
665                                 if(get_irn_n(start_block, j) == begin_projx)
666                                 {
667                                         printf("FOUND IT!!!!!!!!!!!!!!!!!!\n");
668                                         return(j);
669                                 }
670                         }
671                 }
672         }
673         return(-1);
674 }
675
676
677 static pmap *projx_link = NULL;
678
679 void link_to_reg_end (ir_node *n, void *env) {
680         if(get_irn_op(n) == op_Proj &&
681                 get_irn_mode(n) == mode_X &&
682                 get_irn_op(get_irn_n(n, 0)) == op_EndReg) {
683                         /* Reg End Projx -> Find the CallBegin Projx and hash it */
684                         ir_node *end_projx = n;
685                         ir_node *begin_projx = get_Block_cfgpred(get_irg_start_block(get_irn_irg(end_projx)),
686                                 get_Proj_proj(end_projx));
687                         set_projx_link(begin_projx, end_projx);
688         }
689 }
690
691 void set_projx_link(ir_node *cb_projx, ir_node *end_projx) {
692         if(projx_link == NULL)
693                 projx_link = pmap_create();
694         pmap_insert(projx_link, (void *)cb_projx, (void *)end_projx);
695 }
696
697 ir_node *get_projx_link(ir_node *cb_projx) {
698         return((ir_node *) pmap_get(projx_link, (void *)cb_projx));
699 }
700
701 #endif
702
703 static INLINE int is_outermost_loop(ir_loop *l) {
704         return l == get_loop_outer_loop(l);
705 }
706
707
708 /*-----------------------------------------------------------*
709  *                   The core algorithm.                     *
710  *-----------------------------------------------------------*/
711
712 /**
713  * The core algorithm: Find strongly coupled components.
714  *
715  * @param n  node to start
716  */
717 static void scc(ir_node *n) {
718         if (irn_visited(n))
719                 return;
720         mark_irn_visited(n);
721
722         /* Initialize the node */
723         set_irn_dfn(n, current_dfn);      /* Depth first number for this node */
724         set_irn_uplink(n, current_dfn);   /* ... is default uplink. */
725         set_irn_loop(n, NULL);
726         ++current_dfn;
727         push(n);
728
729         /* AS: get_start_index might return -1 for Control Flow Nodes, and thus a negative
730            array index would be passed to is_backedge(). But CFG Nodes dont't have a backedge array,
731            so is_backedge does not access array[-1] but correctly returns false! */
732
733         if (!is_outermost_Start(n)) {
734                 int i, arity = get_irn_arity(n);
735
736                 for (i = get_start_index(n); i < arity; ++i) {
737                         ir_node *m;
738                         if (is_backedge(n, i))
739                                 continue;
740                         m = get_irn_n(n, i);
741                         scc(m);
742                         if (irn_is_in_stack(m)) {
743                                 /* Uplink of m is smaller if n->m is a backedge.
744                                    Propagate the uplink to mark the loop. */
745                                 if (get_irn_uplink(m) < get_irn_uplink(n))
746                                         set_irn_uplink(n, get_irn_uplink(m));
747                         }
748                 }
749         }
750
751         if (get_irn_dfn(n) == get_irn_uplink(n)) {
752                 /* This condition holds for
753                    1) the node with the incoming backedge.
754                       That is: We found a loop!
755                    2) Straight line code, because no uplink has been propagated, so the
756                       uplink still is the same as the dfn.
757
758                    But n might not be a proper loop head for the analysis. Proper loop
759                    heads are Block and Phi nodes. find_tail() searches the stack for
760                    Block's and Phi's and takes those nodes as loop heads for the current
761                    loop instead and marks the incoming edge as backedge. */
762
763                 ir_node *tail = find_tail(n);
764                 if (tail != NULL) {
765                         /* We have a loop, that is no straight line code,
766                            because we found a loop head!
767                            Next actions: Open a new loop on the loop tree and
768                                          try to find inner loops */
769
770 #if NO_LOOPS_WITHOUT_HEAD
771                         /* This is an adaption of the algorithm from fiasco / optscc to
772                          * avoid loops without Block or Phi as first node.  This should
773                          * severely reduce the number of evaluations of nodes to detect
774                          * a fixpoint in the heap analysis.
775                          * Further it avoids loops without firm nodes that cause errors
776                          * in the heap analyses.
777                          * But attention:  don't do it for the outermost loop:  This loop
778                          * is not iterated.  A first block can be a loop head in case of
779                          * an endless recursion. */
780
781                         ir_loop *l;
782                         int close;
783                         if ((get_loop_n_elements(current_loop) > 0) || (is_outermost_loop(current_loop))) {
784                                 l = new_loop();
785                                 close = 1;
786                         } else {
787                                 l = current_loop;
788                                 close = 0;
789                         }
790 #else
791                         ir_loop *l = new_loop();
792 #endif
793
794                         /* Remove the loop from the stack ... */
795                         pop_scc_unmark_visit(n);
796
797                         /* The current backedge has been marked, that is temporarily eliminated,
798                            by find tail. Start the scc algorithm
799                            again on the subgraph that is left (the current loop without the backedge)
800                            in order to find more inner loops. */
801                         scc(tail);
802
803                         assert(irn_visited(n));
804 #if NO_LOOPS_WITHOUT_HEAD
805                         if (close)
806 #endif
807                                 close_loop(l);
808                 } else {
809                         /* No loop head was found, that is we have straight line code.
810                            Pop all nodes from the stack to the current loop. */
811                         pop_scc_to_loop(n);
812                 }
813         }
814 }
815
816 #ifdef INTERPROCEDURAL_VIEW
817 static void my_scc(ir_node *n) {
818         int i;
819         if (irn_visited(n))
820                 return;
821         mark_irn_visited(n);
822
823         /* Initialize the node */
824         set_irn_dfn(n, current_dfn);      /* Depth first number for this node */
825         set_irn_uplink(n, current_dfn);   /* ... is default uplink. */
826         set_irn_loop(n, NULL);
827         current_dfn ++;
828         push(n);
829
830         /* AS: get_start_index might return -1 for Control Flow Nodes, and thus a negative
831            array index would be passed to is_backedge(). But CFG Nodes dont't have a backedge array,
832            so is_backedge does not access array[-1] but correctly returns false! */
833
834         if (!is_outermost_Start(n)) {
835                 int arity = get_irn_arity(n);
836
837                 for (i = get_start_index(n); i < arity; i++) {
838                         ir_node *m;
839                         if (is_backedge(n, i)) continue;
840                         m = get_irn_n(n, i); /* get_irn_ip_pred(n, i); */
841                         /* if (!m || is_Unknown(m)) continue; */
842                         my_scc(m);
843                         if (irn_is_in_stack(m)) {
844                                 /* Uplink of m is smaller if n->m is a backedge.
845                                    Propagate the uplink to mark the loop. */
846                                 if (get_irn_uplink(m) < get_irn_uplink(n))
847                                         set_irn_uplink(n, get_irn_uplink(m));
848                         }
849                 }
850         }
851
852         if (get_irn_dfn(n) == get_irn_uplink(n)) {
853                 /* This condition holds for
854                    1) the node with the incoming backedge.
855                       That is: We found a loop!
856                    2) Straight line code, because no uplink has been propagated, so the
857                       uplink still is the same as the dfn.
858
859                    But n might not be a proper loop head for the analysis. Proper loop
860                    heads are Block and Phi nodes. find_tail searches the stack for
861                    Block's and Phi's and takes those nodes as loop heads for the current
862                    loop instead and marks the incoming edge as backedge. */
863
864                 ir_node *tail = find_tail(n);
865                 if (tail) {
866                         /* We have a loop, that is no straight line code,
867                            because we found a loop head!
868                            Next actions: Open a new loop on the loop tree and
869                                          try to find inner loops */
870
871 #if NO_LOOPS_WITHOUT_HEAD
872                         /* This is an adaption of the algorithm from fiasco / optscc to
873                          * avoid loops without Block or Phi as first node.  This should
874                          * severely reduce the number of evaluations of nodes to detect
875                          * a fixpoint in the heap analysis.
876                          * Further it avoids loops without firm nodes that cause errors
877                          * in the heap analyses. */
878
879                         ir_loop *l;
880                         int close;
881                         if ((get_loop_n_elements(current_loop) > 0) || (is_outermost_loop(current_loop))) {
882                                 l = new_loop();
883                                 close = 1;
884                         } else {
885                                 l = current_loop;
886                                 close = 0;
887                         }
888 #else
889                         ir_loop *l = new_loop();
890 #endif
891
892                         /* Remove the loop from the stack ... */
893                         pop_scc_unmark_visit(n);
894
895                         /* The current backedge has been marked, that is temporarily eliminated,
896                            by find tail. Start the scc algorithm
897                            anew on the subgraph that is left (the current loop without the backedge)
898                            in order to find more inner loops. */
899                         my_scc(tail);
900
901                         assert(irn_visited(n));
902 #if NO_LOOPS_WITHOUT_HEAD
903                         if (close)
904 #endif
905                                 close_loop(l);
906                 } else {
907                         /* No loop head was found, that is we have straightline code.
908                            Pop all nodes from the stack to the current loop. */
909                         pop_scc_to_loop(n);
910                 }
911         }
912 }
913 #endif /* INTERPROCEDURAL_VIEW */
914
915 /* Constructs backedge information for irg. In interprocedural view constructs
916    backedges for all methods called by irg, too. */
917 int construct_backedges(ir_graph *irg) {
918         ir_graph *rem = current_ir_graph;
919         ir_loop *head_rem;
920         struct obstack temp;
921
922         assert(!get_interprocedural_view() &&
923                "not implemented, use construct_ip_backedges()");
924
925         max_loop_depth = 0;
926         current_ir_graph   = irg;
927         outermost_ir_graph = irg;
928
929         obstack_init(&temp);
930         init_scc(irg, &temp);
931
932         current_loop = NULL;
933         new_loop();  /* sets current_loop */
934         head_rem = current_loop; /* Just for assertion */
935
936         inc_irg_visited(irg);
937
938         scc(get_irg_end(irg));
939
940         finish_scc();
941         obstack_free(&temp, NULL);
942
943         assert(head_rem == current_loop);
944         mature_loops(current_loop, irg->obst);
945         set_irg_loop(irg, current_loop);
946         set_irg_loopinfo_state(irg, loopinfo_consistent);
947         assert(get_irg_loop(irg)->kind == k_ir_loop);
948         current_ir_graph = rem;
949         return max_loop_depth;
950 }
951
952
953 #ifdef INTERPROCEDURAL_VIEW
954 int construct_ip_backedges(void) {
955         ir_graph *rem = current_ir_graph;
956         int rem_ipv = get_interprocedural_view();
957         int i;
958         strcut obstack temp;
959
960         max_loop_depth = 0;
961         assert(get_irp_ip_view_state() == ip_view_valid);
962
963         outermost_ir_graph = get_irp_main_irg();
964
965         obstack_init(&temp);
966         init_ip_scc(&temp);
967
968         current_loop = NULL;
969         new_loop();  /* sets current_loop */
970         set_interprocedural_view(1);
971
972         inc_max_irg_visited();
973         for (i = 0; i < get_irp_n_irgs(); i++)
974                 set_irg_visited(get_irp_irg(i), get_max_irg_visited());
975
976         /** We have to start the walk at the same nodes as cg_walk. **/
977         /* Walk starting at unreachable procedures. Only these
978          * have End blocks visible in interprocedural view. */
979         for (i = 0; i < get_irp_n_irgs(); i++) {
980                 ir_node *sb;
981                 current_ir_graph = get_irp_irg(i);
982
983                 sb = get_irg_start_block(current_ir_graph);
984
985                 if ((get_Block_n_cfgpreds(sb) > 1) ||
986                     (get_nodes_block(get_Block_cfgpred(sb, 0)) != sb))
987                         continue;
988
989                 scc(get_irg_end(current_ir_graph));
990         }
991
992         /* Check whether we walked all procedures: there could be procedures
993            with cyclic calls but no call from the outside. */
994         for (i = 0; i < get_irp_n_irgs(); i++) {
995                 ir_node *sb;
996                 current_ir_graph = get_irp_irg(i);
997
998                 /* Test start block: if inner procedure end and end block are not
999                  * visible and therefore not marked. */
1000                 sb = get_irg_start_block(current_ir_graph);
1001                 if (get_irn_visited(sb) < get_irg_visited(current_ir_graph)) scc(sb);
1002         }
1003
1004         /* Walk all endless loops in inner procedures.
1005          * We recognize an inner procedure if the End node is not visited. */
1006         for (i = 0; i < get_irp_n_irgs(); i++) {
1007                 ir_node *e;
1008                 current_ir_graph = get_irp_irg(i);
1009
1010                 e = get_irg_end(current_ir_graph);
1011                 if (get_irn_visited(e) < get_irg_visited(current_ir_graph)) {
1012                         int j;
1013                         /* Don't visit the End node. */
1014                         for (j = 0; j < get_End_n_keepalives(e); j++)
1015                                 scc(get_End_keepalive(e, j));
1016                 }
1017         }
1018
1019         set_irg_loop(outermost_ir_graph, current_loop);
1020         set_irg_loopinfo_state(current_ir_graph, loopinfo_ip_consistent);
1021         assert(get_irg_loop(outermost_ir_graph)->kind == k_ir_loop);
1022
1023         obstack_free(&temp, NULL);
1024         current_ir_graph = rem;
1025         set_interprocedural_view(rem_ipv);
1026         return max_loop_depth;
1027 }
1028
1029 void my_construct_ip_backedges(void) {
1030         ir_graph *rem = current_ir_graph;
1031         int rem_ipv = get_interprocedural_view();
1032         int i;
1033
1034         assert(get_irp_ip_view_state() == ip_view_valid);
1035
1036         outermost_ir_graph = get_irp_main_irg();
1037
1038         init_ip_scc();
1039
1040         current_loop = NULL;
1041         new_loop();  /* sets current_loop */
1042         set_interprocedural_view(1);
1043
1044         inc_max_irg_visited();
1045         for (i = 0; i < get_irp_n_irgs(); i++)
1046                 set_irg_visited(get_irp_irg(i), get_max_irg_visited());
1047
1048         /** We have to start the walk at the same nodes as cg_walk. **/
1049         /* Walk starting at unreachable procedures. Only these
1050          * have End blocks visible in interprocedural view. */
1051         for (i = 0; i < get_irp_n_irgs(); i++) {
1052                 ir_node *sb;
1053                 current_ir_graph = get_irp_irg(i);
1054
1055                 sb = get_irg_start_block(current_ir_graph);
1056
1057                 if ((get_Block_n_cfgpreds(sb) > 1) ||
1058                     (get_nodes_block(get_Block_cfgpred(sb, 0)) != sb)) continue;
1059
1060                 my_scc(get_irg_end(current_ir_graph));
1061         }
1062
1063         /* Check whether we walked all procedures: there could be procedures
1064            with cyclic calls but no call from the outside. */
1065         for (i = 0; i < get_irp_n_irgs(); i++) {
1066                 ir_node *sb;
1067                 current_ir_graph = get_irp_irg(i);
1068
1069                 /* Test start block: if inner procedure end and end block are not
1070                  * visible and therefore not marked. */
1071                 sb = get_irg_start_block(current_ir_graph);
1072                 if (get_irn_visited(sb) < get_irg_visited(current_ir_graph))
1073                         scc(sb);
1074         }
1075
1076         /* Walk all endless loops in inner procedures.
1077          * We recognize an inner procedure if the End node is not visited. */
1078         for (i = 0; i < get_irp_n_irgs(); i++) {
1079                 ir_node *e;
1080                 current_ir_graph = get_irp_irg(i);
1081
1082                 e = get_irg_end(current_ir_graph);
1083                 if (get_irn_visited(e) < get_irg_visited(current_ir_graph)) {
1084                         int j;
1085                         /* Don't visit the End node. */
1086                         for (j = 0; j < get_End_n_keepalives(e); j++) scc(get_End_keepalive(e, j));
1087                 }
1088         }
1089
1090         set_irg_loop(outermost_ir_graph, current_loop);
1091         set_irg_loopinfo_state(current_ir_graph, loopinfo_ip_consistent);
1092         assert(get_irg_loop(outermost_ir_graph)->kind == k_ir_loop);
1093
1094         current_ir_graph = rem;
1095         set_interprocedural_view(rem_ipv);
1096 }
1097 #endif
1098
1099 static void reset_backedges(ir_node *n) {
1100         if (is_possible_loop_head(n)) {
1101 #ifdef INTERPROCEDURAL_VIEW
1102                 int rem = get_interprocedural_view();
1103
1104                 set_interprocedural_view(1);
1105                 clear_backedges(n);
1106                 set_interprocedural_view(1);
1107                 clear_backedges(n);
1108                 set_interprocedural_view(rem);
1109 #else
1110                 clear_backedges(n);
1111 #endif
1112         }
1113 }
1114
1115
1116 /*
1117 static void loop_reset_backedges(ir_loop *l) {
1118         int i;
1119         reset_backedges(get_loop_node(l, 0));
1120         for (i = 0; i < get_loop_n_nodes(l); ++i)
1121                 set_irn_loop(get_loop_node(l, i), NULL);
1122         for (i = 0; i < get_loop_n_sons(l); ++i) {
1123                 loop_reset_backedges(get_loop_son(l, i));
1124         }
1125 }
1126 */
1127
1128 static void loop_reset_node(ir_node *n, void *env) {
1129         (void) env;
1130         set_irn_loop(n, NULL);
1131         reset_backedges(n);
1132 }
1133
1134
1135 /** Removes all loop information.
1136     Resets all backedges */
1137 void free_loop_information(ir_graph *irg) {
1138         /* We can not use this recursion, as the loop might contain
1139            illegal nodes by now.  Why else would we throw away the
1140            representation?
1141         if (get_irg_loop(irg)) loop_reset_backedges(get_irg_loop(irg));
1142         */
1143         irg_walk_graph(irg, loop_reset_node, NULL, NULL);
1144         set_irg_loop(irg, NULL);
1145         set_irg_loopinfo_state(current_ir_graph, loopinfo_none);
1146         /* We cannot free the loop nodes, they are on the obstack. */
1147 }
1148
1149
1150 void free_all_loop_information(void) {
1151         int i;
1152 #ifdef INTERPROCEDURAL_VIEW
1153         int rem = get_interprocedural_view();
1154         set_interprocedural_view(1);  /* To visit all filter nodes */
1155 #endif
1156         for (i = 0; i < get_irp_n_irgs(); i++) {
1157                 free_loop_information(get_irp_irg(i));
1158         }
1159 #ifdef INTERPROCEDURAL_VIEW
1160         set_interprocedural_view(rem);
1161 #endif
1162 }
1163
1164
1165
1166
1167
1168 /* Debug stuff *************************************************/
1169
1170 static int test_loop_node(ir_loop *l) {
1171         int i, has_node = 0, found_problem = 0;
1172         loop_element le;
1173
1174         assert(l && l->kind == k_ir_loop);
1175
1176         if (get_loop_n_elements(l) == 0) {
1177                 found_problem = 1;
1178                 dump_loop(l, "-ha");
1179         }
1180
1181         le = get_loop_element(l, 0);
1182         if (*(le.kind) != k_ir_node) {
1183                 assert(le.kind && *(le.kind) == k_ir_loop);
1184
1185                 found_problem = 1;
1186                 dump_loop(l, "-ha");
1187         }
1188
1189         if ((*(le.kind) == k_ir_node) && !is_possible_loop_head(le.node)) {
1190                 found_problem = 1;
1191                 dump_loop(l, "-ha");
1192         }
1193
1194         if ((get_loop_depth(l) != 0) &&
1195                 (*(le.kind) == k_ir_node) && !has_backedges(le.node)) {
1196                         found_problem = 1;
1197                         dump_loop(l, "-ha");
1198         }
1199
1200         /* Recur */
1201         has_node = 0;
1202         for (i = 0; i < get_loop_n_elements(l); ++i) {
1203                 le = get_loop_element(l, i);
1204                 if (*(le.kind) == k_ir_node)
1205                         has_node++;
1206                 else
1207                         if (test_loop_node(le.son)) found_problem = 1;
1208         }
1209
1210         if (has_node == 0) {
1211                 found_problem = 1;
1212                 dump_loop(l, "-ha");
1213         }
1214
1215         return found_problem;
1216 }
1217
1218 /** Prints all loop nodes that
1219  *  - do not have any firm nodes, only loop sons
1220  *  - the header is not a Phi, Block or Filter.
1221  */
1222 void find_strange_loop_nodes(ir_loop *l) {
1223         int found_problem = 0;
1224         found_problem = test_loop_node(l);
1225         printf("Finished Test\n\n");
1226         if (found_problem) exit(0);
1227
1228 }
1229
1230 /* ------------------------------------------------------------------- */
1231 /* Simple analyses based on the loop information                       */
1232 /* ------------------------------------------------------------------- */
1233
1234 int is_loop_variant(ir_loop *l, ir_loop *b) {
1235         int i, n_elems;
1236
1237         if (l == b) return 1;
1238
1239         n_elems = get_loop_n_elements(l);
1240         for (i = 0; i < n_elems; ++i) {
1241                 loop_element e = get_loop_element(l, i);
1242                 if (is_ir_loop(e.kind))
1243                         if (is_loop_variant(e.son, b))
1244                                 return 1;
1245         }
1246
1247         return 0;
1248 }
1249
1250 /* Test whether a value is loop invariant.
1251  *
1252  * @param n      The node to be tested.
1253  * @param block  A block node.  We pass the block, not the loop as we must
1254  *               start off with a block loop to find all proper uses.
1255  *
1256  * Returns non-zero, if the node n is not changed in the loop block
1257  * belongs to or in inner loops of this blocks loop. */
1258 int is_loop_invariant(const ir_node *n, const ir_node *block) {
1259         ir_loop *l = get_irn_loop(block);
1260         const ir_node *b = is_Block(n) ? n : get_nodes_block(n);
1261         return !is_loop_variant(l, get_irn_loop(b));
1262 }