OSDN Git Service

* loop-unswitch.c (unswitch_loop): Pass probabilities to loopify.
[pf3gnuchains/gcc-fork.git] / gcc / cfgloopmanip.c
1 /* Loop manipulation code for GNU compiler.
2    Copyright (C) 2002, 2003, 2004, 2005 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, 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301, 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 "obstack.h"
28 #include "basic-block.h"
29 #include "cfgloop.h"
30 #include "cfglayout.h"
31 #include "cfghooks.h"
32 #include "output.h"
33
34 static void duplicate_subloops (struct loop *, struct loop *);
35 static void copy_loops_to (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 fix_loop_placements (struct loop *, bool *);
44 static bool fix_bb_placement (basic_block);
45 static void fix_bb_placements (basic_block, bool *);
46 static void place_new_loop (struct loop *);
47 static basic_block create_preheader (struct loop *, int);
48 static void unloop (struct loop *, bool *);
49
50 #define RDIV(X,Y) (((X) + (Y) / 2) / (Y))
51
52 /* Checks whether basic block BB is dominated by DATA.  */
53 static bool
54 rpe_enum_p (basic_block bb, void *data)
55 {
56   return dominated_by_p (CDI_DOMINATORS, bb, data);
57 }
58
59 /* Remove basic blocks BBS.  NBBS is the number of the basic blocks.  */
60
61 static void
62 remove_bbs (basic_block *bbs, int nbbs)
63 {
64   int i;
65
66   for (i = 0; i < nbbs; i++)
67     delete_basic_block (bbs[i]);
68 }
69
70 /* Find path -- i.e. the basic blocks dominated by edge E and put them
71    into array BBS, that will be allocated large enough to contain them.
72    E->dest must have exactly one predecessor for this to work (it is
73    easy to achieve and we do not put it here because we do not want to
74    alter anything by this function).  The number of basic blocks in the
75    path is returned.  */
76 static int
77 find_path (edge e, basic_block **bbs)
78 {
79   gcc_assert (EDGE_COUNT (e->dest->preds) <= 1);
80
81   /* Find bbs in the path.  */
82   *bbs = XCNEWVEC (basic_block, n_basic_blocks);
83   return dfs_enumerate_from (e->dest, 0, rpe_enum_p, *bbs,
84                              n_basic_blocks, e->dest);
85 }
86
87 /* Fix placement of basic block BB inside loop hierarchy --
88    Let L be a loop to that BB belongs.  Then every successor of BB must either
89      1) belong to some superloop of loop L, or
90      2) be a header of loop K such that K->outer is superloop of L
91    Returns true if we had to move BB into other loop to enforce this condition,
92    false if the placement of BB was already correct (provided that placements
93    of its successors are correct).  */
94 static bool
95 fix_bb_placement (basic_block bb)
96 {
97   edge e;
98   edge_iterator ei;
99   struct loop *loop = current_loops->tree_root, *act;
100
101   FOR_EACH_EDGE (e, ei, bb->succs)
102     {
103       if (e->dest == EXIT_BLOCK_PTR)
104         continue;
105
106       act = e->dest->loop_father;
107       if (act->header == e->dest)
108         act = act->outer;
109
110       if (flow_loop_nested_p (loop, act))
111         loop = act;
112     }
113
114   if (loop == bb->loop_father)
115     return false;
116
117   remove_bb_from_loops (bb);
118   add_bb_to_loop (bb, loop);
119
120   return true;
121 }
122
123 /* Fix placements of basic blocks inside loop hierarchy stored in loops; i.e.
124    enforce condition condition stated in description of fix_bb_placement. We
125    start from basic block FROM that had some of its successors removed, so that
126    his placement no longer has to be correct, and iteratively fix placement of
127    its predecessors that may change if placement of FROM changed.  Also fix
128    placement of subloops of FROM->loop_father, that might also be altered due
129    to this change; the condition for them is similar, except that instead of
130    successors we consider edges coming out of the loops.
131  
132    If the changes may invalidate the information about irreducible regions,
133    IRRED_INVALIDATED is set to true.  */
134
135 static void
136 fix_bb_placements (basic_block from,
137                    bool *irred_invalidated)
138 {
139   sbitmap in_queue;
140   basic_block *queue, *qtop, *qbeg, *qend;
141   struct loop *base_loop;
142   edge e;
143
144   /* We pass through blocks back-reachable from FROM, testing whether some
145      of their successors moved to outer loop.  It may be necessary to
146      iterate several times, but it is finite, as we stop unless we move
147      the basic block up the loop structure.  The whole story is a bit
148      more complicated due to presence of subloops, those are moved using
149      fix_loop_placement.  */
150
151   base_loop = from->loop_father;
152   if (base_loop == current_loops->tree_root)
153     return;
154
155   in_queue = sbitmap_alloc (last_basic_block);
156   sbitmap_zero (in_queue);
157   SET_BIT (in_queue, from->index);
158   /* Prevent us from going out of the base_loop.  */
159   SET_BIT (in_queue, base_loop->header->index);
160
161   queue = XNEWVEC (basic_block, base_loop->num_nodes + 1);
162   qtop = queue + base_loop->num_nodes + 1;
163   qbeg = queue;
164   qend = queue + 1;
165   *qbeg = from;
166
167   while (qbeg != qend)
168     {
169       edge_iterator ei;
170       from = *qbeg;
171       qbeg++;
172       if (qbeg == qtop)
173         qbeg = queue;
174       RESET_BIT (in_queue, from->index);
175
176       if (from->loop_father->header == from)
177         {
178           /* Subloop header, maybe move the loop upward.  */
179           if (!fix_loop_placement (from->loop_father))
180             continue;
181         }
182       else
183         {
184           /* Ordinary basic block.  */
185           if (!fix_bb_placement (from))
186             continue;
187         }
188
189       FOR_EACH_EDGE (e, ei, from->succs)
190         {
191           if (e->flags & EDGE_IRREDUCIBLE_LOOP)
192             *irred_invalidated = true;
193         }
194
195       /* Something has changed, insert predecessors into queue.  */
196       FOR_EACH_EDGE (e, ei, from->preds)
197         {
198           basic_block pred = e->src;
199           struct loop *nca;
200
201           if (e->flags & EDGE_IRREDUCIBLE_LOOP)
202             *irred_invalidated = true;
203
204           if (TEST_BIT (in_queue, pred->index))
205             continue;
206
207           /* If it is subloop, then it either was not moved, or
208              the path up the loop tree from base_loop do not contain
209              it.  */
210           nca = find_common_loop (pred->loop_father, base_loop);
211           if (pred->loop_father != base_loop
212               && (nca == base_loop
213                   || nca != pred->loop_father))
214             pred = pred->loop_father->header;
215           else if (!flow_loop_nested_p (from->loop_father, pred->loop_father))
216             {
217               /* No point in processing it.  */
218               continue;
219             }
220
221           if (TEST_BIT (in_queue, pred->index))
222             continue;
223
224           /* Schedule the basic block.  */
225           *qend = pred;
226           qend++;
227           if (qend == qtop)
228             qend = queue;
229           SET_BIT (in_queue, pred->index);
230         }
231     }
232   free (in_queue);
233   free (queue);
234 }
235
236 /* Removes path beginning at edge E, i.e. remove basic blocks dominated by E
237    and update loop structures and dominators.  Return true if we were able
238    to remove the path, false otherwise (and nothing is affected then).  */
239 bool
240 remove_path (edge e)
241 {
242   edge ae;
243   basic_block *rem_bbs, *bord_bbs, *dom_bbs, from, bb;
244   int i, nrem, n_bord_bbs, n_dom_bbs, nreml;
245   sbitmap seen;
246   bool deleted, irred_invalidated = false;
247   struct loop **deleted_loop;
248
249   if (!loop_delete_branch_edge (e, 0))
250     return false;
251
252   /* Keep track of whether we need to update information about irreducible
253      regions.  This is the case if the removed area is a part of the
254      irreducible region, or if the set of basic blocks that belong to a loop
255      that is inside an irreducible region is changed, or if such a loop is
256      removed.  */
257   if (e->flags & EDGE_IRREDUCIBLE_LOOP)
258     irred_invalidated = true;
259
260   /* We need to check whether basic blocks are dominated by the edge
261      e, but we only have basic block dominators.  This is easy to
262      fix -- when e->dest has exactly one predecessor, this corresponds
263      to blocks dominated by e->dest, if not, split the edge.  */
264   if (!single_pred_p (e->dest))
265     e = single_pred_edge (split_edge (e));
266
267   /* It may happen that by removing path we remove one or more loops
268      we belong to.  In this case first unloop the loops, then proceed
269      normally.   We may assume that e->dest is not a header of any loop,
270      as it now has exactly one predecessor.  */
271   while (e->src->loop_father->outer
272          && dominated_by_p (CDI_DOMINATORS,
273                             e->src->loop_father->latch, e->dest))
274     unloop (e->src->loop_father, &irred_invalidated);
275
276   /* Identify the path.  */
277   nrem = find_path (e, &rem_bbs);
278
279   n_bord_bbs = 0;
280   bord_bbs = XCNEWVEC (basic_block, n_basic_blocks);
281   seen = sbitmap_alloc (last_basic_block);
282   sbitmap_zero (seen);
283
284   /* Find "border" hexes -- i.e. those with predecessor in removed path.  */
285   for (i = 0; i < nrem; i++)
286     SET_BIT (seen, rem_bbs[i]->index);
287   for (i = 0; i < nrem; i++)
288     {
289       edge_iterator ei;
290       bb = rem_bbs[i];
291       FOR_EACH_EDGE (ae, ei, rem_bbs[i]->succs)
292         if (ae->dest != EXIT_BLOCK_PTR && !TEST_BIT (seen, ae->dest->index))
293           {
294             SET_BIT (seen, ae->dest->index);
295             bord_bbs[n_bord_bbs++] = ae->dest;
296           
297             if (ae->flags & EDGE_IRREDUCIBLE_LOOP)
298               irred_invalidated = true;
299           }
300     }
301
302   /* Remove the path.  */
303   from = e->src;
304   deleted = loop_delete_branch_edge (e, 1);
305   gcc_assert (deleted);
306   dom_bbs = XCNEWVEC (basic_block, n_basic_blocks);
307
308   /* Cancel loops contained in the path.  */
309   deleted_loop = XNEWVEC (struct loop *, nrem);
310   nreml = 0;
311   for (i = 0; i < nrem; i++)
312     if (rem_bbs[i]->loop_father->header == rem_bbs[i])
313       deleted_loop[nreml++] = rem_bbs[i]->loop_father;
314
315   remove_bbs (rem_bbs, nrem);
316   free (rem_bbs);
317
318   for (i = 0; i < nreml; i++)
319     cancel_loop_tree (deleted_loop[i]);
320   free (deleted_loop);
321
322   /* Find blocks whose dominators may be affected.  */
323   n_dom_bbs = 0;
324   sbitmap_zero (seen);
325   for (i = 0; i < n_bord_bbs; i++)
326     {
327       basic_block ldom;
328
329       bb = get_immediate_dominator (CDI_DOMINATORS, bord_bbs[i]);
330       if (TEST_BIT (seen, bb->index))
331         continue;
332       SET_BIT (seen, bb->index);
333
334       for (ldom = first_dom_son (CDI_DOMINATORS, bb);
335            ldom;
336            ldom = next_dom_son (CDI_DOMINATORS, ldom))
337         if (!dominated_by_p (CDI_DOMINATORS, from, ldom))
338           dom_bbs[n_dom_bbs++] = ldom;
339     }
340
341   free (seen);
342
343   /* Recount dominators.  */
344   iterate_fix_dominators (CDI_DOMINATORS, dom_bbs, n_dom_bbs);
345   free (dom_bbs);
346   free (bord_bbs);
347
348   /* Fix placements of basic blocks inside loops and the placement of
349      loops in the loop tree.  */
350   fix_bb_placements (from, &irred_invalidated);
351   fix_loop_placements (from->loop_father, &irred_invalidated);
352
353   if (irred_invalidated
354       && (current_loops->state & LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS) != 0)
355     mark_irreducible_loops ();
356
357   return true;
358 }
359
360 /* Predicate for enumeration in add_loop.  */
361 static bool
362 alp_enum_p (basic_block bb, void *alp_header)
363 {
364   return bb != (basic_block) alp_header;
365 }
366
367 /* Given LOOP structure with filled header and latch, find the body of the
368    corresponding loop and add it to loops tree.  Insert the LOOP as a son of
369    outer.  */
370
371 static void
372 add_loop (struct loop *loop, struct loop *outer)
373 {
374   basic_block *bbs;
375   int i, n;
376
377   /* Add it to loop structure.  */
378   place_new_loop (loop);
379   flow_loop_tree_node_add (outer, loop);
380
381   /* Find its nodes.  */
382   bbs = XCNEWVEC (basic_block, n_basic_blocks);
383   n = dfs_enumerate_from (loop->latch, 1, alp_enum_p,
384                           bbs, n_basic_blocks, loop->header);
385
386   for (i = 0; i < n; i++)
387     {
388       remove_bb_from_loops (bbs[i]);
389       add_bb_to_loop (bbs[i], loop);
390     }
391   remove_bb_from_loops (loop->header);
392   add_bb_to_loop (loop->header, loop);
393
394   free (bbs);
395 }
396
397 /* Multiply all frequencies in LOOP by NUM/DEN.  */
398 void
399 scale_loop_frequencies (struct loop *loop, int num, int den)
400 {
401   basic_block *bbs;
402
403   bbs = get_loop_body (loop);
404   scale_bbs_frequencies_int (bbs, loop->num_nodes, num, den);
405   free (bbs);
406 }
407
408 /* Make area between HEADER_EDGE and LATCH_EDGE a loop by connecting
409    latch to header and update loop tree and dominators
410    accordingly. Everything between them plus LATCH_EDGE destination must
411    be dominated by HEADER_EDGE destination, and back-reachable from
412    LATCH_EDGE source.  HEADER_EDGE is redirected to basic block SWITCH_BB,
413    FALSE_EDGE of SWITCH_BB to original destination of HEADER_EDGE and
414    TRUE_EDGE of SWITCH_BB to original destination of LATCH_EDGE.
415    Returns the newly created loop.  Frequencies and counts in the new loop
416    are scaled by FALSE_SCALE and in the old one by TRUE_SCALE.  */
417
418 struct loop *
419 loopify (edge latch_edge, edge header_edge,
420          basic_block switch_bb, edge true_edge, edge false_edge,
421          bool redirect_all_edges, unsigned true_scale, unsigned false_scale)
422 {
423   basic_block succ_bb = latch_edge->dest;
424   basic_block pred_bb = header_edge->src;
425   basic_block *dom_bbs, *body;
426   unsigned n_dom_bbs, i;
427   sbitmap seen;
428   struct loop *loop = XCNEW (struct loop);
429   struct loop *outer = succ_bb->loop_father->outer;
430   int freq;
431   gcov_type cnt;
432   edge e;
433   edge_iterator ei;
434
435   loop->header = header_edge->dest;
436   loop->latch = latch_edge->src;
437
438   freq = EDGE_FREQUENCY (header_edge);
439   cnt = header_edge->count;
440
441   /* Redirect edges.  */
442   loop_redirect_edge (latch_edge, loop->header);
443   loop_redirect_edge (true_edge, succ_bb);
444
445   /* During loop versioning, one of the switch_bb edge is already properly
446      set. Do not redirect it again unless redirect_all_edges is true.  */
447   if (redirect_all_edges)
448     {
449       loop_redirect_edge (header_edge, switch_bb);
450       loop_redirect_edge (false_edge, loop->header);
451
452       /* Update dominators.  */
453       set_immediate_dominator (CDI_DOMINATORS, switch_bb, pred_bb);
454       set_immediate_dominator (CDI_DOMINATORS, loop->header, switch_bb);
455     }
456
457   set_immediate_dominator (CDI_DOMINATORS, succ_bb, switch_bb);
458
459   /* Compute new loop.  */
460   add_loop (loop, outer);
461
462   /* Add switch_bb to appropriate loop.  */
463   if (switch_bb->loop_father)
464     remove_bb_from_loops (switch_bb);
465   add_bb_to_loop (switch_bb, outer);
466
467   /* Fix frequencies.  */
468   if (redirect_all_edges)
469     {
470       switch_bb->frequency = freq;
471       switch_bb->count = cnt;
472       FOR_EACH_EDGE (e, ei, switch_bb->succs)
473         {
474           e->count = (switch_bb->count * e->probability) / REG_BR_PROB_BASE;
475         }
476     }
477   scale_loop_frequencies (loop, false_scale, REG_BR_PROB_BASE);
478   scale_loop_frequencies (succ_bb->loop_father, true_scale, REG_BR_PROB_BASE);
479
480   /* Update dominators of blocks outside of LOOP.  */
481   dom_bbs = XCNEWVEC (basic_block, n_basic_blocks);
482   n_dom_bbs = 0;
483   seen = sbitmap_alloc (last_basic_block);
484   sbitmap_zero (seen);
485   body = get_loop_body (loop);
486
487   for (i = 0; i < loop->num_nodes; i++)
488     SET_BIT (seen, body[i]->index);
489
490   for (i = 0; i < loop->num_nodes; i++)
491     {
492       basic_block ldom;
493
494       for (ldom = first_dom_son (CDI_DOMINATORS, body[i]);
495            ldom;
496            ldom = next_dom_son (CDI_DOMINATORS, ldom))
497         if (!TEST_BIT (seen, ldom->index))
498           {
499             SET_BIT (seen, ldom->index);
500             dom_bbs[n_dom_bbs++] = ldom;
501           }
502     }
503
504   iterate_fix_dominators (CDI_DOMINATORS, dom_bbs, n_dom_bbs);
505
506   free (body);
507   free (seen);
508   free (dom_bbs);
509
510   return loop;
511 }
512
513 /* Remove the latch edge of a LOOP and update loops to indicate that
514    the LOOP was removed.  After this function, original loop latch will
515    have no successor, which caller is expected to fix somehow.
516
517    If this may cause the information about irreducible regions to become
518    invalid, IRRED_INVALIDATED is set to true.  */
519
520 static void
521 unloop (struct loop *loop, bool *irred_invalidated)
522 {
523   basic_block *body;
524   struct loop *ploop;
525   unsigned i, n;
526   basic_block latch = loop->latch;
527   bool dummy = false;
528
529   if (loop_preheader_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP)
530     *irred_invalidated = true;
531
532   /* This is relatively straightforward.  The dominators are unchanged, as
533      loop header dominates loop latch, so the only thing we have to care of
534      is the placement of loops and basic blocks inside the loop tree.  We
535      move them all to the loop->outer, and then let fix_bb_placements do
536      its work.  */
537
538   body = get_loop_body (loop);
539   n = loop->num_nodes;
540   for (i = 0; i < n; i++)
541     if (body[i]->loop_father == loop)
542       {
543         remove_bb_from_loops (body[i]);
544         add_bb_to_loop (body[i], loop->outer);
545       }
546   free(body);
547
548   while (loop->inner)
549     {
550       ploop = loop->inner;
551       flow_loop_tree_node_remove (ploop);
552       flow_loop_tree_node_add (loop->outer, ploop);
553     }
554
555   /* Remove the loop and free its data.  */
556   delete_loop (loop);
557
558   remove_edge (single_succ_edge (latch));
559
560   /* We do not pass IRRED_INVALIDATED to fix_bb_placements here, as even if
561      there is an irreducible region inside the cancelled loop, the flags will
562      be still correct.  */
563   fix_bb_placements (latch, &dummy);
564 }
565
566 /* Fix placement of LOOP inside loop tree, i.e. find the innermost superloop
567    FATHER of LOOP such that all of the edges coming out of LOOP belong to
568    FATHER, and set it as outer loop of LOOP.  Return true if placement of
569    LOOP changed.  */
570
571 int
572 fix_loop_placement (struct loop *loop)
573 {
574   basic_block *body;
575   unsigned i;
576   edge e;
577   edge_iterator ei;
578   struct loop *father = loop->pred[0], *act;
579
580   body = get_loop_body (loop);
581   for (i = 0; i < loop->num_nodes; i++)
582     FOR_EACH_EDGE (e, ei, body[i]->succs)
583       if (!flow_bb_inside_loop_p (loop, e->dest))
584         {
585           act = find_common_loop (loop, e->dest->loop_father);
586           if (flow_loop_nested_p (father, act))
587             father = act;
588         }
589   free (body);
590
591   if (father != loop->outer)
592     {
593       for (act = loop->outer; act != father; act = act->outer)
594         act->num_nodes -= loop->num_nodes;
595       flow_loop_tree_node_remove (loop);
596       flow_loop_tree_node_add (father, loop);
597       return 1;
598     }
599   return 0;
600 }
601
602 /* Fix placement of superloops of LOOP inside loop tree, i.e. ensure that
603    condition stated in description of fix_loop_placement holds for them.
604    It is used in case when we removed some edges coming out of LOOP, which
605    may cause the right placement of LOOP inside loop tree to change.
606  
607    IRRED_INVALIDATED is set to true if a change in the loop structures might
608    invalidate the information about irreducible regions.  */
609
610 static void
611 fix_loop_placements (struct loop *loop, bool *irred_invalidated)
612 {
613   struct loop *outer;
614
615   while (loop->outer)
616     {
617       outer = loop->outer;
618       if (!fix_loop_placement (loop))
619         break;
620
621       /* Changing the placement of a loop in the loop tree may alter the
622          validity of condition 2) of the description of fix_bb_placement
623          for its preheader, because the successor is the header and belongs
624          to the loop.  So call fix_bb_placements to fix up the placement
625          of the preheader and (possibly) of its predecessors.  */
626       fix_bb_placements (loop_preheader_edge (loop)->src,
627                          irred_invalidated);
628       loop = outer;
629     }
630 }
631
632 /* Creates place for a new LOOP in loops structure.  */
633 static void
634 place_new_loop (struct loop *loop)
635 {
636   loop->num = number_of_loops ();
637   VEC_safe_push (loop_p, heap, current_loops->larray, loop);
638 }
639
640 /* Copies copy of LOOP as subloop of TARGET loop, placing newly
641    created loop into loops structure.  */
642 struct loop *
643 duplicate_loop (struct loop *loop, struct loop *target)
644 {
645   struct loop *cloop;
646   cloop = XCNEW (struct loop);
647   place_new_loop (cloop);
648
649   /* Mark the new loop as copy of LOOP.  */
650   loop->copy = cloop;
651
652   /* Add it to target.  */
653   flow_loop_tree_node_add (target, cloop);
654
655   return cloop;
656 }
657
658 /* Copies structure of subloops of LOOP into TARGET loop, placing
659    newly created loops into loop tree.  */
660 static void
661 duplicate_subloops (struct loop *loop, struct loop *target)
662 {
663   struct loop *aloop, *cloop;
664
665   for (aloop = loop->inner; aloop; aloop = aloop->next)
666     {
667       cloop = duplicate_loop (aloop, target);
668       duplicate_subloops (aloop, cloop);
669     }
670 }
671
672 /* Copies structure of subloops of N loops, stored in array COPIED_LOOPS,
673    into TARGET loop, placing newly created loops into loop tree.  */
674 static void
675 copy_loops_to (struct loop **copied_loops, int n, struct loop *target)
676 {
677   struct loop *aloop;
678   int i;
679
680   for (i = 0; i < n; i++)
681     {
682       aloop = duplicate_loop (copied_loops[i], target);
683       duplicate_subloops (copied_loops[i], aloop);
684     }
685 }
686
687 /* Redirects edge E to basic block DEST.  */
688 static void
689 loop_redirect_edge (edge e, basic_block dest)
690 {
691   if (e->dest == dest)
692     return;
693
694   redirect_edge_and_branch_force (e, dest);
695 }
696
697 /* Deletes edge E from a branch if possible.  Unless REALLY_DELETE is set,
698    just test whether it is possible to remove the edge.  */
699 static bool
700 loop_delete_branch_edge (edge e, int really_delete)
701 {
702   basic_block src = e->src;
703   basic_block newdest;
704   int irr;
705   edge snd;
706
707   gcc_assert (EDGE_COUNT (src->succs) > 1);
708
709   /* Cannot handle more than two exit edges.  */
710   if (EDGE_COUNT (src->succs) > 2)
711     return false;
712   /* And it must be just a simple branch.  */
713   if (!any_condjump_p (BB_END (src)))
714     return false;
715
716   snd = e == EDGE_SUCC (src, 0) ? EDGE_SUCC (src, 1) : EDGE_SUCC (src, 0);
717   newdest = snd->dest;
718   if (newdest == EXIT_BLOCK_PTR)
719     return false;
720
721   /* Hopefully the above conditions should suffice.  */
722   if (!really_delete)
723     return true;
724
725   /* Redirecting behaves wrongly wrto this flag.  */
726   irr = snd->flags & EDGE_IRREDUCIBLE_LOOP;
727
728   if (!redirect_edge_and_branch (e, newdest))
729     return false;
730   single_succ_edge (src)->flags &= ~EDGE_IRREDUCIBLE_LOOP;
731   single_succ_edge (src)->flags |= irr;
732
733   return true;
734 }
735
736 /* Check whether LOOP's body can be duplicated.  */
737 bool
738 can_duplicate_loop_p (struct loop *loop)
739 {
740   int ret;
741   basic_block *bbs = get_loop_body (loop);
742
743   ret = can_copy_bbs_p (bbs, loop->num_nodes);
744   free (bbs);
745
746   return ret;
747 }
748
749 /* The NBBS blocks in BBS will get duplicated and the copies will be placed
750    to LOOP.  Update the single_exit information in superloops of LOOP.  */
751
752 static void
753 update_single_exits_after_duplication (basic_block *bbs, unsigned nbbs,
754                                        struct loop *loop)
755 {
756   unsigned i;
757
758   for (i = 0; i < nbbs; i++)
759     bbs[i]->flags |= BB_DUPLICATED;
760
761   for (; loop->outer; loop = loop->outer)
762     {
763       if (!single_exit (loop))
764         continue;
765
766       if (single_exit (loop)->src->flags & BB_DUPLICATED)
767         set_single_exit (loop, NULL);
768     }
769
770   for (i = 0; i < nbbs; i++)
771     bbs[i]->flags &= ~BB_DUPLICATED;
772 }
773
774 /* Updates single exit information for the copy of LOOP.  */
775
776 static void
777 update_single_exit_for_duplicated_loop (struct loop *loop)
778 {
779   struct loop *copy = loop->copy;
780   basic_block src, dest;
781   edge exit = single_exit (loop);
782
783   if (!exit)
784     return;
785
786   src = get_bb_copy (exit->src);
787   dest = exit->dest;
788   if (dest->flags & BB_DUPLICATED)
789     dest = get_bb_copy (dest);
790
791   exit = find_edge (src, dest);
792   gcc_assert (exit != NULL);
793   set_single_exit (copy, exit);
794 }
795
796 /* Updates single exit information for copies of ORIG_LOOPS and their subloops.
797    N is the number of the loops in the ORIG_LOOPS array.  */
798
799 static void
800 update_single_exit_for_duplicated_loops (struct loop *orig_loops[], unsigned n)
801 {
802   unsigned i;
803
804   for (i = 0; i < n; i++)
805     update_single_exit_for_duplicated_loop (orig_loops[i]);
806 }
807
808 /* Sets probability and count of edge E to zero.  The probability and count
809    is redistributed evenly to the remaining edges coming from E->src.  */
810
811 static void
812 set_zero_probability (edge e)
813 {
814   basic_block bb = e->src;
815   edge_iterator ei;
816   edge ae, last = NULL;
817   unsigned n = EDGE_COUNT (bb->succs);
818   gcov_type cnt = e->count, cnt1;
819   unsigned prob = e->probability, prob1;
820
821   gcc_assert (n > 1);
822   cnt1 = cnt / (n - 1);
823   prob1 = prob / (n - 1);
824
825   FOR_EACH_EDGE (ae, ei, bb->succs)
826     {
827       if (ae == e)
828         continue;
829
830       ae->probability += prob1;
831       ae->count += cnt1;
832       last = ae;
833     }
834
835   /* Move the rest to one of the edges.  */
836   last->probability += prob % (n - 1);
837   last->count += cnt % (n - 1);
838
839   e->probability = 0;
840   e->count = 0;
841 }
842
843 /* Duplicates body of LOOP to given edge E NDUPL times.  Takes care of updating
844    loop structure and dominators.  E's destination must be LOOP header for
845    this to work, i.e. it must be entry or latch edge of this loop; these are
846    unique, as the loops must have preheaders for this function to work
847    correctly (in case E is latch, the function unrolls the loop, if E is entry
848    edge, it peels the loop).  Store edges created by copying ORIG edge from
849    copies corresponding to set bits in WONT_EXIT bitmap (bit 0 corresponds to
850    original LOOP body, the other copies are numbered in order given by control
851    flow through them) into TO_REMOVE array.  Returns false if duplication is
852    impossible.  */
853
854 bool
855 duplicate_loop_to_header_edge (struct loop *loop, edge e,
856                                unsigned int ndupl, sbitmap wont_exit,
857                                edge orig, VEC (edge, heap) **to_remove,
858                                int flags)
859 {
860   struct loop *target, *aloop;
861   struct loop **orig_loops;
862   unsigned n_orig_loops;
863   basic_block header = loop->header, latch = loop->latch;
864   basic_block *new_bbs, *bbs, *first_active;
865   basic_block new_bb, bb, first_active_latch = NULL;
866   edge ae, latch_edge;
867   edge spec_edges[2], new_spec_edges[2];
868 #define SE_LATCH 0
869 #define SE_ORIG 1
870   unsigned i, j, n;
871   int is_latch = (latch == e->src);
872   int scale_act = 0, *scale_step = NULL, scale_main = 0;
873   int scale_after_exit = 0;
874   int p, freq_in, freq_le, freq_out_orig;
875   int prob_pass_thru, prob_pass_wont_exit, prob_pass_main;
876   int add_irreducible_flag;
877   basic_block place_after;
878   bitmap bbs_to_scale = NULL;
879   bitmap_iterator bi;
880
881   gcc_assert (e->dest == loop->header);
882   gcc_assert (ndupl > 0);
883
884   if (orig)
885     {
886       /* Orig must be edge out of the loop.  */
887       gcc_assert (flow_bb_inside_loop_p (loop, orig->src));
888       gcc_assert (!flow_bb_inside_loop_p (loop, orig->dest));
889     }
890
891   n = loop->num_nodes;
892   bbs = get_loop_body_in_dom_order (loop);
893   gcc_assert (bbs[0] == loop->header);
894   gcc_assert (bbs[n  - 1] == loop->latch);
895
896   /* Check whether duplication is possible.  */
897   if (!can_copy_bbs_p (bbs, loop->num_nodes))
898     {
899       free (bbs);
900       return false;
901     }
902   new_bbs = XNEWVEC (basic_block, loop->num_nodes);
903
904   /* In case we are doing loop peeling and the loop is in the middle of
905      irreducible region, the peeled copies will be inside it too.  */
906   add_irreducible_flag = e->flags & EDGE_IRREDUCIBLE_LOOP;
907   gcc_assert (!is_latch || !add_irreducible_flag);
908
909   /* Find edge from latch.  */
910   latch_edge = loop_latch_edge (loop);
911
912   if (flags & DLTHE_FLAG_UPDATE_FREQ)
913     {
914       /* Calculate coefficients by that we have to scale frequencies
915          of duplicated loop bodies.  */
916       freq_in = header->frequency;
917       freq_le = EDGE_FREQUENCY (latch_edge);
918       if (freq_in == 0)
919         freq_in = 1;
920       if (freq_in < freq_le)
921         freq_in = freq_le;
922       freq_out_orig = orig ? EDGE_FREQUENCY (orig) : freq_in - freq_le;
923       if (freq_out_orig > freq_in - freq_le)
924         freq_out_orig = freq_in - freq_le;
925       prob_pass_thru = RDIV (REG_BR_PROB_BASE * freq_le, freq_in);
926       prob_pass_wont_exit =
927               RDIV (REG_BR_PROB_BASE * (freq_le + freq_out_orig), freq_in);
928
929       if (orig
930           && REG_BR_PROB_BASE - orig->probability != 0)
931         {
932           /* The blocks that are dominated by a removed exit edge ORIG have
933              frequencies scaled by this.  */
934           scale_after_exit = RDIV (REG_BR_PROB_BASE * REG_BR_PROB_BASE,
935                                    REG_BR_PROB_BASE - orig->probability);
936           bbs_to_scale = BITMAP_ALLOC (NULL);
937           for (i = 0; i < n; i++)
938             {
939               if (bbs[i] != orig->src
940                   && dominated_by_p (CDI_DOMINATORS, bbs[i], orig->src))
941                 bitmap_set_bit (bbs_to_scale, i);
942             }
943         }
944
945       scale_step = XNEWVEC (int, ndupl);
946
947       for (i = 1; i <= ndupl; i++)
948         scale_step[i - 1] = TEST_BIT (wont_exit, i)
949                                 ? prob_pass_wont_exit
950                                 : prob_pass_thru;
951
952       /* Complete peeling is special as the probability of exit in last
953          copy becomes 1.  */
954       if (flags & DLTHE_FLAG_COMPLETTE_PEEL)
955         {
956           int wanted_freq = EDGE_FREQUENCY (e);
957
958           if (wanted_freq > freq_in)
959             wanted_freq = freq_in;
960
961           gcc_assert (!is_latch);
962           /* First copy has frequency of incoming edge.  Each subsequent
963              frequency should be reduced by prob_pass_wont_exit.  Caller
964              should've managed the flags so all except for original loop
965              has won't exist set.  */
966           scale_act = RDIV (wanted_freq * REG_BR_PROB_BASE, freq_in);
967           /* Now simulate the duplication adjustments and compute header
968              frequency of the last copy.  */
969           for (i = 0; i < ndupl; i++)
970             wanted_freq = RDIV (wanted_freq * scale_step[i], REG_BR_PROB_BASE);
971           scale_main = RDIV (wanted_freq * REG_BR_PROB_BASE, freq_in);
972         }
973       else if (is_latch)
974         {
975           prob_pass_main = TEST_BIT (wont_exit, 0)
976                                 ? prob_pass_wont_exit
977                                 : prob_pass_thru;
978           p = prob_pass_main;
979           scale_main = REG_BR_PROB_BASE;
980           for (i = 0; i < ndupl; i++)
981             {
982               scale_main += p;
983               p = RDIV (p * scale_step[i], REG_BR_PROB_BASE);
984             }
985           scale_main = RDIV (REG_BR_PROB_BASE * REG_BR_PROB_BASE, scale_main);
986           scale_act = RDIV (scale_main * prob_pass_main, REG_BR_PROB_BASE);
987         }
988       else
989         {
990           scale_main = REG_BR_PROB_BASE;
991           for (i = 0; i < ndupl; i++)
992             scale_main = RDIV (scale_main * scale_step[i], REG_BR_PROB_BASE);
993           scale_act = REG_BR_PROB_BASE - prob_pass_thru;
994         }
995       for (i = 0; i < ndupl; i++)
996         gcc_assert (scale_step[i] >= 0 && scale_step[i] <= REG_BR_PROB_BASE);
997       gcc_assert (scale_main >= 0 && scale_main <= REG_BR_PROB_BASE
998                   && scale_act >= 0  && scale_act <= REG_BR_PROB_BASE);
999     }
1000
1001   /* Loop the new bbs will belong to.  */
1002   target = e->src->loop_father;
1003
1004   /* Original loops.  */
1005   n_orig_loops = 0;
1006   for (aloop = loop->inner; aloop; aloop = aloop->next)
1007     n_orig_loops++;
1008   orig_loops = XCNEWVEC (struct loop *, n_orig_loops);
1009   for (aloop = loop->inner, i = 0; aloop; aloop = aloop->next, i++)
1010     orig_loops[i] = aloop;
1011
1012   loop->copy = target;
1013
1014   first_active = XNEWVEC (basic_block, n);
1015   if (is_latch)
1016     {
1017       memcpy (first_active, bbs, n * sizeof (basic_block));
1018       first_active_latch = latch;
1019     }
1020
1021   /* Update the information about single exits.  */
1022   if (current_loops->state & LOOPS_HAVE_MARKED_SINGLE_EXITS)
1023     update_single_exits_after_duplication (bbs, n, target);
1024
1025   spec_edges[SE_ORIG] = orig;
1026   spec_edges[SE_LATCH] = latch_edge;
1027
1028   place_after = e->src;
1029   for (j = 0; j < ndupl; j++)
1030     {
1031       /* Copy loops.  */
1032       copy_loops_to (orig_loops, n_orig_loops, target);
1033
1034       /* Copy bbs.  */
1035       copy_bbs (bbs, n, new_bbs, spec_edges, 2, new_spec_edges, loop,
1036                 place_after);
1037       place_after = new_spec_edges[SE_LATCH]->src;
1038
1039       if (current_loops->state & LOOPS_HAVE_MARKED_SINGLE_EXITS)
1040         {
1041           for (i = 0; i < n; i++)
1042             bbs[i]->flags |= BB_DUPLICATED;
1043           update_single_exit_for_duplicated_loops (orig_loops, n_orig_loops);
1044           for (i = 0; i < n; i++)
1045             bbs[i]->flags &= ~BB_DUPLICATED;
1046         }
1047
1048       if (flags & DLTHE_RECORD_COPY_NUMBER)
1049         for (i = 0; i < n; i++)
1050           {
1051             gcc_assert (!new_bbs[i]->aux);
1052             new_bbs[i]->aux = (void *)(size_t)(j + 1);
1053           }
1054
1055       /* Note whether the blocks and edges belong to an irreducible loop.  */
1056       if (add_irreducible_flag)
1057         {
1058           for (i = 0; i < n; i++)
1059             new_bbs[i]->flags |= BB_DUPLICATED;
1060           for (i = 0; i < n; i++)
1061             {
1062               edge_iterator ei;
1063               new_bb = new_bbs[i];
1064               if (new_bb->loop_father == target)
1065                 new_bb->flags |= BB_IRREDUCIBLE_LOOP;
1066
1067               FOR_EACH_EDGE (ae, ei, new_bb->succs)
1068                 if ((ae->dest->flags & BB_DUPLICATED)
1069                     && (ae->src->loop_father == target
1070                         || ae->dest->loop_father == target))
1071                   ae->flags |= EDGE_IRREDUCIBLE_LOOP;
1072             }
1073           for (i = 0; i < n; i++)
1074             new_bbs[i]->flags &= ~BB_DUPLICATED;
1075         }
1076
1077       /* Redirect the special edges.  */
1078       if (is_latch)
1079         {
1080           redirect_edge_and_branch_force (latch_edge, new_bbs[0]);
1081           redirect_edge_and_branch_force (new_spec_edges[SE_LATCH],
1082                                           loop->header);
1083           set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], latch);
1084           latch = loop->latch = new_bbs[n - 1];
1085           e = latch_edge = new_spec_edges[SE_LATCH];
1086         }
1087       else
1088         {
1089           redirect_edge_and_branch_force (new_spec_edges[SE_LATCH],
1090                                           loop->header);
1091           redirect_edge_and_branch_force (e, new_bbs[0]);
1092           set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], e->src);
1093           e = new_spec_edges[SE_LATCH];
1094         }
1095
1096       /* Record exit edge in this copy.  */
1097       if (orig && TEST_BIT (wont_exit, j + 1))
1098         {
1099           if (to_remove)
1100             VEC_safe_push (edge, heap, *to_remove, new_spec_edges[SE_ORIG]);
1101           set_zero_probability (new_spec_edges[SE_ORIG]);
1102
1103           /* Scale the frequencies of the blocks dominated by the exit.  */
1104           if (bbs_to_scale)
1105             {
1106               EXECUTE_IF_SET_IN_BITMAP (bbs_to_scale, 0, i, bi)
1107                 {
1108                   scale_bbs_frequencies_int (new_bbs + i, 1, scale_after_exit,
1109                                              REG_BR_PROB_BASE);
1110                 }
1111             }
1112         }
1113
1114       /* Record the first copy in the control flow order if it is not
1115          the original loop (i.e. in case of peeling).  */
1116       if (!first_active_latch)
1117         {
1118           memcpy (first_active, new_bbs, n * sizeof (basic_block));
1119           first_active_latch = new_bbs[n - 1];
1120         }
1121
1122       /* Set counts and frequencies.  */
1123       if (flags & DLTHE_FLAG_UPDATE_FREQ)
1124         {
1125           scale_bbs_frequencies_int (new_bbs, n, scale_act, REG_BR_PROB_BASE);
1126           scale_act = RDIV (scale_act * scale_step[j], REG_BR_PROB_BASE);
1127         }
1128     }
1129   free (new_bbs);
1130   free (orig_loops);
1131
1132   /* Record the exit edge in the original loop body, and update the frequencies.  */
1133   if (orig && TEST_BIT (wont_exit, 0))
1134     {
1135       if (to_remove)
1136         VEC_safe_push (edge, heap, *to_remove, orig);
1137       set_zero_probability (orig);
1138
1139       /* Scale the frequencies of the blocks dominated by the exit.  */
1140       if (bbs_to_scale)
1141         {
1142           EXECUTE_IF_SET_IN_BITMAP (bbs_to_scale, 0, i, bi)
1143             {
1144               scale_bbs_frequencies_int (bbs + i, 1, scale_after_exit,
1145                                          REG_BR_PROB_BASE);
1146             }
1147         }
1148     }
1149
1150   /* Update the original loop.  */
1151   if (!is_latch)
1152     set_immediate_dominator (CDI_DOMINATORS, e->dest, e->src);
1153   if (flags & DLTHE_FLAG_UPDATE_FREQ)
1154     {
1155       scale_bbs_frequencies_int (bbs, n, scale_main, REG_BR_PROB_BASE);
1156       free (scale_step);
1157     }
1158
1159   /* Update dominators of outer blocks if affected.  */
1160   for (i = 0; i < n; i++)
1161     {
1162       basic_block dominated, dom_bb, *dom_bbs;
1163       int n_dom_bbs,j;
1164
1165       bb = bbs[i];
1166       bb->aux = 0;
1167
1168       n_dom_bbs = get_dominated_by (CDI_DOMINATORS, bb, &dom_bbs);
1169       for (j = 0; j < n_dom_bbs; j++)
1170         {
1171           dominated = dom_bbs[j];
1172           if (flow_bb_inside_loop_p (loop, dominated))
1173             continue;
1174           dom_bb = nearest_common_dominator (
1175                         CDI_DOMINATORS, first_active[i], first_active_latch);
1176           set_immediate_dominator (CDI_DOMINATORS, dominated, dom_bb);
1177         }
1178       free (dom_bbs);
1179     }
1180   free (first_active);
1181
1182   free (bbs);
1183   BITMAP_FREE (bbs_to_scale);
1184
1185   return true;
1186 }
1187
1188 /* A callback for make_forwarder block, to redirect all edges except for
1189    MFB_KJ_EDGE to the entry part.  E is the edge for that we should decide
1190    whether to redirect it.  */
1191
1192 static edge mfb_kj_edge;
1193 static bool
1194 mfb_keep_just (edge e)
1195 {
1196   return e != mfb_kj_edge;
1197 }
1198
1199 /* Creates a pre-header for a LOOP.  Returns newly created block.  Unless
1200    CP_SIMPLE_PREHEADERS is set in FLAGS, we only force LOOP to have single
1201    entry; otherwise we also force preheader block to have only one successor.
1202    The function also updates dominators.  */
1203
1204 static basic_block
1205 create_preheader (struct loop *loop, int flags)
1206 {
1207   edge e, fallthru;
1208   basic_block dummy;
1209   int nentry = 0;
1210   bool irred = false;
1211   bool latch_edge_was_fallthru;
1212   edge one_succ_pred = 0;
1213   edge_iterator ei;
1214
1215   FOR_EACH_EDGE (e, ei, loop->header->preds)
1216     {
1217       if (e->src == loop->latch)
1218         continue;
1219       irred |= (e->flags & EDGE_IRREDUCIBLE_LOOP) != 0;
1220       nentry++;
1221       if (single_succ_p (e->src))
1222         one_succ_pred = e;
1223     }
1224   gcc_assert (nentry);
1225   if (nentry == 1)
1226     {
1227       /* Get an edge that is different from the one from loop->latch
1228          to loop->header.  */
1229       e = EDGE_PRED (loop->header,
1230                      EDGE_PRED (loop->header, 0)->src == loop->latch);
1231
1232       if (!(flags & CP_SIMPLE_PREHEADERS) || single_succ_p (e->src))
1233         return NULL;
1234     }
1235
1236   mfb_kj_edge = loop_latch_edge (loop);
1237   latch_edge_was_fallthru = (mfb_kj_edge->flags & EDGE_FALLTHRU) != 0;
1238   fallthru = make_forwarder_block (loop->header, mfb_keep_just, NULL);
1239   dummy = fallthru->src;
1240   loop->header = fallthru->dest;
1241
1242   /* Try to be clever in placing the newly created preheader.  The idea is to
1243      avoid breaking any "fallthruness" relationship between blocks.
1244
1245      The preheader was created just before the header and all incoming edges
1246      to the header were redirected to the preheader, except the latch edge.
1247      So the only problematic case is when this latch edge was a fallthru
1248      edge: it is not anymore after the preheader creation so we have broken
1249      the fallthruness.  We're therefore going to look for a better place.  */
1250   if (latch_edge_was_fallthru)
1251     {
1252       if (one_succ_pred)
1253         e = one_succ_pred;
1254       else
1255         e = EDGE_PRED (dummy, 0);
1256
1257       move_block_after (dummy, e->src);
1258     }
1259
1260   if (irred)
1261     {
1262       dummy->flags |= BB_IRREDUCIBLE_LOOP;
1263       single_succ_edge (dummy)->flags |= EDGE_IRREDUCIBLE_LOOP;
1264     }
1265
1266   if (dump_file)
1267     fprintf (dump_file, "Created preheader block for loop %i\n",
1268              loop->num);
1269
1270   return dummy;
1271 }
1272
1273 /* Create preheaders for each loop; for meaning of FLAGS see create_preheader.  */
1274
1275 void
1276 create_preheaders (int flags)
1277 {
1278   loop_iterator li;
1279   struct loop *loop;
1280
1281   FOR_EACH_LOOP (li, loop, 0)
1282     create_preheader (loop, flags);
1283   current_loops->state |= LOOPS_HAVE_PREHEADERS;
1284 }
1285
1286 /* Forces all loop latches to have only single successor.  */
1287
1288 void
1289 force_single_succ_latches (void)
1290 {
1291   loop_iterator li;
1292   struct loop *loop;
1293   edge e;
1294
1295   FOR_EACH_LOOP (li, loop, 0)
1296     {
1297       if (loop->latch != loop->header && single_succ_p (loop->latch))
1298         continue;
1299
1300       e = find_edge (loop->latch, loop->header);
1301
1302       split_edge (e);
1303     }
1304   current_loops->state |= LOOPS_HAVE_SIMPLE_LATCHES;
1305 }
1306
1307 /* This function is called from loop_version.  It splits the entry edge
1308    of the loop we want to version, adds the versioning condition, and
1309    adjust the edges to the two versions of the loop appropriately.
1310    e is an incoming edge. Returns the basic block containing the
1311    condition.
1312
1313    --- edge e ---- > [second_head]
1314
1315    Split it and insert new conditional expression and adjust edges.
1316
1317     --- edge e ---> [cond expr] ---> [first_head]
1318                         |
1319                         +---------> [second_head]
1320
1321   THEN_PROB is the probability of then branch of the condition.  */
1322
1323 static basic_block
1324 lv_adjust_loop_entry_edge (basic_block first_head, basic_block second_head,
1325                            edge e, void *cond_expr, unsigned then_prob)
1326 {
1327   basic_block new_head = NULL;
1328   edge e1;
1329
1330   gcc_assert (e->dest == second_head);
1331
1332   /* Split edge 'e'. This will create a new basic block, where we can
1333      insert conditional expr.  */
1334   new_head = split_edge (e);
1335
1336   lv_add_condition_to_bb (first_head, second_head, new_head,
1337                           cond_expr);
1338
1339   /* Don't set EDGE_TRUE_VALUE in RTL mode, as it's invalid there.  */
1340   e = single_succ_edge (new_head);
1341   e1 = make_edge (new_head, first_head,
1342                   current_ir_type () == IR_GIMPLE ? EDGE_TRUE_VALUE : 0);
1343   e1->probability = then_prob;
1344   e->probability = REG_BR_PROB_BASE - then_prob;
1345   e1->count = RDIV (e->count * e1->probability, REG_BR_PROB_BASE);
1346   e->count = RDIV (e->count * e->probability, REG_BR_PROB_BASE);
1347
1348   set_immediate_dominator (CDI_DOMINATORS, first_head, new_head);
1349   set_immediate_dominator (CDI_DOMINATORS, second_head, new_head);
1350
1351   /* Adjust loop header phi nodes.  */
1352   lv_adjust_loop_header_phi (first_head, second_head, new_head, e1);
1353
1354   return new_head;
1355 }
1356
1357 /* Main entry point for Loop Versioning transformation.
1358
1359    This transformation given a condition and a loop, creates
1360    -if (condition) { loop_copy1 } else { loop_copy2 },
1361    where loop_copy1 is the loop transformed in one way, and loop_copy2
1362    is the loop transformed in another way (or unchanged). 'condition'
1363    may be a run time test for things that were not resolved by static
1364    analysis (overlapping ranges (anti-aliasing), alignment, etc.).
1365
1366    THEN_PROB is the probability of the then edge of the if.  THEN_SCALE
1367    is the ratio by that the frequencies in the original loop should
1368    be scaled.  ELSE_SCALE is the ratio by that the frequencies in the
1369    new loop should be scaled.
1370    
1371    If PLACE_AFTER is true, we place the new loop after LOOP in the
1372    instruction stream, otherwise it is placed before LOOP.  */
1373
1374 struct loop *
1375 loop_version (struct loop *loop,
1376               void *cond_expr, basic_block *condition_bb,
1377               unsigned then_prob, unsigned then_scale, unsigned else_scale,
1378               bool place_after)
1379 {
1380   basic_block first_head, second_head;
1381   edge entry, latch_edge, exit, true_edge, false_edge;
1382   int irred_flag;
1383   struct loop *nloop;
1384   basic_block cond_bb;
1385
1386   /* CHECKME: Loop versioning does not handle nested loop at this point.  */
1387   if (loop->inner)
1388     return NULL;
1389
1390   /* Record entry and latch edges for the loop */
1391   entry = loop_preheader_edge (loop);
1392   irred_flag = entry->flags & EDGE_IRREDUCIBLE_LOOP;
1393   entry->flags &= ~EDGE_IRREDUCIBLE_LOOP;
1394
1395   /* Note down head of loop as first_head.  */
1396   first_head = entry->dest;
1397
1398   /* Duplicate loop.  */
1399   if (!cfg_hook_duplicate_loop_to_header_edge (loop, entry, 1,
1400                                                NULL, NULL, NULL, 0))
1401     return NULL;
1402
1403   /* After duplication entry edge now points to new loop head block.
1404      Note down new head as second_head.  */
1405   second_head = entry->dest;
1406
1407   /* Split loop entry edge and insert new block with cond expr.  */
1408   cond_bb =  lv_adjust_loop_entry_edge (first_head, second_head,
1409                                         entry, cond_expr, then_prob);
1410   if (condition_bb)
1411     *condition_bb = cond_bb;
1412
1413   if (!cond_bb)
1414     {
1415       entry->flags |= irred_flag;
1416       return NULL;
1417     }
1418
1419   latch_edge = single_succ_edge (get_bb_copy (loop->latch));
1420
1421   extract_cond_bb_edges (cond_bb, &true_edge, &false_edge);
1422   nloop = loopify (latch_edge,
1423                    single_pred_edge (get_bb_copy (loop->header)),
1424                    cond_bb, true_edge, false_edge,
1425                    false /* Do not redirect all edges.  */,
1426                    then_scale, else_scale);
1427
1428   exit = single_exit (loop);
1429   if (exit)
1430     set_single_exit (nloop, find_edge (get_bb_copy (exit->src), exit->dest));
1431
1432   /* loopify redirected latch_edge. Update its PENDING_STMTS.  */
1433   lv_flush_pending_stmts (latch_edge);
1434
1435   /* loopify redirected condition_bb's succ edge. Update its PENDING_STMTS.  */
1436   extract_cond_bb_edges (cond_bb, &true_edge, &false_edge);
1437   lv_flush_pending_stmts (false_edge);
1438   /* Adjust irreducible flag.  */
1439   if (irred_flag)
1440     {
1441       cond_bb->flags |= BB_IRREDUCIBLE_LOOP;
1442       loop_preheader_edge (loop)->flags |= EDGE_IRREDUCIBLE_LOOP;
1443       loop_preheader_edge (nloop)->flags |= EDGE_IRREDUCIBLE_LOOP;
1444       single_pred_edge (cond_bb)->flags |= EDGE_IRREDUCIBLE_LOOP;
1445     }
1446
1447   if (place_after)
1448     {
1449       basic_block *bbs = get_loop_body_in_dom_order (nloop), after;
1450       unsigned i;
1451
1452       after = loop->latch;
1453
1454       for (i = 0; i < nloop->num_nodes; i++)
1455         {
1456           move_block_after (bbs[i], after);
1457           after = bbs[i];
1458         }
1459       free (bbs);
1460     }
1461
1462   /* At this point condition_bb is loop predheader with two successors,
1463      first_head and second_head.   Make sure that loop predheader has only
1464      one successor.  */
1465   split_edge (loop_preheader_edge (loop));
1466   split_edge (loop_preheader_edge (nloop));
1467
1468   return nloop;
1469 }
1470
1471 /* The structure of loops might have changed.  Some loops might get removed
1472    (and their headers and latches were set to NULL), loop exists might get
1473    removed (thus the loop nesting may be wrong), and some blocks and edges
1474    were changed (so the information about bb --> loop mapping does not have
1475    to be correct).  But still for the remaining loops the header dominates
1476    the latch, and loops did not get new subloobs (new loops might possibly
1477    get created, but we are not interested in them).  Fix up the mess.
1478
1479    If CHANGED_BBS is not NULL, basic blocks whose loop has changed are
1480    marked in it.  */
1481
1482 void
1483 fix_loop_structure (bitmap changed_bbs)
1484 {
1485   basic_block bb;
1486   struct loop *loop, *ploop;
1487   loop_iterator li;
1488
1489   /* Remove the old bb -> loop mapping.  */
1490   FOR_EACH_BB (bb)
1491     {
1492       bb->aux = (void *) (size_t) bb->loop_father->depth;
1493       bb->loop_father = current_loops->tree_root;
1494     }
1495
1496   /* Remove the dead loops from structures.  */
1497   current_loops->tree_root->num_nodes = n_basic_blocks;
1498   FOR_EACH_LOOP (li, loop, 0)
1499     {
1500       loop->num_nodes = 0;
1501       if (loop->header)
1502         continue;
1503
1504       while (loop->inner)
1505         {
1506           ploop = loop->inner;
1507           flow_loop_tree_node_remove (ploop);
1508           flow_loop_tree_node_add (loop->outer, ploop);
1509         }
1510
1511       /* Remove the loop and free its data.  */
1512       delete_loop (loop);
1513     }
1514
1515   /* Rescan the bodies of loops, starting from the outermost.  */
1516   FOR_EACH_LOOP (li, loop, 0)
1517     {
1518       loop->num_nodes = flow_loop_nodes_find (loop->header, loop);
1519     }
1520
1521   /* Now fix the loop nesting.  */
1522   FOR_EACH_LOOP (li, loop, 0)
1523     {
1524       bb = loop_preheader_edge (loop)->src;
1525       if (bb->loop_father != loop->outer)
1526         {
1527           flow_loop_tree_node_remove (loop);
1528           flow_loop_tree_node_add (bb->loop_father, loop);
1529         }
1530     }
1531
1532   /* Mark the blocks whose loop has changed.  */
1533   FOR_EACH_BB (bb)
1534     {
1535       if (changed_bbs
1536           && (void *) (size_t) bb->loop_father->depth != bb->aux)
1537         bitmap_set_bit (changed_bbs, bb->index);
1538
1539       bb->aux = NULL;
1540     }
1541
1542   if (current_loops->state & LOOPS_HAVE_MARKED_SINGLE_EXITS)
1543     mark_single_exit_loops ();
1544   if (current_loops->state & LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
1545     mark_irreducible_loops ();
1546 }