Merge from vendor branch OPENSSL:
[dragonfly.git] / contrib / gcc-3.4 / gcc / cfgloopmanip.c
1 /* Loop manipulation code for GNU compiler.
2    Copyright (C) 2002, 2003 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 2, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING.  If not, write to the Free
18 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA.  */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "rtl.h"
26 #include "hard-reg-set.h"
27 #include "basic-block.h"
28 #include "cfgloop.h"
29 #include "cfglayout.h"
30 #include "output.h"
31
32 static struct loop * duplicate_loop (struct loops *, struct loop *,
33                                      struct loop *);
34 static void duplicate_subloops (struct loops *, struct loop *, struct loop *);
35 static void copy_loops_to (struct loops *, struct loop **, int,
36                            struct loop *);
37 static void loop_redirect_edge (edge, basic_block);
38 static bool loop_delete_branch_edge (edge, int);
39 static void remove_bbs (basic_block *, int);
40 static bool rpe_enum_p (basic_block, void *);
41 static int find_path (edge, basic_block **);
42 static bool alp_enum_p (basic_block, void *);
43 static void add_loop (struct loops *, struct loop *);
44 static void fix_loop_placements (struct loops *, struct loop *);
45 static bool fix_bb_placement (struct loops *, basic_block);
46 static void fix_bb_placements (struct loops *, basic_block);
47 static void place_new_loop (struct loops *, struct loop *);
48 static void scale_loop_frequencies (struct loop *, int, int);
49 static void scale_bbs_frequencies (basic_block *, int, int, int);
50 static basic_block create_preheader (struct loop *, int);
51 static void fix_irreducible_loops (basic_block);
52
53 /* Splits basic block BB after INSN, returns created edge.  Updates loops
54    and dominators.  */
55 edge
56 split_loop_bb (basic_block bb, rtx insn)
57 {
58   edge e;
59
60   /* Split the block.  */
61   e = split_block (bb, insn);
62
63   /* Add dest to loop.  */
64   add_bb_to_loop (e->dest, e->src->loop_father);
65
66   /* Fix dominators.  */
67   add_to_dominance_info (CDI_DOMINATORS, e->dest);
68   redirect_immediate_dominators (CDI_DOMINATORS, e->src, e->dest);
69   set_immediate_dominator (CDI_DOMINATORS, e->dest, e->src);
70
71   return e;
72 }
73
74 /* Checks whether basic block BB is dominated by DATA.  */
75 static bool
76 rpe_enum_p (basic_block bb, void *data)
77 {
78   return dominated_by_p (CDI_DOMINATORS, bb, data);
79 }
80
81 /* Remove basic blocks BBS from loop structure and dominance info,
82    and delete them afterwards.  */
83 static void
84 remove_bbs (basic_block *bbs, int nbbs)
85 {
86   int i;
87
88   for (i = 0; i < nbbs; i++)
89     {
90       remove_bb_from_loops (bbs[i]);
91       delete_from_dominance_info (CDI_DOMINATORS, bbs[i]);
92       delete_block (bbs[i]);
93     }
94 }
95
96 /* Find path -- i.e. the basic blocks dominated by edge E and put them
97    into array BBS, that will be allocated large enough to contain them.
98    E->dest must have exactly one predecessor for this to work (it is
99    easy to achieve and we do not put it here because we do not want to
100    alter anything by this function).  The number of basic blocks in the
101    path is returned.  */
102 static int
103 find_path (edge e, basic_block **bbs)
104 {
105   if (e->dest->pred->pred_next)
106     abort ();
107
108   /* Find bbs in the path.  */
109   *bbs = xcalloc (n_basic_blocks, sizeof (basic_block));
110   return dfs_enumerate_from (e->dest, 0, rpe_enum_p, *bbs,
111                              n_basic_blocks, e->dest);
112 }
113
114 /* Fix placement of basic block BB inside loop hierarchy stored in LOOPS --
115    Let L be a loop to that BB belongs.  Then every successor of BB must either
116      1) belong to some superloop of loop L, or
117      2) be a header of loop K such that K->outer is superloop of L
118    Returns true if we had to move BB into other loop to enforce this condition,
119    false if the placement of BB was already correct (provided that placements
120    of its successors are correct).  */
121 static bool
122 fix_bb_placement (struct loops *loops, basic_block bb)
123 {
124   edge e;
125   struct loop *loop = loops->tree_root, *act;
126
127   for (e = bb->succ; e; e = e->succ_next)
128     {
129       if (e->dest == EXIT_BLOCK_PTR)
130         continue;
131
132       act = e->dest->loop_father;
133       if (act->header == e->dest)
134         act = act->outer;
135
136       if (flow_loop_nested_p (loop, act))
137         loop = act;
138     }
139
140   if (loop == bb->loop_father)
141     return false;
142
143   remove_bb_from_loops (bb);
144   add_bb_to_loop (bb, loop);
145
146   return true;
147 }
148
149 /* Fix placements of basic blocks inside loop hierarchy stored in loops; i.e.
150    enforce condition condition stated in description of fix_bb_placement. We
151    start from basic block FROM that had some of its successors removed, so that
152    his placement no longer has to be correct, and iteratively fix placement of
153    its predecessors that may change if placement of FROM changed.  Also fix
154    placement of subloops of FROM->loop_father, that might also be altered due
155    to this change; the condition for them is similar, except that instead of
156    successors we consider edges coming out of the loops.  */
157 static void
158 fix_bb_placements (struct loops *loops, basic_block from)
159 {
160   sbitmap in_queue;
161   basic_block *queue, *qtop, *qbeg, *qend;
162   struct loop *base_loop;
163   edge e;
164
165   /* We pass through blocks back-reachable from FROM, testing whether some
166      of their successors moved to outer loop.  It may be necessary to
167      iterate several times, but it is finite, as we stop unless we move
168      the basic block up the loop structure.  The whole story is a bit
169      more complicated due to presence of subloops, those are moved using
170      fix_loop_placement.  */
171
172   base_loop = from->loop_father;
173   if (base_loop == loops->tree_root)
174     return;
175
176   in_queue = sbitmap_alloc (last_basic_block);
177   sbitmap_zero (in_queue);
178   SET_BIT (in_queue, from->index);
179   /* Prevent us from going out of the base_loop.  */
180   SET_BIT (in_queue, base_loop->header->index);
181
182   queue = xmalloc ((base_loop->num_nodes + 1) * sizeof (basic_block));
183   qtop = queue + base_loop->num_nodes + 1;
184   qbeg = queue;
185   qend = queue + 1;
186   *qbeg = from;
187
188   while (qbeg != qend)
189     {
190       from = *qbeg;
191       qbeg++;
192       if (qbeg == qtop)
193         qbeg = queue;
194       RESET_BIT (in_queue, from->index);
195
196       if (from->loop_father->header == from)
197         {
198           /* Subloop header, maybe move the loop upward.  */
199           if (!fix_loop_placement (from->loop_father))
200             continue;
201         }
202       else
203         {
204           /* Ordinary basic block.  */
205           if (!fix_bb_placement (loops, from))
206             continue;
207         }
208
209       /* Something has changed, insert predecessors into queue.  */
210       for (e = from->pred; e; e = e->pred_next)
211         {
212           basic_block pred = e->src;
213           struct loop *nca;
214
215           if (TEST_BIT (in_queue, pred->index))
216             continue;
217
218           /* If it is subloop, then it either was not moved, or
219              the path up the loop tree from base_loop do not contain
220              it.  */
221           nca = find_common_loop (pred->loop_father, base_loop);
222           if (pred->loop_father != base_loop
223               && (nca == base_loop
224                   || nca != pred->loop_father))
225             pred = pred->loop_father->header;
226           else if (!flow_loop_nested_p (from->loop_father, pred->loop_father))
227             {
228               /* No point in processing it.  */
229               continue;
230             }
231
232           if (TEST_BIT (in_queue, pred->index))
233             continue;
234
235           /* Schedule the basic block.  */
236           *qend = pred;
237           qend++;
238           if (qend == qtop)
239             qend = queue;
240           SET_BIT (in_queue, pred->index);
241         }
242     }
243   free (in_queue);
244   free (queue);
245 }
246
247 /* Basic block from has lost one or more of its predecessors, so it might
248    mo longer be part irreducible loop.  Fix it and proceed recursively
249    for its successors if needed.  */
250 static void
251 fix_irreducible_loops (basic_block from)
252 {
253   basic_block bb;
254   basic_block *stack;
255   int stack_top;
256   sbitmap on_stack;
257   edge *edges, e;
258   unsigned n_edges, i;
259
260   if (!(from->flags & BB_IRREDUCIBLE_LOOP))
261     return;
262
263   on_stack = sbitmap_alloc (last_basic_block);
264   sbitmap_zero (on_stack);
265   SET_BIT (on_stack, from->index);
266   stack = xmalloc (from->loop_father->num_nodes * sizeof (basic_block));
267   stack[0] = from;
268   stack_top = 1;
269
270   while (stack_top)
271     {
272       bb = stack[--stack_top];
273       RESET_BIT (on_stack, bb->index);
274
275       for (e = bb->pred; e; e = e->pred_next)
276         if (e->flags & EDGE_IRREDUCIBLE_LOOP)
277           break;
278       if (e)
279         continue;
280
281       bb->flags &= ~BB_IRREDUCIBLE_LOOP;
282       if (bb->loop_father->header == bb)
283         edges = get_loop_exit_edges (bb->loop_father, &n_edges);
284       else
285         {
286           n_edges = 0;
287           for (e = bb->succ; e; e = e->succ_next)
288             n_edges++;
289           edges = xmalloc (n_edges * sizeof (edge));
290           n_edges = 0;
291           for (e = bb->succ; e; e = e->succ_next)
292             edges[n_edges++] = e;
293         }
294
295       for (i = 0; i < n_edges; i++)
296         {
297           e = edges[i];
298
299           if (e->flags & EDGE_IRREDUCIBLE_LOOP)
300             {
301               if (!flow_bb_inside_loop_p (from->loop_father, e->dest))
302                 continue;
303
304               e->flags &= ~EDGE_IRREDUCIBLE_LOOP;
305               if (TEST_BIT (on_stack, e->dest->index))
306                 continue;
307
308               SET_BIT (on_stack, e->dest->index);
309               stack[stack_top++] = e->dest;
310             }
311         }
312       free (edges);
313     }
314
315   free (on_stack);
316   free (stack);
317 }
318
319 /* Removes path beginning at edge E, i.e. remove basic blocks dominated by E
320    and update loop structure stored in LOOPS and dominators.  Return true if
321    we were able to remove the path, false otherwise (and nothing is affected
322    then).  */
323 bool
324 remove_path (struct loops *loops, edge e)
325 {
326   edge ae;
327   basic_block *rem_bbs, *bord_bbs, *dom_bbs, from, bb;
328   int i, nrem, n_bord_bbs, n_dom_bbs;
329   sbitmap seen;
330
331   if (!loop_delete_branch_edge (e, 0))
332     return false;
333
334   /* We need to check whether basic blocks are dominated by the edge
335      e, but we only have basic block dominators.  This is easy to
336      fix -- when e->dest has exactly one predecessor, this corresponds
337      to blocks dominated by e->dest, if not, split the edge.  */
338   if (e->dest->pred->pred_next)
339     e = loop_split_edge_with (e, NULL_RTX)->pred;
340
341   /* It may happen that by removing path we remove one or more loops
342      we belong to.  In this case first unloop the loops, then proceed
343      normally.   We may assume that e->dest is not a header of any loop,
344      as it now has exactly one predecessor.  */
345   while (e->src->loop_father->outer
346          && dominated_by_p (CDI_DOMINATORS,
347                             e->src->loop_father->latch, e->dest))
348     unloop (loops, e->src->loop_father);
349
350   /* Identify the path.  */
351   nrem = find_path (e, &rem_bbs);
352
353   n_bord_bbs = 0;
354   bord_bbs = xcalloc (n_basic_blocks, sizeof (basic_block));
355   seen = sbitmap_alloc (last_basic_block);
356   sbitmap_zero (seen);
357
358   /* Find "border" hexes -- i.e. those with predecessor in removed path.  */
359   for (i = 0; i < nrem; i++)
360     SET_BIT (seen, rem_bbs[i]->index);
361   for (i = 0; i < nrem; i++)
362     {
363       bb = rem_bbs[i];
364       for (ae = rem_bbs[i]->succ; ae; ae = ae->succ_next)
365         if (ae->dest != EXIT_BLOCK_PTR && !TEST_BIT (seen, ae->dest->index))
366           {
367             SET_BIT (seen, ae->dest->index);
368             bord_bbs[n_bord_bbs++] = ae->dest;
369           }
370     }
371
372   /* Remove the path.  */
373   from = e->src;
374   if (!loop_delete_branch_edge (e, 1))
375     abort ();
376   dom_bbs = xcalloc (n_basic_blocks, sizeof (basic_block));
377
378   /* Cancel loops contained in the path.  */
379   for (i = 0; i < nrem; i++)
380     if (rem_bbs[i]->loop_father->header == rem_bbs[i])
381       cancel_loop_tree (loops, rem_bbs[i]->loop_father);
382
383   remove_bbs (rem_bbs, nrem);
384   free (rem_bbs);
385
386   /* Find blocks whose dominators may be affected.  */
387   n_dom_bbs = 0;
388   sbitmap_zero (seen);
389   for (i = 0; i < n_bord_bbs; i++)
390     {
391       basic_block ldom;
392
393       bb = get_immediate_dominator (CDI_DOMINATORS, bord_bbs[i]);
394       if (TEST_BIT (seen, bb->index))
395         continue;
396       SET_BIT (seen, bb->index);
397
398       for (ldom = first_dom_son (CDI_DOMINATORS, bb);
399            ldom;
400            ldom = next_dom_son (CDI_DOMINATORS, ldom))
401         if (!dominated_by_p (CDI_DOMINATORS, from, ldom))
402           dom_bbs[n_dom_bbs++] = ldom;
403     }
404
405   free (seen);
406
407   /* Recount dominators.  */
408   iterate_fix_dominators (CDI_DOMINATORS, dom_bbs, n_dom_bbs);
409   free (dom_bbs);
410
411   /* These blocks have lost some predecessor(s), thus their irreducible
412      status could be changed.  */
413   for (i = 0; i < n_bord_bbs; i++)
414     fix_irreducible_loops (bord_bbs[i]);
415   free (bord_bbs);
416
417   /* Fix placements of basic blocks inside loops and the placement of
418      loops in the loop tree.  */
419   fix_bb_placements (loops, from);
420   fix_loop_placements (loops, from->loop_father);
421
422   return true;
423 }
424
425 /* Predicate for enumeration in add_loop.  */
426 static bool
427 alp_enum_p (basic_block bb, void *alp_header)
428 {
429   return bb != (basic_block) alp_header;
430 }
431
432 /* Given LOOP structure with filled header and latch, find the body of the
433    corresponding loop and add it to LOOPS tree.  */
434 static void
435 add_loop (struct loops *loops, struct loop *loop)
436 {
437   basic_block *bbs;
438   int i, n;
439
440   /* Add it to loop structure.  */
441   place_new_loop (loops, loop);
442   loop->level = 1;
443
444   /* Find its nodes.  */
445   bbs = xcalloc (n_basic_blocks, sizeof (basic_block));
446   n = dfs_enumerate_from (loop->latch, 1, alp_enum_p,
447                           bbs, n_basic_blocks, loop->header);
448
449   for (i = 0; i < n; i++)
450     add_bb_to_loop (bbs[i], loop);
451   add_bb_to_loop (loop->header, loop);
452
453   free (bbs);
454 }
455
456 /* Multiply all frequencies of basic blocks in array BBS of length NBBS
457    by NUM/DEN.  */
458 static void
459 scale_bbs_frequencies (basic_block *bbs, int nbbs, int num, int den)
460 {
461   int i;
462   edge e;
463
464   for (i = 0; i < nbbs; i++)
465     {
466       bbs[i]->frequency = (bbs[i]->frequency * num) / den;
467       bbs[i]->count = (bbs[i]->count * num) / den;
468       for (e = bbs[i]->succ; e; e = e->succ_next)
469         e->count = (e->count * num) /den;
470     }
471 }
472
473 /* Multiply all frequencies in LOOP by NUM/DEN.  */
474 static void
475 scale_loop_frequencies (struct loop *loop, int num, int den)
476 {
477   basic_block *bbs;
478
479   bbs = get_loop_body (loop);
480   scale_bbs_frequencies (bbs, loop->num_nodes, num, den);
481   free (bbs);
482 }
483
484 /* Make area between HEADER_EDGE and LATCH_EDGE a loop by connecting
485    latch to header and update loop tree stored in LOOPS and dominators
486    accordingly. Everything between them plus LATCH_EDGE destination must
487    be dominated by HEADER_EDGE destination, and back-reachable from
488    LATCH_EDGE source.  HEADER_EDGE is redirected to basic block SWITCH_BB,
489    SWITCH_BB->succ to original destination of LATCH_EDGE and
490    SWITCH_BB->succ->succ_next to original destination of HEADER_EDGE.
491    Returns newly created loop.  */
492 struct loop *
493 loopify (struct loops *loops, edge latch_edge, edge header_edge, basic_block switch_bb)
494 {
495   basic_block succ_bb = latch_edge->dest;
496   basic_block pred_bb = header_edge->src;
497   basic_block *dom_bbs, *body;
498   unsigned n_dom_bbs, i;
499   sbitmap seen;
500   struct loop *loop = xcalloc (1, sizeof (struct loop));
501   struct loop *outer = succ_bb->loop_father->outer;
502   int freq, prob, tot_prob;
503   gcov_type cnt;
504   edge e;
505
506   loop->header = header_edge->dest;
507   loop->latch = latch_edge->src;
508
509   freq = EDGE_FREQUENCY (header_edge);
510   cnt = header_edge->count;
511   prob = switch_bb->succ->probability;
512   tot_prob = prob + switch_bb->succ->succ_next->probability;
513   if (tot_prob == 0)
514     tot_prob = 1;
515
516   /* Redirect edges.  */
517   loop_redirect_edge (latch_edge, loop->header);
518   loop_redirect_edge (header_edge, switch_bb);
519   loop_redirect_edge (switch_bb->succ->succ_next, loop->header);
520   loop_redirect_edge (switch_bb->succ, succ_bb);
521
522   /* Update dominators.  */
523   set_immediate_dominator (CDI_DOMINATORS, switch_bb, pred_bb);
524   set_immediate_dominator (CDI_DOMINATORS, loop->header, switch_bb);
525   set_immediate_dominator (CDI_DOMINATORS, succ_bb, switch_bb);
526
527   /* Compute new loop.  */
528   add_loop (loops, loop);
529   flow_loop_tree_node_add (outer, loop);
530
531   /* Add switch_bb to appropriate loop.  */
532   add_bb_to_loop (switch_bb, outer);
533
534   /* Fix frequencies.  */
535   switch_bb->frequency = freq;
536   switch_bb->count = cnt;
537   for (e = switch_bb->succ; e; e = e->succ_next)
538     e->count = (switch_bb->count * e->probability) / REG_BR_PROB_BASE;
539   scale_loop_frequencies (loop, prob, tot_prob);
540   scale_loop_frequencies (succ_bb->loop_father, tot_prob - prob, tot_prob);
541
542   /* Update dominators of blocks outside of LOOP.  */
543   dom_bbs = xcalloc (n_basic_blocks, sizeof (basic_block));
544   n_dom_bbs = 0;
545   seen = sbitmap_alloc (last_basic_block);
546   sbitmap_zero (seen);
547   body = get_loop_body (loop);
548
549   for (i = 0; i < loop->num_nodes; i++)
550     SET_BIT (seen, body[i]->index);
551
552   for (i = 0; i < loop->num_nodes; i++)
553     {
554       basic_block ldom;
555
556       for (ldom = first_dom_son (CDI_DOMINATORS, body[i]);
557            ldom;
558            ldom = next_dom_son (CDI_DOMINATORS, ldom))
559         if (!TEST_BIT (seen, ldom->index))
560           {
561             SET_BIT (seen, ldom->index);
562             dom_bbs[n_dom_bbs++] = ldom;
563           }
564     }
565
566   iterate_fix_dominators (CDI_DOMINATORS, dom_bbs, n_dom_bbs);
567
568   free (body);
569   free (seen);
570   free (dom_bbs);
571
572   return loop;
573 }
574
575 /* Remove the latch edge of a LOOP and update LOOPS tree to indicate that
576    the LOOP was removed.  After this function, original loop latch will
577    have no successor, which caller is expected to fix somehow.  */
578 void
579 unloop (struct loops *loops, struct loop *loop)
580 {
581   basic_block *body;
582   struct loop *ploop;
583   unsigned i, n;
584   basic_block latch = loop->latch;
585   edge *edges;
586   unsigned n_edges;
587
588   /* This is relatively straightforward.  The dominators are unchanged, as
589      loop header dominates loop latch, so the only thing we have to care of
590      is the placement of loops and basic blocks inside the loop tree.  We
591      move them all to the loop->outer, and then let fix_bb_placements do
592      its work.  */
593
594   body = get_loop_body (loop);
595   edges = get_loop_exit_edges (loop, &n_edges);
596   n = loop->num_nodes;
597   for (i = 0; i < n; i++)
598     if (body[i]->loop_father == loop)
599       {
600         remove_bb_from_loops (body[i]);
601         add_bb_to_loop (body[i], loop->outer);
602       }
603   free(body);
604
605   while (loop->inner)
606     {
607       ploop = loop->inner;
608       flow_loop_tree_node_remove (ploop);
609       flow_loop_tree_node_add (loop->outer, ploop);
610     }
611
612   /* Remove the loop and free its data.  */
613   flow_loop_tree_node_remove (loop);
614   loops->parray[loop->num] = NULL;
615   flow_loop_free (loop);
616
617   remove_edge (latch->succ);
618   fix_bb_placements (loops, latch);
619
620   /* If the loop was inside an irreducible region, we would have to somehow
621      update the irreducible marks inside its body.  While it is certainly
622      possible to do, it is a bit complicated and this situation should be
623      very rare, so we just remark all loops in this case.  */
624   for (i = 0; i < n_edges; i++)
625     if (edges[i]->flags & EDGE_IRREDUCIBLE_LOOP)
626       break;
627   if (i != n_edges)
628     mark_irreducible_loops (loops);
629   free (edges);
630 }
631
632 /* Fix placement of LOOP inside loop tree, i.e. find the innermost superloop
633    FATHER of LOOP such that all of the edges coming out of LOOP belong to
634    FATHER, and set it as outer loop of LOOP.  Return 1 if placement of
635    LOOP changed.  */
636 int
637 fix_loop_placement (struct loop *loop)
638 {
639   basic_block *body;
640   unsigned i;
641   edge e;
642   struct loop *father = loop->pred[0], *act;
643
644   body = get_loop_body (loop);
645   for (i = 0; i < loop->num_nodes; i++)
646     for (e = body[i]->succ; e; e = e->succ_next)
647       if (!flow_bb_inside_loop_p (loop, e->dest))
648         {
649           act = find_common_loop (loop, e->dest->loop_father);
650           if (flow_loop_nested_p (father, act))
651             father = act;
652         }
653   free (body);
654
655   if (father != loop->outer)
656     {
657       for (act = loop->outer; act != father; act = act->outer)
658         act->num_nodes -= loop->num_nodes;
659       flow_loop_tree_node_remove (loop);
660       flow_loop_tree_node_add (father, loop);
661       return 1;
662     }
663   return 0;
664 }
665
666 /* Fix placement of superloops of LOOP inside loop tree, i.e. ensure that
667    condition stated in description of fix_loop_placement holds for them.
668    It is used in case when we removed some edges coming out of LOOP, which
669    may cause the right placement of LOOP inside loop tree to change.  */
670 static void
671 fix_loop_placements (struct loops *loops, struct loop *loop)
672 {
673   struct loop *outer;
674
675   while (loop->outer)
676     {
677       outer = loop->outer;
678       if (!fix_loop_placement (loop))
679         break;
680
681       /* Changing the placement of a loop in the loop tree may alter the
682          validity of condition 2) of the description of fix_bb_placement
683          for its preheader, because the successor is the header and belongs
684          to the loop.  So call fix_bb_placements to fix up the placement
685          of the preheader and (possibly) of its predecessors.  */
686       fix_bb_placements (loops, loop_preheader_edge (loop)->src);
687       loop = outer;
688     }
689 }
690
691 /* Creates place for a new LOOP in LOOPS structure.  */
692 static void
693 place_new_loop (struct loops *loops, struct loop *loop)
694 {
695   loops->parray =
696     xrealloc (loops->parray, (loops->num + 1) * sizeof (struct loop *));
697   loops->parray[loops->num] = loop;
698
699   loop->num = loops->num++;
700 }
701
702 /* Copies copy of LOOP as subloop of TARGET loop, placing newly
703    created loop into LOOPS structure.  */
704 static struct loop *
705 duplicate_loop (struct loops *loops, struct loop *loop, struct loop *target)
706 {
707   struct loop *cloop;
708   cloop = xcalloc (1, sizeof (struct loop));
709   place_new_loop (loops, cloop);
710
711   /* Initialize copied loop.  */
712   cloop->level = loop->level;
713
714   /* Set it as copy of loop.  */
715   loop->copy = cloop;
716
717   /* Add it to target.  */
718   flow_loop_tree_node_add (target, cloop);
719
720   return cloop;
721 }
722
723 /* Copies structure of subloops of LOOP into TARGET loop, placing
724    newly created loops into loop tree stored in LOOPS.  */
725 static void
726 duplicate_subloops (struct loops *loops, struct loop *loop, struct loop *target)
727 {
728   struct loop *aloop, *cloop;
729
730   for (aloop = loop->inner; aloop; aloop = aloop->next)
731     {
732       cloop = duplicate_loop (loops, aloop, target);
733       duplicate_subloops (loops, aloop, cloop);
734     }
735 }
736
737 /* Copies structure of subloops of N loops, stored in array COPIED_LOOPS,
738    into TARGET loop, placing newly created loops into loop tree LOOPS.  */
739 static void
740 copy_loops_to (struct loops *loops, struct loop **copied_loops, int n, struct loop *target)
741 {
742   struct loop *aloop;
743   int i;
744
745   for (i = 0; i < n; i++)
746     {
747       aloop = duplicate_loop (loops, copied_loops[i], target);
748       duplicate_subloops (loops, copied_loops[i], aloop);
749     }
750 }
751
752 /* Redirects edge E to basic block DEST.  */
753 static void
754 loop_redirect_edge (edge e, basic_block dest)
755 {
756   if (e->dest == dest)
757     return;
758
759   redirect_edge_and_branch_force (e, dest);
760 }
761
762 /* Deletes edge E from a branch if possible.  Unless REALLY_DELETE is set,
763    just test whether it is possible to remove the edge.  */
764 static bool
765 loop_delete_branch_edge (edge e, int really_delete)
766 {
767   basic_block src = e->src;
768   int irr;
769   edge snd;
770
771   if (src->succ->succ_next)
772     {
773       basic_block newdest;
774
775       /* Cannot handle more than two exit edges.  */
776       if (src->succ->succ_next->succ_next)
777         return false;
778       /* And it must be just a simple branch.  */
779       if (!any_condjump_p (BB_END (src)))
780         return false;
781
782       snd = e == src->succ ? src->succ->succ_next : src->succ;
783       newdest = snd->dest;
784       if (newdest == EXIT_BLOCK_PTR)
785         return false;
786
787       /* Hopefully the above conditions should suffice.  */
788       if (!really_delete)
789         return true;
790
791       /* Redirecting behaves wrongly wrto this flag.  */
792       irr = snd->flags & EDGE_IRREDUCIBLE_LOOP;
793
794       if (!redirect_edge_and_branch (e, newdest))
795         return false;
796       src->succ->flags &= ~EDGE_IRREDUCIBLE_LOOP;
797       src->succ->flags |= irr;
798
799       return true;
800     }
801   else
802     {
803       /* Cannot happen -- we are using this only to remove an edge
804          from branch.  */
805       abort ();
806     }
807
808   return false;  /* To avoid warning, cannot get here.  */
809 }
810
811 /* Check whether LOOP's body can be duplicated.  */
812 bool
813 can_duplicate_loop_p (struct loop *loop)
814 {
815   int ret;
816   basic_block *bbs = get_loop_body (loop);
817
818   ret = can_copy_bbs_p (bbs, loop->num_nodes);
819   free (bbs);
820   
821   return ret;
822 }
823
824 #define RDIV(X,Y) (((X) + (Y) / 2) / (Y))
825
826 /* Duplicates body of LOOP to given edge E NDUPL times.  Takes care of updating
827    LOOPS structure and dominators.  E's destination must be LOOP header for
828    this to work, i.e. it must be entry or latch edge of this loop; these are
829    unique, as the loops must have preheaders for this function to work
830    correctly (in case E is latch, the function unrolls the loop, if E is entry
831    edge, it peels the loop).  Store edges created by copying ORIG edge from
832    copies corresponding to set bits in WONT_EXIT bitmap (bit 0 corresponds to
833    original LOOP body, the other copies are numbered in order given by control
834    flow through them) into TO_REMOVE array.  Returns false if duplication is
835    impossible.  */
836 int
837 duplicate_loop_to_header_edge (struct loop *loop, edge e, struct loops *loops,
838                                unsigned int ndupl, sbitmap wont_exit,
839                                edge orig, edge *to_remove,
840                                unsigned int *n_to_remove, int flags)
841 {
842   struct loop *target, *aloop;
843   struct loop **orig_loops;
844   unsigned n_orig_loops;
845   basic_block header = loop->header, latch = loop->latch;
846   basic_block *new_bbs, *bbs, *first_active;
847   basic_block new_bb, bb, first_active_latch = NULL;
848   edge ae, latch_edge;
849   edge spec_edges[2], new_spec_edges[2];
850 #define SE_LATCH 0
851 #define SE_ORIG 1
852   unsigned i, j, n;
853   int is_latch = (latch == e->src);
854   int scale_act = 0, *scale_step = NULL, scale_main = 0;
855   int p, freq_in, freq_le, freq_out_orig;
856   int prob_pass_thru, prob_pass_wont_exit, prob_pass_main;
857   int add_irreducible_flag;
858
859   if (e->dest != loop->header)
860     abort ();
861   if (ndupl <= 0)
862     abort ();
863
864   if (orig)
865     {
866       /* Orig must be edge out of the loop.  */
867       if (!flow_bb_inside_loop_p (loop, orig->src))
868         abort ();
869       if (flow_bb_inside_loop_p (loop, orig->dest))
870         abort ();
871     }
872
873   bbs = get_loop_body (loop);
874
875   /* Check whether duplication is possible.  */
876   if (!can_copy_bbs_p (bbs, loop->num_nodes))
877     {
878       free (bbs);
879       return false;
880     }
881   new_bbs = xmalloc (sizeof (basic_block) * loop->num_nodes);
882
883   /* In case we are doing loop peeling and the loop is in the middle of
884      irreducible region, the peeled copies will be inside it too.  */
885   add_irreducible_flag = e->flags & EDGE_IRREDUCIBLE_LOOP;
886   if (is_latch && add_irreducible_flag)
887     abort ();
888
889   /* Find edge from latch.  */
890   latch_edge = loop_latch_edge (loop);
891
892   if (flags & DLTHE_FLAG_UPDATE_FREQ)
893     {
894       /* Calculate coefficients by that we have to scale frequencies
895          of duplicated loop bodies.  */
896       freq_in = header->frequency;
897       freq_le = EDGE_FREQUENCY (latch_edge);
898       if (freq_in == 0)
899         freq_in = 1;
900       if (freq_in < freq_le)
901         freq_in = freq_le;
902       freq_out_orig = orig ? EDGE_FREQUENCY (orig) : freq_in - freq_le;
903       if (freq_out_orig > freq_in - freq_le)
904         freq_out_orig = freq_in - freq_le;
905       prob_pass_thru = RDIV (REG_BR_PROB_BASE * freq_le, freq_in);
906       prob_pass_wont_exit =
907               RDIV (REG_BR_PROB_BASE * (freq_le + freq_out_orig), freq_in);
908
909       scale_step = xmalloc (ndupl * sizeof (int));
910
911         for (i = 1; i <= ndupl; i++)
912           scale_step[i - 1] = TEST_BIT (wont_exit, i)
913                                 ? prob_pass_wont_exit
914                                 : prob_pass_thru;
915
916       if (is_latch)
917         {
918           prob_pass_main = TEST_BIT (wont_exit, 0)
919                                 ? prob_pass_wont_exit
920                                 : prob_pass_thru;
921           p = prob_pass_main;
922           scale_main = REG_BR_PROB_BASE;
923           for (i = 0; i < ndupl; i++)
924             {
925               scale_main += p;
926               p = RDIV (p * scale_step[i], REG_BR_PROB_BASE);
927             }
928           scale_main = RDIV (REG_BR_PROB_BASE * REG_BR_PROB_BASE, scale_main);
929           scale_act = RDIV (scale_main * prob_pass_main, REG_BR_PROB_BASE);
930         }
931       else
932         {
933           scale_main = REG_BR_PROB_BASE;
934           for (i = 0; i < ndupl; i++)
935             scale_main = RDIV (scale_main * scale_step[i], REG_BR_PROB_BASE);
936           scale_act = REG_BR_PROB_BASE - prob_pass_thru;
937         }
938       for (i = 0; i < ndupl; i++)
939         if (scale_step[i] < 0 || scale_step[i] > REG_BR_PROB_BASE)
940           abort ();
941       if (scale_main < 0 || scale_main > REG_BR_PROB_BASE
942           || scale_act < 0  || scale_act > REG_BR_PROB_BASE)
943         abort ();
944     }
945
946   /* Loop the new bbs will belong to.  */
947   target = e->src->loop_father;
948
949   /* Original loops.  */
950   n_orig_loops = 0;
951   for (aloop = loop->inner; aloop; aloop = aloop->next)
952     n_orig_loops++;
953   orig_loops = xcalloc (n_orig_loops, sizeof (struct loop *));
954   for (aloop = loop->inner, i = 0; aloop; aloop = aloop->next, i++)
955     orig_loops[i] = aloop;
956
957   loop->copy = target;
958
959   n = loop->num_nodes;
960
961   first_active = xmalloc (n * sizeof (basic_block));
962   if (is_latch)
963     {
964       memcpy (first_active, bbs, n * sizeof (basic_block));
965       first_active_latch = latch;
966     }
967
968   /* Record exit edge in original loop body.  */
969   if (orig && TEST_BIT (wont_exit, 0))
970     to_remove[(*n_to_remove)++] = orig;
971
972   spec_edges[SE_ORIG] = orig;
973   spec_edges[SE_LATCH] = latch_edge;
974
975   for (j = 0; j < ndupl; j++)
976     {
977       /* Copy loops.  */
978       copy_loops_to (loops, orig_loops, n_orig_loops, target);
979
980       /* Copy bbs.  */
981       copy_bbs (bbs, n, new_bbs, spec_edges, 2, new_spec_edges, loop);
982
983       /* Note whether the blocks and edges belong to an irreducible loop.  */
984       if (add_irreducible_flag)
985         {
986           for (i = 0; i < n; i++)
987             new_bbs[i]->rbi->duplicated = 1;
988           for (i = 0; i < n; i++)
989             {
990               new_bb = new_bbs[i];
991               if (new_bb->loop_father == target)
992                 new_bb->flags |= BB_IRREDUCIBLE_LOOP;
993
994               for (ae = new_bb->succ; ae; ae = ae->succ_next)
995                 if (ae->dest->rbi->duplicated
996                     && (ae->src->loop_father == target
997                         || ae->dest->loop_father == target))
998                   ae->flags |= EDGE_IRREDUCIBLE_LOOP;
999             }
1000           for (i = 0; i < n; i++)
1001             new_bbs[i]->rbi->duplicated = 0;
1002         }
1003
1004       /* Redirect the special edges.  */
1005       if (is_latch)
1006         {
1007           redirect_edge_and_branch_force (latch_edge, new_bbs[0]);
1008           redirect_edge_and_branch_force (new_spec_edges[SE_LATCH],
1009                                           loop->header);
1010           set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], latch);
1011           latch = loop->latch = new_bbs[1];
1012           e = latch_edge = new_spec_edges[SE_LATCH];
1013         }
1014       else
1015         {
1016           redirect_edge_and_branch_force (new_spec_edges[SE_LATCH],
1017                                           loop->header);
1018           redirect_edge_and_branch_force (e, new_bbs[0]);
1019           set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], e->src);
1020           e = new_spec_edges[SE_LATCH];
1021         }
1022
1023       /* Record exit edge in this copy.  */
1024       if (orig && TEST_BIT (wont_exit, j + 1))
1025         to_remove[(*n_to_remove)++] = new_spec_edges[SE_ORIG];
1026
1027       /* Record the first copy in the control flow order if it is not
1028          the original loop (i.e. in case of peeling).  */
1029       if (!first_active_latch)
1030         {
1031           memcpy (first_active, new_bbs, n * sizeof (basic_block));
1032           first_active_latch = new_bbs[1];
1033         }
1034
1035       /* Set counts and frequencies.  */
1036       if (flags & DLTHE_FLAG_UPDATE_FREQ)
1037         {
1038           scale_bbs_frequencies (new_bbs, n, scale_act, REG_BR_PROB_BASE);
1039           scale_act = RDIV (scale_act * scale_step[j], REG_BR_PROB_BASE);
1040         }
1041     }
1042   free (new_bbs);
1043   free (orig_loops);
1044   
1045   /* Update the original loop.  */
1046   if (!is_latch)
1047     set_immediate_dominator (CDI_DOMINATORS, e->dest, e->src);
1048   if (flags & DLTHE_FLAG_UPDATE_FREQ)
1049     {
1050       scale_bbs_frequencies (bbs, n, scale_main, REG_BR_PROB_BASE);
1051       free (scale_step);
1052     }
1053
1054   /* Update dominators of outer blocks if affected.  */
1055   for (i = 0; i < n; i++)
1056     {
1057       basic_block dominated, dom_bb, *dom_bbs;
1058       int n_dom_bbs,j;
1059
1060       bb = bbs[i];
1061       n_dom_bbs = get_dominated_by (CDI_DOMINATORS, bb, &dom_bbs);
1062       for (j = 0; j < n_dom_bbs; j++)
1063         {
1064           dominated = dom_bbs[j];
1065           if (flow_bb_inside_loop_p (loop, dominated))
1066             continue;
1067           dom_bb = nearest_common_dominator (
1068                         CDI_DOMINATORS, first_active[i], first_active_latch);
1069           set_immediate_dominator (CDI_DOMINATORS, dominated, dom_bb);
1070         }
1071       free (dom_bbs);
1072     }
1073   free (first_active);
1074
1075   free (bbs);
1076
1077   return true;
1078 }
1079
1080 /* Creates a pre-header for a LOOP.  Returns newly created block.  Unless
1081    CP_SIMPLE_PREHEADERS is set in FLAGS, we only force LOOP to have single
1082    entry; otherwise we also force preheader block to have only one successor.
1083    The function also updates dominators stored in DOM.  */
1084 static basic_block
1085 create_preheader (struct loop *loop, int flags)
1086 {
1087   edge e, fallthru;
1088   basic_block dummy;
1089   basic_block jump, src = 0;
1090   struct loop *cloop, *ploop;
1091   int nentry = 0;
1092   rtx insn;
1093
1094   cloop = loop->outer;
1095
1096   for (e = loop->header->pred; e; e = e->pred_next)
1097     {
1098       if (e->src == loop->latch)
1099         continue;
1100       nentry++;
1101     }
1102   if (!nentry)
1103     abort ();
1104   if (nentry == 1)
1105     {
1106       for (e = loop->header->pred; e->src == loop->latch; e = e->pred_next);
1107       if (!(flags & CP_SIMPLE_PREHEADERS)
1108           || !e->src->succ->succ_next)
1109         return NULL;
1110     }
1111
1112   insn = first_insn_after_basic_block_note (loop->header);
1113   if (insn)
1114     insn = PREV_INSN (insn);
1115   else
1116     insn = get_last_insn ();
1117   if (insn == BB_END (loop->header))
1118     {
1119       /* Split_block would not split block after its end.  */
1120       emit_note_after (NOTE_INSN_DELETED, insn);
1121     }
1122   fallthru = split_block (loop->header, insn);
1123   dummy = fallthru->src;
1124   loop->header = fallthru->dest;
1125
1126   /* The header could be a latch of some superloop(s); due to design of
1127      split_block, it would now move to fallthru->dest.  */
1128   for (ploop = loop; ploop; ploop = ploop->outer)
1129     if (ploop->latch == dummy)
1130       ploop->latch = fallthru->dest;
1131
1132   add_to_dominance_info (CDI_DOMINATORS, fallthru->dest);
1133
1134   /* Redirect edges.  */
1135   for (e = dummy->pred; e; e = e->pred_next)
1136     {
1137       src = e->src;
1138       if (src == loop->latch)
1139         break;
1140     }
1141   if (!e)
1142     abort ();
1143
1144   dummy->frequency -= EDGE_FREQUENCY (e);
1145   dummy->count -= e->count;
1146   fallthru->count -= e->count;
1147   jump = redirect_edge_and_branch_force (e, loop->header);
1148   if (jump)
1149     {
1150       add_to_dominance_info (CDI_DOMINATORS, jump);
1151       set_immediate_dominator (CDI_DOMINATORS, jump, src);
1152       add_bb_to_loop (jump, loop);
1153       loop->latch = jump;
1154     }
1155
1156   /* Update structures.  */
1157   redirect_immediate_dominators (CDI_DOMINATORS, dummy, loop->header);
1158   set_immediate_dominator (CDI_DOMINATORS, loop->header, dummy);
1159   loop->header->loop_father = loop;
1160   add_bb_to_loop (dummy, cloop);
1161   if (rtl_dump_file)
1162     fprintf (rtl_dump_file, "Created preheader block for loop %i\n",
1163              loop->num);
1164
1165   return dummy;
1166 }
1167
1168 /* Create preheaders for each loop from loop tree stored in LOOPS; for meaning
1169    of FLAGS see create_preheader.  */
1170 void
1171 create_preheaders (struct loops *loops, int flags)
1172 {
1173   unsigned i;
1174   for (i = 1; i < loops->num; i++)
1175     create_preheader (loops->parray[i], flags);
1176   loops->state |= LOOPS_HAVE_PREHEADERS;
1177 }
1178
1179 /* Forces all loop latches of loops from loop tree LOOPS to have only single
1180    successor.  */
1181 void
1182 force_single_succ_latches (struct loops *loops)
1183 {
1184   unsigned i;
1185   struct loop *loop;
1186   edge e;
1187
1188   for (i = 1; i < loops->num; i++)
1189     {
1190       loop = loops->parray[i];
1191       if (loop->latch != loop->header
1192           && !loop->latch->succ->succ_next)
1193         continue;
1194
1195       for (e = loop->header->pred; e->src != loop->latch; e = e->pred_next)
1196         continue;
1197
1198       loop_split_edge_with (e, NULL_RTX);
1199     }
1200   loops->state |= LOOPS_HAVE_SIMPLE_LATCHES;
1201 }
1202
1203 /* A quite stupid function to put INSNS on edge E. They are supposed to form
1204    just one basic block.  Jumps in INSNS are not handled, so cfg do not have to
1205    be ok after this function.  The created block is placed on correct place
1206    in LOOPS structure and its dominator is set.  */
1207 basic_block
1208 loop_split_edge_with (edge e, rtx insns)
1209 {
1210   basic_block src, dest, new_bb;
1211   struct loop *loop_c;
1212   edge new_e;
1213
1214   src = e->src;
1215   dest = e->dest;
1216
1217   loop_c = find_common_loop (src->loop_father, dest->loop_father);
1218
1219   /* Create basic block for it.  */
1220
1221   new_bb = split_edge (e);
1222   add_to_dominance_info (CDI_DOMINATORS, new_bb);
1223   add_bb_to_loop (new_bb, loop_c);
1224   new_bb->flags = insns ? BB_SUPERBLOCK : 0;
1225
1226   new_e = new_bb->succ;
1227   if (e->flags & EDGE_IRREDUCIBLE_LOOP)
1228     {
1229       new_bb->flags |= BB_IRREDUCIBLE_LOOP;
1230       new_e->flags |= EDGE_IRREDUCIBLE_LOOP;
1231     }
1232
1233   if (insns)
1234     emit_insn_after (insns, BB_END (new_bb));
1235
1236   set_immediate_dominator (CDI_DOMINATORS, new_bb, src);
1237   set_immediate_dominator (CDI_DOMINATORS, dest,
1238                            recount_dominator (CDI_DOMINATORS, dest));
1239
1240   if (dest->loop_father->latch == src)
1241     dest->loop_father->latch = new_bb;
1242
1243   return new_bb;
1244 }