fix trailing whitespaces and tabulators in the middle of a line
[libfirm] / ir / opt / loop.c
1 /*
2  * Copyright (C) 1995-2010 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  * @author   Christian Helmer
23  * @brief    loop inversion and loop unrolling
24  *
25  * @version  $Id$
26  */
27
28 #include "config.h"
29
30 #include "iroptimize.h"
31 #include "opt_init.h"
32 #include "irnode.h"
33 #include "debug.h"
34 #include "error.h"
35
36 #include "ircons.h"
37 #include "irgopt.h"
38 #include "irgmod.h"
39 #include "irgwalk.h"
40 #include "irouts.h"
41 #include "iredges.h"
42 #include "irtools.h"
43 #include "array_t.h"
44 #include "beutil.h"
45 #include "irpass.h"
46 #include "irdom.h"
47
48 #include "irbackedge_t.h"
49 #include "irphase_t.h"
50 #include "irloop_t.h"
51
52
53 DEBUG_ONLY(static firm_dbg_module_t *dbg);
54
55 /* DBG print stats for every procedure.  */
56 #define LOOP_OPT_STATS 0
57
58 /* DBG: Ignore node limits and process every possible loop. */
59 #define LOOP_IGNORE_NODE_LIMITS 0
60
61 /**
62  * Convenience macro for iterating over every phi node of the given block.
63  * Requires phi list per block.
64  */
65 #define for_each_phi(block, phi) \
66         for ((phi) = get_Block_phis( (block) ); (phi) ; (phi) = get_Phi_next((phi)))
67
68 #define for_each_phi_safe(head, phi, next) \
69         for ((phi) = (head), (next) = (head) ? get_Phi_next((head)) : NULL; \
70                         (phi) ; (phi) = (next), (next) = (next) ? get_Phi_next((next)) : NULL)
71
72 /* Currently processed loop. */
73 static ir_loop *cur_loop;
74
75 /* Flag for kind of unrolling. */
76 typedef enum {
77         constant,
78         invariant
79 } unrolling_kind_flag;
80
81 /* Condition for performing visiting a node during copy_walk. */
82 typedef unsigned walker_condition(ir_node *);
83
84 /* Node and position of a predecessor. */
85 typedef struct entry_edge {
86         ir_node *node;
87         int pos;
88         ir_node *pred;
89 } entry_edge;
90
91 /* Node info for unrolling. */
92 typedef struct unrolling_node_info {
93         ir_node **copies;
94         /*ir_node **ins;*/
95 } unrolling_node_info;
96
97 /* Outs of the nodes head. */
98 static entry_edge *cur_head_outs;
99
100 /* Information about the loop head */
101 static ir_node *loop_head = NULL;
102 static unsigned loop_head_valid = 1;
103
104 /* List of all inner loops, that are processed. */
105 static ir_loop **loops;
106
107 #if LOOP_OPT_STATS
108
109 #define count_stats(val) (++val)
110 #define print_stats() (do_print_stats())
111 #define reset_stats() (do_reset_stats())
112
113 /* Stats */
114 typedef struct loop_stats_t {
115         unsigned loops;
116         unsigned inverted;
117         unsigned too_large;
118         unsigned too_large_adapted;
119         unsigned cc_limit_reached;
120         unsigned calls_limit;
121
122         unsigned u_simple_counting_loop;
123         unsigned constant_unroll;
124         unsigned invariant_unroll;
125
126         unsigned unhandled;
127 } loop_stats_t;
128
129 static loop_stats_t stats;
130
131 /* Set stats to sero */
132 static void do_reset_stats(void)
133 {
134         memset(&stats, 0, sizeof(loop_stats_t));
135 }
136
137 /* Print stats */
138 static void do_print_stats(void)
139 {
140         DB((dbg, LEVEL_2, "---------------------------------------\n"));
141         DB((dbg, LEVEL_2, "loops             :   %d\n",stats.loops));
142         DB((dbg, LEVEL_2, "inverted          :   %d\n",stats.inverted));
143         DB((dbg, LEVEL_2, "too_large         :   %d\n",stats.too_large));
144         DB((dbg, LEVEL_2, "too_large_adapted :   %d\n",stats.too_large_adapted));
145         DB((dbg, LEVEL_2, "cc_limit_reached  :   %d\n",stats.cc_limit_reached));
146         DB((dbg, LEVEL_2, "calls_limit       :   %d\n",stats.calls_limit));
147         DB((dbg, LEVEL_2, "u_simple_counting :   %d\n",stats.u_simple_counting_loop));
148         DB((dbg, LEVEL_2, "constant_unroll   :   %d\n",stats.constant_unroll));
149         DB((dbg, LEVEL_2, "invariant_unroll  :   %d\n",stats.invariant_unroll));
150         DB((dbg, LEVEL_2, "=======================================\n"));
151 }
152 #else
153 /* No stats */
154 #define count_stats(val) ((void)0)
155 #define print_stats() ((void)0)
156 #define reset_stats() ((void)0)
157
158 #endif
159
160 /* Commandline parameters */
161 typedef struct loop_opt_params_t {
162         unsigned max_loop_size;     /* Maximum number of nodes */
163         int      depth_adaption;    /* Loop nest depth adaption */
164         unsigned allowed_calls;     /* Number of calls allowed */
165         unsigned count_phi:1;       /* Count phi nodes */
166         unsigned count_proj:1;      /* Count projections */
167
168         unsigned max_cc_size;       /* Maximum condition chain size */
169
170         unsigned allow_const_unrolling:1;
171         unsigned allow_invar_unrolling:1;
172
173 } loop_opt_params_t;
174
175 static loop_opt_params_t opt_params;
176
177 /* Loop analysis informations */
178 typedef struct loop_info_t {
179         unsigned nodes;         /* node count */
180         unsigned ld_st;         /* load and store nodes */
181         unsigned calls;         /* number of calls */
182         unsigned cf_outs;       /* number of cf edges which leave the loop */
183         entry_edge cf_out;      /* single loop leaving cf edge */
184         int be_src_pos;         /* position of the single own backedge in the head */
185
186         /* for inversion */
187         unsigned cc_size;       /* nodes in the condition chain */
188
189         /* for unrolling */
190         unsigned max_unroll;        /* Number of unrolls satisfying max_loop_size */
191         unsigned exit_cond;         /* 1 if condition==true exits the loop.  */
192         unsigned latest_value:1;    /* 1 if condition is checked against latest counter value */
193         unsigned needs_backedge:1;  /* 0 if loop is completely unrolled */
194         unsigned decreasing:1;      /* Step operation is_Sub, or step is<0 */
195
196         /* IV informations of a simple loop */
197         ir_node *start_val;
198         ir_node *step;
199         ir_node *end_val;
200         ir_node *iteration_phi;
201         ir_node *add;
202
203         tarval *count_tar;                  /* Number of loop iterations */
204
205         ir_node *duff_cond;                 /* Duff mod */
206         unrolling_kind_flag unroll_kind;    /* constant or invariant unrolling */
207 } loop_info_t;
208
209 /* Information about the current loop */
210 static loop_info_t loop_info;
211
212 /* Outs of the condition chain (loop inversion). */
213 static ir_node **cc_blocks;
214 /* df/cf edges with def in the condition chain */
215 static entry_edge *cond_chain_entries;
216 /* Array of df loops found in the condition chain. */
217 static entry_edge *head_df_loop;
218 /* Number of blocks in cc */
219 static unsigned inversion_blocks_in_cc;
220
221
222 /* Cf/df edges leaving the loop.
223  * Called entries here, as they are used to enter the loop with walkers. */
224 static entry_edge *loop_entries;
225 /* Number of unrolls to perform */
226 static int unroll_nr;
227 /* Phase is used to keep copies of nodes. */
228 static ir_phase *phase;
229
230 /* Loop operations.  */
231 typedef enum loop_op_t {
232         loop_op_inversion,
233         loop_op_unrolling,
234         loop_op_peeling
235 } loop_op_t;
236
237 /* Saves which loop operation to do until after basic tests. */
238 static loop_op_t loop_op;
239
240 /************************************************************************/
241
242 /* Returns the maximum nodes for the given nest depth */
243 static unsigned get_max_nodes_adapted(unsigned depth)
244 {
245         int adapt_permil = opt_params.depth_adaption * depth;
246         unsigned permil_change;
247
248         if (adapt_permil < -1000)
249                 return 0;
250
251         permil_change = 1000 + adapt_permil;
252         return (opt_params.max_loop_size * permil_change) / 1000;
253 }
254
255 /* Reset nodes link. For use with a walker. */
256 static void reset_link(ir_node *node, void *env)
257 {
258         (void)env;
259         set_irn_link(node, NULL);
260 }
261
262 /* Returns 0 if the node or block is not in cur_loop. */
263 static unsigned is_in_loop(ir_node *node)
264 {
265         return (get_irn_loop(get_block(node)) == cur_loop);
266 }
267
268 /* Returns 0 if the given edge is not a backedge
269  * with its pred in the cur_loop. */
270 static unsigned is_own_backedge(ir_node *n, int pos)
271 {
272         return (is_backedge(n, pos) && is_in_loop(get_irn_n(n, pos)));
273 }
274
275 /* Finds loop head and some loop_info as calls or else if necessary. */
276 static void get_loop_info(ir_node *node, void *env)
277 {
278         unsigned node_in_loop, pred_in_loop;
279         int i, arity;
280         (void)env;
281
282         arity = get_irn_arity(node);
283         for (i = 0; i < arity; i++) {
284                 ir_node *pred = get_irn_n(node, i);
285
286                 pred_in_loop = is_in_loop(pred);
287                 node_in_loop = is_in_loop(node);
288
289                 /* collect some loop information */
290                 if (node_in_loop) {
291                         if (is_Phi(node) && opt_params.count_phi)
292                                 ++loop_info.nodes;
293                         else if (is_Proj(node) && opt_params.count_proj)
294                                 ++loop_info.nodes;
295                         else if (!is_Confirm(node) && !is_Const(node) && !is_SymConst(node))
296                                 ++loop_info.nodes;
297
298                         if (is_Load(node) || is_Store(node))
299                                 ++loop_info.ld_st;
300
301                         if (is_Call(node))
302                                 ++loop_info.calls;
303                 }
304
305                 /* Find the loops head/the blocks with cfpred outside of the loop */
306                 if (is_Block(node) && node_in_loop && !pred_in_loop && loop_head_valid) {
307                         ir_node *cfgpred = get_Block_cfgpred(node, i);
308
309                         if (!is_in_loop(cfgpred)) {
310                                 DB((dbg, LEVEL_5, "potential head %+F because inloop and pred %+F not inloop\n",
311                                                         node, pred));
312                                 /* another head? We do not touch this. */
313                                 if (loop_head && loop_head != node) {
314                                         loop_head_valid = 0;
315                                 } else {
316                                         loop_head = node;
317                                 }
318                         }
319                 }
320         }
321 }
322
323 /* Finds all edges with users outside of the loop
324  * and definition inside the loop. */
325 static void get_loop_entries(ir_node *node, void *env)
326 {
327         unsigned node_in_loop, pred_in_loop;
328         int i, arity;
329         (void) env;
330
331         arity = get_irn_arity(node);
332         for (i = 0; i < arity; ++i) {
333                 ir_node *pred = get_irn_n(node, i);
334
335                 pred_in_loop = is_in_loop(pred);
336                 node_in_loop = is_in_loop(node);
337
338                 if (pred_in_loop && !node_in_loop) {
339                         entry_edge entry;
340                         entry.node = node;
341                         entry.pos = i;
342                         entry.pred = pred;
343                         ARR_APP1(entry_edge, loop_entries, entry);
344                         /* Count cf outs */
345                         if (is_Block(node)) {
346                                 ++loop_info.cf_outs;
347                                 loop_info.cf_out = entry;
348                         }
349                 }
350         }
351 }
352
353 /* ssa */
354 static ir_node *ssa_second_def;
355 static ir_node *ssa_second_def_block;
356
357 /**
358  * Walks the graph bottom up, searching for definitions and creates phis.
359  */
360 static ir_node *search_def_and_create_phis(ir_node *block, ir_mode *mode, int first)
361 {
362         int i;
363         int n_cfgpreds;
364         ir_graph *irg;
365         ir_node *phi;
366         ir_node **in;
367
368         DB((dbg, LEVEL_5, "ssa search_def_and_create_phis: block %N\n", block));
369
370         /* Prevents creation of phi that would be bad anyway.
371          * Dead and bad blocks. */
372         if (get_irn_arity(block) < 1 || is_Bad(block)) {
373                 DB((dbg, LEVEL_5, "ssa bad %N\n", block));
374                 return new_Bad();
375         }
376
377         if (block == ssa_second_def_block && !first) {
378                 DB((dbg, LEVEL_5, "ssa found second definition: use second def %N\n", ssa_second_def));
379                 return ssa_second_def;
380         }
381
382         /* already processed this block? */
383         if (irn_visited(block)) {
384                 ir_node *value = (ir_node *) get_irn_link(block);
385                 DB((dbg, LEVEL_5, "ssa already visited: use linked %N\n", value));
386                 return value;
387         }
388
389         irg = get_irn_irg(block);
390         assert(block != get_irg_start_block(irg));
391
392         /* a Block with only 1 predecessor needs no Phi */
393         n_cfgpreds = get_Block_n_cfgpreds(block);
394         if (n_cfgpreds == 1) {
395                 ir_node *pred_block = get_Block_cfgpred_block(block, 0);
396                 ir_node *value;
397
398                 DB((dbg, LEVEL_5, "ssa 1 pred: walk pred %N\n", pred_block));
399
400                 value = search_def_and_create_phis(pred_block, mode, 0);
401                 set_irn_link(block, value);
402                 mark_irn_visited(block);
403
404                 return value;
405         }
406
407         /* create a new Phi */
408         NEW_ARR_A(ir_node*, in, n_cfgpreds);
409         for (i = 0; i < n_cfgpreds; ++i)
410                 in[i] = new_Unknown(mode);
411
412         phi = new_r_Phi(block, n_cfgpreds, in, mode);
413         /* Important: always keep block phi list up to date. */
414         add_Block_phi(block, phi);
415         DB((dbg, LEVEL_5, "ssa phi creation: link new phi %N to block %N\n", phi, block));
416         set_irn_link(block, phi);
417         mark_irn_visited(block);
418
419         /* set Phi predecessors */
420         for (i = 0; i < n_cfgpreds; ++i) {
421                 ir_node *pred_val;
422                 ir_node *pred_block = get_Block_cfgpred_block(block, i);
423                 assert(pred_block != NULL);
424                 pred_val = search_def_and_create_phis(pred_block, mode, 0);
425
426                 assert(pred_val != NULL);
427
428                 DB((dbg, LEVEL_5, "ssa phi pred:phi %N, pred %N\n", phi, pred_val));
429                 set_irn_n(phi, i, pred_val);
430         }
431
432         return phi;
433 }
434
435
436 /**
437  * Given a set of values this function constructs SSA-form for the users of the
438  * first value (the users are determined through the out-edges of the value).
439  * Works without using the dominance tree.
440  */
441 static void construct_ssa(ir_node *orig_block, ir_node *orig_val,
442                 ir_node *second_block, ir_node *second_val)
443 {
444         ir_graph *irg;
445         ir_mode *mode;
446         const ir_edge_t *edge;
447         const ir_edge_t *next;
448
449         assert(orig_block && orig_val && second_block && second_val &&
450                         "no parameter of construct_ssa may be NULL");
451
452         if (orig_val == second_val)
453                 return;
454
455         irg = get_irn_irg(orig_val);
456
457         ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED);
458         inc_irg_visited(irg);
459
460         mode = get_irn_mode(orig_val);
461         set_irn_link(orig_block, orig_val);
462         mark_irn_visited(orig_block);
463
464         ssa_second_def_block = second_block;
465         ssa_second_def       = second_val;
466
467         /* Only fix the users of the first, i.e. the original node */
468         foreach_out_edge_safe(orig_val, edge, next) {
469                 ir_node *user = get_edge_src_irn(edge);
470                 int j = get_edge_src_pos(edge);
471                 ir_node *user_block = get_nodes_block(user);
472                 ir_node *newval;
473
474                 /* ignore keeps */
475                 if (is_End(user))
476                         continue;
477
478                 DB((dbg, LEVEL_5, "original user %N\n", user));
479
480                 if (is_Phi(user)) {
481                         ir_node *pred_block = get_Block_cfgpred_block(user_block, j);
482                         newval = search_def_and_create_phis(pred_block, mode, 1);
483                 } else {
484                         newval = search_def_and_create_phis(user_block, mode, 1);
485                 }
486                 if (newval != user && !is_Bad(newval))
487                         set_irn_n(user, j, newval);
488         }
489
490         ir_free_resources(irg, IR_RESOURCE_IRN_VISITED);
491 }
492
493
494 /***** Unrolling Helper Functions *****/
495
496 /* Assign the copy with index nr to node n */
497 static void set_unroll_copy(ir_node *n, int nr, ir_node *cp)
498 {
499         unrolling_node_info *info;
500         assert(nr != 0 && "0 reserved");
501
502         info = (unrolling_node_info *)phase_get_irn_data(phase, n);
503         if (! info) {
504                 ir_node **arr;
505
506                 info = XMALLOCZ(unrolling_node_info);
507                 arr = NEW_ARR_F(ir_node *, unroll_nr);
508                 info->copies = arr;
509                 memset(info->copies, 0, (unroll_nr) * sizeof(ir_node *));
510
511                 phase_set_irn_data(phase, n, info);
512         }
513         /* Original node */
514         info->copies[0] = n;
515
516         info->copies[nr] = cp;
517 }
518
519 /* Returns a nodes copy if it exists, else NULL. */
520 static ir_node *get_unroll_copy(ir_node *n, int nr)
521 {
522         ir_node             *cp;
523         unrolling_node_info *info = (unrolling_node_info *)phase_get_irn_data(phase, n);
524         if (! info)
525                 return NULL;
526
527         cp = info->copies[nr];
528         return cp;
529 }
530
531
532 /***** Inversion Helper Functions *****/
533
534 /* Sets copy cp of node n. */
535 static void set_inversion_copy(ir_node *n, ir_node *cp)
536 {
537         phase_set_irn_data(phase, n, cp);
538 }
539
540 /* Getter of copy of n for inversion */
541 static ir_node *get_inversion_copy(ir_node *n)
542 {
543         ir_node *cp = (ir_node *)phase_get_irn_data(phase, n);
544         return cp;
545 }
546
547 /* Resets block mark for given node. For use with walker */
548 static void reset_block_mark(ir_node *node, void * env)
549 {
550         (void) env;
551
552         if (is_Block(node))
553                 set_Block_mark(node, 0);
554 }
555
556 /* Returns mark of node, or its block if node is not a block.
557  * Used in this context to determine if node is in the condition chain. */
558 static unsigned is_nodes_block_marked(ir_node* node)
559 {
560         if (is_Block(node))
561                 return get_Block_mark(node);
562         else
563                 return get_Block_mark(get_block(node));
564 }
565
566 /* Extends a nodes ins by node new.
567  * NOTE: This is slow if a node n needs to be extended more than once. */
568 static int extend_irn(ir_node *n, ir_node *new)
569 {
570         ir_node **ins;
571         int i;
572         int arity = get_irn_arity(n);
573         int new_arity = arity + 1;
574
575         NEW_ARR_A(ir_node *, ins, new_arity);
576
577         for(i = 0; i < arity; ++i) {
578                 ins[i] = get_irn_n(n, i);
579         }
580         ins[i] = new;
581
582         set_irn_in(n, new_arity, ins);
583         return arity;
584 }
585
586 /* Extends a block by a copy of its pred at pos,
587  * fixing also the phis in the same way. */
588 static void extend_ins_by_copy(ir_node *block, int pos)
589 {
590         ir_node *new_in;
591         ir_node *phi;
592         ir_node *pred;
593         assert(is_Block(block));
594
595         /* Extend block by copy of definition at pos */
596         pred = get_irn_n(block, pos);
597         new_in = get_inversion_copy(pred);
598         DB((dbg, LEVEL_5, "Extend block %N by %N cp of %N\n", block, new_in, pred));
599         extend_irn(block, new_in);
600
601         /* Extend block phis by copy of definition at pos */
602         for_each_phi(block, phi) {
603                 ir_node *pred, *cp;
604
605                 pred = get_irn_n(phi, pos);
606                 cp = get_inversion_copy(pred);
607                 /* If the phis in is not in the condition chain (eg. a constant),
608                  * there is no copy. */
609                 if (cp == NULL)
610                         new_in = pred;
611                 else
612                         new_in = cp;
613
614                 DB((dbg, LEVEL_5, "Extend phi %N by %N cp of %N\n", phi, new_in, pred));
615                 extend_irn(phi, new_in);
616         }
617 }
618
619 /* Returns the number of blocks backedges. With or without alien bes. */
620 static int get_backedge_n(ir_node *block, unsigned with_alien)
621 {
622         int i;
623         int be_n = 0;
624         int arity = get_irn_arity(block);
625
626         assert(is_Block(block) && "We only required backedges of blocks.");
627
628         for (i = 0; i < arity; ++i) {
629                 ir_node *pred = get_irn_n(block, i);
630                 if (is_backedge(block, i) && (with_alien || is_in_loop(pred)))
631                         ++be_n;
632         }
633         return be_n;
634 }
635
636 /* Returns a raw copy of the given node.
637  * Attributes are kept/set according to the needs of loop inversion. */
638 static ir_node *copy_node(ir_node *node)
639 {
640         int i, arity;
641         ir_node *cp;
642
643         cp = exact_copy(node);
644         arity = get_irn_arity(node);
645
646         /* Keep backedge info */
647         for (i = 0; i < arity; ++i) {
648                 if (is_backedge(node, i))
649                         set_backedge(cp, i);
650         }
651
652         if (is_Block(cp)) {
653                 set_Block_mark(cp, 0);
654         }
655
656         return cp;
657 }
658
659
660 /**
661  * This walker copies all walked nodes.
662  * If the walk_condition is true for a node, it is copied.
663  * All nodes node_info->copy have to be NULL prior to every walk.
664  * Order of ins is important for later usage.
665  */
666 static void copy_walk(ir_node *node, walker_condition *walk_condition,
667                       ir_loop *set_loop)
668 {
669         int i;
670         int arity;
671         ir_node *cp;
672         ir_node **cpin;
673         ir_graph *irg = current_ir_graph;
674
675         /**
676          * break condition and cycle resolver, creating temporary node copies
677          */
678         if (get_irn_visited(node) >= get_irg_visited(irg)) {
679                 /* Here we rely on nodestate's copy being initialized with NULL */
680                 DB((dbg, LEVEL_5, "copy_walk: We have already visited %N\n", node));
681                 if (get_inversion_copy(node) == NULL) {
682                         cp = copy_node(node);
683                         set_inversion_copy(node, cp);
684
685                         DB((dbg, LEVEL_5, "The TEMP copy of %N is created %N\n", node, cp));
686                 }
687                 return;
688         }
689
690         /* Walk */
691         mark_irn_visited(node);
692
693         if (!is_Block(node)) {
694                 ir_node *pred = get_nodes_block(node);
695                 if (walk_condition(pred))
696                         DB((dbg, LEVEL_5, "walk block %N\n", pred));
697                 copy_walk(pred, walk_condition, set_loop);
698         }
699
700         arity = get_irn_arity(node);
701
702         NEW_ARR_A(ir_node *, cpin, arity);
703
704         for (i = 0; i < arity; ++i) {
705                 ir_node *pred = get_irn_n(node, i);
706
707                 if (walk_condition(pred)) {
708                         DB((dbg, LEVEL_5, "walk node %N\n", pred));
709                         copy_walk(pred, walk_condition, set_loop);
710                         cpin[i] = get_inversion_copy(pred);
711                         DB((dbg, LEVEL_5, "copy of %N gets new in %N which is copy of %N\n",
712                                                 node, get_inversion_copy(pred), pred));
713                 } else {
714                         cpin[i] = pred;
715                 }
716         }
717
718         /* copy node / finalize temp node */
719         if (get_inversion_copy(node) == NULL) {
720                 /* No temporary copy existent */
721                 cp = copy_node(node);
722                 set_inversion_copy(node, cp);
723                 DB((dbg, LEVEL_5, "The FINAL copy of %N is CREATED %N\n", node, cp));
724         } else {
725                 /* temporary copy is existent but without correct ins */
726                 cp = get_inversion_copy(node);
727                 DB((dbg, LEVEL_5, "The FINAL copy of %N is EXISTENT %N\n", node, cp));
728         }
729
730         if (!is_Block(node)) {
731                 ir_node *cpblock = get_inversion_copy(get_nodes_block(node));
732
733                 set_nodes_block(cp, cpblock );
734                 if (is_Phi(cp))
735                         add_Block_phi(cpblock, cp);
736         }
737
738         /* Keeps phi list of temporary node. */
739         set_irn_in(cp, ARR_LEN(cpin), cpin);
740 }
741
742 /**
743  * This walker copies all walked nodes.
744  * If the walk_condition is true for a node, it is copied.
745  * All nodes node_info->copy have to be NULL prior to every walk.
746  * Order of ins is important for later usage.
747  * Takes copy_index, to phase-link copy at specific index.
748  */
749 static void copy_walk_n(ir_node *node,
750                 walker_condition *walk_condition, int copy_index)
751 {
752         int i;
753         int arity;
754         ir_node *cp;
755         ir_node **cpin;
756
757         /**
758          * break condition and cycle resolver, creating temporary node copies
759          */
760         if (irn_visited(node)) {
761                 /* Here we rely on nodestate's copy being initialized with NULL */
762                 DB((dbg, LEVEL_5, "copy_walk: We have already visited %N\n", node));
763                 if (get_unroll_copy(node, copy_index) == NULL) {
764                         ir_node *u;
765                         u = copy_node(node);
766                         set_unroll_copy(node, copy_index, u);
767                         DB((dbg, LEVEL_5, "The TEMP unknown of %N is created %N\n", node, u));
768                 }
769                 return;
770         }
771
772         /* Walk */
773         mark_irn_visited(node);
774
775         if (!is_Block(node)) {
776                 ir_node *block = get_nodes_block(node);
777                 if (walk_condition(block))
778                         DB((dbg, LEVEL_5, "walk block %N\n", block));
779                 copy_walk_n(block, walk_condition, copy_index);
780         }
781
782         arity = get_irn_arity(node);
783         NEW_ARR_A(ir_node *, cpin, arity);
784
785         for (i = 0; i < arity; ++i) {
786                 ir_node *pred = get_irn_n(node, i);
787
788                 if (walk_condition(pred)) {
789                         DB((dbg, LEVEL_5, "walk node %N\n", pred));
790                         copy_walk_n(pred, walk_condition, copy_index);
791                         cpin[i] = get_unroll_copy(pred, copy_index);
792                 } else {
793                         cpin[i] = pred;
794                 }
795         }
796
797         /* copy node / finalize temp node */
798         cp = get_unroll_copy(node, copy_index);
799         if (cp == NULL || is_Unknown(cp)) {
800                 cp = copy_node(node);
801                 set_unroll_copy(node, copy_index, cp);
802                 DB((dbg, LEVEL_5, "The FINAL copy of %N is CREATED %N\n", node, cp));
803         } else {
804                 /* temporary copy is existent but without correct ins */
805                 cp = get_unroll_copy(node, copy_index);
806                 DB((dbg, LEVEL_5, "The FINAL copy of %N is EXISTENT %N\n", node, cp));
807         }
808
809         if (!is_Block(node)) {
810                 ir_node *cpblock = get_unroll_copy(get_nodes_block(node), copy_index);
811
812                 set_nodes_block(cp, cpblock );
813                 if (is_Phi(cp))
814                         add_Block_phi(cpblock, cp);
815         }
816
817         /* Keeps phi list of temporary node. */
818         set_irn_in(cp, ARR_LEN(cpin), cpin);
819 }
820
821 /* Removes alle Blocks with non marked predecessors from the condition chain. */
822 static void unmark_not_allowed_cc_blocks(void)
823 {
824         int blocks = ARR_LEN(cc_blocks);
825         int i;
826
827         for(i = 0; i < blocks; ++i) {
828                 ir_node *block = cc_blocks[i];
829                 int a;
830                 int arity = get_irn_arity(block);
831
832                 /* Head is an exception. */
833                 if (block == loop_head)
834                         continue;
835
836                 for(a = 0; a < arity; ++a) {
837                         if (! is_nodes_block_marked(get_irn_n(block, a))) {
838                                 set_Block_mark(block, 0);
839                                 --inversion_blocks_in_cc;
840                                 DB((dbg, LEVEL_5, "Removed %N from cc (blocks in cc %d)\n",
841                                                 block, inversion_blocks_in_cc));
842
843                                 break;
844                         }
845                 }
846         }
847 }
848
849 /* Unmarks all cc blocks using cc_blocks except head. */
850 static void unmark_cc_blocks(void)
851 {
852         int blocks = ARR_LEN(cc_blocks);
853         int i;
854
855         for(i = 0; i < blocks; ++i) {
856                 ir_node *block = cc_blocks[i];
857
858                 /* Head is an exception. */
859                 if (block != loop_head)
860                         set_Block_mark(block, 0);
861         }
862         inversion_blocks_in_cc = 1;
863
864         /* invalidate */
865         loop_info.cc_size = 0;
866 }
867
868 /**
869  * Populates head_entries with (node, pred_pos) tuple
870  * whereas the node's pred at pred_pos is in the cc but not the node itself.
871  * Also finds df loops inside the cc.
872  * Head and condition chain blocks have been marked previously.
873  */
874 static void get_head_outs(ir_node *node, void *env)
875 {
876         int i;
877         int arity = get_irn_arity(node);
878         (void) env;
879
880         for (i = 0; i < arity; ++i) {
881                 if (!is_nodes_block_marked(node) && is_nodes_block_marked(get_irn_n(node, i))) {
882                         entry_edge entry;
883                         entry.node = node;
884                         entry.pos = i;
885                         /* Saving also predecessor seems redundant, but becomes
886                          * necessary when changing position of it, before
887                          * dereferencing it.*/
888                         entry.pred = get_irn_n(node, i);
889                         ARR_APP1(entry_edge, cur_head_outs, entry);
890                 }
891         }
892
893         arity = get_irn_arity(loop_head);
894
895         /* Find df loops inside the cc */
896         if (is_Phi(node) && get_nodes_block(node) == loop_head) {
897                 for (i = 0; i < arity; ++i) {
898                         if (is_own_backedge(loop_head, i)) {
899                                 if (is_nodes_block_marked(get_irn_n(node, i))) {
900                                         entry_edge entry;
901                                         entry.node = node;
902                                         entry.pos = i;
903                                         entry.pred = get_irn_n(node, i);
904                                         ARR_APP1(entry_edge, head_df_loop, entry);
905                                         DB((dbg, LEVEL_5, "Found incc assignment node %N @%d is pred %N, graph %N %N\n",
906                                                         node, i, entry.pred, current_ir_graph, get_irg_start_block(current_ir_graph)));
907                                 }
908                         }
909                 }
910         }
911 }
912
913 /**
914  * Find condition chains, and add them to be inverted
915  * A block belongs to the chain if a condition branches out of the loop.
916  * (Some blocks need to be removed once again.)
917  * Returns 1 if the given block belongs to the condition chain.
918  */
919 static unsigned find_condition_chain(ir_node *block)
920 {
921         const    ir_edge_t *edge;
922         unsigned mark = 0;
923         unsigned has_be = 0;
924         unsigned jmp_only;
925         unsigned nodes_n = 0;
926
927         mark_irn_visited(block);
928
929         DB((dbg, LEVEL_5, "condition_chains for block %N\n", block));
930
931         /* Get node count */
932         foreach_out_edge_kind(block, edge, EDGE_KIND_NORMAL) {
933                 ++nodes_n;
934         }
935
936         /* Check if node count would exceed maximum cc size.
937          * TODO
938          * This is not optimal, as we search depth-first and break here,
939          * continuing with another subtree. */
940         if (loop_info.cc_size + nodes_n > opt_params.max_cc_size) {
941                 set_Block_mark(block, 0);
942                 return 0;
943         }
944
945         /* Check if block only has a jmp instruction. */
946         jmp_only = 1;
947         foreach_out_edge(block, edge) {
948                 ir_node *src = get_edge_src_irn(edge);
949
950                 if (! is_Block(src) && ! is_Jmp(src)) {
951                         jmp_only = 0;
952                 }
953         }
954
955         /* Check cf outs if one is leaving the loop,
956          * or if this node has a backedge. */
957         foreach_block_succ(block, edge) {
958                 ir_node *src = get_edge_src_irn(edge);
959                 int pos = get_edge_src_pos(edge);
960
961                 if (! is_in_loop(src))
962                         mark = 1;
963
964                 /* Inverting blocks with backedge outs leads to a cf edge
965                  * from the inverted head, into the inverted head (skipping the body).
966                  * As the body becomes the new loop head,
967                  * this would introduce another loop in the existing loop.
968                  * This loop inversion cannot cope with this case. */
969                 if (is_backedge(src, pos)) {
970                         has_be = 1;
971                         break;
972                 }
973         }
974
975         /* We need all predecessors to already belong to the condition chain.
976          * Example of wrong case:  * == in cc
977          *
978          *     Head*             ,--.
979          *    /|   \            B   |
980          *   / A*  B           /    |
981          *  / /\   /          ?     |
982          *   /   C*      =>      D  |
983          *      /  D           Head |
984          *     /               A  \_|
985          *                      C
986          */
987         /* Collect blocks containing only a Jmp.
988          * Do not collect blocks with backedge outs. */
989         if ((jmp_only == 1 || mark == 1) && has_be == 0) {
990                 set_Block_mark(block, 1);
991                 ++inversion_blocks_in_cc;
992                 loop_info.cc_size += nodes_n;
993                 DB((dbg, LEVEL_5, "block %N is part of condition chain\n", block));
994                 ARR_APP1(ir_node *, cc_blocks, block);
995         } else {
996                 set_Block_mark(block, 0);
997         }
998
999         foreach_block_succ(block, edge) {
1000                 ir_node *src = get_edge_src_irn( edge );
1001
1002                 if (is_in_loop(src) && ! irn_visited(src))
1003                         find_condition_chain(src);
1004         }
1005
1006         return mark;
1007 }
1008
1009 /**
1010  * Rewires the copied condition chain. Removes backedges.
1011  * as this condition chain is prior to the loop.
1012  * Copy of loop_head must have phi list and old (unfixed) backedge info of the loop head.
1013  * (loop_head is already fixed, we cannot rely on it.)
1014  */
1015 static void fix_copy_inversion(void)
1016 {
1017         ir_node *new_head;
1018         ir_node **ins;
1019         ir_node **phis;
1020         ir_node *phi, *next;
1021         ir_node *head_cp    = get_inversion_copy(loop_head);
1022         int arity           = get_irn_arity(head_cp);
1023         int backedges       = get_backedge_n(head_cp, 0);
1024         int new_arity       = arity - backedges;
1025         int pos;
1026         int i;
1027
1028         NEW_ARR_A(ir_node *, ins, new_arity);
1029
1030         pos = 0;
1031         /* Remove block backedges */
1032         for(i = 0; i < arity; ++i) {
1033                 if (!is_backedge(head_cp, i))
1034                         ins[pos++] = get_irn_n(head_cp, i);
1035         }
1036
1037         new_head = new_Block(new_arity, ins);
1038
1039         phis = NEW_ARR_F(ir_node *, 0);
1040
1041         for_each_phi_safe(get_Block_phis(head_cp), phi, next) {
1042                 ir_node *new_phi;
1043                 NEW_ARR_A(ir_node *, ins, new_arity);
1044                 pos = 0;
1045                 for(i = 0; i < arity; ++i) {
1046                         if (!is_backedge(head_cp, i))
1047                                 ins[pos++] = get_irn_n(phi, i);
1048                 }
1049                 new_phi = new_rd_Phi(get_irn_dbg_info(phi),
1050                                 new_head, new_arity, ins,
1051                                 get_irn_mode(phi));
1052                 ARR_APP1(ir_node *, phis, new_phi);
1053         }
1054
1055         pos = 0;
1056         for_each_phi_safe(get_Block_phis(head_cp), phi, next) {
1057                 exchange(phi, phis[pos++]);
1058         }
1059
1060         exchange(head_cp, new_head);
1061
1062         DEL_ARR_F(phis);
1063 }
1064
1065 /* Puts the original condition chain at the end of the loop,
1066  * subsequently to the body.
1067  * Relies on block phi list and correct backedges.
1068  */
1069 static void fix_head_inversion(void)
1070 {
1071         ir_node *new_head;
1072         ir_node **ins;
1073         ir_node *phi, *next;
1074         ir_node **phis;
1075         int arity           = get_irn_arity(loop_head);
1076         int backedges       = get_backedge_n(loop_head, 0);
1077         int new_arity       = backedges;
1078         int pos;
1079         int i;
1080
1081         NEW_ARR_A(ir_node *, ins, new_arity);
1082
1083         pos = 0;
1084         /* Keep only backedges */
1085         for(i = 0; i < arity; ++i) {
1086                 if (is_own_backedge(loop_head, i))
1087                         ins[pos++] = get_irn_n(loop_head, i);
1088         }
1089
1090         new_head = new_Block(new_arity, ins);
1091
1092         phis = NEW_ARR_F(ir_node *, 0);
1093
1094         for_each_phi(loop_head, phi) {
1095                 ir_node *new_phi;
1096                 DB((dbg, LEVEL_5, "Fixing phi %N of loop head\n", phi));
1097
1098                 NEW_ARR_A(ir_node *, ins, new_arity);
1099
1100                 pos = 0;
1101                 for (i = 0; i < arity; ++i) {
1102                         ir_node *pred = get_irn_n(phi, i);
1103
1104                         if (is_own_backedge(loop_head, i)) {
1105                                 /* If assignment is in the condition chain,
1106                                  * we need to create a phi in the new loop head.
1107                                  * This can only happen for df, not cf. See find_condition_chains. */
1108                                 if (is_nodes_block_marked(pred)) {
1109                                         /* Cannot do this here. */
1110                                         ins[pos++] = pred; /*fix_inner_cc_definitions(phi, pred);*/
1111                                 } else {
1112                                         ins[pos++] = pred;
1113                                 }
1114                         }
1115                 }
1116
1117                 new_phi = new_rd_Phi(get_irn_dbg_info(phi),
1118                         new_head, new_arity, ins,
1119                         get_irn_mode(phi));
1120
1121                 ARR_APP1(ir_node *, phis, new_phi);
1122
1123                 DB((dbg, LEVEL_5, "fix inverted head should exch %N by %N (arity %d)\n", phi, new_phi, pos ));
1124         }
1125
1126         pos = 0;
1127         for_each_phi_safe(get_Block_phis(loop_head), phi, next) {
1128                 DB((dbg, LEVEL_5, "fix inverted exch phi %N by %N\n", phi, phis[pos]));
1129                 if (phis[pos] != phi)
1130                         exchange(phi, phis[pos++]);
1131         }
1132
1133         DEL_ARR_F(phis);
1134
1135         DB((dbg, LEVEL_5, "fix inverted head exch head block %N by %N\n", loop_head, new_head));
1136         exchange(loop_head, new_head);
1137 }
1138
1139 /* Does the loop inversion.  */
1140 static void inversion_walk(entry_edge *head_entries)
1141 {
1142         int i;
1143
1144         /*
1145          * The order of rewiring bottom-up is crucial.
1146          * Any change of the order leads to lost information that would be needed later.
1147          */
1148
1149         ir_reserve_resources(current_ir_graph, IR_RESOURCE_IRN_VISITED);
1150
1151         /* 1. clone condition chain */
1152         inc_irg_visited(current_ir_graph);
1153
1154         for (i = 0; i < ARR_LEN(head_entries); ++i) {
1155                 entry_edge entry = head_entries[i];
1156                 ir_node *pred = get_irn_n(entry.node, entry.pos);
1157
1158                 DB((dbg, LEVEL_5, "\nInit walk block %N\n", pred));
1159
1160                 copy_walk(pred, is_nodes_block_marked, cur_loop);
1161         }
1162
1163         ir_free_resources(current_ir_graph, IR_RESOURCE_IRN_VISITED);
1164
1165         /* 2. Extends the head control flow successors ins
1166          *    with the definitions of the copied head node. */
1167         for (i = 0; i < ARR_LEN(head_entries); ++i) {
1168                 entry_edge head_out = head_entries[i];
1169
1170                 if (is_Block(head_out.node))
1171                         extend_ins_by_copy(head_out.node, head_out.pos);
1172         }
1173
1174         /* 3. construct_ssa for users of definitions in the condition chain,
1175          *    as there is now a second definition. */
1176         for (i = 0; i < ARR_LEN(head_entries); ++i) {
1177                 entry_edge head_out = head_entries[i];
1178
1179                 /* Ignore keepalives */
1180                 if (is_End(head_out.node))
1181                         continue;
1182
1183                 /* Construct ssa for assignments in the condition chain. */
1184                 if (!is_Block(head_out.node)) {
1185                         ir_node *pred, *cppred, *block, *cpblock;
1186
1187                         pred = head_out.pred;
1188                         cppred = get_inversion_copy(pred);
1189                         block = get_nodes_block(pred);
1190                         cpblock = get_nodes_block(cppred);
1191                         construct_ssa(block, pred, cpblock, cppred);
1192                 }
1193         }
1194
1195         /*
1196          * If there is an assignment in the condition chain
1197          * with a user also in the condition chain,
1198          * the dominance frontier is in the new loop head.
1199          * The dataflow loop is completely in the condition chain.
1200          * Goal:
1201          *  To be wired: >|
1202          *
1203          *  | ,--.   |
1204          * Phi_cp |  | copied condition chain
1205          * >| |   |  |
1206          * >| ?__/   |
1207          * >| ,-.
1208          *  Phi* |   | new loop head with newly created phi.
1209          *   |   |
1210          *  Phi  |   | original, inverted condition chain
1211          *   |   |   |
1212          *   ?__/    |
1213          *
1214          */
1215         for (i = 0; i < ARR_LEN(head_df_loop); ++i) {
1216                 entry_edge head_out = head_df_loop[i];
1217
1218                 /* Construct ssa for assignments in the condition chain. */
1219                 ir_node *pred, *cppred, *block, *cpblock;
1220
1221                 pred = head_out.pred;
1222                 cppred = get_inversion_copy(pred);
1223                 assert(cppred && pred);
1224                 block = get_nodes_block(pred);
1225                 cpblock = get_nodes_block(cppred);
1226                 construct_ssa(block, pred, cpblock, cppred);
1227         }
1228
1229         /* 4. Remove the ins which are no backedges from the original condition chain
1230          *    as the cc is now subsequent to the body. */
1231         fix_head_inversion();
1232
1233         /* 5. Remove the backedges of the copied condition chain,
1234          *    because it is going to be the new 'head' in advance to the loop. */
1235         fix_copy_inversion();
1236 }
1237
1238 /* Performs loop inversion of cur_loop if possible and reasonable. */
1239 static void loop_inversion(void)
1240 {
1241         unsigned do_inversion = 1;
1242         unsigned has_cc = 0;
1243
1244         /*inversion_head_node_limit = INT_MAX;*/
1245         ir_reserve_resources(current_ir_graph, IR_RESOURCE_BLOCK_MARK);
1246
1247         /* Reset block marks.
1248          * We use block marks to flag blocks of the original condition chain. */
1249         irg_walk_graph(current_ir_graph, reset_block_mark, NULL, NULL);
1250
1251         /*loop_info.blocks = get_loop_n_blocks(cur_loop);*/
1252         cond_chain_entries = NEW_ARR_F(entry_edge, 0);
1253         head_df_loop = NEW_ARR_F(entry_edge, 0);
1254
1255         /*head_inversion_node_count = 0;*/
1256         inversion_blocks_in_cc = 0;
1257
1258         /* Use phase to keep copy of nodes from the condition chain. */
1259         phase = new_phase(current_ir_graph, phase_irn_init_default);
1260
1261         /* Search for condition chains and temporarily save the blocks in an array. */
1262         cc_blocks = NEW_ARR_F(ir_node *, 0);
1263         inc_irg_visited(current_ir_graph);
1264         has_cc = find_condition_chain(loop_head);
1265
1266         unmark_not_allowed_cc_blocks();
1267         DEL_ARR_F(cc_blocks);
1268
1269 #if LOOP_IGNORE_NODE_LIMITS
1270         (void) unmark_cc_blocks;
1271 #else
1272         /* Condition chain too large.
1273          * Loop should better be small enough to fit into the cache. */
1274         /* FIXME Of course, we should take a small enough cc in the first place,
1275          * which is not that simple. (bin packing)  */
1276         if (loop_info.cc_size > opt_params.max_cc_size) {
1277                 count_stats(stats.cc_limit_reached);
1278
1279                 /* Only head taken? */
1280                 if (inversion_blocks_in_cc == 1)
1281                         do_inversion = 0;
1282                 else
1283                         /* Unmark cc blocks except the head.
1284                          * Invert head only for possible unrolling. */
1285                         unmark_cc_blocks();
1286         }
1287 #endif
1288
1289         /* We also catch endless loops here,
1290          * because they do not have a condition chain. */
1291         if (inversion_blocks_in_cc < 1) {
1292                 do_inversion = 0;
1293                 DB((dbg, LEVEL_3,
1294                         "Loop contains %d (less than 1) invertible blocks => No Inversion done.\n",
1295                         inversion_blocks_in_cc));
1296         }
1297
1298         if (do_inversion) {
1299                 cur_head_outs = NEW_ARR_F(entry_edge, 0);
1300
1301                 /* Get all edges pointing into the condition chain. */
1302                 irg_walk_graph(current_ir_graph, get_head_outs, NULL, NULL);
1303
1304                 /* Do the inversion */
1305                 inversion_walk(cur_head_outs);
1306
1307                 DEL_ARR_F(cur_head_outs);
1308
1309                 /* Duplicated blocks changed doms */
1310                 set_irg_doms_inconsistent(current_ir_graph);
1311                 /* Loop content changed */
1312                 set_irg_loopinfo_inconsistent(current_ir_graph);
1313                 /* TODO are they? Depends on set_irn_in and set_irn_n exchange and new_node. */
1314                 set_irg_outs_inconsistent(current_ir_graph);
1315
1316                 count_stats(stats.inverted);
1317         }
1318
1319         /* free */
1320         phase_free(phase);
1321         DEL_ARR_F(cond_chain_entries);
1322         DEL_ARR_F(head_df_loop);
1323
1324         ir_free_resources(current_ir_graph, IR_RESOURCE_BLOCK_MARK);
1325 }
1326
1327 /* Fix the original loop_heads ins for invariant unrolling case. */
1328 static void unrolling_fix_loop_head_inv(void)
1329 {
1330         ir_node *ins[2];
1331         ir_node *phi;
1332         ir_node *proj = new_Proj(loop_info.duff_cond, mode_X, 0);
1333         ir_node *head_pred = get_irn_n(loop_head, loop_info.be_src_pos);
1334         ir_node *loop_condition = get_unroll_copy(head_pred, unroll_nr - 1);
1335
1336         /* Original loop_heads ins are:
1337          * duff block and the own backedge */
1338
1339         ins[0] = loop_condition;
1340         ins[1] = proj;
1341
1342         set_irn_in(loop_head, 2, ins);
1343
1344         for_each_phi(loop_head, phi) {
1345                 ir_node *pred = get_irn_n(phi, loop_info.be_src_pos);
1346                 ir_node *last_pred = get_unroll_copy(pred, unroll_nr - 1);
1347
1348                 ins[0] = last_pred;
1349                 ins[1] = get_irn_link(phi);
1350
1351                 set_irn_in(phi, 2, ins);
1352         }
1353 }
1354
1355 /* Removes previously created phis with only 1 in. */
1356 static void correct_phis(ir_node *node, void *env)
1357 {
1358         (void)env;
1359         if (is_Phi(node) && get_irn_arity(node) == 1) {
1360                 ir_node *exch;
1361                 ir_node *in[1];
1362
1363                 in[0] = get_irn_n(node, 0);
1364
1365                 exch = new_rd_Phi(get_irn_dbg_info(node),
1366                     get_nodes_block(node), 1, in,
1367                 get_irn_mode(node));
1368
1369                 exchange(node, exch);
1370         }
1371 }
1372
1373 /* Unrolling: Rewire floating copies. */
1374 static void place_copies(int copies)
1375 {
1376         ir_node *loophead = loop_head;
1377         int c, i;
1378         int be_src_pos = loop_info.be_src_pos;
1379
1380         /* Serialize loops by fixing their head ins.
1381          * Processed are the copies.
1382          * The original loop is done after that, to keep backedge infos. */
1383         for (c = 0; c < copies; ++c) {
1384                 ir_node *upper = get_unroll_copy(loophead, c);
1385                 ir_node *lower = get_unroll_copy(loophead, c + 1);
1386                 ir_node *phi;
1387                 ir_node *topmost_be_block = get_nodes_block(get_irn_n(loophead, be_src_pos));
1388
1389                 /* Important: get the preds first and then their copy. */
1390                 ir_node *upper_be_block = get_unroll_copy(topmost_be_block, c);
1391                 ir_node *new_jmp = new_r_Jmp(upper_be_block);
1392                 DB((dbg, LEVEL_5, " place_copies upper %N lower %N\n", upper, lower));
1393
1394                 DB((dbg, LEVEL_5, "topmost be block %N \n", topmost_be_block));
1395
1396                 if (loop_info.unroll_kind == constant) {
1397                         ir_node *ins[1];
1398                         ins[0] = new_jmp;
1399                         set_irn_in(lower, 1, ins);
1400
1401                         for_each_phi(loophead, phi) {
1402                                 ir_node *topmost_def = get_irn_n(phi, be_src_pos);
1403                                 ir_node *upper_def = get_unroll_copy(topmost_def, c);
1404                                 ir_node *lower_phi = get_unroll_copy(phi, c + 1);
1405
1406                                 /* It is possible, that the value used
1407                                  * in the OWN backedge path is NOT defined in this loop. */
1408                                 if (is_in_loop(topmost_def))
1409                                         ins[0] = upper_def;
1410                                 else
1411                                         ins[0] = topmost_def;
1412
1413                                 set_irn_in(lower_phi, 1, ins);
1414                                 /* Need to replace phis with 1 in later. */
1415                         }
1416                 } else {
1417                         /* Invariant case */
1418                         /* Every node has 2 ins. One from the duff blocks
1419                          * and one from the previous unrolled loop. */
1420                         ir_node *ins[2];
1421                         /* Calculate corresponding projection of mod result for this copy c */
1422                         ir_node *proj = new_Proj(loop_info.duff_cond, mode_X, unroll_nr - c - 1);
1423
1424                         ins[0] = new_jmp;
1425                         ins[1] = proj;
1426                         set_irn_in(lower, 1, ins);
1427
1428                         for_each_phi(loophead, phi) {
1429                                 ir_node *topmost_phi_pred = get_irn_n(phi, be_src_pos);
1430                                 ir_node *upper_phi_pred;
1431                                 ir_node *lower_phi;
1432                                 ir_node *duff_phi;
1433
1434                                 lower_phi = get_unroll_copy(phi, c + 1);
1435                                 duff_phi = get_irn_link(lower_phi);
1436
1437                                 if (is_in_loop(topmost_phi_pred)) {
1438                                         upper_phi_pred = get_unroll_copy(topmost_phi_pred, c);
1439                                 } else {
1440                                         upper_phi_pred = topmost_phi_pred;
1441                                 }
1442
1443                                 ins[0] = upper_phi_pred;
1444                                 ins[1] = duff_phi;
1445
1446                                 set_irn_in(lower_phi, 2, ins);
1447                         }
1448                 }
1449         }
1450
1451         /* Reconnect loop landing pad with last copy. */
1452         for (i = 0; i < ARR_LEN(loop_entries); ++i) {
1453                 entry_edge edge = loop_entries[i];
1454                 /* Last copy is at the bottom */
1455                 ir_node *new_pred = get_unroll_copy(edge.pred, copies);
1456                 set_irn_n(edge.node, edge.pos, new_pred);
1457         }
1458
1459         /* Fix original loops head.
1460          * Done in the end, as ins and be info were needed before. */
1461         if (loop_info.unroll_kind == constant) {
1462                 ir_node *phi;
1463                 ir_node *head_pred = get_irn_n(loop_head, be_src_pos);
1464                 ir_node *loop_condition = get_unroll_copy(head_pred, unroll_nr - 1);
1465
1466                 set_irn_n(loop_head, loop_info.be_src_pos, loop_condition);
1467
1468                 for_each_phi(loop_head, phi) {
1469                         ir_node *pred = get_irn_n(phi, be_src_pos);
1470                         ir_node *last_pred;
1471
1472                         /* It is possible, that the value used
1473                          * in the OWN backedge path is NOT defined in this loop. */
1474                         if (is_in_loop(pred))
1475                                 last_pred = get_unroll_copy(pred, copies);
1476                         else
1477                                 last_pred = pred;
1478                         set_irn_n(phi, be_src_pos, last_pred);
1479                 }
1480         } else {
1481                 unrolling_fix_loop_head_inv();
1482         }
1483 }
1484
1485 /* Copies the cur_loop several times. */
1486 static void copy_loop(entry_edge *cur_loop_outs, int copies)
1487 {
1488         int i, c;
1489
1490         ir_reserve_resources(current_ir_graph, IR_RESOURCE_IRN_VISITED);
1491
1492         for (c = 0; c < copies; ++c) {
1493
1494                 inc_irg_visited(current_ir_graph);
1495
1496                 DB((dbg, LEVEL_5, "         ### Copy_loop  copy nr: %d ###\n", c));
1497                 for (i = 0; i < ARR_LEN(cur_loop_outs); ++i) {
1498                         entry_edge entry = cur_loop_outs[i];
1499                         ir_node *pred = get_irn_n(entry.node, entry.pos);
1500
1501                         copy_walk_n(pred, is_in_loop, c + 1);
1502                 }
1503         }
1504
1505         ir_free_resources(current_ir_graph, IR_RESOURCE_IRN_VISITED);
1506 }
1507
1508
1509 /* Creates a new phi from the given phi node omitting own bes,
1510  * using be_block as supplier of backedge informations. */
1511 static ir_node *clone_phis_sans_bes(ir_node *node, ir_node *be_block)
1512 {
1513         ir_node **ins;
1514         int arity = get_irn_arity(node);
1515         int i, c = 0;
1516
1517         assert(get_irn_arity(node) == get_irn_arity(be_block));
1518         assert(is_Phi(node));
1519
1520         ins = NEW_ARR_F(ir_node *, arity);
1521         for (i = 0; i < arity; ++i) {
1522                 if (! is_own_backedge(be_block, i)) {
1523                         ins[c] = get_irn_n(node, i);
1524                         ++c;
1525 #if 0
1526                 } else {
1527                         ir_node *pred = get_inr_n(node, i);
1528                         if (! is_in_loop(pred)) {
1529                                 ins[c] = pred;
1530                                 ++c;
1531                         }
1532 #endif
1533                 }
1534         }
1535
1536         return new_r_Phi(get_nodes_block(node), c, ins, get_irn_mode(node));
1537 }
1538
1539 /* Creates a new block from the given block node omitting own bes,
1540  * using be_block as supplier of backedge informations. */
1541 static ir_node *clone_block_sans_bes(ir_node *node, ir_node *be_block)
1542 {
1543         ir_node **ins;
1544         int arity = get_irn_arity(node);
1545         int i, c = 0;
1546
1547         assert(get_irn_arity(node) == get_irn_arity(be_block));
1548         assert(is_Block(node));
1549
1550         ins = NEW_ARR_F(ir_node *, arity);
1551         for (i = 0; i < arity; ++i) {
1552                 if (! is_own_backedge(be_block, i)) {
1553                         ins[c] = get_irn_n(node, i);
1554                         ++c;
1555                 }
1556         }
1557
1558         return new_Block(c, ins);
1559 }
1560
1561 /* Creates blocks for duffs device, using previously obtained
1562  * informations about the iv.
1563  * TODO split */
1564 static void create_duffs_block(void)
1565 {
1566         ir_mode *mode;
1567
1568         ir_node *block1, *count_block, *duff_block;
1569         ir_node *ems, *ems_divmod, *ems_mod_proj, *cmp_null,
1570                 *cmp_proj, *ems_mode_cond, *x_true, *x_false, *const_null;
1571         ir_node *true_val, *false_val;
1572         ir_node *ins[2];
1573
1574         ir_node *duff_mod, *proj, *cond;
1575
1576         ir_node *count, *correction, *unroll_c;
1577         ir_node *cmp_bad_count, *good_count, *bad_count, *count_phi, *bad_count_neg;
1578
1579         mode = get_irn_mode(loop_info.end_val);
1580         const_null = new_Const(get_mode_null(mode));
1581
1582         /* TODO naming
1583          * 1. Calculate first approach to count.
1584          *    Condition: (end - start) % step == 0 */
1585         block1 = clone_block_sans_bes(loop_head, loop_head);
1586
1587         /* Create loop entry phis in first duff block
1588          * as it becomes the loops preheader */
1589         if (loop_info.unroll_kind == invariant) {
1590                 ir_node *phi;
1591                 for_each_phi(loop_head, phi) {
1592                         ir_node *new_phi = clone_phis_sans_bes(phi, loop_head);
1593                         set_nodes_block(new_phi, block1);
1594                 }
1595         }
1596
1597         ems = new_r_Sub(block1, loop_info.end_val, loop_info.start_val,
1598                 get_irn_mode(loop_info.end_val));
1599
1600         ems_divmod = new_r_DivMod(block1,
1601                 new_NoMem(),
1602                 ems,
1603                 loop_info.step,
1604                 mode,
1605                 op_pin_state_pinned);
1606
1607         ems_mod_proj = new_r_Proj(ems_divmod, mode, pn_DivMod_res_mod);
1608         cmp_null = new_r_Cmp(block1, ems_mod_proj, const_null);
1609         cmp_proj = new_r_Proj(cmp_null, mode, pn_Cmp_Eq);
1610         ems_mode_cond = new_Cond(cmp_proj);
1611
1612         /* ems % step == 0 */
1613         x_true = new_Proj(ems_mode_cond, mode_X, pn_Cond_true);
1614         /* ems % step != 0 */
1615         x_false = new_Proj(ems_mode_cond, mode_X, pn_Cond_false);
1616
1617
1618         /* 2. Second block.
1619          * Assures, duffs device receives a valid count.
1620          * Condition:
1621          *     decreasing: count < 0
1622          *     increasing: count > 0
1623          */
1624         ins[0] = x_true;
1625         ins[1] = x_false;
1626
1627         count_block = new_Block(2, ins);
1628
1629         /* Increase loop-taken-count depending on the loop condition
1630          * uses the latest iv to compare to. */
1631         if (loop_info.latest_value == 1) {
1632                 /* ems % step == 0 :  +0 */
1633                 true_val = new_Const(get_mode_null(mode));
1634                 /* ems % step != 0 :  +1 */
1635                 false_val = new_Const(get_mode_one(mode));
1636         } else {
1637                 tarval *tv_two = new_tarval_from_long(2, mode);
1638                 /* ems % step == 0 :  +1 */
1639                 true_val = new_Const(get_mode_one(mode));
1640                 /* ems % step != 0 :  +2 */
1641                 false_val = new_Const(tv_two);
1642         }
1643
1644         ins[0] = true_val;
1645         ins[1] = false_val;
1646
1647         correction = new_r_Phi(count_block, 2, ins, mode);
1648
1649         count = new_r_Proj(ems_divmod, mode, pn_DivMod_res_div);
1650
1651         /* (end - start) / step  +  correction */
1652         count = new_Add(count, correction, mode);
1653
1654         cmp_bad_count = new_r_Cmp(count_block, count, const_null);
1655
1656         /* We preconditioned the loop to be tail-controlled.
1657          * So, if count is something 'wrong' like 0,
1658          * negative/positive (depending on step direction),
1659          * we may take the loop once (tail-contr.) and leave it
1660          * to the existing condition, to break; */
1661
1662         /* Depending on step direction, we have to check for > or < 0 */
1663         if (loop_info.decreasing == 1) {
1664                 bad_count_neg = new_r_Proj(cmp_bad_count, mode_X, pn_Cmp_Lt);
1665         } else {
1666                 bad_count_neg = new_r_Proj(cmp_bad_count, mode_X, pn_Cmp_Gt);
1667         }
1668
1669         bad_count_neg = new_Cond(bad_count_neg);
1670         good_count = new_Proj(bad_count_neg, mode_X, pn_Cond_true);
1671         bad_count = new_Proj(ems_mode_cond, mode_X, pn_Cond_false);
1672
1673         /* 3. Duff Block
1674          *    Contains module to decide which loop to start from. */
1675
1676         ins[0] = good_count;
1677         ins[1] = bad_count;
1678         duff_block = new_Block(2, ins);
1679
1680         /* Matze: I commented this line out because I was in the process of
1681          * removing the Abs node. I don't understand that line at all anyway
1682          * since no other code here checks for the presence of an Abs or creates
1683          * one. So how can we know here that "count" is an Abs node... */
1684 #if 0
1685         /* count wants to be positive */
1686         ins[0] = get_Abs_op(count);
1687 #endif
1688         /* Manually feed the aforementioned count = 1 (bad case)*/
1689         ins[1] = new_Const(get_mode_one(mode));
1690         count_phi = new_r_Phi(duff_block, 2, ins, mode);
1691
1692         unroll_c = new_Const(new_tarval_from_long((long)unroll_nr, mode));
1693
1694         /* count % unroll_nr */
1695         duff_mod = new_r_Mod(duff_block,
1696                 new_NoMem(),
1697                 count_phi,
1698                 unroll_c,
1699                 mode,
1700                 op_pin_state_pinned);
1701
1702         proj = new_Proj(duff_mod, mode_X, pn_Mod_res);
1703         cond = new_Cond(proj);
1704
1705         loop_info.duff_cond = cond;
1706 }
1707
1708 /* Returns 1 if given node is not in loop,
1709  * or if it is a phi of the loop head with only loop invariant defs.
1710  */
1711 static unsigned is_loop_invariant_def(ir_node *node)
1712 {
1713         int i;
1714
1715         if (! is_in_loop(node))
1716                 return 1;
1717
1718         /* If this is a phi of the loophead shared by more than 1 loop,
1719          * we need to check if all defs are not in the loop.  */
1720         if (is_Phi(node)) {
1721                 ir_node *block;
1722                 block = get_nodes_block(node);
1723
1724                 /* To prevent unexpected situations. */
1725                 if (block != loop_head)
1726                         return 0;
1727
1728                 for (i = 0; i < get_irn_arity(node); ++i) {
1729                         /* Check if all bes are just loopbacks. */
1730                         if (is_own_backedge(block, i) && get_irn_n(node, i) != node)
1731                                 return 0;
1732                 }
1733         }
1734         return 1;
1735 }
1736
1737 /* Returns 1 if one pred of node is invariant and the other is not.
1738  * invar_pred and other are set analogously. */
1739 static unsigned get_invariant_pred(ir_node *node, ir_node **invar_pred, ir_node **other)
1740 {
1741         ir_node *pred0 = get_irn_n(node, 0);
1742         ir_node *pred1 = get_irn_n(node, 1);
1743
1744         *invar_pred = NULL;
1745         *other = NULL;
1746
1747         if (is_loop_invariant_def(pred0)) {
1748                 *invar_pred = pred0;
1749                 *other = pred1;
1750         }
1751
1752         if (is_loop_invariant_def(pred1)) {
1753                 if (invar_pred != NULL)
1754                         /* RETURN. We do not want both preds to be invariant. */
1755                         return 0;
1756
1757                 *other = pred0;
1758                 *invar_pred = pred1;
1759                 return 1;
1760         } else {
1761                 return 0;
1762         }
1763 }
1764
1765 /* Starts from a phi that may belong to an iv.
1766  * If an add forms a loop with iteration_phi,
1767  * and add uses a constant, 1 is returned
1768  * and 'start' as well as 'add' are sane. */
1769 static unsigned get_start_and_add(ir_node *iteration_phi, unrolling_kind_flag role)
1770 {
1771         int i;
1772         ir_node *found_add = loop_info.add;
1773         int arity = get_irn_arity(iteration_phi);
1774
1775         DB((dbg, LEVEL_4, "Find start and add from %N\n", iteration_phi));
1776
1777         for (i = 0; i < arity; ++i) {
1778
1779                 /* Find start_val which needs to be pred of the iteration_phi.
1780                  * If start_val already known, sanity check. */
1781                 if (!is_backedge(get_nodes_block(loop_info.iteration_phi), i)) {
1782                         ir_node *found_start_val = get_irn_n(loop_info.iteration_phi, i);
1783
1784                         DB((dbg, LEVEL_4, "found_start_val %N\n", found_start_val));
1785
1786                         /* We already found a start_val it has to be always the same. */
1787                         if (loop_info.start_val && found_start_val != loop_info.start_val)
1788                                 return 0;
1789
1790                         if ((role == constant) && !(is_SymConst(found_start_val) || is_Const(found_start_val)))
1791                                         return 0;
1792                         else if((role == constant) && !(is_loop_invariant_def(found_start_val)))
1793                                         return 0;
1794
1795                         loop_info.start_val = found_start_val;
1796                 }
1797
1798                 /* The phi has to be in the loop head.
1799                  * Follow all own backedges. Every value supplied from these preds of the phi
1800                  * needs to origin from the same add. */
1801                 if (is_own_backedge(get_nodes_block(loop_info.iteration_phi), i)) {
1802                         ir_node *new_found = get_irn_n(loop_info.iteration_phi,i);
1803
1804                         DB((dbg, LEVEL_4, "is add? %N\n", new_found));
1805
1806                         if (! (is_Add(new_found) || is_Sub(new_found)) || (found_add && found_add != new_found))
1807                                 return 0;
1808                         else
1809                                 found_add = new_found;
1810                 }
1811         }
1812
1813         loop_info.add = found_add;
1814
1815         return 1;
1816 }
1817
1818
1819 /* Returns 1 if one pred of node is a const value and the other is not.
1820  * const_pred and other are set analogously. */
1821 static unsigned get_const_pred(ir_node *node, ir_node **const_pred, ir_node **other)
1822 {
1823         ir_node *pred0 = get_irn_n(node, 0);
1824         ir_node *pred1 = get_irn_n(node, 1);
1825
1826         DB((dbg, LEVEL_4, "Checking for constant pred of %N\n", node));
1827
1828         *const_pred = NULL;
1829         *other = NULL;
1830
1831         /*DB((dbg, LEVEL_4, "is %N const\n", pred0));*/
1832         if (is_Const(pred0) || is_SymConst(pred0)) {
1833                 DB((dbg, LEVEL_1, "%N is constant\n", pred0));
1834                 *const_pred = pred0;
1835                 *other = pred1;
1836         }
1837
1838         /*DB((dbg, LEVEL_4, "is %N const\n", pred1));*/
1839         if (is_Const(pred1) || is_SymConst(pred1)) {
1840                 if (*const_pred != NULL) {
1841                         DB((dbg, LEVEL_1, "%N is ALSO constant\n", pred1));
1842                         /* RETURN. We do not want both preds to be constant. */
1843                         return 0;
1844                 }
1845
1846                 DB((dbg, LEVEL_4, "%N is constant\n", pred1));
1847                 *other = pred0;
1848                 *const_pred = pred1;
1849         }
1850
1851         if (*const_pred == NULL)
1852                 return 0;
1853         else
1854                 return 1;
1855 }
1856
1857 /* Returns the mathematically inverted pn_Cmp. */
1858 static pn_Cmp get_math_inverted_case(pn_Cmp proj)
1859 {
1860         switch(proj) {
1861                 case pn_Cmp_Eq:
1862                         return pn_Cmp_Lg;
1863                 case pn_Cmp_Lg:
1864                         return pn_Cmp_Eq;
1865                 case pn_Cmp_Lt:
1866                         return pn_Cmp_Ge;
1867                 case pn_Cmp_Le:
1868                         return pn_Cmp_Gt;
1869                 case pn_Cmp_Gt:
1870                         return pn_Cmp_Le;
1871                 case pn_Cmp_Ge:
1872                         return pn_Cmp_Lt;
1873                 default:
1874                         panic("Unhandled pn_Cmp.");
1875         }
1876 }
1877
1878 /* norm_proj means we do not exit the loop. */
1879 static unsigned simulate_next(tarval **count_tar,
1880                 tarval *stepped, tarval *step_tar, tarval *end_tar, pn_Cmp norm_proj)
1881 {
1882         tarval *next;
1883
1884         DB((dbg, LEVEL_1, "Loop taken if (stepped)%ld %s (end)%ld ",
1885                                 get_tarval_long(stepped),
1886                                 get_pnc_string((norm_proj)),
1887                                 get_tarval_long(end_tar)));
1888         DB((dbg, LEVEL_1, "comparing latest value %d\n", loop_info.latest_value));
1889
1890         /* If current iv does not stay in the loop,
1891          * this run satisfied the exit condition. */
1892         if (! (tarval_cmp(stepped, end_tar) & norm_proj))
1893                 return 1;
1894
1895         DB((dbg, LEVEL_1, "Result: (stepped)%ld IS %s (end)%ld\n",
1896                                 get_tarval_long(stepped),
1897                                 get_pnc_string(tarval_cmp(stepped, end_tar)),
1898                                 get_tarval_long(end_tar)));
1899
1900         /* next step */
1901         if (is_Add(loop_info.add))
1902                 next = tarval_add(stepped, step_tar);
1903         else
1904                 /* sub */
1905                 next = tarval_sub(stepped, step_tar, get_irn_mode(loop_info.end_val));
1906
1907         DB((dbg, LEVEL_1, "Loop taken if %ld %s %ld ",
1908                                 get_tarval_long(next),
1909                                 get_pnc_string(norm_proj),
1910                                 get_tarval_long(end_tar)));
1911         DB((dbg, LEVEL_1, "comparing latest value %d\n", loop_info.latest_value));
1912
1913         /* Increase steps. */
1914         *count_tar = tarval_add(*count_tar, get_tarval_one(get_tarval_mode(*count_tar)));
1915
1916         /* Next has to fail the loop condition, or we will never exit. */
1917         if (! (tarval_cmp(next, end_tar) & norm_proj))
1918                 return 1;
1919         else
1920                 return 0;
1921 }
1922
1923 /* Check if loop meets requirements for a 'simple loop':
1924  * - Exactly one cf out
1925  * - Allowed calls
1926  * - Max nodes after unrolling
1927  * - tail-controlled
1928  * - exactly one be
1929  * - cmp
1930  * Returns Projection of cmp node or NULL; */
1931 static ir_node *is_simple_loop(void)
1932 {
1933         int arity, i;
1934         unsigned loop_depth, max_loop_nodes_adapted;
1935         ir_node *loop_block, *exit_block, *projx, *cond, *projres, *loop_condition;
1936
1937         /* Maximum of one condition, and no endless loops. */
1938         if (loop_info.cf_outs != 1)
1939                 return NULL;
1940
1941         DB((dbg, LEVEL_4, "1 loop exit\n"));
1942
1943 #if 0
1944         /* Ignore loop size. Probably not wise in other than testcases. */
1945         (void) max_loop_nodes_adapted;
1946         (void) loop_depth;
1947
1948         loop_info.max_unroll = 6;
1949 #else
1950         /* Calculate maximum unroll_nr keeping node count below limit. */
1951         loop_depth = get_loop_depth(cur_loop) - 1;
1952         max_loop_nodes_adapted = get_max_nodes_adapted(loop_depth);
1953
1954         loop_info.max_unroll = opt_params.max_loop_size / loop_info.nodes;
1955         if (loop_info.max_unroll < 2) {
1956                 count_stats(stats.too_large);
1957                 return NULL;
1958         }
1959 #endif
1960         DB((dbg, LEVEL_4, "maximum unroll factor %u, to not exceed node limit \n",
1961                 loop_info.max_unroll));
1962
1963         arity = get_irn_arity(loop_head);
1964         /* RETURN if we have more than 1 be. */
1965         /* Get my backedges without alien bes. */
1966         loop_block = NULL;
1967         for (i = 0; i < arity; ++i) {
1968                 ir_node *pred = get_irn_n(loop_head, i);
1969                 if (is_own_backedge(loop_head, i)) {
1970                         if (loop_block)
1971                                 /* Our simple loops may have only one backedge. */
1972                                 return NULL;
1973                         else {
1974                                 loop_block = get_nodes_block(pred);
1975                                 loop_info.be_src_pos = i;
1976                         }
1977                 }
1978         }
1979
1980         DB((dbg, LEVEL_4, "loop has 1 own backedge.\n"));
1981
1982         exit_block = get_nodes_block(loop_info.cf_out.pred);
1983         /* The loop has to be tail-controlled.
1984          * This can be changed/improved,
1985          * but we would need a duff iv. */
1986         if (exit_block != loop_block)
1987                 return NULL;
1988
1989         DB((dbg, LEVEL_4, "tail-controlled loop.\n"));
1990
1991         /* find value on which loop exit depends */
1992         projx = loop_info.cf_out.pred;
1993         cond = get_irn_n(projx, 0);
1994         projres = get_irn_n(cond, 0);
1995         loop_condition = get_irn_n(projres, 0);
1996
1997         if (!is_Cmp(loop_condition))
1998                 return NULL;
1999
2000         DB((dbg, LEVEL_5, "projection is %s\n", get_pnc_string(get_Proj_proj(projx))));
2001
2002         switch(get_Proj_proj(projx)) {
2003                 case pn_Cond_false:
2004                         loop_info.exit_cond = 0;
2005                         break;
2006                 case pn_Cond_true:
2007                         loop_info.exit_cond = 1;
2008                         break;
2009                 default:
2010                         panic("Cond Proj_proj other than true/false");
2011         }
2012
2013         DB((dbg, LEVEL_4, "Valid Cmp.\n"));
2014
2015         return projres;
2016 }
2017
2018 /* Returns 1 if all nodes are mode_Iu or mode_Is. */
2019 static unsigned are_mode_I(ir_node *n1, ir_node* n2, ir_node *n3)
2020 {
2021         ir_mode *m1 = get_irn_mode(n1);
2022         ir_mode *m2 = get_irn_mode(n2);
2023         ir_mode *m3 = get_irn_mode(n3);
2024
2025         if ((m1 == mode_Iu && m2 == mode_Iu && m3 == mode_Iu) ||
2026             (m1 == mode_Is && m2 == mode_Is && m3 == mode_Is))
2027                 return 1;
2028         else
2029                 return 0;
2030 }
2031
2032 /* Checks if cur_loop is a simple tail-controlled counting loop
2033  * with start and end value loop invariant, step constant. */
2034 static unsigned get_unroll_decision_invariant(void)
2035 {
2036
2037         ir_node  *projres, *loop_condition, *iteration_path;
2038         unsigned  success, is_latest_val;
2039         tarval   *start_tar, *step_tar;
2040         ir_mode  *mode;
2041
2042         /* RETURN if loop is not 'simple' */
2043         projres = is_simple_loop();
2044         if (projres == NULL)
2045                 return 0;
2046
2047         loop_condition = get_irn_n(projres, 0);
2048
2049         success = get_invariant_pred(loop_condition, &loop_info.end_val, &iteration_path);
2050         if (! success)
2051                 return 0;
2052
2053         DB((dbg, LEVEL_4, "Invariant End_val %N, other %N\n", loop_info.end_val, iteration_path));
2054
2055         /* We may find the add or the phi first.
2056          * Until now we only have end_val. */
2057         if (is_Add(iteration_path) || is_Sub(iteration_path)) {
2058
2059                 /* We test against the latest value of the iv. */
2060                 is_latest_val = 1;
2061
2062                 loop_info.add = iteration_path;
2063                 DB((dbg, LEVEL_4, "Got add %N (maybe not sane)\n", loop_info.add));
2064
2065                 /* Preds of the add should be step and the iteration_phi */
2066                 success = get_const_pred(loop_info.add, &loop_info.step, &loop_info.iteration_phi);
2067                 if (! success)
2068                         return 0;
2069
2070                 DB((dbg, LEVEL_4, "Got step %N\n", loop_info.step));
2071
2072                 if (! is_Phi(loop_info.iteration_phi))
2073                         return 0;
2074
2075                 DB((dbg, LEVEL_4, "Got phi %N\n", loop_info.iteration_phi));
2076
2077                 /* Find start_val.
2078                  * Does necessary sanity check of add, if it is already set.  */
2079                 success = get_start_and_add(loop_info.iteration_phi, invariant);
2080                 if (! success)
2081                         return 0;
2082
2083                 DB((dbg, LEVEL_4, "Got start %N\n", loop_info.start_val));
2084
2085         } else if (is_Phi(iteration_path)) {
2086                 ir_node *new_iteration_phi;
2087
2088                 /* We compare with the value the iv had entering this run. */
2089                 is_latest_val = 0;
2090
2091                 loop_info.iteration_phi = iteration_path;
2092                 DB((dbg, LEVEL_4, "Got phi %N\n", loop_info.iteration_phi));
2093
2094                 /* Find start_val and add-node.
2095                  * Does necessary sanity check of add, if it is already set.  */
2096                 success = get_start_and_add(loop_info.iteration_phi, invariant);
2097                 if (! success)
2098                         return 0;
2099
2100                 DB((dbg, LEVEL_4, "Got start %N\n", loop_info.start_val));
2101                 DB((dbg, LEVEL_4, "Got add or sub %N\n", loop_info.add));
2102
2103                 success = get_const_pred(loop_info.add, &loop_info.step, &new_iteration_phi);
2104                 if (! success)
2105                         return 0;
2106
2107                 DB((dbg, LEVEL_4, "Got step %N\n", loop_info.step));
2108
2109                 if (loop_info.iteration_phi != new_iteration_phi)
2110                         return 0;
2111
2112         } else {
2113                 return 0;
2114         }
2115
2116         mode = get_irn_mode(loop_info.end_val);
2117
2118         DB((dbg, LEVEL_4, "start %N, end %N, step %N\n",
2119                                 loop_info.start_val, loop_info.end_val, loop_info.step));
2120
2121         if (mode != mode_Is && mode != mode_Iu)
2122                 return 0;
2123
2124         /* TODO necessary? */
2125         if (!are_mode_I(loop_info.start_val, loop_info.step, loop_info.end_val))
2126                 return 0;
2127
2128         DB((dbg, LEVEL_4, "mode integer\n"));
2129
2130         step_tar = get_Const_tarval(loop_info.step);
2131         start_tar = get_Const_tarval(loop_info.start_val);
2132
2133         if (tarval_is_null(step_tar)) {
2134                 /* TODO Might be worth a warning. */
2135                 return 0;
2136         }
2137
2138         DB((dbg, LEVEL_4, "step is not 0\n"));
2139
2140         create_duffs_block();
2141
2142         return loop_info.max_unroll;
2143 }
2144
2145 /* Returns unroll factor,
2146  * given maximum unroll factor and number of loop passes. */
2147 static unsigned get_preferred_factor_constant(tarval *count_tar)
2148 {
2149         tarval *tar_6, *tar_5, *tar_4, *tar_3, *tar_2;
2150         unsigned prefer;
2151         ir_mode *mode = get_irn_mode(loop_info.end_val);
2152
2153         tar_6 = new_tarval_from_long(6, mode);
2154         tar_5 = new_tarval_from_long(5, mode);
2155         tar_4 = new_tarval_from_long(4, mode);
2156         tar_3 = new_tarval_from_long(3, mode);
2157         tar_2 = new_tarval_from_long(2, mode);
2158
2159         /* loop passes % {6, 5, 4, 3, 2} == 0  */
2160         if (tarval_is_null(tarval_mod(count_tar, tar_6)))
2161                 prefer = 6;
2162         else if (tarval_is_null(tarval_mod(count_tar, tar_5)))
2163                 prefer = 5;
2164         else if (tarval_is_null(tarval_mod(count_tar, tar_4)))
2165                 prefer = 4;
2166         else if (tarval_is_null(tarval_mod(count_tar, tar_3)))
2167                 prefer = 3;
2168         else if (tarval_is_null(tarval_mod(count_tar, tar_2)))
2169                 prefer = 2;
2170         else {
2171                 /* gcd(max_unroll, count_tar) */
2172                 int a = loop_info.max_unroll;
2173                 int b = (int)get_tarval_long(count_tar);
2174                 int c;
2175
2176                 DB((dbg, LEVEL_4, "gcd of max_unroll %d and count_tar %d: ", a, b));
2177
2178                 do {
2179                 c = a % b;
2180                 a = b; b = c;
2181                 } while( c != 0);
2182
2183                 DB((dbg, LEVEL_4, "%d\n", a));
2184                 return a;
2185         }
2186
2187         DB((dbg, LEVEL_4, "preferred unroll factor %d\n", prefer));
2188
2189         /*
2190          * If our preference is greater than the allowed unroll factor
2191          * we either might reduce the preferred factor and prevent a duffs device block,
2192          * or create a duffs device block, from which in this case (constants only)
2193          * we know the startloop at compiletime.
2194          * The latter yields the following graphs.
2195          * but for code generation we would want to use graph A.
2196          * The graphs are equivalent. So, we can only reduce the preferred factor.
2197          * A)                   B)
2198          *     PreHead             PreHead
2199          *        |      ,--.         |   ,--.
2200          *         \ Loop1   \        Loop2   \
2201          *          \  |     |       /  |     |
2202          *           Loop2   /      / Loop1   /
2203          *           |   `--'      |      `--'
2204          */
2205
2206         if (prefer <= loop_info.max_unroll)
2207                 return prefer;
2208         else {
2209                 switch(prefer) {
2210                         case 6:
2211                                 if (loop_info.max_unroll >= 3)
2212                                         return 3;
2213                                 else if (loop_info.max_unroll >= 2)
2214                                         return 2;
2215                                 else
2216                                         return 0;
2217
2218                         case 4:
2219                                 if (loop_info.max_unroll >= 2)
2220                                         return 2;
2221                                 else
2222                                         return 0;
2223
2224                         default:
2225                                 return 0;
2226                 }
2227         }
2228 }
2229
2230 /* Check if cur_loop is a simple counting loop.
2231  * Start, step and end are constants. */
2232 /* TODO split. */
2233 static unsigned get_unroll_decision_constant(void)
2234 {
2235         ir_node  *projres, *loop_condition, *iteration_path;
2236         unsigned  success, is_latest_val;
2237         tarval   *start_tar, *end_tar, *step_tar, *diff_tar, *count_tar, *stepped;
2238         pn_Cmp    proj_proj, norm_proj;
2239         ir_mode  *mode;
2240
2241         /* RETURN if loop is not 'simple' */
2242         projres = is_simple_loop();
2243         if (projres == NULL)
2244                 return 0;
2245
2246         /* One in of the loop condition needs to be loop invariant. => end_val
2247          * The other in is assigned by an add. => add
2248          * The add uses a loop invariant value => step
2249          * and a phi with a loop invariant start_val and the add node as ins.
2250
2251            ^   ^
2252            |   | .-,
2253            |   Phi |
2254                 \  |   |
2255           ^  Add   |
2256            \  | \__|
2257             cond
2258              /\
2259         */
2260
2261         loop_condition = get_irn_n(projres, 0);
2262
2263         success = get_const_pred(loop_condition, &loop_info.end_val, &iteration_path);
2264         if (! success)
2265                 return 0;
2266
2267         DB((dbg, LEVEL_4, "End_val %N, other %N\n", loop_info.end_val, iteration_path));
2268
2269         /* We may find the add or the phi first.
2270          * Until now we only have end_val. */
2271         if (is_Add(iteration_path) || is_Sub(iteration_path)) {
2272
2273                 /* We test against the latest value of the iv. */
2274                 is_latest_val = 1;
2275
2276                 loop_info.add = iteration_path;
2277                 DB((dbg, LEVEL_4, "Got add %N (maybe not sane)\n", loop_info.add));
2278
2279                 /* Preds of the add should be step and the iteration_phi */
2280                 success = get_const_pred(loop_info.add, &loop_info.step, &loop_info.iteration_phi);
2281                 if (! success)
2282                         return 0;
2283
2284                 DB((dbg, LEVEL_4, "Got step %N\n", loop_info.step));
2285
2286                 if (! is_Phi(loop_info.iteration_phi))
2287                         return 0;
2288
2289                 DB((dbg, LEVEL_4, "Got phi %N\n", loop_info.iteration_phi));
2290
2291                 /* Find start_val.
2292                  * Does necessary sanity check of add, if it is already set.  */
2293                 success = get_start_and_add(loop_info.iteration_phi, constant);
2294                 if (! success)
2295                         return 0;
2296
2297                 DB((dbg, LEVEL_4, "Got start %N\n", loop_info.start_val));
2298
2299         } else if (is_Phi(iteration_path)) {
2300                 ir_node *new_iteration_phi;
2301
2302                 /* We compare with the value the iv had entering this run. */
2303                 is_latest_val = 0;
2304
2305                 loop_info.iteration_phi = iteration_path;
2306                 DB((dbg, LEVEL_4, "Got phi %N\n", loop_info.iteration_phi));
2307
2308                 /* Find start_val and add-node.
2309                  * Does necessary sanity check of add, if it is already set.  */
2310                 success = get_start_and_add(loop_info.iteration_phi, constant);
2311                 if (! success)
2312                         return 0;
2313
2314                 DB((dbg, LEVEL_4, "Got start %N\n", loop_info.start_val));
2315                 DB((dbg, LEVEL_4, "Got add or sub %N\n", loop_info.add));
2316
2317                 success = get_const_pred(loop_info.add, &loop_info.step, &new_iteration_phi);
2318                 if (! success)
2319                         return 0;
2320
2321                 DB((dbg, LEVEL_4, "Got step %N\n", loop_info.step));
2322
2323                 if (loop_info.iteration_phi != new_iteration_phi)
2324                         return 0;
2325
2326         } else {
2327                 /* RETURN */
2328                 return 0;
2329         }
2330
2331         mode = get_irn_mode(loop_info.end_val);
2332
2333         DB((dbg, LEVEL_4, "start %N, end %N, step %N\n",
2334                                 loop_info.start_val, loop_info.end_val, loop_info.step));
2335
2336         if (mode != mode_Is && mode != mode_Iu)
2337                 return 0;
2338
2339         /* TODO necessary? */
2340         if (!are_mode_I(loop_info.start_val, loop_info.step, loop_info.end_val))
2341                 return 0;
2342
2343         DB((dbg, LEVEL_4, "mode integer\n"));
2344
2345         end_tar = get_Const_tarval(loop_info.end_val);
2346         start_tar = get_Const_tarval(loop_info.start_val);
2347         step_tar = get_Const_tarval(loop_info.step);
2348
2349         if (tarval_is_null(step_tar))
2350                 /* TODO Might be worth a warning. */
2351                 return 0;
2352
2353         DB((dbg, LEVEL_4, "step is not 0\n"));
2354
2355         if ((!tarval_is_negative(step_tar)) ^ (!is_Sub(loop_info.add)))
2356                 loop_info.decreasing = 1;
2357
2358         diff_tar = tarval_sub(end_tar, start_tar, mode);
2359
2360         /* We need at least count_tar steps to be close to end_val, maybe more.
2361          * No way, that we have gone too many steps.
2362          * This represents the 'latest value'.
2363          * (If condition checks against latest value, is checked later) */
2364         count_tar = tarval_div(diff_tar, step_tar);
2365
2366         /* Iv will not pass end_val (except overflows).
2367          * Nothing done, as it would yield to no advantage. */
2368         if (tarval_is_negative(count_tar)) {
2369                 DB((dbg, LEVEL_1, "Loop is endless or never taken."));
2370                 /* TODO Might be worth a warning. */
2371                 return 0;
2372         }
2373
2374         count_stats(stats.u_simple_counting_loop);
2375
2376         loop_info.latest_value = is_latest_val;
2377
2378         /* TODO split here
2379         if (! is_simple_counting_loop(&count_tar))
2380                 return 0;
2381         */
2382
2383         /* stepped can be negative, if step < 0 */
2384         stepped = tarval_mul(count_tar, step_tar);
2385
2386         /* step as close to end_val as possible, */
2387         /* |stepped| <= |end_tar|, and dist(stepped, end_tar) is smaller than a step. */
2388         if (is_Sub(loop_info.add))
2389                 stepped = tarval_sub(start_tar, stepped, mode_Is);
2390         else
2391                 stepped = tarval_add(start_tar, stepped);
2392
2393         DB((dbg, LEVEL_4, "stepped to %ld\n", get_tarval_long(stepped)));
2394
2395         proj_proj = get_Proj_proj(projres);
2396         /* Assure that norm_proj is the stay-in-loop case. */
2397         if (loop_info.exit_cond == 1)
2398                 norm_proj = get_math_inverted_case(proj_proj);
2399         else
2400                 norm_proj = proj_proj;
2401
2402         DB((dbg, LEVEL_4, "normalized projection %s\n", get_pnc_string(norm_proj)));
2403
2404         /* Executed at most once (stay in counting loop if a Eq b) */
2405         if (norm_proj == pn_Cmp_Eq)
2406                 /* TODO Might be worth a warning. */
2407                 return 0;
2408
2409         /* calculates next values and increases count_tar according to it */
2410         success = simulate_next(&count_tar, stepped, step_tar, end_tar, norm_proj);
2411         if (! success)
2412                 return 0;
2413
2414         /* We run loop once more, if we compare to the
2415          * not yet in-/decreased iv. */
2416         if (is_latest_val == 0) {
2417                 DB((dbg, LEVEL_4, "condition uses not latest iv value\n"));
2418                 count_tar = tarval_add(count_tar, get_tarval_one(mode));
2419         }
2420
2421         DB((dbg, LEVEL_4, "loop taken %ld times\n", get_tarval_long(count_tar)));
2422
2423         /* Assure the loop is taken at least 1 time. */
2424         if (tarval_is_null(count_tar)) {
2425                 /* TODO Might be worth a warning. */
2426                 return 0;
2427         }
2428
2429         loop_info.count_tar = count_tar;
2430         return get_preferred_factor_constant(count_tar);
2431 }
2432
2433 /**
2434  * Loop unrolling
2435  */
2436 static void unroll_loop(void)
2437 {
2438         unroll_nr = 0;
2439
2440         /* get_unroll_decision_constant and invariant are completely
2441          * independent for flexibility.
2442          * Some checks may be performed twice. */
2443
2444         /* constant case? */
2445         if (opt_params.allow_const_unrolling)
2446                 unroll_nr = get_unroll_decision_constant();
2447         if (unroll_nr > 1) {
2448                 loop_info.unroll_kind = constant;
2449
2450         } else {
2451                 /* invariant case? */
2452                 if (opt_params.allow_invar_unrolling)
2453                         unroll_nr = get_unroll_decision_invariant();
2454                 if (unroll_nr > 1)
2455                         loop_info.unroll_kind = invariant;
2456         }
2457
2458         DB((dbg, LEVEL_1, " *** Unrolling %d times ***\n", unroll_nr));
2459
2460         if (unroll_nr > 1) {
2461                 loop_entries = NEW_ARR_F(entry_edge, 0);
2462
2463                 /* Get loop outs */
2464                 irg_walk_graph(current_ir_graph, get_loop_entries, NULL, NULL);
2465
2466                 if ((int)get_tarval_long(loop_info.count_tar) == unroll_nr)
2467                         loop_info.needs_backedge = 0;
2468                 else
2469                         loop_info.needs_backedge = 1;
2470
2471                 /* Use phase to keep copy of nodes from the condition chain. */
2472                 phase = new_phase(current_ir_graph, phase_irn_init_default);
2473
2474                 /* Copies the loop */
2475                 copy_loop(loop_entries, unroll_nr - 1);
2476
2477                 /* Line up the floating copies. */
2478                 place_copies(unroll_nr - 1);
2479
2480                 /* Remove phis with 1 in*/
2481                 irg_walk_graph(current_ir_graph, correct_phis, NULL, NULL);
2482
2483                 /* dump_ir_block_graph(current_ir_graph, "-DONE"); */
2484
2485                 if (loop_info.unroll_kind == constant)
2486                         count_stats(stats.constant_unroll);
2487                 else
2488                         count_stats(stats.invariant_unroll);
2489
2490                 set_irg_doms_inconsistent(current_ir_graph);
2491                 set_irg_loopinfo_inconsistent(current_ir_graph);
2492                 /* TODO is it? */
2493                 set_irg_outs_inconsistent(current_ir_graph);
2494
2495                 DEL_ARR_F(loop_entries);
2496         }
2497
2498 }
2499
2500 /* Analyzes the loop, and checks if size is within allowed range.
2501  * Decides if loop will be processed. */
2502 static void init_analyze(ir_loop *loop)
2503 {
2504         /* Expect no benefit of big loops. */
2505         /* TODO tuning/make parameter */
2506         int      loop_depth;
2507         unsigned max_loop_nodes = opt_params.max_loop_size;
2508         unsigned max_loop_nodes_adapted;
2509         int      max_calls = opt_params.allowed_calls;
2510         int      depth_adaption = opt_params.depth_adaption;
2511
2512         cur_loop = loop;
2513
2514         loop_head = NULL;
2515         loop_head_valid = 1;
2516
2517         /* Reset loop info */
2518         memset(&loop_info, 0, sizeof(loop_info_t));
2519
2520         DB((dbg, LEVEL_1, "    >>>> current loop includes node %N <<<\n",
2521                 get_loop_node(loop, 0)));
2522
2523         /* Collect loop informations: head, node counts. */
2524         irg_walk_graph(current_ir_graph, get_loop_info, NULL, NULL);
2525
2526         /* Depth of 0 is the procedure and 1 a topmost loop. */
2527         loop_depth = get_loop_depth(loop) - 1;
2528
2529         /* Calculating in per mil. */
2530         max_loop_nodes_adapted = get_max_nodes_adapted(loop_depth);
2531
2532         DB((dbg, LEVEL_1, "max_nodes: %d\nmax_nodes_adapted %d at depth of %d (adaption %d)\n",
2533                         max_loop_nodes, max_loop_nodes_adapted, loop_depth, depth_adaption));
2534
2535         if (! (loop_info.nodes > 0))
2536                 return;
2537
2538 #if LOOP_IGNORE_NODE_LIMITS
2539         DB((dbg, LEVEL_1, "WARNING: Loop node limitations ignored."));
2540 #else
2541         if (loop_info.nodes > max_loop_nodes) {
2542                 /* Only for stats */
2543                 DB((dbg, LEVEL_1, "Nodes %d > allowed nodes %d\n",
2544                         loop_info.nodes, loop_depth, max_loop_nodes));
2545                 count_stats(stats.too_large);
2546                 /* no RETURN */
2547                 /* Adaption might change it */
2548         }
2549
2550         /* Limit processing to loops smaller than given parameter. */
2551         if (loop_info.nodes > max_loop_nodes_adapted) {
2552                 DB((dbg, LEVEL_1, "Nodes %d > allowed nodes (depth %d adapted) %d\n",
2553                         loop_info.nodes, loop_depth, max_loop_nodes_adapted));
2554                 count_stats(stats.too_large_adapted);
2555                 return;
2556         }
2557
2558         if (loop_info.calls > opt_params.allowed_calls) {
2559                 DB((dbg, LEVEL_1, "Calls %d > allowed calls %d\n",
2560                         loop_info.calls, max_calls));
2561                 count_stats(stats.calls_limit);
2562                 return;
2563         }
2564 #endif
2565
2566         /* RETURN if there is no valid head */
2567         if (!loop_head || !loop_head_valid) {
2568                 DB((dbg, LEVEL_1,   "No valid loop head. Nothing done.\n"));
2569                 return;
2570         } else {
2571                 DB((dbg, LEVEL_1,   "Loophead: %N\n", loop_head));
2572         }
2573
2574         switch (loop_op) {
2575                 case loop_op_inversion:
2576                         loop_inversion();
2577                         break;
2578
2579                 case loop_op_unrolling:
2580                         unroll_loop();
2581                         break;
2582
2583                 default:
2584                         panic("Loop optimization not implemented.");
2585         }
2586         DB((dbg, LEVEL_1, "       <<<< end of loop with node %N >>>>\n",
2587                 get_loop_node(loop, 0)));
2588 }
2589
2590 /* Find innermost loops and add them to loops. */
2591 static void find_innermost_loop(ir_loop *loop)
2592 {
2593         /* descend into sons */
2594         int sons = get_loop_n_sons(loop);
2595
2596         if (sons == 0) {
2597                 ARR_APP1(ir_loop *, loops, loop);
2598         } else {
2599                 int s;
2600                 for (s=0; s<sons; s++) {
2601                         find_innermost_loop(get_loop_son(loop, s));
2602                 }
2603         }
2604 }
2605
2606 /* Assure preconditions are met and go through all loops. */
2607 void loop_optimization(ir_graph *irg)
2608 {
2609         ir_loop *loop;
2610         int     i, sons, nr;
2611
2612         /* SPEC2000: Total time 98.9% with inversion only */
2613         opt_params.max_loop_size = 100;
2614         opt_params.depth_adaption = 400;
2615         opt_params.count_phi = 0;
2616         opt_params.count_proj = 0;
2617         opt_params.allowed_calls = 0;
2618
2619         opt_params.max_cc_size = 100;
2620
2621         /* Unrolling not yet tested */
2622         opt_params.allow_const_unrolling = 1;
2623         opt_params.allow_invar_unrolling = 1;
2624
2625         /* Reset stats for this procedure */
2626         reset_stats();
2627
2628         /* Preconditions */
2629         set_current_ir_graph(irg);
2630
2631         edges_assure(irg);
2632         assure_irg_outs(irg);
2633
2634         /* NOTE: sets only the loop attribute of blocks, not nodes */
2635         /* NOTE: Kills links */
2636         assure_cf_loop(irg);
2637
2638         ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK | IR_RESOURCE_PHI_LIST);
2639         collect_phiprojs(irg);
2640         ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
2641
2642         loop = get_irg_loop(irg);
2643         sons = get_loop_n_sons(loop);
2644
2645         loops = NEW_ARR_F(ir_loop *, 0);
2646         /* List all inner loops */
2647         for (nr = 0; nr < sons; ++nr) {
2648                 find_innermost_loop(get_loop_son(loop, nr));
2649         }
2650
2651         ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK);
2652         /* Set all links to NULL */
2653         irg_walk_graph(current_ir_graph, reset_link, NULL, NULL);
2654
2655         for (i = 0; i < ARR_LEN(loops); ++i) {
2656                 ir_loop *loop = loops[i];
2657
2658                 count_stats(stats.loops);
2659
2660                 /* Analyze and handle loop */
2661                 init_analyze(loop);
2662
2663                 /* Copied blocks do not have their phi list yet */
2664                 collect_phiprojs(irg);
2665
2666                 /* Set links to NULL
2667                  * TODO Still necessary? */
2668                 irg_walk_graph(current_ir_graph, reset_link, NULL, NULL);
2669         }
2670
2671         print_stats();
2672
2673         DEL_ARR_F(loops);
2674         ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
2675         ir_free_resources(irg, IR_RESOURCE_PHI_LIST);
2676 }
2677
2678 void do_loop_unrolling(ir_graph *irg)
2679 {
2680         loop_op = loop_op_unrolling;
2681
2682         DB((dbg, LEVEL_1, " >>> unrolling (Startnode %N) <<<\n",
2683                                 get_irg_start(irg)));
2684
2685         loop_optimization(irg);
2686
2687         DB((dbg, LEVEL_1, " >>> unrolling done (Startnode %N) <<<\n",
2688                                 get_irg_start(irg)));
2689 }
2690
2691 void do_loop_inversion(ir_graph *irg)
2692 {
2693         loop_op = loop_op_inversion;
2694
2695         DB((dbg, LEVEL_1, " >>> inversion (Startnode %N) <<<\n",
2696                                 get_irg_start(irg)));
2697
2698         loop_optimization(irg);
2699
2700         DB((dbg, LEVEL_1, " >>> inversion done (Startnode %N) <<<\n",
2701                                 get_irg_start(irg)));
2702 }
2703
2704 void do_loop_peeling(ir_graph *irg)
2705 {
2706         loop_op = loop_op_peeling;
2707
2708         DB((dbg, LEVEL_1, " >>> peeling (Startnode %N) <<<\n",
2709                                 get_irg_start(irg)));
2710
2711         loop_optimization(irg);
2712
2713         DB((dbg, LEVEL_1, " >>> peeling done (Startnode %N) <<<\n",
2714                                 get_irg_start(irg)));
2715
2716 }
2717
2718 ir_graph_pass_t *loop_inversion_pass(const char *name)
2719 {
2720         return def_graph_pass(name ? name : "loop_inversion", do_loop_inversion);
2721 }
2722
2723 ir_graph_pass_t *loop_unroll_pass(const char *name)
2724 {
2725         return def_graph_pass(name ? name : "loop_unroll", do_loop_unrolling);
2726 }
2727
2728 ir_graph_pass_t *loop_peeling_pass(const char *name)
2729 {
2730         return def_graph_pass(name ? name : "loop_peeling", do_loop_peeling);
2731 }
2732
2733 void firm_init_loop_opt(void)
2734 {
2735         FIRM_DBG_REGISTER(dbg, "firm.opt.loop");
2736 }