d8ff40ee6b59ca1d7e677fd94af3a7c8f6a6fc35
[libfirm] / ir / ana / callgraph.c
1 /*
2  * Copyright (C) 1995-2011 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       Representation and computation of the callgraph.
23  * @author      Goetz Lindenmaier
24  * @date        21.7.2004
25  * @version     $Id$
26  */
27 #include "config.h"
28
29 #include <string.h>
30 #include <stdlib.h>
31
32 #include "callgraph.h"
33
34 #include "irloop_t.h"
35 #include "irprog_t.h"
36 #include "irgraph_t.h"
37 #include "irnode_t.h"
38
39 #include "cgana.h"
40 #include "execution_frequency.h"
41
42 #include "array.h"
43 #include "pmap.h"
44 #include "hashptr.h"
45 #include "raw_bitset.h"
46
47 #include "irgwalk.h"
48
49 static ir_visited_t master_cg_visited = 0;
50 static inline int cg_irg_visited      (ir_graph *n);
51 static inline void mark_cg_irg_visited(ir_graph *n);
52
53 /** Returns the callgraph state of the program representation. */
54 irp_callgraph_state get_irp_callgraph_state(void)
55 {
56         return irp->callgraph_state;
57 }
58
59 /* Sets the callgraph state of the program representation. */
60 void set_irp_callgraph_state(irp_callgraph_state s)
61 {
62         irp->callgraph_state = s;
63 }
64
65 /* Returns the number of procedures that call the given irg. */
66 int get_irg_n_callers(const ir_graph *irg)
67 {
68         if (irg->callers) return ARR_LEN(irg->callers);
69         return -1;
70 }
71
72 /* Returns the caller at position pos. */
73 ir_graph *get_irg_caller(const ir_graph *irg, int pos)
74 {
75         assert(pos >= 0 && pos < get_irg_n_callers(irg));
76         if (irg->callers) return irg->callers[pos];
77         return NULL;
78 }
79
80 /* Returns non-zero if the caller at position pos is "a backedge", i.e. a recursion. */
81 int is_irg_caller_backedge(const ir_graph *irg, int pos)
82 {
83         assert(pos >= 0 && pos < get_irg_n_callers(irg));
84         return irg->caller_isbe != NULL ? rbitset_is_set(irg->caller_isbe, pos) : 0;
85 }
86
87 /** Search the caller in the list of all callers and set it's backedge property. */
88 static void set_irg_caller_backedge(ir_graph *irg, ir_graph *caller)
89 {
90         int i, n_callers = get_irg_n_callers(irg);
91
92         /* allocate a new array on demand */
93         if (irg->caller_isbe == NULL)
94                 irg->caller_isbe = rbitset_malloc(n_callers);
95         for (i = 0; i < n_callers; ++i) {
96                 if (get_irg_caller(irg, i) == caller) {
97                         rbitset_set(irg->caller_isbe, i);
98                         break;
99                 }
100         }
101 }
102
103 /* Returns non-zero if the irg has a backedge caller. */
104 int has_irg_caller_backedge(const ir_graph *irg)
105 {
106         int i, n_callers = get_irg_n_callers(irg);
107
108         if (irg->caller_isbe != NULL) {
109                 for (i = 0; i < n_callers; ++i)
110                         if (rbitset_is_set(irg->caller_isbe, i))
111                                 return 1;
112         }
113         return 0;
114 }
115
116 /**
117  * Find the reversion position of a caller.
118  * Given the position pos_caller of an caller of irg, return
119  * irg's callee position on that caller.
120  */
121 static int reverse_pos(const ir_graph *callee, int pos_caller)
122 {
123         ir_graph *caller = get_irg_caller(callee, pos_caller);
124         /* search the other relation for the corresponding edge. */
125         int pos_callee = -1;
126         int i, n_callees = get_irg_n_callees(caller);
127         for (i = 0; i < n_callees; ++i) {
128                 if (get_irg_callee(caller, i) == callee) {
129                         pos_callee = i;
130                         break;
131                 }
132         }
133
134         assert(pos_callee >= 0);
135
136         return pos_callee;
137 }
138
139 /* Returns the maximal loop depth of call nodes that call along this edge. */
140 int get_irg_caller_loop_depth(const ir_graph *irg, int pos)
141 {
142         ir_graph *caller     = get_irg_caller(irg, pos);
143         int       pos_callee = reverse_pos(irg, pos);
144
145         return get_irg_callee_loop_depth(caller, pos_callee);
146 }
147
148
149 /* Returns the number of procedures that are called by the given irg. */
150 int get_irg_n_callees(const ir_graph *irg)
151 {
152         if (irg->callees) return ARR_LEN(irg->callees);
153         return -1;
154 }
155
156 /* Returns the callee at position pos. */
157 ir_graph *get_irg_callee(const ir_graph *irg, int pos)
158 {
159         assert(pos >= 0 && pos < get_irg_n_callees(irg));
160         if (irg->callees) return irg->callees[pos]->irg;
161         return NULL;
162 }
163
164 /* Returns non-zero if the callee at position pos is "a backedge", i.e. a recursion. */
165 int is_irg_callee_backedge(const ir_graph *irg, int pos)
166 {
167         assert(pos >= 0 && pos < get_irg_n_callees(irg));
168         return irg->callee_isbe != NULL ? rbitset_is_set(irg->callee_isbe, pos) : 0;
169 }
170
171 /* Returns non-zero if the irg has a backedge callee. */
172 int has_irg_callee_backedge(const ir_graph *irg)
173 {
174         int i, n_callees = get_irg_n_callees(irg);
175
176         if (irg->callee_isbe != NULL) {
177                 for (i = 0; i < n_callees; ++i)
178                         if (rbitset_is_set(irg->callee_isbe, i))
179                                 return 1;
180         }
181         return 0;
182 }
183
184 /**
185  * Mark the callee at position pos as a backedge.
186  */
187 static void set_irg_callee_backedge(ir_graph *irg, int pos)
188 {
189         int n = get_irg_n_callees(irg);
190
191         /* allocate a new array on demand */
192         if (irg->callee_isbe == NULL)
193                 irg->callee_isbe = rbitset_malloc(n);
194         assert(pos >= 0 && pos < n);
195         rbitset_set(irg->callee_isbe, pos);
196 }
197
198 /* Returns the maximal loop depth of call nodes that call along this edge. */
199 int get_irg_callee_loop_depth(const ir_graph *irg, int pos)
200 {
201         assert(pos >= 0 && pos < get_irg_n_callees(irg));
202         if (irg->callees) return irg->callees[pos]->max_depth;
203         return -1;
204 }
205
206 static double get_irg_callee_execution_frequency(const ir_graph *irg, int pos)
207 {
208         ir_node **arr = irg->callees[pos]->call_list;
209         size_t i, n_Calls = ARR_LEN(arr);
210         double freq = 0.0;
211
212         for (i = 0; i < n_Calls; ++i) {
213                 freq += get_irn_exec_freq(arr[i]);
214         }
215         return freq;
216 }
217
218 static double get_irg_callee_method_execution_frequency(const ir_graph *irg,
219                                                         int pos)
220 {
221         double call_freq = get_irg_callee_execution_frequency(irg, pos);
222         double meth_freq = get_irg_method_execution_frequency(irg);
223         return call_freq * meth_freq;
224 }
225
226 static double get_irg_caller_method_execution_frequency(const ir_graph *irg,
227                                                         int pos)
228 {
229         ir_graph *caller     = get_irg_caller(irg, pos);
230         int       pos_callee = reverse_pos(irg, pos);
231
232         return get_irg_callee_method_execution_frequency(caller, pos_callee);
233 }
234
235
236 /* --------------------- Compute the callgraph ------------------------ */
237
238 /**
239  * Walker called by compute_callgraph(), analyses all Call nodes.
240  */
241 static void ana_Call(ir_node *n, void *env)
242 {
243         int i, n_callees;
244         ir_graph *irg;
245         (void) env;
246
247         if (! is_Call(n)) return;
248
249         irg = get_irn_irg(n);
250         n_callees = get_Call_n_callees(n);
251         for (i = 0; i < n_callees; ++i) {
252                 ir_entity *callee_e = get_Call_callee(n, i);
253                 ir_graph *callee = get_entity_irg(callee_e);
254
255                 if (callee) {
256                         cg_callee_entry buf;
257                         cg_callee_entry *found;
258                         int depth;
259
260                         buf.irg = callee;
261
262                         pset_insert((pset *)callee->callers, irg, HASH_PTR(irg));
263                         found = (cg_callee_entry*) pset_find((pset *)irg->callees, &buf, HASH_PTR(callee));
264                         if (found) {  /* add Call node to list, compute new nesting. */
265                                 ir_node **arr = found->call_list;
266                                 ARR_APP1(ir_node *, arr, n);
267                                 found->call_list = arr;
268                         } else { /* New node, add Call node and init nesting. */
269                                 found = OALLOC(irg->obst, cg_callee_entry);
270                                 found->irg = callee;
271                                 found->call_list = NEW_ARR_F(ir_node *, 1);
272                                 found->call_list[0] = n;
273                                 found->max_depth = 0;
274                                 pset_insert((pset *)irg->callees, found, HASH_PTR(callee));
275                         }
276                         depth = get_loop_depth(get_irn_loop(get_nodes_block(n)));
277                         found->max_depth = (depth > found->max_depth) ? depth : found->max_depth;
278                 }
279         }
280 }
281
282 /** compare two ir graphs in a cg_callee_entry */
283 static int cg_callee_entry_cmp(const void *elt, const void *key)
284 {
285         const cg_callee_entry *e1 = (const cg_callee_entry*) elt;
286         const cg_callee_entry *e2 = (const cg_callee_entry*) key;
287         return e1->irg != e2->irg;
288 }
289
290 /** compare two ir graphs for pointer identity */
291 static int graph_cmp(const void *elt, const void *key)
292 {
293         const ir_graph *e1 = (const ir_graph*) elt;
294         const ir_graph *e2 = (const ir_graph*) key;
295         return e1 != e2;
296 }
297
298
299 /* Construct and destruct the callgraph. */
300 void compute_callgraph(void)
301 {
302         int i, n_irgs;
303
304         /* initialize */
305         free_callgraph();
306
307         n_irgs = get_irp_n_irgs();
308         for (i = 0; i < n_irgs; ++i) {
309                 ir_graph *irg = get_irp_irg(i);
310                 assert(get_irg_callee_info_state(irg) == irg_callee_info_consistent);
311                 irg->callees = (cg_callee_entry **)new_pset(cg_callee_entry_cmp, 8);
312                 irg->callers = (ir_graph **)new_pset(graph_cmp, 8);
313                 //construct_cf_backedges(irg);
314         }
315
316         /* Compute the call graph */
317         for (i = 0; i < n_irgs; ++i) {
318                 ir_graph *irg = get_irp_irg(i);
319                 construct_cf_backedges(irg);   // We also find the maximal loop depth of a call.
320                 irg_walk_graph(irg, ana_Call, NULL, NULL);
321         }
322
323         /* Change the sets to arrays. */
324         for (i = 0; i < n_irgs; ++i) {
325                 size_t j, count;
326                 cg_callee_entry *callee;
327                 ir_graph *c, *irg = get_irp_irg(i);
328                 pset *callee_set, *caller_set;
329
330                 callee_set = (pset *)irg->callees;
331                 count = pset_count(callee_set);
332                 irg->callees = NEW_ARR_F(cg_callee_entry *, count);
333                 irg->callee_isbe = NULL;
334                 callee = (cg_callee_entry*) pset_first(callee_set);
335                 for (j = 0; j < count; ++j) {
336                         irg->callees[j] = callee;
337                         callee = (cg_callee_entry*) pset_next(callee_set);
338                 }
339                 del_pset(callee_set);
340                 assert(callee == NULL);
341
342                 caller_set = (pset *)irg->callers;
343                 count = pset_count(caller_set);
344                 irg->callers = NEW_ARR_F(ir_graph *, count);
345                 irg->caller_isbe =  NULL;
346                 c = (ir_graph*) pset_first(caller_set);
347                 for (j = 0; j < count; ++j) {
348                         irg->callers[j] = c;
349                         c = (ir_graph*) pset_next(caller_set);
350                 }
351                 del_pset(caller_set);
352                 assert(c == NULL);
353         }
354         set_irp_callgraph_state(irp_callgraph_consistent);
355 }
356
357 /* Destruct the callgraph. */
358 void free_callgraph(void)
359 {
360         int i, n_irgs = get_irp_n_irgs();
361         for (i = 0; i < n_irgs; ++i) {
362                 ir_graph *irg = get_irp_irg(i);
363                 if (irg->callees) DEL_ARR_F(irg->callees);
364                 if (irg->callers) DEL_ARR_F(irg->callers);
365                 if (irg->callee_isbe) free(irg->callee_isbe);
366                 if (irg->caller_isbe) free(irg->caller_isbe);
367                 irg->callees = NULL;
368                 irg->callers = NULL;
369                 irg->callee_isbe = NULL;
370                 irg->caller_isbe = NULL;
371         }
372         set_irp_callgraph_state(irp_callgraph_none);
373 }
374
375 /* ----------------------------------------------------------------------------------- */
376 /* A walker for the callgraph                                                          */
377 /* ----------------------------------------------------------------------------------- */
378
379
380 static void do_walk(ir_graph *irg, callgraph_walk_func *pre, callgraph_walk_func *post, void *env)
381 {
382         int i, n_callees;
383
384         if (cg_irg_visited(irg))
385                 return;
386         mark_cg_irg_visited(irg);
387
388         if (pre)
389                 pre(irg, env);
390
391         n_callees = get_irg_n_callees(irg);
392         for (i = 0; i < n_callees; i++) {
393                 ir_graph *m = get_irg_callee(irg, i);
394                 do_walk(m, pre, post, env);
395         }
396
397         if (post)
398                 post(irg, env);
399 }
400
401 void callgraph_walk(callgraph_walk_func *pre, callgraph_walk_func *post, void *env)
402 {
403         int i, n_irgs = get_irp_n_irgs();
404         ++master_cg_visited;
405
406         /* roots are methods which have no callers in the current program */
407         for (i = 0; i < n_irgs; ++i) {
408                 ir_graph *irg = get_irp_irg(i);
409
410                 if (get_irg_n_callers(irg) == 0)
411                         do_walk(irg, pre, post, env);
412         }
413
414         /* in case of unreachable call loops we haven't visited some irgs yet */
415         for (i = 0; i < n_irgs; i++) {
416                 ir_graph *irg = get_irp_irg(i);
417                 do_walk(irg, pre, post, env);
418         }
419 }
420
421 /* ----------------------------------------------------------------------------------- */
422 /* loop construction algorithm                                                         */
423 /* ----------------------------------------------------------------------------------- */
424
425 static ir_graph *outermost_ir_graph;   /**< The outermost graph the scc is computed
426                                             for */
427 static ir_loop *current_loop;      /**< Current cfloop construction is working
428                                         on. */
429 static int loop_node_cnt = 0;      /**< Counts the number of allocated cfloop nodes.
430                                         Each cfloop node gets a unique number.
431                                         What for? ev. remove. @@@ */
432 static int current_dfn = 1;        /**< Counter to generate depth first numbering
433                                         of visited nodes.  */
434
435 /*-----------------*/
436 /* Node attributes */
437 /*-----------------*/
438
439 typedef struct scc_info {
440         int in_stack;          /**< Marks whether node is on the stack. */
441         int dfn;               /**< Depth first search number. */
442         int uplink;            /**< dfn number of ancestor. */
443         int visited;
444 } scc_info;
445
446 /**
447  * allocates a new scc_info on the obstack
448  */
449 static inline scc_info *new_scc_info(struct obstack *obst)
450 {
451         return OALLOCZ(obst, scc_info);
452 }
453
454 /**
455  * Returns non-zero if a graph was already visited.
456  */
457 static inline int cg_irg_visited(ir_graph *irg)
458 {
459         return irg->self_visited >= master_cg_visited;
460 }
461
462 /**
463  * Marks a graph as visited.
464  */
465 static inline void mark_cg_irg_visited(ir_graph *irg)
466 {
467         irg->self_visited = master_cg_visited;
468 }
469
470 /**
471  * Set a graphs visited flag to i.
472  */
473 static inline void set_cg_irg_visited(ir_graph *irg, ir_visited_t i)
474 {
475         irg->self_visited = i;
476 }
477
478 /**
479  * Returns the visited flag of a graph.
480  */
481 static inline ir_visited_t get_cg_irg_visited(ir_graph *irg)
482 {
483         return irg->self_visited;
484 }
485
486 static inline void mark_irg_in_stack(ir_graph *irg)
487 {
488         scc_info *info = (scc_info*) get_irg_link(irg);
489         assert(info && "missing call to init_scc()");
490         info->in_stack = 1;
491 }
492
493 static inline void mark_irg_not_in_stack(ir_graph *irg)
494 {
495         scc_info *info = (scc_info*) get_irg_link(irg);
496         assert(info && "missing call to init_scc()");
497         info->in_stack = 0;
498 }
499
500 static inline int irg_is_in_stack(ir_graph *irg)
501 {
502         scc_info *info = (scc_info*) get_irg_link(irg);
503         assert(info && "missing call to init_scc()");
504         return info->in_stack;
505 }
506
507 static inline void set_irg_uplink(ir_graph *irg, int uplink)
508 {
509         scc_info *info = (scc_info*) get_irg_link(irg);
510         assert(info && "missing call to init_scc()");
511         info->uplink = uplink;
512 }
513
514 static inline int get_irg_uplink(ir_graph *irg)
515 {
516         scc_info *info = (scc_info*) get_irg_link(irg);
517         assert(info && "missing call to init_scc()");
518         return info->uplink;
519 }
520
521 static inline void set_irg_dfn(ir_graph *irg, int dfn)
522 {
523         scc_info *info = (scc_info*) get_irg_link(irg);
524         assert(info && "missing call to init_scc()");
525         info->dfn = dfn;
526 }
527
528 static inline int get_irg_dfn(ir_graph *irg)
529 {
530         scc_info *info = (scc_info*) get_irg_link(irg);
531         assert(info && "missing call to init_scc()");
532         return info->dfn;
533 }
534
535 /**********************************************************************/
536 /* A stack.                                                          **/
537 /**********************************************************************/
538
539 static ir_graph **stack = NULL;
540 static size_t tos = 0;                /**< top of stack */
541
542 /**
543  * Initialize the irg stack.
544  */
545 static inline void init_stack(void)
546 {
547         if (stack) {
548                 ARR_RESIZE(ir_graph *, stack, 1000);
549         } else {
550                 stack = NEW_ARR_F(ir_graph *, 1000);
551         }
552         tos = 0;
553 }
554
555 /**
556  * push a graph on the irg stack
557  * @param n the graph to be pushed
558  */
559 static inline void push(ir_graph *irg)
560 {
561         if (tos == ARR_LEN(stack)) {
562                 size_t nlen = ARR_LEN(stack) * 2;
563                 ARR_RESIZE(ir_graph*, stack, nlen);
564         }
565         stack [tos++] = irg;
566         mark_irg_in_stack(irg);
567 }
568
569 /**
570  * return the topmost graph on the stack and pop it
571  */
572 static inline ir_graph *pop(void)
573 {
574         ir_graph *irg;
575
576         assert(tos > 0);
577         irg = stack[--tos];
578         mark_irg_not_in_stack(irg);
579         return irg;
580 }
581
582 /**
583  * The nodes up to irg belong to the current loop.
584  * Removes them from the stack and adds them to the current loop.
585  */
586 static inline void pop_scc_to_loop(ir_graph *irg)
587 {
588         ir_graph *m;
589
590         do {
591                 m = pop();
592                 loop_node_cnt++;
593                 set_irg_dfn(m, loop_node_cnt);
594                 add_loop_irg(current_loop, m);
595                 m->l = current_loop;
596                 //m->callgraph_loop_depth = current_loop->depth;
597         } while (m != irg);
598 }
599
600 /* GL ??? my last son is my grandson???  Removes cfloops with no
601    ir_nodes in them.  Such loops have only another loop as son. (Why
602    can't they have two loops as sons? Does it never get that far? ) */
603 static void close_loop(ir_loop *l)
604 {
605         int last = get_loop_n_elements(l) - 1;
606         loop_element lelement = get_loop_element(l, last);
607         ir_loop *last_son = lelement.son;
608
609         if (get_kind(last_son) == k_ir_loop &&
610             get_loop_n_elements(last_son) == 1) {
611                 ir_loop *gson;
612
613                 lelement = get_loop_element(last_son, 0);
614                 gson = lelement.son;
615                 if (get_kind(gson) == k_ir_loop) {
616                         loop_element new_last_son;
617
618                         gson->outer_loop = l;
619                         new_last_son.son = gson;
620                         l->children[last] = new_last_son;
621                 }
622         }
623         current_loop = l;
624 }
625
626 /**
627  * Removes and unmarks all nodes up to n from the stack.
628  * The nodes must be visited once more to assign them to a scc.
629  */
630 static inline void pop_scc_unmark_visit(ir_graph *n)
631 {
632         ir_graph *m = NULL;
633
634         while (m != n) {
635                 m = pop();
636                 set_cg_irg_visited(m, 0);
637         }
638 }
639
640 /**********************************************************************/
641 /* The loop data structure.                                          **/
642 /**********************************************************************/
643
644 /**
645  * Allocates a new loop as son of current_loop.  Sets current_loop
646  * to the new loop and returns the father.
647  */
648 static ir_loop *new_loop(void)
649 {
650         ir_loop *father = current_loop;
651         ir_loop *son    = alloc_loop(father, outermost_ir_graph->obst);
652
653         current_loop = son;
654         return father;
655 }
656
657
658 /**********************************************************************/
659 /* Constructing and destructing the loop/backedge information.       **/
660 /**********************************************************************/
661
662 /* Initialization steps. **********************************************/
663
664 static void init_scc(struct obstack *obst)
665 {
666         int i;
667         int n_irgs;
668
669         current_dfn   = 1;
670         loop_node_cnt = 0;
671         init_stack();
672
673         n_irgs = get_irp_n_irgs();
674         for (i = 0; i < n_irgs; ++i) {
675                 ir_graph *irg = get_irp_irg(i);
676                 set_irg_link(irg, new_scc_info(obst));
677                 irg->callgraph_recursion_depth = 0;
678                 irg->callgraph_loop_depth      = 0;
679         }
680 }
681
682 /** Returns non-zero if n is a loop header, i.e., it is a Block node
683  *  and has predecessors within the cfloop and out of the cfloop.
684  *
685  *  @param root: only needed for assertion.
686  */
687 static int is_head(ir_graph *n, ir_graph *root)
688 {
689         int i, arity;
690         int some_outof_loop = 0, some_in_loop = 0;
691
692         arity = get_irg_n_callees(n);
693         for (i = 0; i < arity; i++) {
694                 ir_graph *pred = get_irg_callee(n, i);
695                 if (is_irg_callee_backedge(n, i)) continue;
696                 if (!irg_is_in_stack(pred)) {
697                         some_outof_loop = 1;
698                 } else {
699                         if (get_irg_uplink(pred) < get_irg_uplink(root))  {
700                                 assert(get_irg_uplink(pred) >= get_irg_uplink(root));
701                         }
702                         some_in_loop = 1;
703                 }
704         }
705
706         return some_outof_loop && some_in_loop;
707 }
708
709 /**
710  * Returns non-zero if n is possible loop head of an endless loop.
711  * I.e., it is a Block or Phi node and has only predecessors
712  * within the loop.
713  * @arg root: only needed for assertion.
714  */
715 static int is_endless_head(ir_graph *n, ir_graph *root)
716 {
717         int i, arity;
718         int some_outof_loop = 0, some_in_loop = 0;
719
720         arity = get_irg_n_callees(n);
721         for (i = 0; i < arity; i++) {
722                 ir_graph *pred = get_irg_callee(n, i);
723                 assert(pred);
724                 if (is_irg_callee_backedge(n, i))
725                         continue;
726                 if (!irg_is_in_stack(pred)) {
727                         some_outof_loop = 1;
728                 } else {
729                         if (get_irg_uplink(pred) < get_irg_uplink(root)) {
730                                 assert(get_irg_uplink(pred) >= get_irg_uplink(root));
731                         }
732                         some_in_loop = 1;
733                 }
734         }
735         return !some_outof_loop && some_in_loop;
736 }
737
738 /**
739  * Returns index of the predecessor with the smallest dfn number
740  * greater-equal than limit.
741  */
742 static int smallest_dfn_pred(ir_graph *n, int limit)
743 {
744         int i, index = -2, min = -1;
745
746         int arity = get_irg_n_callees(n);
747         for (i = 0; i < arity; i++) {
748                 ir_graph *pred = get_irg_callee(n, i);
749                 if (is_irg_callee_backedge(n, i) || !irg_is_in_stack(pred))
750                         continue;
751                 if (get_irg_dfn(pred) >= limit && (min == -1 || get_irg_dfn(pred) < min)) {
752                         index = i;
753                         min = get_irg_dfn(pred);
754                 }
755         }
756
757         return index;
758 }
759
760 /** Returns index of the predecessor with the largest dfn number. */
761 static int largest_dfn_pred(ir_graph *n)
762 {
763         int i, index = -2, max = -1;
764
765         int arity = get_irg_n_callees(n);
766         for (i = 0; i < arity; ++i) {
767                 ir_graph *pred = get_irg_callee(n, i);
768                 if (is_irg_callee_backedge (n, i) || !irg_is_in_stack(pred)) continue;
769                 if (get_irg_dfn(pred) > max) {
770                         index = i;
771                         max = get_irg_dfn(pred);
772                 }
773         }
774
775         return index;
776 }
777
778 static ir_graph *find_tail(ir_graph *n)
779 {
780         ir_graph *m;
781         int i, res_index = -2;
782
783         /*
784         if (!icfg && rm_cyclic_phis && remove_cyclic_phis (n)) return NULL;
785         */
786         m = stack[tos-1];  /* tos = top of stack */
787         if (is_head (m, n)) {
788                 res_index = smallest_dfn_pred(m, 0);
789                 if ((res_index == -2) &&  /* no smallest dfn pred found. */
790                         (n == m))
791                         return NULL;
792         } else {
793                 if (m == n) return NULL;    // Is this to catch Phi - self loops?
794                 for (i = tos-2; i >= 0; --i) {
795                         m = stack[i];
796
797                         if (is_head(m, n)) {
798                                 res_index = smallest_dfn_pred(m, get_irg_dfn(m) + 1);
799                                 if (res_index == -2)  /* no smallest dfn pred found. */
800                                         res_index = largest_dfn_pred(m);
801
802                                 if ((m == n) && (res_index == -2)) {
803                                         i = -1;
804                                 }
805                                 break;
806                         }
807
808                         /* We should not walk past our selves on the stack:  The upcoming nodes
809                            are not in this loop. We assume a loop not reachable from Start. */
810                         if (m == n) {
811                                 i = -1;
812                                 break;
813                         }
814
815                 }
816
817                 if (i < 0) {
818                         /* A dead loop not reachable from Start. */
819                         for (i = tos-2; i >= 0; --i) {
820                                 m = stack[i];
821                                 if (is_endless_head(m, n)) {
822                                         res_index = smallest_dfn_pred(m, get_irg_dfn(m) + 1);
823                                         if (res_index == -2)  /* no smallest dfn pred found. */
824                                                 res_index = largest_dfn_pred(m);
825                                         break;
826                                 }
827                                 if (m == n) { break; }  /* It's not an unreachable loop, either. */
828                         }
829                         //assert(0 && "no head found on stack");
830                 }
831
832         }
833         assert (res_index > -2);
834
835         set_irg_callee_backedge(m, res_index);
836         return get_irg_callee(m, res_index);
837 }
838
839 /*-----------------------------------------------------------*
840  *                   The core algorithm.                     *
841  *-----------------------------------------------------------*/
842
843
844 static void cgscc(ir_graph *n)
845 {
846         int i, arity;
847
848         if (cg_irg_visited(n)) return;
849         mark_cg_irg_visited(n);
850
851         /* Initialize the node */
852         set_irg_dfn(n, current_dfn);      /* Depth first number for this node */
853         set_irg_uplink(n, current_dfn);   /* ... is default uplink. */
854         current_dfn ++;
855         push(n);
856
857         arity = get_irg_n_callees(n);
858         for (i = 0; i < arity; i++) {
859                 ir_graph *m;
860                 if (is_irg_callee_backedge(n, i)) continue;
861                 m = get_irg_callee(n, i);
862
863                 /** This marks the backedge, but does it guarantee a correct loop tree? */
864                 //if (m == n) { set_irg_callee_backedge(n, i); continue; }
865
866                 cgscc(m);
867                 if (irg_is_in_stack(m)) {
868                         /* Uplink of m is smaller if n->m is a backedge.
869                            Propagate the uplink to mark the cfloop. */
870                         if (get_irg_uplink(m) < get_irg_uplink(n))
871                                 set_irg_uplink(n, get_irg_uplink(m));
872                 }
873         }
874
875         if (get_irg_dfn(n) == get_irg_uplink(n)) {
876                 /* This condition holds for
877                    1) the node with the incoming backedge.
878                    That is: We found a cfloop!
879                    2) Straight line code, because no uplink has been propagated, so the
880                    uplink still is the same as the dfn.
881
882                    But n might not be a proper cfloop head for the analysis. Proper cfloop
883                    heads are Block and Phi nodes. find_tail searches the stack for
884                    Block's and Phi's and takes those nodes as cfloop heads for the current
885                    cfloop instead and marks the incoming edge as backedge. */
886
887                 ir_graph *tail = find_tail(n);
888                 if (tail) {
889                         /* We have a cfloop, that is no straight line code,
890                            because we found a cfloop head!
891                            Next actions: Open a new cfloop on the cfloop tree and
892                            try to find inner cfloops */
893
894
895                         ir_loop *l = new_loop();
896
897                         /* Remove the cfloop from the stack ... */
898                         pop_scc_unmark_visit(n);
899
900                         /* The current backedge has been marked, that is temporarily eliminated,
901                            by find tail. Start the scc algorithm
902                            anew on the subgraph thats left (the current cfloop without the backedge)
903                            in order to find more inner cfloops. */
904
905                         cgscc(tail);
906
907                         assert(cg_irg_visited(n));
908                         close_loop(l);
909                 } else {
910                         pop_scc_to_loop(n);
911                 }
912         }
913 }
914
915
916 /**
917  * reset the backedge information for all callers in all irgs
918  */
919 static void reset_isbe(void)
920 {
921         int i, n_irgs = get_irp_n_irgs();
922
923         for (i = 0; i < n_irgs; ++i) {
924                 ir_graph *irg = get_irp_irg(i);
925
926                 if (irg->caller_isbe)
927                         xfree(irg->caller_isbe);
928                 irg->caller_isbe = NULL;
929
930                 if (irg->callee_isbe)
931                         xfree(irg->callee_isbe);
932                 irg->callee_isbe = NULL;
933         }
934 }
935
936 /* ----------------------------------------------------------------------------------- */
937 /* Another algorithm to compute recursion nesting depth                                */
938 /* Walk the callgraph.  For each crossed edge increase the loop depth by the edge      */
939 /* weight. Assign graphs the maximal depth.                                            */
940 /* ----------------------------------------------------------------------------------- */
941
942 static void compute_loop_depth(ir_graph *irg, void *env)
943 {
944         int current_nesting = *(int *) env;
945         int old_nesting = irg->callgraph_loop_depth;
946         ir_visited_t old_visited = get_cg_irg_visited(irg);
947         int i, n_callees;
948
949         //return ;
950
951         if (cg_irg_visited(irg)) return;
952
953         mark_cg_irg_visited(irg);
954
955         if (old_nesting < current_nesting)
956                 irg->callgraph_loop_depth = current_nesting;
957
958         if (current_nesting > irp->max_callgraph_loop_depth)
959                 irp->max_callgraph_loop_depth = current_nesting;
960
961         if ((old_visited +1 < get_cg_irg_visited(irg)) ||   /* not yet visited */
962                 (old_nesting < current_nesting)) {        /* propagate larger nesting */
963                         /* Don't walk the graph, but a tree that is an unfolded graph. */
964                         n_callees = get_irg_n_callees(irg);
965                         for (i = 0; i < n_callees; i++) {
966                                 ir_graph *m = get_irg_callee(irg, i);
967                                 *(int *)env += get_irg_callee_loop_depth(irg, i);
968                                 compute_loop_depth(m, env);
969                                 *(int *)env -= get_irg_callee_loop_depth(irg, i);
970                         }
971         }
972
973         set_cg_irg_visited(irg, master_cg_visited-1);
974 }
975
976 /* ------------------------------------------------------------------------------------ */
977 /* Another algorithm to compute recursion nesting depth                                 */
978 /* Walk the callgraph.  For each crossed loop increase the nesting depth by one.        */
979 /* Assign graphs the maximal nesting depth.   Don't increase if passing loops more than */
980 /* once.                                                                               */
981 /* ------------------------------------------------------------------------------------ */
982
983
984 /* For callees, we want to remember the Call nodes, too. */
985 typedef struct ana_entry2 {
986         ir_loop **loop_stack;   /**< a stack of ir_loop entries */
987         int tos;                /**< the top of stack entry */
988         int recursion_nesting;
989 } ana_entry2;
990
991 /**
992  * push a loop entry on the stack
993  */
994 static void push2(ana_entry2 *e, ir_loop *g)
995 {
996         if (ARR_LEN(e->loop_stack) == e->tos) {
997                 ARR_APP1(ir_loop *, e->loop_stack, g);
998         } else {
999                 e->loop_stack[e->tos] = g;
1000         }
1001         ++e->tos;
1002 }
1003
1004 /**
1005  * returns the top of stack and pop it
1006  */
1007 static ir_loop *pop2(ana_entry2 *e)
1008 {
1009         return e->loop_stack[--e->tos];
1010 }
1011
1012 /**
1013  * check if a loop g in on the stack. Did not check the TOS.
1014  */
1015 static int in_stack(ana_entry2 *e, ir_loop *g)
1016 {
1017         int i;
1018         for (i = e->tos-1; i >= 0; --i) {
1019                 if (e->loop_stack[i] == g) return 1;
1020         }
1021         return 0;
1022 }
1023
1024 static void compute_rec_depth(ir_graph *irg, void *env)
1025 {
1026         ana_entry2 *e = (ana_entry2 *)env;
1027         ir_loop *l = irg->l;
1028         int depth, old_depth = irg->callgraph_recursion_depth;
1029         int i, n_callees;
1030         int pushed = 0;
1031
1032         if (cg_irg_visited(irg))
1033                 return;
1034         mark_cg_irg_visited(irg);
1035
1036         /* -- compute and set the new nesting value -- */
1037         if ((l != irp->outermost_cg_loop) && !in_stack(e, l)) {
1038                 push2(e, l);
1039                 e->recursion_nesting++;
1040                 pushed = 1;
1041         }
1042         depth = e->recursion_nesting;
1043
1044         if (old_depth < depth)
1045                 irg->callgraph_recursion_depth = depth;
1046
1047         if (depth > irp->max_callgraph_recursion_depth)
1048                 irp->max_callgraph_recursion_depth = depth;
1049
1050         /* -- spread the nesting value -- */
1051         if (depth == 0 || old_depth < depth) {
1052                 /* Don't walk the graph, but a tree that is an unfolded graph.
1053                    Therefore we unset the visited flag at the end. */
1054                 n_callees = get_irg_n_callees(irg);
1055                 for (i = 0; i < n_callees; ++i) {
1056                         ir_graph *m = get_irg_callee(irg, i);
1057                         compute_rec_depth(m, env);
1058                 }
1059         }
1060
1061         /* -- clean up -- */
1062         if (pushed) {
1063                 pop2(e);
1064                 e->recursion_nesting--;
1065         }
1066         set_cg_irg_visited(irg, master_cg_visited-1);
1067 }
1068
1069
1070 /* ----------------------------------------------------------------------------------- */
1071 /* Another algorithm to compute the execution frequency of methods ignoring recursions. */
1072 /* Walk the callgraph.  Ignore backedges.  Use sum of execution frequencies of Call     */
1073 /* nodes to evaluate a callgraph edge.                                                 */
1074 /* ----------------------------------------------------------------------------------- */
1075
1076 /* Returns the method execution frequency of a graph. */
1077 double get_irg_method_execution_frequency(const ir_graph *irg)
1078 {
1079         return irg->method_execution_frequency;
1080 }
1081
1082 /**
1083  * Increase the method execution frequency to freq if its current value is
1084  * smaller then this.
1085  */
1086 static void set_irg_method_execution_frequency(ir_graph *irg, double freq)
1087 {
1088         irg->method_execution_frequency = freq;
1089
1090         if (irp->max_method_execution_frequency < freq)
1091                 irp->max_method_execution_frequency = freq;
1092 }
1093
1094 static void compute_method_execution_frequency(ir_graph *irg, void *env)
1095 {
1096         int i, n_callers;
1097         double freq;
1098         int    found_edge;
1099         int    n_callees;
1100         (void) env;
1101
1102         if (cg_irg_visited(irg))
1103                 return;
1104
1105         /* We need the values of all predecessors (except backedges).
1106            So they must be marked.  Else we will reach the node through
1107            one of the unmarked ones. */
1108         n_callers = get_irg_n_callers(irg);
1109         for (i = 0; i < n_callers; ++i) {
1110                 ir_graph *m = get_irg_caller(irg, i);
1111                 if (is_irg_caller_backedge(irg, i))
1112                         continue;
1113                 if (!cg_irg_visited(m)) {
1114                         return;
1115                 }
1116         }
1117         mark_cg_irg_visited(irg);
1118
1119         /* Compute the new frequency. */
1120         freq = 0;
1121         found_edge = 0;
1122         for (i = 0; i < n_callers; i++) {
1123                 if (! is_irg_caller_backedge(irg, i)) {
1124                         double edge_freq = get_irg_caller_method_execution_frequency(irg, i);
1125                         assert(edge_freq >= 0);
1126                         freq += edge_freq;
1127                         found_edge = 1;
1128                 }
1129         }
1130
1131         if (!found_edge) {
1132                 /* A starting point: method only called from outside,
1133                 or only backedges as predecessors. */
1134                 freq = 1;
1135         }
1136
1137         set_irg_method_execution_frequency(irg, freq);
1138
1139         /* recur */
1140         n_callees = get_irg_n_callees(irg);
1141         for (i = 0; i < n_callees; ++i) {
1142                 compute_method_execution_frequency(get_irg_callee(irg, i), NULL);
1143         }
1144 }
1145
1146
1147 /* ----------------------------------------------------------------------------------- */
1148 /* The recursion stuff driver.                                                         */
1149 /* ----------------------------------------------------------------------------------- */
1150
1151 /* Compute the backedges that represent recursions. */
1152 void find_callgraph_recursions(void)
1153 {
1154         int i, n_irgs;
1155         struct obstack temp;
1156
1157         reset_isbe();
1158
1159         /* -- compute the looptree. -- */
1160
1161         /* The outermost graph.  We start here.  Then we start at all
1162         functions in irg list that are never called, then at the remaining
1163         unvisited ones. The third step is needed for functions that are not
1164         reachable from the outermost graph, but call themselves in a cycle. */
1165         assert(get_irp_main_irg());
1166         outermost_ir_graph = get_irp_main_irg();
1167         obstack_init(&temp);
1168         init_scc(&temp);
1169
1170         current_loop = NULL;
1171         new_loop();  /* sets current_loop */
1172
1173         ++master_cg_visited;
1174         cgscc(outermost_ir_graph);
1175         n_irgs = get_irp_n_irgs();
1176         for (i = 0; i < n_irgs; ++i) {
1177                 ir_graph *irg = get_irp_irg(i);
1178                 if (!cg_irg_visited(irg) && get_irg_n_callers(irg) == 0)
1179                         cgscc(irg);
1180         }
1181         for (i = 0; i < n_irgs; ++i) {
1182                 ir_graph *irg = get_irp_irg(i);
1183                 if (!cg_irg_visited(irg))
1184                         cgscc(irg);
1185         }
1186         obstack_free(&temp, NULL);
1187
1188         irp->outermost_cg_loop = current_loop;
1189         mature_loops(current_loop, outermost_ir_graph->obst);
1190
1191         /* -- Reverse the backedge information. -- */
1192         for (i = 0; i < n_irgs; ++i) {
1193                 ir_graph *irg = get_irp_irg(i);
1194                 int j, n_callees = get_irg_n_callees(irg);
1195                 for (j = 0; j < n_callees; ++j) {
1196                         if (is_irg_callee_backedge(irg, j))
1197                                 set_irg_caller_backedge(get_irg_callee(irg, j), irg);
1198                 }
1199         }
1200
1201         irp->callgraph_state = irp_callgraph_and_calltree_consistent;
1202 }
1203
1204 /* Compute interprocedural performance estimates. */
1205 void compute_performance_estimates(void)
1206 {
1207         int i, n_irgs = get_irp_n_irgs();
1208         int current_nesting;
1209         ana_entry2 e;
1210
1211         assert(get_irp_exec_freq_state() != exec_freq_none && "execution frequency not calculated");
1212
1213         /* -- compute the loop depth  -- */
1214         current_nesting = 0;
1215         irp->max_callgraph_loop_depth = 0;
1216         master_cg_visited += 2;
1217         compute_loop_depth(get_irp_main_irg(), &current_nesting);
1218         for (i = 0; i < n_irgs; i++) {
1219                 ir_graph *irg = get_irp_irg(i);
1220                 if ((get_cg_irg_visited(irg) < master_cg_visited-1) &&
1221                         get_irg_n_callers(irg) == 0) {
1222                                 compute_loop_depth(irg, &current_nesting);
1223                 }
1224         }
1225         for (i = 0; i < n_irgs; i++) {
1226                 ir_graph *irg = get_irp_irg(i);
1227                 if (get_cg_irg_visited(irg) < master_cg_visited-1) {
1228                         compute_loop_depth(irg, &current_nesting);
1229                 }
1230         }
1231
1232
1233         /* -- compute the recursion depth -- */
1234         e.loop_stack        = NEW_ARR_F(ir_loop *, 0);
1235         e.tos               = 0;
1236         e.recursion_nesting = 0;
1237
1238         irp->max_callgraph_recursion_depth = 0;
1239
1240         master_cg_visited += 2;
1241         compute_rec_depth(get_irp_main_irg(), &e);
1242         for (i = 0; i < n_irgs; i++) {
1243                 ir_graph *irg = get_irp_irg(i);
1244                 if ((get_cg_irg_visited(irg) < master_cg_visited-1) &&
1245                         get_irg_n_callers(irg) == 0) {
1246                                 compute_rec_depth(irg, &e);
1247                 }
1248         }
1249         for (i = 0; i < n_irgs; i++) {
1250                 ir_graph *irg = get_irp_irg(i);
1251                 if (get_cg_irg_visited(irg) < master_cg_visited-1) {
1252                         compute_rec_depth(irg, &e);
1253                 }
1254         }
1255
1256         DEL_ARR_F(e.loop_stack);
1257
1258         /* -- compute the execution frequency -- */
1259         irp->max_method_execution_frequency = 0;
1260         master_cg_visited += 2;
1261         assert(get_irg_n_callers(get_irp_main_irg()) == 0);
1262         compute_method_execution_frequency(get_irp_main_irg(), NULL);
1263         for (i = 0; i < n_irgs; i++) {
1264                 ir_graph *irg = get_irp_irg(i);
1265                 if ((get_cg_irg_visited(irg) < master_cg_visited-1) &&
1266                         get_irg_n_callers(irg) == 0) {
1267                                 compute_method_execution_frequency(irg, NULL);
1268                 }
1269         }
1270         for (i = 0; i < n_irgs; i++) {
1271                 ir_graph *irg = get_irp_irg(i);
1272                 if (get_cg_irg_visited(irg) < master_cg_visited-1) {
1273                         compute_method_execution_frequency(irg, NULL);
1274                 }
1275         }
1276 }
1277
1278 /* Returns the maximal loop depth of all paths from an external visible method to
1279    this irg. */
1280 int  get_irg_loop_depth(const ir_graph *irg)
1281 {
1282         assert(irp->callgraph_state == irp_callgraph_consistent ||
1283                 irp->callgraph_state == irp_callgraph_and_calltree_consistent);
1284         return  irg->callgraph_loop_depth;
1285 }
1286
1287 /* Returns the maximal recursion depth of all paths from an external visible method to
1288    this irg. */
1289 int get_irg_recursion_depth(const ir_graph *irg)
1290 {
1291         assert(irp->callgraph_state == irp_callgraph_and_calltree_consistent);
1292         return irg->callgraph_recursion_depth;
1293 }
1294
1295 /* Computes the interprocedural loop nesting information. */
1296 void analyse_loop_nesting_depth(void)
1297 {
1298         /* establish preconditions. */
1299         if (get_irp_callee_info_state() != irg_callee_info_consistent) {
1300                 ir_entity **free_methods = NULL;
1301
1302                 cgana(&free_methods);
1303                 xfree(free_methods);
1304         }
1305
1306         if (irp_callgraph_consistent != get_irp_callgraph_state()) {
1307                 compute_callgraph();
1308         }
1309
1310         find_callgraph_recursions();
1311
1312         compute_performance_estimates();
1313
1314         set_irp_loop_nesting_depth_state(loop_nesting_depth_consistent);
1315 }
1316
1317 loop_nesting_depth_state get_irp_loop_nesting_depth_state(void)
1318 {
1319         return irp->lnd_state;
1320 }
1321 void set_irp_loop_nesting_depth_state(loop_nesting_depth_state s)
1322 {
1323         irp->lnd_state = s;
1324 }
1325 void set_irp_loop_nesting_depth_state_inconsistent(void)
1326 {
1327         if (irp->lnd_state == loop_nesting_depth_consistent)
1328                 irp->lnd_state = loop_nesting_depth_inconsistent;
1329 }