OSDN Git Service

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