OSDN Git Service

* cfgloopmanip.c (remove_path, loopify, duplicate_loop_to_header_edge):
[pf3gnuchains/gcc-fork.git] / gcc / cfgloopmanip.c
1 /* Loop manipulation code for GNU compiler.
2    Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 2, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING.  If not, write to the Free
18 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301, USA.  */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "rtl.h"
26 #include "hard-reg-set.h"
27 #include "obstack.h"
28 #include "basic-block.h"
29 #include "cfgloop.h"
30 #include "cfglayout.h"
31 #include "cfghooks.h"
32 #include "output.h"
33
34 static void duplicate_subloops (struct loop *, struct loop *);
35 static void copy_loops_to (struct loop **, int,
36                            struct loop *);
37 static void loop_redirect_edge (edge, basic_block);
38 static void remove_bbs (basic_block *, int);
39 static bool rpe_enum_p (basic_block, 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 (basic_block bb, void *data)
51 {
52   return dominated_by_p (CDI_DOMINATORS, bb, 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       && (current_loops->state & LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS) != 0)
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
415   /* Add it to loop structure.  */
416   place_new_loop (loop);
417   flow_loop_tree_node_add (outer, loop);
418
419   /* Find its nodes.  */
420   bbs = XNEWVEC (basic_block, n_basic_blocks);
421   n = get_loop_body_with_size (loop, bbs, n_basic_blocks);
422
423   for (i = 0; i < n; i++)
424     {
425       if (bbs[i]->loop_father == outer)
426         {
427           remove_bb_from_loops (bbs[i]);
428           add_bb_to_loop (bbs[i], loop);
429           continue;
430         }
431
432       loop->num_nodes++;
433
434       /* If we find a direct subloop of OUTER, move it to LOOP.  */
435       subloop = bbs[i]->loop_father;
436       if (loop_outer (subloop) == outer
437           && subloop->header == bbs[i])
438         {
439           flow_loop_tree_node_remove (subloop);
440           flow_loop_tree_node_add (loop, subloop);
441         }
442     }
443
444   free (bbs);
445 }
446
447 /* Multiply all frequencies in LOOP by NUM/DEN.  */
448 void
449 scale_loop_frequencies (struct loop *loop, int num, int den)
450 {
451   basic_block *bbs;
452
453   bbs = get_loop_body (loop);
454   scale_bbs_frequencies_int (bbs, loop->num_nodes, num, den);
455   free (bbs);
456 }
457
458 /* Make area between HEADER_EDGE and LATCH_EDGE a loop by connecting
459    latch to header and update loop tree and dominators
460    accordingly. Everything between them plus LATCH_EDGE destination must
461    be dominated by HEADER_EDGE destination, and back-reachable from
462    LATCH_EDGE source.  HEADER_EDGE is redirected to basic block SWITCH_BB,
463    FALSE_EDGE of SWITCH_BB to original destination of HEADER_EDGE and
464    TRUE_EDGE of SWITCH_BB to original destination of LATCH_EDGE.
465    Returns the newly created loop.  Frequencies and counts in the new loop
466    are scaled by FALSE_SCALE and in the old one by TRUE_SCALE.  */
467
468 struct loop *
469 loopify (edge latch_edge, edge header_edge,
470          basic_block switch_bb, edge true_edge, edge false_edge,
471          bool redirect_all_edges, unsigned true_scale, unsigned false_scale)
472 {
473   basic_block succ_bb = latch_edge->dest;
474   basic_block pred_bb = header_edge->src;
475   basic_block *body;
476   VEC (basic_block, heap) *dom_bbs;
477   unsigned i;
478   sbitmap seen;
479   struct loop *loop = alloc_loop ();
480   struct loop *outer = loop_outer (succ_bb->loop_father);
481   int freq;
482   gcov_type cnt;
483   edge e;
484   edge_iterator ei;
485
486   loop->header = header_edge->dest;
487   loop->latch = latch_edge->src;
488
489   freq = EDGE_FREQUENCY (header_edge);
490   cnt = header_edge->count;
491
492   /* Redirect edges.  */
493   loop_redirect_edge (latch_edge, loop->header);
494   loop_redirect_edge (true_edge, succ_bb);
495
496   /* During loop versioning, one of the switch_bb edge is already properly
497      set. Do not redirect it again unless redirect_all_edges is true.  */
498   if (redirect_all_edges)
499     {
500       loop_redirect_edge (header_edge, switch_bb);
501       loop_redirect_edge (false_edge, loop->header);
502
503       /* Update dominators.  */
504       set_immediate_dominator (CDI_DOMINATORS, switch_bb, pred_bb);
505       set_immediate_dominator (CDI_DOMINATORS, loop->header, switch_bb);
506     }
507
508   set_immediate_dominator (CDI_DOMINATORS, succ_bb, switch_bb);
509
510   /* Compute new loop.  */
511   add_loop (loop, outer);
512
513   /* Add switch_bb to appropriate loop.  */
514   if (switch_bb->loop_father)
515     remove_bb_from_loops (switch_bb);
516   add_bb_to_loop (switch_bb, outer);
517
518   /* Fix frequencies.  */
519   if (redirect_all_edges)
520     {
521       switch_bb->frequency = freq;
522       switch_bb->count = cnt;
523       FOR_EACH_EDGE (e, ei, switch_bb->succs)
524         {
525           e->count = (switch_bb->count * e->probability) / REG_BR_PROB_BASE;
526         }
527     }
528   scale_loop_frequencies (loop, false_scale, REG_BR_PROB_BASE);
529   scale_loop_frequencies (succ_bb->loop_father, true_scale, REG_BR_PROB_BASE);
530
531   /* Update dominators of blocks outside of LOOP.  */
532   dom_bbs = NULL;
533   seen = sbitmap_alloc (last_basic_block);
534   sbitmap_zero (seen);
535   body = get_loop_body (loop);
536
537   for (i = 0; i < loop->num_nodes; i++)
538     SET_BIT (seen, body[i]->index);
539
540   for (i = 0; i < loop->num_nodes; i++)
541     {
542       basic_block ldom;
543
544       for (ldom = first_dom_son (CDI_DOMINATORS, body[i]);
545            ldom;
546            ldom = next_dom_son (CDI_DOMINATORS, ldom))
547         if (!TEST_BIT (seen, ldom->index))
548           {
549             SET_BIT (seen, ldom->index);
550             VEC_safe_push (basic_block, heap, dom_bbs, ldom);
551           }
552     }
553
554   iterate_fix_dominators (CDI_DOMINATORS, dom_bbs, false);
555
556   free (body);
557   free (seen);
558   VEC_free (basic_block, heap, dom_bbs);
559
560   return loop;
561 }
562
563 /* Remove the latch edge of a LOOP and update loops to indicate that
564    the LOOP was removed.  After this function, original loop latch will
565    have no successor, which caller is expected to fix somehow.
566
567    If this may cause the information about irreducible regions to become
568    invalid, IRRED_INVALIDATED is set to true.  */
569
570 static void
571 unloop (struct loop *loop, bool *irred_invalidated)
572 {
573   basic_block *body;
574   struct loop *ploop;
575   unsigned i, n;
576   basic_block latch = loop->latch;
577   bool dummy = false;
578
579   if (loop_preheader_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP)
580     *irred_invalidated = true;
581
582   /* This is relatively straightforward.  The dominators are unchanged, as
583      loop header dominates loop latch, so the only thing we have to care of
584      is the placement of loops and basic blocks inside the loop tree.  We
585      move them all to the loop->outer, and then let fix_bb_placements do
586      its work.  */
587
588   body = get_loop_body (loop);
589   n = loop->num_nodes;
590   for (i = 0; i < n; i++)
591     if (body[i]->loop_father == loop)
592       {
593         remove_bb_from_loops (body[i]);
594         add_bb_to_loop (body[i], loop_outer (loop));
595       }
596   free(body);
597
598   while (loop->inner)
599     {
600       ploop = loop->inner;
601       flow_loop_tree_node_remove (ploop);
602       flow_loop_tree_node_add (loop_outer (loop), ploop);
603     }
604
605   /* Remove the loop and free its data.  */
606   delete_loop (loop);
607
608   remove_edge (single_succ_edge (latch));
609
610   /* We do not pass IRRED_INVALIDATED to fix_bb_placements here, as even if
611      there is an irreducible region inside the cancelled loop, the flags will
612      be still correct.  */
613   fix_bb_placements (latch, &dummy);
614 }
615
616 /* Fix placement of superloops of LOOP inside loop tree, i.e. ensure that
617    condition stated in description of fix_loop_placement holds for them.
618    It is used in case when we removed some edges coming out of LOOP, which
619    may cause the right placement of LOOP inside loop tree to change.
620  
621    IRRED_INVALIDATED is set to true if a change in the loop structures might
622    invalidate the information about irreducible regions.  */
623
624 static void
625 fix_loop_placements (struct loop *loop, bool *irred_invalidated)
626 {
627   struct loop *outer;
628
629   while (loop_outer (loop))
630     {
631       outer = loop_outer (loop);
632       if (!fix_loop_placement (loop))
633         break;
634
635       /* Changing the placement of a loop in the loop tree may alter the
636          validity of condition 2) of the description of fix_bb_placement
637          for its preheader, because the successor is the header and belongs
638          to the loop.  So call fix_bb_placements to fix up the placement
639          of the preheader and (possibly) of its predecessors.  */
640       fix_bb_placements (loop_preheader_edge (loop)->src,
641                          irred_invalidated);
642       loop = outer;
643     }
644 }
645
646 /* Copies copy of LOOP as subloop of TARGET loop, placing newly
647    created loop into loops structure.  */
648 struct loop *
649 duplicate_loop (struct loop *loop, struct loop *target)
650 {
651   struct loop *cloop;
652   cloop = alloc_loop ();
653   place_new_loop (cloop);
654
655   /* Mark the new loop as copy of LOOP.  */
656   set_loop_copy (loop, cloop);
657
658   /* Add it to target.  */
659   flow_loop_tree_node_add (target, cloop);
660
661   return cloop;
662 }
663
664 /* Copies structure of subloops of LOOP into TARGET loop, placing
665    newly created loops into loop tree.  */
666 static void
667 duplicate_subloops (struct loop *loop, struct loop *target)
668 {
669   struct loop *aloop, *cloop;
670
671   for (aloop = loop->inner; aloop; aloop = aloop->next)
672     {
673       cloop = duplicate_loop (aloop, target);
674       duplicate_subloops (aloop, cloop);
675     }
676 }
677
678 /* Copies structure of subloops of N loops, stored in array COPIED_LOOPS,
679    into TARGET loop, placing newly created loops into loop tree.  */
680 static void
681 copy_loops_to (struct loop **copied_loops, int n, struct loop *target)
682 {
683   struct loop *aloop;
684   int i;
685
686   for (i = 0; i < n; i++)
687     {
688       aloop = duplicate_loop (copied_loops[i], target);
689       duplicate_subloops (copied_loops[i], aloop);
690     }
691 }
692
693 /* Redirects edge E to basic block DEST.  */
694 static void
695 loop_redirect_edge (edge e, basic_block dest)
696 {
697   if (e->dest == dest)
698     return;
699
700   redirect_edge_and_branch_force (e, dest);
701 }
702
703 /* Check whether LOOP's body can be duplicated.  */
704 bool
705 can_duplicate_loop_p (struct loop *loop)
706 {
707   int ret;
708   basic_block *bbs = get_loop_body (loop);
709
710   ret = can_copy_bbs_p (bbs, loop->num_nodes);
711   free (bbs);
712
713   return ret;
714 }
715
716 /* Sets probability and count of edge E to zero.  The probability and count
717    is redistributed evenly to the remaining edges coming from E->src.  */
718
719 static void
720 set_zero_probability (edge e)
721 {
722   basic_block bb = e->src;
723   edge_iterator ei;
724   edge ae, last = NULL;
725   unsigned n = EDGE_COUNT (bb->succs);
726   gcov_type cnt = e->count, cnt1;
727   unsigned prob = e->probability, prob1;
728
729   gcc_assert (n > 1);
730   cnt1 = cnt / (n - 1);
731   prob1 = prob / (n - 1);
732
733   FOR_EACH_EDGE (ae, ei, bb->succs)
734     {
735       if (ae == e)
736         continue;
737
738       ae->probability += prob1;
739       ae->count += cnt1;
740       last = ae;
741     }
742
743   /* Move the rest to one of the edges.  */
744   last->probability += prob % (n - 1);
745   last->count += cnt % (n - 1);
746
747   e->probability = 0;
748   e->count = 0;
749 }
750
751 /* Duplicates body of LOOP to given edge E NDUPL times.  Takes care of updating
752    loop structure and dominators.  E's destination must be LOOP header for
753    this to work, i.e. it must be entry or latch edge of this loop; these are
754    unique, as the loops must have preheaders for this function to work
755    correctly (in case E is latch, the function unrolls the loop, if E is entry
756    edge, it peels the loop).  Store edges created by copying ORIG edge from
757    copies corresponding to set bits in WONT_EXIT bitmap (bit 0 corresponds to
758    original LOOP body, the other copies are numbered in order given by control
759    flow through them) into TO_REMOVE array.  Returns false if duplication is
760    impossible.  */
761
762 bool
763 duplicate_loop_to_header_edge (struct loop *loop, edge e,
764                                unsigned int ndupl, sbitmap wont_exit,
765                                edge orig, VEC (edge, heap) **to_remove,
766                                int flags)
767 {
768   struct loop *target, *aloop;
769   struct loop **orig_loops;
770   unsigned n_orig_loops;
771   basic_block header = loop->header, latch = loop->latch;
772   basic_block *new_bbs, *bbs, *first_active;
773   basic_block new_bb, bb, first_active_latch = NULL;
774   edge ae, latch_edge;
775   edge spec_edges[2], new_spec_edges[2];
776 #define SE_LATCH 0
777 #define SE_ORIG 1
778   unsigned i, j, n;
779   int is_latch = (latch == e->src);
780   int scale_act = 0, *scale_step = NULL, scale_main = 0;
781   int scale_after_exit = 0;
782   int p, freq_in, freq_le, freq_out_orig;
783   int prob_pass_thru, prob_pass_wont_exit, prob_pass_main;
784   int add_irreducible_flag;
785   basic_block place_after;
786   bitmap bbs_to_scale = NULL;
787   bitmap_iterator bi;
788
789   gcc_assert (e->dest == loop->header);
790   gcc_assert (ndupl > 0);
791
792   if (orig)
793     {
794       /* Orig must be edge out of the loop.  */
795       gcc_assert (flow_bb_inside_loop_p (loop, orig->src));
796       gcc_assert (!flow_bb_inside_loop_p (loop, orig->dest));
797     }
798
799   n = loop->num_nodes;
800   bbs = get_loop_body_in_dom_order (loop);
801   gcc_assert (bbs[0] == loop->header);
802   gcc_assert (bbs[n  - 1] == loop->latch);
803
804   /* Check whether duplication is possible.  */
805   if (!can_copy_bbs_p (bbs, loop->num_nodes))
806     {
807       free (bbs);
808       return false;
809     }
810   new_bbs = XNEWVEC (basic_block, loop->num_nodes);
811
812   /* In case we are doing loop peeling and the loop is in the middle of
813      irreducible region, the peeled copies will be inside it too.  */
814   add_irreducible_flag = e->flags & EDGE_IRREDUCIBLE_LOOP;
815   gcc_assert (!is_latch || !add_irreducible_flag);
816
817   /* Find edge from latch.  */
818   latch_edge = loop_latch_edge (loop);
819
820   if (flags & DLTHE_FLAG_UPDATE_FREQ)
821     {
822       /* Calculate coefficients by that we have to scale frequencies
823          of duplicated loop bodies.  */
824       freq_in = header->frequency;
825       freq_le = EDGE_FREQUENCY (latch_edge);
826       if (freq_in == 0)
827         freq_in = 1;
828       if (freq_in < freq_le)
829         freq_in = freq_le;
830       freq_out_orig = orig ? EDGE_FREQUENCY (orig) : freq_in - freq_le;
831       if (freq_out_orig > freq_in - freq_le)
832         freq_out_orig = freq_in - freq_le;
833       prob_pass_thru = RDIV (REG_BR_PROB_BASE * freq_le, freq_in);
834       prob_pass_wont_exit =
835               RDIV (REG_BR_PROB_BASE * (freq_le + freq_out_orig), freq_in);
836
837       if (orig
838           && REG_BR_PROB_BASE - orig->probability != 0)
839         {
840           /* The blocks that are dominated by a removed exit edge ORIG have
841              frequencies scaled by this.  */
842           scale_after_exit = RDIV (REG_BR_PROB_BASE * REG_BR_PROB_BASE,
843                                    REG_BR_PROB_BASE - orig->probability);
844           bbs_to_scale = BITMAP_ALLOC (NULL);
845           for (i = 0; i < n; i++)
846             {
847               if (bbs[i] != orig->src
848                   && dominated_by_p (CDI_DOMINATORS, bbs[i], orig->src))
849                 bitmap_set_bit (bbs_to_scale, i);
850             }
851         }
852
853       scale_step = XNEWVEC (int, ndupl);
854
855       for (i = 1; i <= ndupl; i++)
856         scale_step[i - 1] = TEST_BIT (wont_exit, i)
857                                 ? prob_pass_wont_exit
858                                 : prob_pass_thru;
859
860       /* Complete peeling is special as the probability of exit in last
861          copy becomes 1.  */
862       if (flags & DLTHE_FLAG_COMPLETTE_PEEL)
863         {
864           int wanted_freq = EDGE_FREQUENCY (e);
865
866           if (wanted_freq > freq_in)
867             wanted_freq = freq_in;
868
869           gcc_assert (!is_latch);
870           /* First copy has frequency of incoming edge.  Each subsequent
871              frequency should be reduced by prob_pass_wont_exit.  Caller
872              should've managed the flags so all except for original loop
873              has won't exist set.  */
874           scale_act = RDIV (wanted_freq * REG_BR_PROB_BASE, freq_in);
875           /* Now simulate the duplication adjustments and compute header
876              frequency of the last copy.  */
877           for (i = 0; i < ndupl; i++)
878             wanted_freq = RDIV (wanted_freq * scale_step[i], REG_BR_PROB_BASE);
879           scale_main = RDIV (wanted_freq * REG_BR_PROB_BASE, freq_in);
880         }
881       else if (is_latch)
882         {
883           prob_pass_main = TEST_BIT (wont_exit, 0)
884                                 ? prob_pass_wont_exit
885                                 : prob_pass_thru;
886           p = prob_pass_main;
887           scale_main = REG_BR_PROB_BASE;
888           for (i = 0; i < ndupl; i++)
889             {
890               scale_main += p;
891               p = RDIV (p * scale_step[i], REG_BR_PROB_BASE);
892             }
893           scale_main = RDIV (REG_BR_PROB_BASE * REG_BR_PROB_BASE, scale_main);
894           scale_act = RDIV (scale_main * prob_pass_main, REG_BR_PROB_BASE);
895         }
896       else
897         {
898           scale_main = REG_BR_PROB_BASE;
899           for (i = 0; i < ndupl; i++)
900             scale_main = RDIV (scale_main * scale_step[i], REG_BR_PROB_BASE);
901           scale_act = REG_BR_PROB_BASE - prob_pass_thru;
902         }
903       for (i = 0; i < ndupl; i++)
904         gcc_assert (scale_step[i] >= 0 && scale_step[i] <= REG_BR_PROB_BASE);
905       gcc_assert (scale_main >= 0 && scale_main <= REG_BR_PROB_BASE
906                   && scale_act >= 0  && scale_act <= REG_BR_PROB_BASE);
907     }
908
909   /* Loop the new bbs will belong to.  */
910   target = e->src->loop_father;
911
912   /* Original loops.  */
913   n_orig_loops = 0;
914   for (aloop = loop->inner; aloop; aloop = aloop->next)
915     n_orig_loops++;
916   orig_loops = XCNEWVEC (struct loop *, n_orig_loops);
917   for (aloop = loop->inner, i = 0; aloop; aloop = aloop->next, i++)
918     orig_loops[i] = aloop;
919
920   set_loop_copy (loop, target);
921
922   first_active = XNEWVEC (basic_block, n);
923   if (is_latch)
924     {
925       memcpy (first_active, bbs, n * sizeof (basic_block));
926       first_active_latch = latch;
927     }
928
929   spec_edges[SE_ORIG] = orig;
930   spec_edges[SE_LATCH] = latch_edge;
931
932   place_after = e->src;
933   for (j = 0; j < ndupl; j++)
934     {
935       /* Copy loops.  */
936       copy_loops_to (orig_loops, n_orig_loops, target);
937
938       /* Copy bbs.  */
939       copy_bbs (bbs, n, new_bbs, spec_edges, 2, new_spec_edges, loop,
940                 place_after);
941       place_after = new_spec_edges[SE_LATCH]->src;
942
943       if (flags & DLTHE_RECORD_COPY_NUMBER)
944         for (i = 0; i < n; i++)
945           {
946             gcc_assert (!new_bbs[i]->aux);
947             new_bbs[i]->aux = (void *)(size_t)(j + 1);
948           }
949
950       /* Note whether the blocks and edges belong to an irreducible loop.  */
951       if (add_irreducible_flag)
952         {
953           for (i = 0; i < n; i++)
954             new_bbs[i]->flags |= BB_DUPLICATED;
955           for (i = 0; i < n; i++)
956             {
957               edge_iterator ei;
958               new_bb = new_bbs[i];
959               if (new_bb->loop_father == target)
960                 new_bb->flags |= BB_IRREDUCIBLE_LOOP;
961
962               FOR_EACH_EDGE (ae, ei, new_bb->succs)
963                 if ((ae->dest->flags & BB_DUPLICATED)
964                     && (ae->src->loop_father == target
965                         || ae->dest->loop_father == target))
966                   ae->flags |= EDGE_IRREDUCIBLE_LOOP;
967             }
968           for (i = 0; i < n; i++)
969             new_bbs[i]->flags &= ~BB_DUPLICATED;
970         }
971
972       /* Redirect the special edges.  */
973       if (is_latch)
974         {
975           redirect_edge_and_branch_force (latch_edge, new_bbs[0]);
976           redirect_edge_and_branch_force (new_spec_edges[SE_LATCH],
977                                           loop->header);
978           set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], latch);
979           latch = loop->latch = new_bbs[n - 1];
980           e = latch_edge = new_spec_edges[SE_LATCH];
981         }
982       else
983         {
984           redirect_edge_and_branch_force (new_spec_edges[SE_LATCH],
985                                           loop->header);
986           redirect_edge_and_branch_force (e, new_bbs[0]);
987           set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], e->src);
988           e = new_spec_edges[SE_LATCH];
989         }
990
991       /* Record exit edge in this copy.  */
992       if (orig && TEST_BIT (wont_exit, j + 1))
993         {
994           if (to_remove)
995             VEC_safe_push (edge, heap, *to_remove, new_spec_edges[SE_ORIG]);
996           set_zero_probability (new_spec_edges[SE_ORIG]);
997
998           /* Scale the frequencies of the blocks dominated by the exit.  */
999           if (bbs_to_scale)
1000             {
1001               EXECUTE_IF_SET_IN_BITMAP (bbs_to_scale, 0, i, bi)
1002                 {
1003                   scale_bbs_frequencies_int (new_bbs + i, 1, scale_after_exit,
1004                                              REG_BR_PROB_BASE);
1005                 }
1006             }
1007         }
1008
1009       /* Record the first copy in the control flow order if it is not
1010          the original loop (i.e. in case of peeling).  */
1011       if (!first_active_latch)
1012         {
1013           memcpy (first_active, new_bbs, n * sizeof (basic_block));
1014           first_active_latch = new_bbs[n - 1];
1015         }
1016
1017       /* Set counts and frequencies.  */
1018       if (flags & DLTHE_FLAG_UPDATE_FREQ)
1019         {
1020           scale_bbs_frequencies_int (new_bbs, n, scale_act, REG_BR_PROB_BASE);
1021           scale_act = RDIV (scale_act * scale_step[j], REG_BR_PROB_BASE);
1022         }
1023     }
1024   free (new_bbs);
1025   free (orig_loops);
1026
1027   /* Record the exit edge in the original loop body, and update the frequencies.  */
1028   if (orig && TEST_BIT (wont_exit, 0))
1029     {
1030       if (to_remove)
1031         VEC_safe_push (edge, heap, *to_remove, orig);
1032       set_zero_probability (orig);
1033
1034       /* Scale the frequencies of the blocks dominated by the exit.  */
1035       if (bbs_to_scale)
1036         {
1037           EXECUTE_IF_SET_IN_BITMAP (bbs_to_scale, 0, i, bi)
1038             {
1039               scale_bbs_frequencies_int (bbs + i, 1, scale_after_exit,
1040                                          REG_BR_PROB_BASE);
1041             }
1042         }
1043     }
1044
1045   /* Update the original loop.  */
1046   if (!is_latch)
1047     set_immediate_dominator (CDI_DOMINATORS, e->dest, e->src);
1048   if (flags & DLTHE_FLAG_UPDATE_FREQ)
1049     {
1050       scale_bbs_frequencies_int (bbs, n, scale_main, REG_BR_PROB_BASE);
1051       free (scale_step);
1052     }
1053
1054   /* Update dominators of outer blocks if affected.  */
1055   for (i = 0; i < n; i++)
1056     {
1057       basic_block dominated, dom_bb;
1058       VEC (basic_block, heap) *dom_bbs;
1059       unsigned j;
1060
1061       bb = bbs[i];
1062       bb->aux = 0;
1063
1064       dom_bbs = get_dominated_by (CDI_DOMINATORS, bb);
1065       for (j = 0; VEC_iterate (basic_block, dom_bbs, j, dominated); j++)
1066         {
1067           if (flow_bb_inside_loop_p (loop, dominated))
1068             continue;
1069           dom_bb = nearest_common_dominator (
1070                         CDI_DOMINATORS, first_active[i], first_active_latch);
1071           set_immediate_dominator (CDI_DOMINATORS, dominated, dom_bb);
1072         }
1073       VEC_free (basic_block, heap, dom_bbs);
1074     }
1075   free (first_active);
1076
1077   free (bbs);
1078   BITMAP_FREE (bbs_to_scale);
1079
1080   return true;
1081 }
1082
1083 /* A callback for make_forwarder block, to redirect all edges except for
1084    MFB_KJ_EDGE to the entry part.  E is the edge for that we should decide
1085    whether to redirect it.  */
1086
1087 edge mfb_kj_edge;
1088 bool
1089 mfb_keep_just (edge e)
1090 {
1091   return e != mfb_kj_edge;
1092 }
1093
1094 /* Creates a pre-header for a LOOP.  Returns newly created block.  Unless
1095    CP_SIMPLE_PREHEADERS is set in FLAGS, we only force LOOP to have single
1096    entry; otherwise we also force preheader block to have only one successor.
1097    The function also updates dominators.  */
1098
1099 basic_block
1100 create_preheader (struct loop *loop, int flags)
1101 {
1102   edge e, fallthru;
1103   basic_block dummy;
1104   int nentry = 0;
1105   bool irred = false;
1106   bool latch_edge_was_fallthru;
1107   edge one_succ_pred = NULL, single_entry = NULL;
1108   edge_iterator ei;
1109
1110   FOR_EACH_EDGE (e, ei, loop->header->preds)
1111     {
1112       if (e->src == loop->latch)
1113         continue;
1114       irred |= (e->flags & EDGE_IRREDUCIBLE_LOOP) != 0;
1115       nentry++;
1116       single_entry = e;
1117       if (single_succ_p (e->src))
1118         one_succ_pred = e;
1119     }
1120   gcc_assert (nentry);
1121   if (nentry == 1)
1122     {
1123       if (/* We do not allow entry block to be the loop preheader, since we
1124              cannot emit code there.  */
1125           single_entry->src != ENTRY_BLOCK_PTR
1126           /* If we want simple preheaders, also force the preheader to have
1127              just a single successor.  */
1128           && !((flags & CP_SIMPLE_PREHEADERS)
1129                && !single_succ_p (single_entry->src)))
1130         return NULL;
1131     }
1132
1133   mfb_kj_edge = loop_latch_edge (loop);
1134   latch_edge_was_fallthru = (mfb_kj_edge->flags & EDGE_FALLTHRU) != 0;
1135   fallthru = make_forwarder_block (loop->header, mfb_keep_just, NULL);
1136   dummy = fallthru->src;
1137   loop->header = fallthru->dest;
1138
1139   /* Try to be clever in placing the newly created preheader.  The idea is to
1140      avoid breaking any "fallthruness" relationship between blocks.
1141
1142      The preheader was created just before the header and all incoming edges
1143      to the header were redirected to the preheader, except the latch edge.
1144      So the only problematic case is when this latch edge was a fallthru
1145      edge: it is not anymore after the preheader creation so we have broken
1146      the fallthruness.  We're therefore going to look for a better place.  */
1147   if (latch_edge_was_fallthru)
1148     {
1149       if (one_succ_pred)
1150         e = one_succ_pred;
1151       else
1152         e = EDGE_PRED (dummy, 0);
1153
1154       move_block_after (dummy, e->src);
1155     }
1156
1157   if (irred)
1158     {
1159       dummy->flags |= BB_IRREDUCIBLE_LOOP;
1160       single_succ_edge (dummy)->flags |= EDGE_IRREDUCIBLE_LOOP;
1161     }
1162
1163   if (dump_file)
1164     fprintf (dump_file, "Created preheader block for loop %i\n",
1165              loop->num);
1166
1167   return dummy;
1168 }
1169
1170 /* Create preheaders for each loop; for meaning of FLAGS see create_preheader.  */
1171
1172 void
1173 create_preheaders (int flags)
1174 {
1175   loop_iterator li;
1176   struct loop *loop;
1177
1178   if (!current_loops)
1179     return;
1180
1181   FOR_EACH_LOOP (li, loop, 0)
1182     create_preheader (loop, flags);
1183   current_loops->state |= LOOPS_HAVE_PREHEADERS;
1184 }
1185
1186 /* Forces all loop latches to have only single successor.  */
1187
1188 void
1189 force_single_succ_latches (void)
1190 {
1191   loop_iterator li;
1192   struct loop *loop;
1193   edge e;
1194
1195   FOR_EACH_LOOP (li, loop, 0)
1196     {
1197       if (loop->latch != loop->header && single_succ_p (loop->latch))
1198         continue;
1199
1200       e = find_edge (loop->latch, loop->header);
1201
1202       split_edge (e);
1203     }
1204   current_loops->state |= LOOPS_HAVE_SIMPLE_LATCHES;
1205 }
1206
1207 /* This function is called from loop_version.  It splits the entry edge
1208    of the loop we want to version, adds the versioning condition, and
1209    adjust the edges to the two versions of the loop appropriately.
1210    e is an incoming edge. Returns the basic block containing the
1211    condition.
1212
1213    --- edge e ---- > [second_head]
1214
1215    Split it and insert new conditional expression and adjust edges.
1216
1217     --- edge e ---> [cond expr] ---> [first_head]
1218                         |
1219                         +---------> [second_head]
1220
1221   THEN_PROB is the probability of then branch of the condition.  */
1222
1223 static basic_block
1224 lv_adjust_loop_entry_edge (basic_block first_head, basic_block second_head,
1225                            edge e, void *cond_expr, unsigned then_prob)
1226 {
1227   basic_block new_head = NULL;
1228   edge e1;
1229
1230   gcc_assert (e->dest == second_head);
1231
1232   /* Split edge 'e'. This will create a new basic block, where we can
1233      insert conditional expr.  */
1234   new_head = split_edge (e);
1235
1236   lv_add_condition_to_bb (first_head, second_head, new_head,
1237                           cond_expr);
1238
1239   /* Don't set EDGE_TRUE_VALUE in RTL mode, as it's invalid there.  */
1240   e = single_succ_edge (new_head);
1241   e1 = make_edge (new_head, first_head,
1242                   current_ir_type () == IR_GIMPLE ? EDGE_TRUE_VALUE : 0);
1243   e1->probability = then_prob;
1244   e->probability = REG_BR_PROB_BASE - then_prob;
1245   e1->count = RDIV (e->count * e1->probability, REG_BR_PROB_BASE);
1246   e->count = RDIV (e->count * e->probability, REG_BR_PROB_BASE);
1247
1248   set_immediate_dominator (CDI_DOMINATORS, first_head, new_head);
1249   set_immediate_dominator (CDI_DOMINATORS, second_head, new_head);
1250
1251   /* Adjust loop header phi nodes.  */
1252   lv_adjust_loop_header_phi (first_head, second_head, new_head, e1);
1253
1254   return new_head;
1255 }
1256
1257 /* Main entry point for Loop Versioning transformation.
1258
1259    This transformation given a condition and a loop, creates
1260    -if (condition) { loop_copy1 } else { loop_copy2 },
1261    where loop_copy1 is the loop transformed in one way, and loop_copy2
1262    is the loop transformed in another way (or unchanged). 'condition'
1263    may be a run time test for things that were not resolved by static
1264    analysis (overlapping ranges (anti-aliasing), alignment, etc.).
1265
1266    THEN_PROB is the probability of the then edge of the if.  THEN_SCALE
1267    is the ratio by that the frequencies in the original loop should
1268    be scaled.  ELSE_SCALE is the ratio by that the frequencies in the
1269    new loop should be scaled.
1270    
1271    If PLACE_AFTER is true, we place the new loop after LOOP in the
1272    instruction stream, otherwise it is placed before LOOP.  */
1273
1274 struct loop *
1275 loop_version (struct loop *loop,
1276               void *cond_expr, basic_block *condition_bb,
1277               unsigned then_prob, unsigned then_scale, unsigned else_scale,
1278               bool place_after)
1279 {
1280   basic_block first_head, second_head;
1281   edge entry, latch_edge, true_edge, false_edge;
1282   int irred_flag;
1283   struct loop *nloop;
1284   basic_block cond_bb;
1285
1286   /* CHECKME: Loop versioning does not handle nested loop at this point.  */
1287   if (loop->inner)
1288     return NULL;
1289
1290   /* Record entry and latch edges for the loop */
1291   entry = loop_preheader_edge (loop);
1292   irred_flag = entry->flags & EDGE_IRREDUCIBLE_LOOP;
1293   entry->flags &= ~EDGE_IRREDUCIBLE_LOOP;
1294
1295   /* Note down head of loop as first_head.  */
1296   first_head = entry->dest;
1297
1298   /* Duplicate loop.  */
1299   if (!cfg_hook_duplicate_loop_to_header_edge (loop, entry, 1,
1300                                                NULL, NULL, NULL, 0))
1301     return NULL;
1302
1303   /* After duplication entry edge now points to new loop head block.
1304      Note down new head as second_head.  */
1305   second_head = entry->dest;
1306
1307   /* Split loop entry edge and insert new block with cond expr.  */
1308   cond_bb =  lv_adjust_loop_entry_edge (first_head, second_head,
1309                                         entry, cond_expr, then_prob);
1310   if (condition_bb)
1311     *condition_bb = cond_bb;
1312
1313   if (!cond_bb)
1314     {
1315       entry->flags |= irred_flag;
1316       return NULL;
1317     }
1318
1319   latch_edge = single_succ_edge (get_bb_copy (loop->latch));
1320
1321   extract_cond_bb_edges (cond_bb, &true_edge, &false_edge);
1322   nloop = loopify (latch_edge,
1323                    single_pred_edge (get_bb_copy (loop->header)),
1324                    cond_bb, true_edge, false_edge,
1325                    false /* Do not redirect all edges.  */,
1326                    then_scale, else_scale);
1327
1328   /* loopify redirected latch_edge. Update its PENDING_STMTS.  */
1329   lv_flush_pending_stmts (latch_edge);
1330
1331   /* loopify redirected condition_bb's succ edge. Update its PENDING_STMTS.  */
1332   extract_cond_bb_edges (cond_bb, &true_edge, &false_edge);
1333   lv_flush_pending_stmts (false_edge);
1334   /* Adjust irreducible flag.  */
1335   if (irred_flag)
1336     {
1337       cond_bb->flags |= BB_IRREDUCIBLE_LOOP;
1338       loop_preheader_edge (loop)->flags |= EDGE_IRREDUCIBLE_LOOP;
1339       loop_preheader_edge (nloop)->flags |= EDGE_IRREDUCIBLE_LOOP;
1340       single_pred_edge (cond_bb)->flags |= EDGE_IRREDUCIBLE_LOOP;
1341     }
1342
1343   if (place_after)
1344     {
1345       basic_block *bbs = get_loop_body_in_dom_order (nloop), after;
1346       unsigned i;
1347
1348       after = loop->latch;
1349
1350       for (i = 0; i < nloop->num_nodes; i++)
1351         {
1352           move_block_after (bbs[i], after);
1353           after = bbs[i];
1354         }
1355       free (bbs);
1356     }
1357
1358   /* At this point condition_bb is loop predheader with two successors,
1359      first_head and second_head.   Make sure that loop predheader has only
1360      one successor.  */
1361   split_edge (loop_preheader_edge (loop));
1362   split_edge (loop_preheader_edge (nloop));
1363
1364   return nloop;
1365 }
1366
1367 /* The structure of loops might have changed.  Some loops might get removed
1368    (and their headers and latches were set to NULL), loop exists might get
1369    removed (thus the loop nesting may be wrong), and some blocks and edges
1370    were changed (so the information about bb --> loop mapping does not have
1371    to be correct).  But still for the remaining loops the header dominates
1372    the latch, and loops did not get new subloobs (new loops might possibly
1373    get created, but we are not interested in them).  Fix up the mess.
1374
1375    If CHANGED_BBS is not NULL, basic blocks whose loop has changed are
1376    marked in it.  */
1377
1378 void
1379 fix_loop_structure (bitmap changed_bbs)
1380 {
1381   basic_block bb;
1382   struct loop *loop, *ploop;
1383   loop_iterator li;
1384   bool record_exits = false;
1385   struct loop **superloop = XNEWVEC (struct loop *, number_of_loops ());
1386
1387   gcc_assert (current_loops->state & LOOPS_HAVE_SIMPLE_LATCHES);
1388
1389   /* Remove the old bb -> loop mapping.  Remember the depth of the blocks in
1390      the loop hierarchy, so that we can recognize blocks whose loop nesting
1391      relationship has changed.  */
1392   FOR_EACH_BB (bb)
1393     {
1394       if (changed_bbs)
1395         bb->aux = (void *) (size_t) loop_depth (bb->loop_father);
1396       bb->loop_father = current_loops->tree_root;
1397     }
1398
1399   if (current_loops->state & LOOPS_HAVE_RECORDED_EXITS)
1400     {
1401       release_recorded_exits ();
1402       record_exits = true;
1403     }
1404
1405   /* Remove the dead loops from structures.  We start from the innermost
1406      loops, so that when we remove the loops, we know that the loops inside
1407      are preserved, and do not waste time relinking loops that will be
1408      removed later.  */
1409   FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
1410     {
1411       if (loop->header)
1412         continue;
1413
1414       while (loop->inner)
1415         {
1416           ploop = loop->inner;
1417           flow_loop_tree_node_remove (ploop);
1418           flow_loop_tree_node_add (loop_outer (loop), ploop);
1419         }
1420
1421       /* Remove the loop and free its data.  */
1422       delete_loop (loop);
1423     }
1424
1425   /* Rescan the bodies of loops, starting from the outermost ones.  We assume
1426      that no optimization interchanges the order of the loops, i.e., it cannot
1427      happen that L1 was superloop of L2 before and it is subloop of L2 now
1428      (without explicitly updating loop information).  At the same time, we also
1429      determine the new loop structure.  */
1430   current_loops->tree_root->num_nodes = n_basic_blocks;
1431   FOR_EACH_LOOP (li, loop, 0)
1432     {
1433       superloop[loop->num] = loop->header->loop_father;
1434       loop->num_nodes = flow_loop_nodes_find (loop->header, loop);
1435     }
1436
1437   /* Now fix the loop nesting.  */
1438   FOR_EACH_LOOP (li, loop, 0)
1439     {
1440       ploop = superloop[loop->num];
1441       if (ploop != loop_outer (loop))
1442         {
1443           flow_loop_tree_node_remove (loop);
1444           flow_loop_tree_node_add (ploop, loop);
1445         }
1446     }
1447   free (superloop);
1448
1449   /* Mark the blocks whose loop has changed.  */
1450   if (changed_bbs)
1451     {
1452       FOR_EACH_BB (bb)
1453         {
1454           if ((void *) (size_t) loop_depth (bb->loop_father) != bb->aux)
1455             bitmap_set_bit (changed_bbs, bb->index);
1456
1457           bb->aux = NULL;
1458         }
1459     }
1460
1461   if (current_loops->state & LOOPS_HAVE_PREHEADERS)
1462     create_preheaders (CP_SIMPLE_PREHEADERS);
1463
1464   if (current_loops->state & LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
1465     mark_irreducible_loops ();
1466
1467   if (record_exits)
1468     record_loop_exits ();
1469
1470 #ifdef ENABLE_CHECKING
1471   verify_loop_structure ();
1472 #endif
1473 }