OSDN Git Service

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