Fixed wrongly set debug values.
[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         assert(nr != 0 && "0 reserved");
500
501         unrolling_node_info *info = (unrolling_node_info *)phase_get_irn_data(phase, n);
502         if (! info) {
503                 ir_node **arr;
504
505                 info = XMALLOCZ(unrolling_node_info);
506                 arr = NEW_ARR_F(ir_node *, unroll_nr);
507                 info->copies = arr;
508                 memset(info->copies, 0, (unroll_nr) * sizeof(ir_node *));
509
510                 phase_set_irn_data(phase, n, info);
511         }
512         /* Original node */
513         info->copies[0] = n;
514
515         info->copies[nr] = cp;
516 }
517
518 /* Returns a nodes copy if it exists, else NULL. */
519 static ir_node *get_unroll_copy(ir_node *n, int nr)
520 {
521         unrolling_node_info *info = (unrolling_node_info *)phase_get_irn_data(phase, n);
522         if (! info)
523                 return NULL;
524
525         ir_node *cp = info->copies[nr];
526         return cp;
527 }
528
529
530 /***** Inversion Helper Functions *****/
531
532 /* Sets copy cp of node n. */
533 static void set_inversion_copy(ir_node *n, ir_node *cp)
534 {
535         phase_set_irn_data(phase, n, cp);
536 }
537
538 /* Getter of copy of n for inversion */
539 static ir_node *get_inversion_copy(ir_node *n)
540 {
541         ir_node *cp = (ir_node *)phase_get_irn_data(phase, n);
542         return cp;
543 }
544
545 /* Resets block mark for given node. For use with walker */
546 static void reset_block_mark(ir_node *node, void * env)
547 {
548         (void) env;
549
550         if (is_Block(node))
551                 set_Block_mark(node, 0);
552 }
553
554 /* Returns mark of node, or its block if node is not a block.
555  * Used in this context to determine if node is in the condition chain. */
556 static unsigned is_nodes_block_marked(ir_node* node)
557 {
558         if (is_Block(node))
559                 return get_Block_mark(node);
560         else
561                 return get_Block_mark(get_block(node));
562 }
563
564 /* Extends a nodes ins by node new.
565  * NOTE: This is slow if a node n needs to be extended more than once. */
566 static int extend_irn(ir_node *n, ir_node *new)
567 {
568         ir_node **ins;
569         int i;
570         int arity = get_irn_arity(n);
571         int new_arity = arity + 1;
572
573         NEW_ARR_A(ir_node *, ins, new_arity);
574
575         for(i = 0; i < arity; ++i) {
576                 ins[i] = get_irn_n(n, i);
577         }
578         ins[i] = new;
579
580         set_irn_in(n, new_arity, ins);
581         return arity;
582 }
583
584 /* Extends a block by a copy of its pred at pos,
585  * fixing also the phis in the same way. */
586 static void extend_ins_by_copy(ir_node *block, int pos)
587 {
588         ir_node *new_in;
589         ir_node *phi;
590         ir_node *pred;
591         assert(is_Block(block));
592
593         /* Extend block by copy of definition at pos */
594         pred = get_irn_n(block, pos);
595         new_in = get_inversion_copy(pred);
596         DB((dbg, LEVEL_5, "Extend block %N by %N cp of %N\n", block, new_in, pred));
597         extend_irn(block, new_in);
598
599         /* Extend block phis by copy of definition at pos */
600         for_each_phi(block, phi) {
601                 ir_node *pred, *cp;
602
603                 pred = get_irn_n(phi, pos);
604                 cp = get_inversion_copy(pred);
605                 /* If the phis in is not in the condition chain (eg. a constant),
606                  * there is no copy. */
607                 if (cp == NULL)
608                         new_in = pred;
609                 else
610                         new_in = cp;
611
612                 DB((dbg, LEVEL_5, "Extend phi %N by %N cp of %N\n", phi, new_in, pred));
613                 extend_irn(phi, new_in);
614         }
615 }
616
617 /* Returns the number of blocks backedges. With or without alien bes. */
618 static int get_backedge_n(ir_node *block, unsigned with_alien)
619 {
620         int i;
621         int be_n = 0;
622         int arity = get_irn_arity(block);
623
624         assert(is_Block(block) && "We only required backedges of blocks.");
625
626         for (i = 0; i < arity; ++i) {
627                 ir_node *pred = get_irn_n(block, i);
628                 if (is_backedge(block, i) && (with_alien || is_in_loop(pred)))
629                         ++be_n;
630         }
631         return be_n;
632 }
633
634 /* Returns a raw copy of the given node.
635  * Attributes are kept/set according to the needs of loop inversion. */
636 static ir_node *copy_node(ir_node *node)
637 {
638         int i, arity;
639         ir_node *cp;
640
641         cp = exact_copy(node);
642         arity = get_irn_arity(node);
643
644         /* Keep backedge info */
645         for (i = 0; i < arity; ++i) {
646                 if (is_backedge(node, i))
647                         set_backedge(cp, i);
648         }
649
650         if (is_Block(cp)) {
651                 /* We may not keep the old macroblock. */
652                 set_Block_MacroBlock(cp, 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;
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                 }
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                 }*/
1533         }
1534
1535         return new_r_Phi(get_nodes_block(node), c, ins, get_irn_mode(node));
1536 }
1537
1538 /* Creates a new block from the given block node omitting own bes,
1539  * using be_block as supplier of backedge informations. */
1540 static ir_node *clone_block_sans_bes(ir_node *node, ir_node *be_block)
1541 {
1542         ir_node **ins;
1543         int arity = get_irn_arity(node);
1544         int i, c = 0;
1545
1546         assert(get_irn_arity(node) == get_irn_arity(be_block));
1547         assert(is_Block(node));
1548
1549         ins = NEW_ARR_F(ir_node *, arity);
1550         for (i = 0; i < arity; ++i) {
1551                 if (! is_own_backedge(be_block, i)) {
1552                         ins[c] = get_irn_n(node, i);
1553                         ++c;
1554                 }
1555         }
1556
1557         return new_Block(c, ins);
1558 }
1559
1560 /* Creates blocks for duffs device, using previously obtained
1561  * informations about the iv.
1562  * TODO split */
1563 static void create_duffs_block(void)
1564 {
1565         ir_mode *mode;
1566
1567         ir_node *block1, *count_block, *duff_block;
1568         ir_node *ems, *ems_divmod, *ems_mod_proj, *cmp_null,
1569                 *cmp_proj, *ems_mode_cond, *x_true, *x_false, *const_null;
1570         ir_node *true_val, *false_val;
1571         ir_node *ins[2];
1572
1573         ir_node *duff_mod, *proj, *cond;
1574
1575         ir_node *count, *correction, *unroll_c;
1576         ir_node *cmp_bad_count, *good_count, *bad_count, *count_phi, *bad_count_neg;
1577
1578         mode = get_irn_mode(loop_info.end_val);
1579         const_null = new_Const(get_mode_null(mode));
1580
1581         /* TODO naming
1582          * 1. Calculate first approach to count.
1583          *    Condition: (end - start) % step == 0 */
1584         block1 = clone_block_sans_bes(loop_head, loop_head);
1585
1586         /* Create loop entry phis in first duff block
1587          * as it becomes the loops preheader */
1588         if (loop_info.unroll_kind == invariant) {
1589                 ir_node *phi;
1590                 for_each_phi(loop_head, phi) {
1591                         ir_node *new_phi = clone_phis_sans_bes(phi, loop_head);
1592                         set_nodes_block(new_phi, block1);
1593                 }
1594         }
1595
1596         ems = new_r_Sub(block1, loop_info.end_val, loop_info.start_val,
1597                 get_irn_mode(loop_info.end_val));
1598
1599         ems_divmod = new_r_DivMod(block1,
1600                 new_NoMem(),
1601                 ems,
1602                 loop_info.step,
1603                 mode,
1604                 op_pin_state_pinned);
1605
1606         ems_mod_proj = new_r_Proj(ems_divmod, mode, pn_DivMod_res_mod);
1607         cmp_null = new_r_Cmp(block1, ems_mod_proj, const_null);
1608         cmp_proj = new_r_Proj(cmp_null, mode, pn_Cmp_Eq);
1609         ems_mode_cond = new_Cond(cmp_proj);
1610
1611         /* ems % step == 0 */
1612         x_true = new_Proj(ems_mode_cond, mode_X, pn_Cond_true);
1613         /* ems % step != 0 */
1614         x_false = new_Proj(ems_mode_cond, mode_X, pn_Cond_false);
1615
1616
1617         /* 2. Second block.
1618          * Assures, duffs device receives a valid count.
1619          * Condition:
1620          *     decreasing: count < 0
1621          *     increasing: count > 0
1622          */
1623         ins[0] = x_true;
1624         ins[1] = x_false;
1625
1626         count_block = new_Block(2, ins);
1627
1628         /* Increase loop-taken-count depending on the loop condition
1629          * uses the latest iv to compare to. */
1630         if (loop_info.latest_value == 1) {
1631                 /* ems % step == 0 :  +0 */
1632                 true_val = new_Const(get_mode_null(mode));
1633                 /* ems % step != 0 :  +1 */
1634                 false_val = new_Const(get_mode_one(mode));
1635         } else {
1636                 tarval *tv_two = new_tarval_from_long(2, mode);
1637                 /* ems % step == 0 :  +1 */
1638                 true_val = new_Const(get_mode_one(mode));
1639                 /* ems % step != 0 :  +2 */
1640                 false_val = new_Const(tv_two);
1641         }
1642
1643         ins[0] = true_val;
1644         ins[1] = false_val;
1645
1646         correction = new_r_Phi(count_block, 2, ins, mode);
1647
1648         count = new_r_Proj(ems_divmod, mode, pn_DivMod_res_div);
1649
1650         /* (end - start) / step  +  correction */
1651         count = new_Add(count, correction, mode);
1652
1653         cmp_bad_count = new_r_Cmp(count_block, count, const_null);
1654
1655         /* We preconditioned the loop to be tail-controlled.
1656          * So, if count is something 'wrong' like 0,
1657          * negative/positive (depending on step direction),
1658          * we may take the loop once (tail-contr.) and leave it
1659          * to the existing condition, to break; */
1660
1661         /* Depending on step direction, we have to check for > or < 0 */
1662         if (loop_info.decreasing == 1) {
1663                 bad_count_neg = new_r_Proj(cmp_bad_count, mode_X, pn_Cmp_Lt);
1664         } else {
1665                 bad_count_neg = new_r_Proj(cmp_bad_count, mode_X, pn_Cmp_Gt);
1666         }
1667
1668         bad_count_neg = new_Cond(bad_count_neg);
1669         good_count = new_Proj(bad_count_neg, mode_X, pn_Cond_true);
1670         bad_count = new_Proj(ems_mode_cond, mode_X, pn_Cond_false);
1671
1672         /* 3. Duff Block
1673          *    Contains module to decide which loop to start from. */
1674
1675         ins[0] = good_count;
1676         ins[1] = bad_count;
1677         duff_block = new_Block(2, ins);
1678
1679         /* count wants to be positive */
1680         ins[0] = get_Abs_op(count);
1681         /* Manually feed the aforementioned count = 1 (bad case)*/
1682         ins[1] = new_Const(get_mode_one(mode));
1683         count_phi = new_r_Phi(duff_block, 2, ins, mode);
1684
1685         unroll_c = new_Const(new_tarval_from_long((long)unroll_nr, mode));
1686
1687         /* count % unroll_nr */
1688         duff_mod = new_r_Mod(duff_block,
1689                 new_NoMem(),
1690                 count_phi,
1691                 unroll_c,
1692                 mode,
1693                 op_pin_state_pinned);
1694
1695         proj = new_Proj(duff_mod, mode_X, pn_Mod_res);
1696         cond = new_Cond(proj);
1697
1698         loop_info.duff_cond = cond;
1699 }
1700
1701 /* Returns 1 if given node is not in loop,
1702  * or if it is a phi of the loop head with only loop invariant defs.
1703  */
1704 static unsigned is_loop_invariant_def(ir_node *node)
1705 {
1706         int i;
1707
1708         if (! is_in_loop(node))
1709                 return 1;
1710
1711         /* If this is a phi of the loophead shared by more than 1 loop,
1712          * we need to check if all defs are not in the loop.  */
1713         if (is_Phi(node)) {
1714                 ir_node *block;
1715                 block = get_nodes_block(node);
1716
1717                 /* To prevent unexpected situations. */
1718                 if (block != loop_head)
1719                         return 0;
1720
1721                 for (i = 0; i < get_irn_arity(node); ++i) {
1722                         /* Check if all bes are just loopbacks. */
1723                         if (is_own_backedge(block, i) && get_irn_n(node, i) != node)
1724                                 return 0;
1725                 }
1726         }
1727         return 1;
1728 }
1729
1730 /* Returns 1 if one pred of node is invariant and the other is not.
1731  * invar_pred and other are set analogously. */
1732 static unsigned get_invariant_pred(ir_node *node, ir_node **invar_pred, ir_node **other)
1733 {
1734         ir_node *pred0 = get_irn_n(node, 0);
1735         ir_node *pred1 = get_irn_n(node, 1);
1736
1737         *invar_pred = NULL;
1738         *other = NULL;
1739
1740         if (is_loop_invariant_def(pred0)) {
1741                 *invar_pred = pred0;
1742                 *other = pred1;
1743         }
1744
1745         if (is_loop_invariant_def(pred1)) {
1746                 if (invar_pred != NULL)
1747                         /* RETURN. We do not want both preds to be invariant. */
1748                         return 0;
1749
1750                 *other = pred0;
1751                 *invar_pred = pred1;
1752                 return 1;
1753         } else {
1754                 return 0;
1755         }
1756 }
1757
1758 /* Starts from a phi that may belong to an iv.
1759  * If an add forms a loop with iteration_phi,
1760  * and add uses a constant, 1 is returned
1761  * and 'start' as well as 'add' are sane. */
1762 static unsigned get_start_and_add(ir_node *iteration_phi, unrolling_kind_flag role)
1763 {
1764         int i;
1765         ir_node *found_add = loop_info.add;
1766         int arity = get_irn_arity(iteration_phi);
1767
1768         DB((dbg, LEVEL_4, "Find start and add from %N\n", iteration_phi));
1769
1770         for (i = 0; i < arity; ++i) {
1771
1772                 /* Find start_val which needs to be pred of the iteration_phi.
1773                  * If start_val already known, sanity check. */
1774                 if (!is_backedge(get_nodes_block(loop_info.iteration_phi), i)) {
1775                         ir_node *found_start_val = get_irn_n(loop_info.iteration_phi, i);
1776
1777                         DB((dbg, LEVEL_4, "found_start_val %N\n", found_start_val));
1778
1779                         /* We already found a start_val it has to be always the same. */
1780                         if (loop_info.start_val && found_start_val != loop_info.start_val)
1781                                 return 0;
1782
1783                         if ((role == constant) && !(is_SymConst(found_start_val) || is_Const(found_start_val)))
1784                                         return 0;
1785                         else if((role == constant) && !(is_loop_invariant_def(found_start_val)))
1786                                         return 0;
1787
1788                         loop_info.start_val = found_start_val;
1789                 }
1790
1791                 /* The phi has to be in the loop head.
1792                  * Follow all own backedges. Every value supplied from these preds of the phi
1793                  * needs to origin from the same add. */
1794                 if (is_own_backedge(get_nodes_block(loop_info.iteration_phi), i)) {
1795                         ir_node *new_found = get_irn_n(loop_info.iteration_phi,i);
1796
1797                         DB((dbg, LEVEL_4, "is add? %N\n", new_found));
1798
1799                         if (! (is_Add(new_found) || is_Sub(new_found)) || (found_add && found_add != new_found))
1800                                 return 0;
1801                         else
1802                                 found_add = new_found;
1803                 }
1804         }
1805
1806         loop_info.add = found_add;
1807
1808         return 1;
1809 }
1810
1811
1812 /* Returns 1 if one pred of node is a const value and the other is not.
1813  * const_pred and other are set analogously. */
1814 static unsigned get_const_pred(ir_node *node, ir_node **const_pred, ir_node **other)
1815 {
1816         ir_node *pred0 = get_irn_n(node, 0);
1817         ir_node *pred1 = get_irn_n(node, 1);
1818
1819         DB((dbg, LEVEL_4, "Checking for constant pred of %N\n", node));
1820
1821         *const_pred = NULL;
1822         *other = NULL;
1823
1824         /*DB((dbg, LEVEL_4, "is %N const\n", pred0));*/
1825         if (is_Const(pred0) || is_SymConst(pred0)) {
1826                 DB((dbg, LEVEL_1, "%N is constant\n", pred0));
1827                 *const_pred = pred0;
1828                 *other = pred1;
1829         }
1830
1831         /*DB((dbg, LEVEL_4, "is %N const\n", pred1));*/
1832         if (is_Const(pred1) || is_SymConst(pred1)) {
1833                 if (*const_pred != NULL) {
1834                         DB((dbg, LEVEL_1, "%N is ALSO constant\n", pred1));
1835                         /* RETURN. We do not want both preds to be constant. */
1836                         return 0;
1837                 }
1838
1839                 DB((dbg, LEVEL_4, "%N is constant\n", pred1));
1840                 *other = pred0;
1841                 *const_pred = pred1;
1842         }
1843
1844         if (*const_pred == NULL)
1845                 return 0;
1846         else
1847                 return 1;
1848 }
1849
1850 /* Returns the mathematically inverted pn_Cmp. */
1851 static pn_Cmp get_math_inverted_case(pn_Cmp proj)
1852 {
1853         switch(proj) {
1854                 case pn_Cmp_Eq:
1855                         return pn_Cmp_Lg;
1856                 case pn_Cmp_Lg:
1857                         return pn_Cmp_Eq;
1858                 case pn_Cmp_Lt:
1859                         return pn_Cmp_Ge;
1860                 case pn_Cmp_Le:
1861                         return pn_Cmp_Gt;
1862                 case pn_Cmp_Gt:
1863                         return pn_Cmp_Le;
1864                 case pn_Cmp_Ge:
1865                         return pn_Cmp_Lt;
1866                 default:
1867                         panic("Unhandled pn_Cmp.");
1868         }
1869 }
1870
1871 /* norm_proj means we do not exit the loop. */
1872 static unsigned simulate_next(tarval **count_tar,
1873                 tarval *stepped, tarval *step_tar, tarval *end_tar, pn_Cmp norm_proj)
1874 {
1875         tarval *next;
1876
1877         DB((dbg, LEVEL_1, "Loop taken if (stepped)%ld %s (end)%ld ",
1878                                 get_tarval_long(stepped),
1879                                 get_pnc_string((norm_proj)),
1880                                 get_tarval_long(end_tar)));
1881         DB((dbg, LEVEL_1, "comparing latest value %d\n", loop_info.latest_value));
1882
1883         /* If current iv does not stay in the loop,
1884          * this run satisfied the exit condition. */
1885         if (! (tarval_cmp(stepped, end_tar) & norm_proj))
1886                 return 1;
1887
1888         DB((dbg, LEVEL_1, "Result: (stepped)%ld IS %s (end)%ld\n",
1889                                 get_tarval_long(stepped),
1890                                 get_pnc_string(tarval_cmp(stepped, end_tar)),
1891                                 get_tarval_long(end_tar)));
1892
1893         /* next step */
1894         if (is_Add(loop_info.add))
1895                 next = tarval_add(stepped, step_tar);
1896         else
1897                 /* sub */
1898                 next = tarval_sub(stepped, step_tar, get_irn_mode(loop_info.end_val));
1899
1900         DB((dbg, LEVEL_1, "Loop taken if %ld %s %ld ",
1901                                 get_tarval_long(next),
1902                                 get_pnc_string(norm_proj),
1903                                 get_tarval_long(end_tar)));
1904         DB((dbg, LEVEL_1, "comparing latest value %d\n", loop_info.latest_value));
1905
1906         /* Increase steps. */
1907         *count_tar = tarval_add(*count_tar, get_tarval_one(get_tarval_mode(*count_tar)));
1908
1909         /* Next has to fail the loop condition, or we will never exit. */
1910         if (! (tarval_cmp(next, end_tar) & norm_proj))
1911                 return 1;
1912         else
1913                 return 0;
1914 }
1915
1916 /* Check if loop meets requirements for a 'simple loop':
1917  * - Exactly one cf out
1918  * - Allowed calls
1919  * - Max nodes after unrolling
1920  * - tail-controlled
1921  * - exactly one be
1922  * - cmp
1923  * Returns Projection of cmp node or NULL; */
1924 static ir_node *is_simple_loop(void)
1925 {
1926         int arity, i;
1927         unsigned loop_depth, max_loop_nodes_adapted;
1928         ir_node *loop_block, *exit_block, *projx, *cond, *projres, *loop_condition;
1929
1930         /* Maximum of one condition, and no endless loops. */
1931         if (loop_info.cf_outs != 1)
1932                 return NULL;
1933
1934         DB((dbg, LEVEL_4, "1 loop exit\n"));
1935
1936 #if 0
1937         /* Ignore loop size. Probably not wise in other than testcases. */
1938         (void) max_loop_nodes_adapted;
1939         (void) loop_depth;
1940
1941         loop_info.max_unroll = 6;
1942 #else
1943         /* Calculate maximum unroll_nr keeping node count below limit. */
1944         loop_depth = get_loop_depth(cur_loop) - 1;
1945         max_loop_nodes_adapted = get_max_nodes_adapted(loop_depth);
1946
1947         loop_info.max_unroll = opt_params.max_loop_size / loop_info.nodes;
1948         if (loop_info.max_unroll < 2) {
1949                 count_stats(stats.too_large);
1950                 return NULL;
1951         }
1952 #endif
1953         DB((dbg, LEVEL_4, "maximum unroll factor %u, to not exceed node limit \n",
1954                 loop_info.max_unroll));
1955
1956         arity = get_irn_arity(loop_head);
1957         /* RETURN if we have more than 1 be. */
1958         /* Get my backedges without alien bes. */
1959         loop_block = NULL;
1960         for (i = 0; i < arity; ++i) {
1961                 ir_node *pred = get_irn_n(loop_head, i);
1962                 if (is_own_backedge(loop_head, i)) {
1963                         if (loop_block)
1964                                 /* Our simple loops may have only one backedge. */
1965                                 return NULL;
1966                         else {
1967                                 loop_block = get_nodes_block(pred);
1968                                 loop_info.be_src_pos = i;
1969                         }
1970                 }
1971         }
1972
1973         DB((dbg, LEVEL_4, "loop has 1 own backedge.\n"));
1974
1975         exit_block = get_nodes_block(loop_info.cf_out.pred);
1976         /* The loop has to be tail-controlled.
1977          * This can be changed/improved,
1978          * but we would need a duff iv. */
1979         if (exit_block != loop_block)
1980                 return NULL;
1981
1982         DB((dbg, LEVEL_4, "tail-controlled loop.\n"));
1983
1984         /* find value on which loop exit depends */
1985         projx = loop_info.cf_out.pred;
1986         cond = get_irn_n(projx, 0);
1987         projres = get_irn_n(cond, 0);
1988         loop_condition = get_irn_n(projres, 0);
1989
1990         if (!is_Cmp(loop_condition))
1991                 return NULL;
1992
1993         DB((dbg, LEVEL_5, "projection is %s\n", get_pnc_string(get_Proj_proj(projx))));
1994
1995         switch(get_Proj_proj(projx)) {
1996                 case pn_Cond_false:
1997                         loop_info.exit_cond = 0;
1998                         break;
1999                 case pn_Cond_true:
2000                         loop_info.exit_cond = 1;
2001                         break;
2002                 default:
2003                         panic("Cond Proj_proj other than true/false");
2004         }
2005
2006         DB((dbg, LEVEL_4, "Valid Cmp.\n"));
2007
2008         return projres;
2009 }
2010
2011 /* Returns 1 if all nodes are mode_Iu or mode_Is. */
2012 static unsigned are_mode_I(ir_node *n1, ir_node* n2, ir_node *n3)
2013 {
2014         ir_mode *m1 = get_irn_mode(n1);
2015         ir_mode *m2 = get_irn_mode(n2);
2016         ir_mode *m3 = get_irn_mode(n3);
2017
2018         if ((m1 == mode_Iu && m2 == mode_Iu && m3 == mode_Iu) ||
2019             (m1 == mode_Is && m2 == mode_Is && m3 == mode_Is))
2020                 return 1;
2021         else
2022                 return 0;
2023 }
2024
2025 /* Checks if cur_loop is a simple tail-controlled counting loop
2026  * with start and end value loop invariant, step constant. */
2027 static unsigned get_unroll_decision_invariant(void)
2028 {
2029
2030         ir_node         *projres, *loop_condition, *iteration_path;
2031         unsigned        success, is_latest_val;
2032         tarval          *start_tar, *step_tar;
2033         ir_mode         *mode;
2034
2035         /* RETURN if loop is not 'simple' */
2036         projres = is_simple_loop();
2037         if (projres == NULL)
2038                 return 0;
2039
2040         loop_condition = get_irn_n(projres, 0);
2041
2042         success = get_invariant_pred(loop_condition, &loop_info.end_val, &iteration_path);
2043         if (! success)
2044                 return 0;
2045
2046         DB((dbg, LEVEL_4, "Invariant End_val %N, other %N\n", loop_info.end_val, iteration_path));
2047
2048         /* We may find the add or the phi first.
2049          * Until now we only have end_val. */
2050         if (is_Add(iteration_path) || is_Sub(iteration_path)) {
2051
2052                 /* We test against the latest value of the iv. */
2053                 is_latest_val = 1;
2054
2055                 loop_info.add = iteration_path;
2056                 DB((dbg, LEVEL_4, "Got add %N (maybe not sane)\n", loop_info.add));
2057
2058                 /* Preds of the add should be step and the iteration_phi */
2059                 success = get_const_pred(loop_info.add, &loop_info.step, &loop_info.iteration_phi);
2060                 if (! success)
2061                         return 0;
2062
2063                 DB((dbg, LEVEL_4, "Got step %N\n", loop_info.step));
2064
2065                 if (! is_Phi(loop_info.iteration_phi))
2066                         return 0;
2067
2068                 DB((dbg, LEVEL_4, "Got phi %N\n", loop_info.iteration_phi));
2069
2070                 /* Find start_val.
2071                  * Does necessary sanity check of add, if it is already set.  */
2072                 success = get_start_and_add(loop_info.iteration_phi, invariant);
2073                 if (! success)
2074                         return 0;
2075
2076                 DB((dbg, LEVEL_4, "Got start %N\n", loop_info.start_val));
2077
2078         } else if (is_Phi(iteration_path)) {
2079                 ir_node *new_iteration_phi;
2080
2081                 /* We compare with the value the iv had entering this run. */
2082                 is_latest_val = 0;
2083
2084                 loop_info.iteration_phi = iteration_path;
2085                 DB((dbg, LEVEL_4, "Got phi %N\n", loop_info.iteration_phi));
2086
2087                 /* Find start_val and add-node.
2088                  * Does necessary sanity check of add, if it is already set.  */
2089                 success = get_start_and_add(loop_info.iteration_phi, invariant);
2090                 if (! success)
2091                         return 0;
2092
2093                 DB((dbg, LEVEL_4, "Got start %N\n", loop_info.start_val));
2094                 DB((dbg, LEVEL_4, "Got add or sub %N\n", loop_info.add));
2095
2096                 success = get_const_pred(loop_info.add, &loop_info.step, &new_iteration_phi);
2097                 if (! success)
2098                         return 0;
2099
2100                 DB((dbg, LEVEL_4, "Got step %N\n", loop_info.step));
2101
2102                 if (loop_info.iteration_phi != new_iteration_phi)
2103                         return 0;
2104
2105         } else {
2106                 return 0;
2107         }
2108
2109         mode = get_irn_mode(loop_info.end_val);
2110
2111         DB((dbg, LEVEL_4, "start %N, end %N, step %N\n",
2112                                 loop_info.start_val, loop_info.end_val, loop_info.step));
2113
2114         if (mode != mode_Is && mode != mode_Iu)
2115                 return 0;
2116
2117         /* TODO necessary? */
2118         if (!are_mode_I(loop_info.start_val, loop_info.step, loop_info.end_val))
2119                 return 0;
2120
2121         DB((dbg, LEVEL_4, "mode integer\n"));
2122
2123         step_tar = get_Const_tarval(loop_info.step);
2124         start_tar = get_Const_tarval(loop_info.start_val);
2125
2126         if (tarval_is_null(step_tar)) {
2127                 /* TODO Might be worth a warning. */
2128                 return 0;
2129         }
2130
2131         DB((dbg, LEVEL_4, "step is not 0\n"));
2132
2133         create_duffs_block();
2134
2135         return loop_info.max_unroll;
2136 }
2137
2138 /* Returns unroll factor,
2139  * given maximum unroll factor and number of loop passes. */
2140 static unsigned get_preferred_factor_constant(tarval *count_tar)
2141 {
2142         tarval *tar_6, *tar_5, *tar_4, *tar_3, *tar_2;
2143         unsigned prefer;
2144         ir_mode *mode = get_irn_mode(loop_info.end_val);
2145
2146         tar_6 = new_tarval_from_long(6, mode);
2147         tar_5 = new_tarval_from_long(5, mode);
2148         tar_4 = new_tarval_from_long(4, mode);
2149         tar_3 = new_tarval_from_long(3, mode);
2150         tar_2 = new_tarval_from_long(2, mode);
2151
2152         /* loop passes % {6, 5, 4, 3, 2} == 0  */
2153         if (tarval_is_null(tarval_mod(count_tar, tar_6)))
2154                 prefer = 6;
2155         else if (tarval_is_null(tarval_mod(count_tar, tar_5)))
2156                 prefer = 5;
2157         else if (tarval_is_null(tarval_mod(count_tar, tar_4)))
2158                 prefer = 4;
2159         else if (tarval_is_null(tarval_mod(count_tar, tar_3)))
2160                 prefer = 3;
2161         else if (tarval_is_null(tarval_mod(count_tar, tar_2)))
2162                 prefer = 2;
2163         else {
2164                 /* gcd(max_unroll, count_tar) */
2165                 int a = loop_info.max_unroll;
2166                 int b = (int)get_tarval_long(count_tar);
2167                 int c;
2168
2169                 DB((dbg, LEVEL_4, "gcd of max_unroll %d and count_tar %d: ", a, b));
2170
2171                 do {
2172                 c = a % b;
2173                 a = b; b = c;
2174                 } while( c != 0);
2175
2176                 DB((dbg, LEVEL_4, "%d\n", a));
2177                 return a;
2178         }
2179
2180         DB((dbg, LEVEL_4, "preferred unroll factor %d\n", prefer));
2181
2182         /*
2183          * If our preference is greater than the allowed unroll factor
2184          * we either might reduce the preferred factor and prevent a duffs device block,
2185          * or create a duffs device block, from which in this case (constants only)
2186          * we know the startloop at compiletime.
2187          * The latter yields the following graphs.
2188          * but for code generation we would want to use graph A.
2189          * The graphs are equivalent. So, we can only reduce the preferred factor.
2190          * A)                   B)
2191          *     PreHead             PreHead
2192          *        |      ,--.         |   ,--.
2193          *         \ Loop1   \        Loop2   \
2194          *          \  |     |       /  |     |
2195          *           Loop2   /      / Loop1   /
2196          *           |   `--'      |      `--'
2197          */
2198
2199         if (prefer <= loop_info.max_unroll)
2200                 return prefer;
2201         else {
2202                 switch(prefer) {
2203                         case 6:
2204                                 if (loop_info.max_unroll >= 3)
2205                                         return 3;
2206                                 else if (loop_info.max_unroll >= 2)
2207                                         return 2;
2208                                 else
2209                                         return 0;
2210
2211                         case 4:
2212                                 if (loop_info.max_unroll >= 2)
2213                                         return 2;
2214                                 else
2215                                         return 0;
2216
2217                         default:
2218                                 return 0;
2219                 }
2220         }
2221 }
2222
2223 /* Check if cur_loop is a simple counting loop.
2224  * Start, step and end are constants. */
2225 /* TODO split. */
2226 static unsigned get_unroll_decision_constant(void)
2227 {
2228         ir_node         *projres, *loop_condition, *iteration_path;
2229         unsigned        success, is_latest_val;
2230         tarval          *start_tar, *end_tar, *step_tar, *diff_tar, *count_tar, *stepped;
2231         pn_Cmp          proj_proj, norm_proj;
2232         ir_mode         *mode;
2233
2234         /* RETURN if loop is not 'simple' */
2235         projres = is_simple_loop();
2236         if (projres == NULL)
2237                 return 0;
2238
2239         /* One in of the loop condition needs to be loop invariant. => end_val
2240          * The other in is assigned by an add. => add
2241          * The add uses a loop invariant value => step
2242          * and a phi with a loop invariant start_val and the add node as ins.
2243
2244            ^   ^
2245            |   | .-,
2246            |   Phi |
2247                 \  |   |
2248           ^  Add   |
2249            \  | \__|
2250             cond
2251              /\
2252         */
2253
2254         loop_condition = get_irn_n(projres, 0);
2255
2256         success = get_const_pred(loop_condition, &loop_info.end_val, &iteration_path);
2257         if (! success)
2258                 return 0;
2259
2260         DB((dbg, LEVEL_4, "End_val %N, other %N\n", loop_info.end_val, iteration_path));
2261
2262         /* We may find the add or the phi first.
2263          * Until now we only have end_val. */
2264         if (is_Add(iteration_path) || is_Sub(iteration_path)) {
2265
2266                 /* We test against the latest value of the iv. */
2267                 is_latest_val = 1;
2268
2269                 loop_info.add = iteration_path;
2270                 DB((dbg, LEVEL_4, "Got add %N (maybe not sane)\n", loop_info.add));
2271
2272                 /* Preds of the add should be step and the iteration_phi */
2273                 success = get_const_pred(loop_info.add, &loop_info.step, &loop_info.iteration_phi);
2274                 if (! success)
2275                         return 0;
2276
2277                 DB((dbg, LEVEL_4, "Got step %N\n", loop_info.step));
2278
2279                 if (! is_Phi(loop_info.iteration_phi))
2280                         return 0;
2281
2282                 DB((dbg, LEVEL_4, "Got phi %N\n", loop_info.iteration_phi));
2283
2284                 /* Find start_val.
2285                  * Does necessary sanity check of add, if it is already set.  */
2286                 success = get_start_and_add(loop_info.iteration_phi, constant);
2287                 if (! success)
2288                         return 0;
2289
2290                 DB((dbg, LEVEL_4, "Got start %N\n", loop_info.start_val));
2291
2292         } else if (is_Phi(iteration_path)) {
2293                 ir_node *new_iteration_phi;
2294
2295                 /* We compare with the value the iv had entering this run. */
2296                 is_latest_val = 0;
2297
2298                 loop_info.iteration_phi = iteration_path;
2299                 DB((dbg, LEVEL_4, "Got phi %N\n", loop_info.iteration_phi));
2300
2301                 /* Find start_val and add-node.
2302                  * Does necessary sanity check of add, if it is already set.  */
2303                 success = get_start_and_add(loop_info.iteration_phi, constant);
2304                 if (! success)
2305                         return 0;
2306
2307                 DB((dbg, LEVEL_4, "Got start %N\n", loop_info.start_val));
2308                 DB((dbg, LEVEL_4, "Got add or sub %N\n", loop_info.add));
2309
2310                 success = get_const_pred(loop_info.add, &loop_info.step, &new_iteration_phi);
2311                 if (! success)
2312                         return 0;
2313
2314                 DB((dbg, LEVEL_4, "Got step %N\n", loop_info.step));
2315
2316                 if (loop_info.iteration_phi != new_iteration_phi)
2317                         return 0;
2318
2319         } else {
2320                 /* RETURN */
2321                 return 0;
2322         }
2323
2324         mode = get_irn_mode(loop_info.end_val);
2325
2326         DB((dbg, LEVEL_4, "start %N, end %N, step %N\n",
2327                                 loop_info.start_val, loop_info.end_val, loop_info.step));
2328
2329         if (mode != mode_Is && mode != mode_Iu)
2330                 return 0;
2331
2332         /* TODO necessary? */
2333         if (!are_mode_I(loop_info.start_val, loop_info.step, loop_info.end_val))
2334                 return 0;
2335
2336         DB((dbg, LEVEL_4, "mode integer\n"));
2337
2338         end_tar = get_Const_tarval(loop_info.end_val);
2339         start_tar = get_Const_tarval(loop_info.start_val);
2340         step_tar = get_Const_tarval(loop_info.step);
2341
2342         if (tarval_is_null(step_tar))
2343                 /* TODO Might be worth a warning. */
2344                 return 0;
2345
2346         DB((dbg, LEVEL_4, "step is not 0\n"));
2347
2348         if ((!tarval_is_negative(step_tar)) ^ (!is_Sub(loop_info.add)))
2349                 loop_info.decreasing = 1;
2350
2351         diff_tar = tarval_sub(end_tar, start_tar, mode);
2352
2353         /* We need at least count_tar steps to be close to end_val, maybe more.
2354          * No way, that we have gone too many steps.
2355          * This represents the 'latest value'.
2356          * (If condition checks against latest value, is checked later) */
2357         count_tar = tarval_div(diff_tar, step_tar);
2358
2359         /* Iv will not pass end_val (except overflows).
2360          * Nothing done, as it would yield to no advantage. */
2361         if (tarval_is_negative(count_tar)) {
2362                 DB((dbg, LEVEL_1, "Loop is endless or never taken."));
2363                 /* TODO Might be worth a warning. */
2364                 return 0;
2365         }
2366
2367         count_stats(stats.u_simple_counting_loop);
2368
2369         loop_info.latest_value = is_latest_val;
2370
2371         /* TODO split here
2372         if (! is_simple_counting_loop(&count_tar))
2373                 return 0;
2374         */
2375
2376         /* stepped can be negative, if step < 0 */
2377         stepped = tarval_mul(count_tar, step_tar);
2378
2379         /* step as close to end_val as possible, */
2380         /* |stepped| <= |end_tar|, and dist(stepped, end_tar) is smaller than a step. */
2381         if (is_Sub(loop_info.add))
2382                 stepped = tarval_sub(start_tar, stepped, mode_Is);
2383         else
2384                 stepped = tarval_add(start_tar, stepped);
2385
2386         DB((dbg, LEVEL_4, "stepped to %ld\n", get_tarval_long(stepped)));
2387
2388         proj_proj = get_Proj_proj(projres);
2389         /* Assure that norm_proj is the stay-in-loop case. */
2390         if (loop_info.exit_cond == 1)
2391                 norm_proj = get_math_inverted_case(proj_proj);
2392         else
2393                 norm_proj = proj_proj;
2394
2395         DB((dbg, LEVEL_4, "normalized projection %s\n", get_pnc_string(norm_proj)));
2396
2397         /* Executed at most once (stay in counting loop if a Eq b) */
2398         if (norm_proj == pn_Cmp_Eq)
2399                 /* TODO Might be worth a warning. */
2400                 return 0;
2401
2402         /* calculates next values and increases count_tar according to it */
2403         success = simulate_next(&count_tar, stepped, step_tar, end_tar, norm_proj);
2404         if (! success)
2405                 return 0;
2406
2407         /* We run loop once more, if we compare to the
2408          * not yet in-/decreased iv. */
2409         if (is_latest_val == 0) {
2410                 DB((dbg, LEVEL_4, "condition uses not latest iv value\n"));
2411                 count_tar = tarval_add(count_tar, get_tarval_one(mode));
2412         }
2413
2414         DB((dbg, LEVEL_4, "loop taken %ld times\n", get_tarval_long(count_tar)));
2415
2416         /* Assure the loop is taken at least 1 time. */
2417         if (tarval_is_null(count_tar)) {
2418                 /* TODO Might be worth a warning. */
2419                 return 0;
2420         }
2421
2422         loop_info.count_tar = count_tar;
2423         return get_preferred_factor_constant(count_tar);
2424 }
2425
2426 /**
2427  * Loop unrolling
2428  */
2429 static void unroll_loop(void)
2430 {
2431         unroll_nr = 0;
2432
2433         /* get_unroll_decision_constant and invariant are completely
2434          * independent for flexibility.
2435          * Some checks may be performed twice. */
2436
2437         /* constant case? */
2438         if (opt_params.allow_const_unrolling)
2439                 unroll_nr = get_unroll_decision_constant();
2440         if (unroll_nr > 1) {
2441                 loop_info.unroll_kind = constant;
2442
2443         } else {
2444                 /* invariant case? */
2445                 if (opt_params.allow_invar_unrolling)
2446                         unroll_nr = get_unroll_decision_invariant();
2447                 if (unroll_nr > 1)
2448                         loop_info.unroll_kind = invariant;
2449         }
2450
2451         DB((dbg, LEVEL_1, " *** Unrolling %d times ***\n", unroll_nr));
2452
2453         if (unroll_nr > 1) {
2454                 loop_entries = NEW_ARR_F(entry_edge, 0);
2455
2456                 /* Get loop outs */
2457                 irg_walk_graph(current_ir_graph, get_loop_entries, NULL, NULL);
2458
2459                 if ((int)get_tarval_long(loop_info.count_tar) == unroll_nr)
2460                         loop_info.needs_backedge = 0;
2461                 else
2462                         loop_info.needs_backedge = 1;
2463
2464                 /* Use phase to keep copy of nodes from the condition chain. */
2465                 phase = new_phase(current_ir_graph, phase_irn_init_default);
2466
2467                 /* Copies the loop */
2468                 copy_loop(loop_entries, unroll_nr - 1);
2469
2470                 /* Line up the floating copies. */
2471                 place_copies(unroll_nr - 1);
2472
2473                 /* Remove phis with 1 in*/
2474                 irg_walk_graph(current_ir_graph, correct_phis, NULL, NULL);
2475
2476                 /* dump_ir_block_graph(current_ir_graph, "-DONE"); */
2477
2478                 if (loop_info.unroll_kind == constant)
2479                         count_stats(stats.constant_unroll);
2480                 else
2481                         count_stats(stats.invariant_unroll);
2482
2483                 set_irg_doms_inconsistent(current_ir_graph);
2484                 set_irg_loopinfo_inconsistent(current_ir_graph);
2485                 /* TODO is it? */
2486                 set_irg_outs_inconsistent(current_ir_graph);
2487
2488                 DEL_ARR_F(loop_entries);
2489         }
2490
2491 }
2492
2493 /* Analyzes the loop, and checks if size is within allowed range.
2494  * Decides if loop will be processed. */
2495 static void init_analyze(ir_loop *loop)
2496 {
2497         /* Expect no benefit of big loops. */
2498         /* TODO tuning/make parameter */
2499         int      loop_depth;
2500         unsigned max_loop_nodes = opt_params.max_loop_size;
2501         unsigned max_loop_nodes_adapted;
2502         int      max_calls = opt_params.allowed_calls;
2503         int      depth_adaption = opt_params.depth_adaption;
2504
2505         cur_loop = loop;
2506
2507         loop_head = NULL;
2508         loop_head_valid = 1;
2509
2510         /* Reset loop info */
2511         memset(&loop_info, 0, sizeof(loop_info_t));
2512
2513         DB((dbg, LEVEL_1, "    >>>> current loop includes node %N <<<\n",
2514                 get_loop_node(loop, 0)));
2515
2516         /* Collect loop informations: head, node counts. */
2517         irg_walk_graph(current_ir_graph, get_loop_info, NULL, NULL);
2518
2519         /* Depth of 0 is the procedure and 1 a topmost loop. */
2520         loop_depth = get_loop_depth(loop) - 1;
2521
2522         /* Calculating in per mil. */
2523         max_loop_nodes_adapted = get_max_nodes_adapted(loop_depth);
2524
2525         DB((dbg, LEVEL_1, "max_nodes: %d\nmax_nodes_adapted %d at depth of %d (adaption %d)\n",
2526                         max_loop_nodes, max_loop_nodes_adapted, loop_depth, depth_adaption));
2527
2528         if (! (loop_info.nodes > 0))
2529                 return;
2530
2531 #if LOOP_IGNORE_NODE_LIMITS
2532         DB((dbg, LEVEL_1, "WARNING: Loop node limitations ignored."));
2533 #else
2534         if (loop_info.nodes > max_loop_nodes) {
2535                 /* Only for stats */
2536                 DB((dbg, LEVEL_1, "Nodes %d > allowed nodes %d\n",
2537                         loop_info.nodes, loop_depth, max_loop_nodes));
2538                 count_stats(stats.too_large);
2539                 /* no RETURN */
2540                 /* Adaption might change it */
2541         }
2542
2543         /* Limit processing to loops smaller than given parameter. */
2544         if (loop_info.nodes > max_loop_nodes_adapted) {
2545                 DB((dbg, LEVEL_1, "Nodes %d > allowed nodes (depth %d adapted) %d\n",
2546                         loop_info.nodes, loop_depth, max_loop_nodes_adapted));
2547                 count_stats(stats.too_large_adapted);
2548                 return;
2549         }
2550
2551         if (loop_info.calls > opt_params.allowed_calls) {
2552                 DB((dbg, LEVEL_1, "Calls %d > allowed calls %d\n",
2553                         loop_info.calls, max_calls));
2554                 count_stats(stats.calls_limit);
2555                 return;
2556         }
2557 #endif
2558
2559         /* RETURN if there is no valid head */
2560         if (!loop_head || !loop_head_valid) {
2561                 DB((dbg, LEVEL_1,   "No valid loop head. Nothing done.\n"));
2562                 return;
2563         } else {
2564                 DB((dbg, LEVEL_1,   "Loophead: %N\n", loop_head));
2565         }
2566
2567         switch (loop_op) {
2568                 case loop_op_inversion:
2569                         loop_inversion();
2570                         break;
2571
2572                 case loop_op_unrolling:
2573                         unroll_loop();
2574                         break;
2575
2576                 default:
2577                         panic("Loop optimization not implemented.");
2578         }
2579         DB((dbg, LEVEL_1, "       <<<< end of loop with node %N >>>>\n",
2580                 get_loop_node(loop, 0)));
2581 }
2582
2583 /* Find innermost loops and add them to loops. */
2584 static void find_innermost_loop(ir_loop *loop)
2585 {
2586         /* descend into sons */
2587         int sons = get_loop_n_sons(loop);
2588
2589         if (sons == 0) {
2590                 ARR_APP1(ir_loop *, loops, loop);
2591         } else {
2592                 int s;
2593                 for (s=0; s<sons; s++) {
2594                         find_innermost_loop(get_loop_son(loop, s));
2595                 }
2596         }
2597 }
2598
2599 /* Assure preconditions are met and go through all loops. */
2600 void loop_optimization(ir_graph *irg)
2601 {
2602         ir_loop *loop;
2603         int     i, sons, nr;
2604
2605         /* SPEC2000: Total time 98.9% with inversion only */
2606         opt_params.max_loop_size = 100;
2607         opt_params.depth_adaption = 400;
2608         opt_params.count_phi = 0;
2609         opt_params.count_proj = 0;
2610         opt_params.allowed_calls = 0;
2611
2612         opt_params.max_cc_size = 100;
2613
2614         /* Unrolling not yet tested */
2615         opt_params.allow_const_unrolling = 1;
2616         opt_params.allow_invar_unrolling = 1;
2617
2618         /* Reset stats for this procedure */
2619         reset_stats();
2620
2621         /* Preconditions */
2622         set_current_ir_graph(irg);
2623
2624         edges_assure(irg);
2625         assure_irg_outs(irg);
2626
2627         /* NOTE: sets only the loop attribute of blocks, not nodes */
2628         /* NOTE: Kills links */
2629         assure_cf_loop(irg);
2630
2631         ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK | IR_RESOURCE_PHI_LIST);
2632         collect_phiprojs(irg);
2633         ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
2634
2635         loop = get_irg_loop(irg);
2636         sons = get_loop_n_sons(loop);
2637
2638         loops = NEW_ARR_F(ir_loop *, 0);
2639         /* List all inner loops */
2640         for (nr = 0; nr < sons; ++nr) {
2641                 find_innermost_loop(get_loop_son(loop, nr));
2642         }
2643
2644         ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK);
2645         /* Set all links to NULL */
2646         irg_walk_graph(current_ir_graph, reset_link, NULL, NULL);
2647
2648         for (i = 0; i < ARR_LEN(loops); ++i) {
2649                 ir_loop *loop = loops[i];
2650
2651                 count_stats(stats.loops);
2652
2653                 /* Analyze and handle loop */
2654                 init_analyze(loop);
2655
2656                 /* Copied blocks do not have their phi list yet */
2657                 collect_phiprojs(irg);
2658
2659                 /* Set links to NULL
2660                  * TODO Still necessary? */
2661                 irg_walk_graph(current_ir_graph, reset_link, NULL, NULL);
2662         }
2663
2664         print_stats();
2665
2666         DEL_ARR_F(loops);
2667         ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
2668         ir_free_resources(irg, IR_RESOURCE_PHI_LIST);
2669 }
2670
2671 void do_loop_unrolling(ir_graph *irg)
2672 {
2673         loop_op = loop_op_unrolling;
2674
2675         DB((dbg, LEVEL_1, " >>> unrolling (Startnode %N) <<<\n",
2676                                 get_irg_start(irg)));
2677
2678         loop_optimization(irg);
2679
2680         DB((dbg, LEVEL_1, " >>> unrolling done (Startnode %N) <<<\n",
2681                                 get_irg_start(irg)));
2682 }
2683
2684 void do_loop_inversion(ir_graph *irg)
2685 {
2686         loop_op = loop_op_inversion;
2687
2688         DB((dbg, LEVEL_1, " >>> inversion (Startnode %N) <<<\n",
2689                                 get_irg_start(irg)));
2690
2691         loop_optimization(irg);
2692
2693         DB((dbg, LEVEL_1, " >>> inversion done (Startnode %N) <<<\n",
2694                                 get_irg_start(irg)));
2695 }
2696
2697 void do_loop_peeling(ir_graph *irg)
2698 {
2699         loop_op = loop_op_peeling;
2700
2701         DB((dbg, LEVEL_1, " >>> peeling (Startnode %N) <<<\n",
2702                                 get_irg_start(irg)));
2703
2704         loop_optimization(irg);
2705
2706         DB((dbg, LEVEL_1, " >>> peeling done (Startnode %N) <<<\n",
2707                                 get_irg_start(irg)));
2708
2709 }
2710
2711 ir_graph_pass_t *loop_inversion_pass(const char *name)
2712 {
2713         return def_graph_pass(name ? name : "loop_inversion", do_loop_inversion);
2714 }
2715
2716 ir_graph_pass_t *loop_unroll_pass(const char *name)
2717 {
2718         return def_graph_pass(name ? name : "loop_unroll", do_loop_unrolling);
2719 }
2720
2721 ir_graph_pass_t *loop_peeling_pass(const char *name)
2722 {
2723         return def_graph_pass(name ? name : "loop_peeling", do_loop_peeling);
2724 }
2725
2726 void firm_init_loop_opt(void)
2727 {
2728         FIRM_DBG_REGISTER(dbg, "firm.opt.loop");
2729 }