OSDN Git Service

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