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