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