2007-01-03 Paul Brook <paul@codesourcery.com>
[official-gcc.git] / gcc / cfgloopmanip.c
blobfd7597e9a124d1cf1041a3a341e302d078709d3c
1 /* Loop manipulation code for GNU compiler.
2 Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4 This file is part of GCC.
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.
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.
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. */
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"
34 static void duplicate_subloops (struct loop *, struct loop *);
35 static void copy_loops_to (struct loop **, int,
36 struct loop *);
37 static void loop_redirect_edge (edge, basic_block);
38 static bool loop_delete_branch_edge (edge, int);
39 static void remove_bbs (basic_block *, int);
40 static bool rpe_enum_p (basic_block, void *);
41 static int find_path (edge, basic_block **);
42 static bool alp_enum_p (basic_block, void *);
43 static void fix_loop_placements (struct loop *, bool *);
44 static bool fix_bb_placement (basic_block);
45 static void fix_bb_placements (basic_block, bool *);
46 static void place_new_loop (struct loop *);
47 static basic_block create_preheader (struct loop *, int);
48 static void unloop (struct loop *, bool *);
50 #define RDIV(X,Y) (((X) + (Y) / 2) / (Y))
52 /* Checks whether basic block BB is dominated by DATA. */
53 static bool
54 rpe_enum_p (basic_block bb, void *data)
56 return dominated_by_p (CDI_DOMINATORS, bb, data);
59 /* Remove basic blocks BBS. NBBS is the number of the basic blocks. */
61 static void
62 remove_bbs (basic_block *bbs, int nbbs)
64 int i;
66 for (i = 0; i < nbbs; i++)
67 delete_basic_block (bbs[i]);
70 /* Find path -- i.e. the basic blocks dominated by edge E and put them
71 into array BBS, that will be allocated large enough to contain them.
72 E->dest must have exactly one predecessor for this to work (it is
73 easy to achieve and we do not put it here because we do not want to
74 alter anything by this function). The number of basic blocks in the
75 path is returned. */
76 static int
77 find_path (edge e, basic_block **bbs)
79 gcc_assert (EDGE_COUNT (e->dest->preds) <= 1);
81 /* Find bbs in the path. */
82 *bbs = XCNEWVEC (basic_block, n_basic_blocks);
83 return dfs_enumerate_from (e->dest, 0, rpe_enum_p, *bbs,
84 n_basic_blocks, e->dest);
87 /* Fix placement of basic block BB inside loop hierarchy --
88 Let L be a loop to that BB belongs. Then every successor of BB must either
89 1) belong to some superloop of loop L, or
90 2) be a header of loop K such that K->outer is superloop of L
91 Returns true if we had to move BB into other loop to enforce this condition,
92 false if the placement of BB was already correct (provided that placements
93 of its successors are correct). */
94 static bool
95 fix_bb_placement (basic_block bb)
97 edge e;
98 edge_iterator ei;
99 struct loop *loop = current_loops->tree_root, *act;
101 FOR_EACH_EDGE (e, ei, bb->succs)
103 if (e->dest == EXIT_BLOCK_PTR)
104 continue;
106 act = e->dest->loop_father;
107 if (act->header == e->dest)
108 act = act->outer;
110 if (flow_loop_nested_p (loop, act))
111 loop = act;
114 if (loop == bb->loop_father)
115 return false;
117 remove_bb_from_loops (bb);
118 add_bb_to_loop (bb, loop);
120 return true;
123 /* Fix placements of basic blocks inside loop hierarchy stored in loops; i.e.
124 enforce condition condition stated in description of fix_bb_placement. We
125 start from basic block FROM that had some of its successors removed, so that
126 his placement no longer has to be correct, and iteratively fix placement of
127 its predecessors that may change if placement of FROM changed. Also fix
128 placement of subloops of FROM->loop_father, that might also be altered due
129 to this change; the condition for them is similar, except that instead of
130 successors we consider edges coming out of the loops.
132 If the changes may invalidate the information about irreducible regions,
133 IRRED_INVALIDATED is set to true. */
135 static void
136 fix_bb_placements (basic_block from,
137 bool *irred_invalidated)
139 sbitmap in_queue;
140 basic_block *queue, *qtop, *qbeg, *qend;
141 struct loop *base_loop;
142 edge e;
144 /* We pass through blocks back-reachable from FROM, testing whether some
145 of their successors moved to outer loop. It may be necessary to
146 iterate several times, but it is finite, as we stop unless we move
147 the basic block up the loop structure. The whole story is a bit
148 more complicated due to presence of subloops, those are moved using
149 fix_loop_placement. */
151 base_loop = from->loop_father;
152 if (base_loop == current_loops->tree_root)
153 return;
155 in_queue = sbitmap_alloc (last_basic_block);
156 sbitmap_zero (in_queue);
157 SET_BIT (in_queue, from->index);
158 /* Prevent us from going out of the base_loop. */
159 SET_BIT (in_queue, base_loop->header->index);
161 queue = XNEWVEC (basic_block, base_loop->num_nodes + 1);
162 qtop = queue + base_loop->num_nodes + 1;
163 qbeg = queue;
164 qend = queue + 1;
165 *qbeg = from;
167 while (qbeg != qend)
169 edge_iterator ei;
170 from = *qbeg;
171 qbeg++;
172 if (qbeg == qtop)
173 qbeg = queue;
174 RESET_BIT (in_queue, from->index);
176 if (from->loop_father->header == from)
178 /* Subloop header, maybe move the loop upward. */
179 if (!fix_loop_placement (from->loop_father))
180 continue;
182 else
184 /* Ordinary basic block. */
185 if (!fix_bb_placement (from))
186 continue;
189 FOR_EACH_EDGE (e, ei, from->succs)
191 if (e->flags & EDGE_IRREDUCIBLE_LOOP)
192 *irred_invalidated = true;
195 /* Something has changed, insert predecessors into queue. */
196 FOR_EACH_EDGE (e, ei, from->preds)
198 basic_block pred = e->src;
199 struct loop *nca;
201 if (e->flags & EDGE_IRREDUCIBLE_LOOP)
202 *irred_invalidated = true;
204 if (TEST_BIT (in_queue, pred->index))
205 continue;
207 /* If it is subloop, then it either was not moved, or
208 the path up the loop tree from base_loop do not contain
209 it. */
210 nca = find_common_loop (pred->loop_father, base_loop);
211 if (pred->loop_father != base_loop
212 && (nca == base_loop
213 || nca != pred->loop_father))
214 pred = pred->loop_father->header;
215 else if (!flow_loop_nested_p (from->loop_father, pred->loop_father))
217 /* No point in processing it. */
218 continue;
221 if (TEST_BIT (in_queue, pred->index))
222 continue;
224 /* Schedule the basic block. */
225 *qend = pred;
226 qend++;
227 if (qend == qtop)
228 qend = queue;
229 SET_BIT (in_queue, pred->index);
232 free (in_queue);
233 free (queue);
236 /* Removes path beginning at edge E, i.e. remove basic blocks dominated by E
237 and update loop structures and dominators. Return true if we were able
238 to remove the path, false otherwise (and nothing is affected then). */
239 bool
240 remove_path (edge e)
242 edge ae;
243 basic_block *rem_bbs, *bord_bbs, *dom_bbs, from, bb;
244 int i, nrem, n_bord_bbs, n_dom_bbs, nreml;
245 sbitmap seen;
246 bool deleted, irred_invalidated = false;
247 struct loop **deleted_loop;
249 if (!loop_delete_branch_edge (e, 0))
250 return false;
252 /* Keep track of whether we need to update information about irreducible
253 regions. This is the case if the removed area is a part of the
254 irreducible region, or if the set of basic blocks that belong to a loop
255 that is inside an irreducible region is changed, or if such a loop is
256 removed. */
257 if (e->flags & EDGE_IRREDUCIBLE_LOOP)
258 irred_invalidated = true;
260 /* We need to check whether basic blocks are dominated by the edge
261 e, but we only have basic block dominators. This is easy to
262 fix -- when e->dest has exactly one predecessor, this corresponds
263 to blocks dominated by e->dest, if not, split the edge. */
264 if (!single_pred_p (e->dest))
265 e = single_pred_edge (split_edge (e));
267 /* It may happen that by removing path we remove one or more loops
268 we belong to. In this case first unloop the loops, then proceed
269 normally. We may assume that e->dest is not a header of any loop,
270 as it now has exactly one predecessor. */
271 while (e->src->loop_father->outer
272 && dominated_by_p (CDI_DOMINATORS,
273 e->src->loop_father->latch, e->dest))
274 unloop (e->src->loop_father, &irred_invalidated);
276 /* Identify the path. */
277 nrem = find_path (e, &rem_bbs);
279 n_bord_bbs = 0;
280 bord_bbs = XCNEWVEC (basic_block, n_basic_blocks);
281 seen = sbitmap_alloc (last_basic_block);
282 sbitmap_zero (seen);
284 /* Find "border" hexes -- i.e. those with predecessor in removed path. */
285 for (i = 0; i < nrem; i++)
286 SET_BIT (seen, rem_bbs[i]->index);
287 for (i = 0; i < nrem; i++)
289 edge_iterator ei;
290 bb = rem_bbs[i];
291 FOR_EACH_EDGE (ae, ei, rem_bbs[i]->succs)
292 if (ae->dest != EXIT_BLOCK_PTR && !TEST_BIT (seen, ae->dest->index))
294 SET_BIT (seen, ae->dest->index);
295 bord_bbs[n_bord_bbs++] = ae->dest;
297 if (ae->flags & EDGE_IRREDUCIBLE_LOOP)
298 irred_invalidated = true;
302 /* Remove the path. */
303 from = e->src;
304 deleted = loop_delete_branch_edge (e, 1);
305 gcc_assert (deleted);
306 dom_bbs = XCNEWVEC (basic_block, n_basic_blocks);
308 /* Cancel loops contained in the path. */
309 deleted_loop = XNEWVEC (struct loop *, nrem);
310 nreml = 0;
311 for (i = 0; i < nrem; i++)
312 if (rem_bbs[i]->loop_father->header == rem_bbs[i])
313 deleted_loop[nreml++] = rem_bbs[i]->loop_father;
315 remove_bbs (rem_bbs, nrem);
316 free (rem_bbs);
318 for (i = 0; i < nreml; i++)
319 cancel_loop_tree (deleted_loop[i]);
320 free (deleted_loop);
322 /* Find blocks whose dominators may be affected. */
323 n_dom_bbs = 0;
324 sbitmap_zero (seen);
325 for (i = 0; i < n_bord_bbs; i++)
327 basic_block ldom;
329 bb = get_immediate_dominator (CDI_DOMINATORS, bord_bbs[i]);
330 if (TEST_BIT (seen, bb->index))
331 continue;
332 SET_BIT (seen, bb->index);
334 for (ldom = first_dom_son (CDI_DOMINATORS, bb);
335 ldom;
336 ldom = next_dom_son (CDI_DOMINATORS, ldom))
337 if (!dominated_by_p (CDI_DOMINATORS, from, ldom))
338 dom_bbs[n_dom_bbs++] = ldom;
341 free (seen);
343 /* Recount dominators. */
344 iterate_fix_dominators (CDI_DOMINATORS, dom_bbs, n_dom_bbs);
345 free (dom_bbs);
346 free (bord_bbs);
348 /* Fix placements of basic blocks inside loops and the placement of
349 loops in the loop tree. */
350 fix_bb_placements (from, &irred_invalidated);
351 fix_loop_placements (from->loop_father, &irred_invalidated);
353 if (irred_invalidated
354 && (current_loops->state & LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS) != 0)
355 mark_irreducible_loops ();
357 return true;
360 /* Predicate for enumeration in add_loop. */
361 static bool
362 alp_enum_p (basic_block bb, void *alp_header)
364 return bb != (basic_block) alp_header;
367 /* Given LOOP structure with filled header and latch, find the body of the
368 corresponding loop and add it to loops tree. Insert the LOOP as a son of
369 outer. */
371 static void
372 add_loop (struct loop *loop, struct loop *outer)
374 basic_block *bbs;
375 int i, n;
377 /* Add it to loop structure. */
378 place_new_loop (loop);
379 flow_loop_tree_node_add (outer, loop);
381 /* Find its nodes. */
382 bbs = XCNEWVEC (basic_block, n_basic_blocks);
383 n = dfs_enumerate_from (loop->latch, 1, alp_enum_p,
384 bbs, n_basic_blocks, loop->header);
386 for (i = 0; i < n; i++)
388 remove_bb_from_loops (bbs[i]);
389 add_bb_to_loop (bbs[i], loop);
391 remove_bb_from_loops (loop->header);
392 add_bb_to_loop (loop->header, loop);
394 free (bbs);
397 /* Multiply all frequencies in LOOP by NUM/DEN. */
398 void
399 scale_loop_frequencies (struct loop *loop, int num, int den)
401 basic_block *bbs;
403 bbs = get_loop_body (loop);
404 scale_bbs_frequencies_int (bbs, loop->num_nodes, num, den);
405 free (bbs);
408 /* Make area between HEADER_EDGE and LATCH_EDGE a loop by connecting
409 latch to header and update loop tree and dominators
410 accordingly. Everything between them plus LATCH_EDGE destination must
411 be dominated by HEADER_EDGE destination, and back-reachable from
412 LATCH_EDGE source. HEADER_EDGE is redirected to basic block SWITCH_BB,
413 FALSE_EDGE of SWITCH_BB to original destination of HEADER_EDGE and
414 TRUE_EDGE of SWITCH_BB to original destination of LATCH_EDGE.
415 Returns the newly created loop. Frequencies and counts in the new loop
416 are scaled by FALSE_SCALE and in the old one by TRUE_SCALE. */
418 struct loop *
419 loopify (edge latch_edge, edge header_edge,
420 basic_block switch_bb, edge true_edge, edge false_edge,
421 bool redirect_all_edges, unsigned true_scale, unsigned false_scale)
423 basic_block succ_bb = latch_edge->dest;
424 basic_block pred_bb = header_edge->src;
425 basic_block *dom_bbs, *body;
426 unsigned n_dom_bbs, i;
427 sbitmap seen;
428 struct loop *loop = XCNEW (struct loop);
429 struct loop *outer = succ_bb->loop_father->outer;
430 int freq;
431 gcov_type cnt;
432 edge e;
433 edge_iterator ei;
435 loop->header = header_edge->dest;
436 loop->latch = latch_edge->src;
438 freq = EDGE_FREQUENCY (header_edge);
439 cnt = header_edge->count;
441 /* Redirect edges. */
442 loop_redirect_edge (latch_edge, loop->header);
443 loop_redirect_edge (true_edge, succ_bb);
445 /* During loop versioning, one of the switch_bb edge is already properly
446 set. Do not redirect it again unless redirect_all_edges is true. */
447 if (redirect_all_edges)
449 loop_redirect_edge (header_edge, switch_bb);
450 loop_redirect_edge (false_edge, loop->header);
452 /* Update dominators. */
453 set_immediate_dominator (CDI_DOMINATORS, switch_bb, pred_bb);
454 set_immediate_dominator (CDI_DOMINATORS, loop->header, switch_bb);
457 set_immediate_dominator (CDI_DOMINATORS, succ_bb, switch_bb);
459 /* Compute new loop. */
460 add_loop (loop, outer);
462 /* Add switch_bb to appropriate loop. */
463 if (switch_bb->loop_father)
464 remove_bb_from_loops (switch_bb);
465 add_bb_to_loop (switch_bb, outer);
467 /* Fix frequencies. */
468 if (redirect_all_edges)
470 switch_bb->frequency = freq;
471 switch_bb->count = cnt;
472 FOR_EACH_EDGE (e, ei, switch_bb->succs)
474 e->count = (switch_bb->count * e->probability) / REG_BR_PROB_BASE;
477 scale_loop_frequencies (loop, false_scale, REG_BR_PROB_BASE);
478 scale_loop_frequencies (succ_bb->loop_father, true_scale, REG_BR_PROB_BASE);
480 /* Update dominators of blocks outside of LOOP. */
481 dom_bbs = XCNEWVEC (basic_block, n_basic_blocks);
482 n_dom_bbs = 0;
483 seen = sbitmap_alloc (last_basic_block);
484 sbitmap_zero (seen);
485 body = get_loop_body (loop);
487 for (i = 0; i < loop->num_nodes; i++)
488 SET_BIT (seen, body[i]->index);
490 for (i = 0; i < loop->num_nodes; i++)
492 basic_block ldom;
494 for (ldom = first_dom_son (CDI_DOMINATORS, body[i]);
495 ldom;
496 ldom = next_dom_son (CDI_DOMINATORS, ldom))
497 if (!TEST_BIT (seen, ldom->index))
499 SET_BIT (seen, ldom->index);
500 dom_bbs[n_dom_bbs++] = ldom;
504 iterate_fix_dominators (CDI_DOMINATORS, dom_bbs, n_dom_bbs);
506 free (body);
507 free (seen);
508 free (dom_bbs);
510 return loop;
513 /* Remove the latch edge of a LOOP and update loops to indicate that
514 the LOOP was removed. After this function, original loop latch will
515 have no successor, which caller is expected to fix somehow.
517 If this may cause the information about irreducible regions to become
518 invalid, IRRED_INVALIDATED is set to true. */
520 static void
521 unloop (struct loop *loop, bool *irred_invalidated)
523 basic_block *body;
524 struct loop *ploop;
525 unsigned i, n;
526 basic_block latch = loop->latch;
527 bool dummy = false;
529 if (loop_preheader_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP)
530 *irred_invalidated = true;
532 /* This is relatively straightforward. The dominators are unchanged, as
533 loop header dominates loop latch, so the only thing we have to care of
534 is the placement of loops and basic blocks inside the loop tree. We
535 move them all to the loop->outer, and then let fix_bb_placements do
536 its work. */
538 body = get_loop_body (loop);
539 n = loop->num_nodes;
540 for (i = 0; i < n; i++)
541 if (body[i]->loop_father == loop)
543 remove_bb_from_loops (body[i]);
544 add_bb_to_loop (body[i], loop->outer);
546 free(body);
548 while (loop->inner)
550 ploop = loop->inner;
551 flow_loop_tree_node_remove (ploop);
552 flow_loop_tree_node_add (loop->outer, ploop);
555 /* Remove the loop and free its data. */
556 delete_loop (loop);
558 remove_edge (single_succ_edge (latch));
560 /* We do not pass IRRED_INVALIDATED to fix_bb_placements here, as even if
561 there is an irreducible region inside the cancelled loop, the flags will
562 be still correct. */
563 fix_bb_placements (latch, &dummy);
566 /* Fix placement of LOOP inside loop tree, i.e. find the innermost superloop
567 FATHER of LOOP such that all of the edges coming out of LOOP belong to
568 FATHER, and set it as outer loop of LOOP. Return true if placement of
569 LOOP changed. */
572 fix_loop_placement (struct loop *loop)
574 basic_block *body;
575 unsigned i;
576 edge e;
577 edge_iterator ei;
578 struct loop *father = loop->pred[0], *act;
580 body = get_loop_body (loop);
581 for (i = 0; i < loop->num_nodes; i++)
582 FOR_EACH_EDGE (e, ei, body[i]->succs)
583 if (!flow_bb_inside_loop_p (loop, e->dest))
585 act = find_common_loop (loop, e->dest->loop_father);
586 if (flow_loop_nested_p (father, act))
587 father = act;
589 free (body);
591 if (father != loop->outer)
593 for (act = loop->outer; act != father; act = act->outer)
594 act->num_nodes -= loop->num_nodes;
595 flow_loop_tree_node_remove (loop);
596 flow_loop_tree_node_add (father, loop);
597 return 1;
599 return 0;
602 /* Fix placement of superloops of LOOP inside loop tree, i.e. ensure that
603 condition stated in description of fix_loop_placement holds for them.
604 It is used in case when we removed some edges coming out of LOOP, which
605 may cause the right placement of LOOP inside loop tree to change.
607 IRRED_INVALIDATED is set to true if a change in the loop structures might
608 invalidate the information about irreducible regions. */
610 static void
611 fix_loop_placements (struct loop *loop, bool *irred_invalidated)
613 struct loop *outer;
615 while (loop->outer)
617 outer = loop->outer;
618 if (!fix_loop_placement (loop))
619 break;
621 /* Changing the placement of a loop in the loop tree may alter the
622 validity of condition 2) of the description of fix_bb_placement
623 for its preheader, because the successor is the header and belongs
624 to the loop. So call fix_bb_placements to fix up the placement
625 of the preheader and (possibly) of its predecessors. */
626 fix_bb_placements (loop_preheader_edge (loop)->src,
627 irred_invalidated);
628 loop = outer;
632 /* Creates place for a new LOOP in loops structure. */
633 static void
634 place_new_loop (struct loop *loop)
636 loop->num = number_of_loops ();
637 VEC_safe_push (loop_p, heap, current_loops->larray, loop);
640 /* Copies copy of LOOP as subloop of TARGET loop, placing newly
641 created loop into loops structure. */
642 struct loop *
643 duplicate_loop (struct loop *loop, struct loop *target)
645 struct loop *cloop;
646 cloop = XCNEW (struct loop);
647 place_new_loop (cloop);
649 /* Mark the new loop as copy of LOOP. */
650 loop->copy = cloop;
652 /* Add it to target. */
653 flow_loop_tree_node_add (target, cloop);
655 return cloop;
658 /* Copies structure of subloops of LOOP into TARGET loop, placing
659 newly created loops into loop tree. */
660 static void
661 duplicate_subloops (struct loop *loop, struct loop *target)
663 struct loop *aloop, *cloop;
665 for (aloop = loop->inner; aloop; aloop = aloop->next)
667 cloop = duplicate_loop (aloop, target);
668 duplicate_subloops (aloop, cloop);
672 /* Copies structure of subloops of N loops, stored in array COPIED_LOOPS,
673 into TARGET loop, placing newly created loops into loop tree. */
674 static void
675 copy_loops_to (struct loop **copied_loops, int n, struct loop *target)
677 struct loop *aloop;
678 int i;
680 for (i = 0; i < n; i++)
682 aloop = duplicate_loop (copied_loops[i], target);
683 duplicate_subloops (copied_loops[i], aloop);
687 /* Redirects edge E to basic block DEST. */
688 static void
689 loop_redirect_edge (edge e, basic_block dest)
691 if (e->dest == dest)
692 return;
694 redirect_edge_and_branch_force (e, dest);
697 /* Deletes edge E from a branch if possible. Unless REALLY_DELETE is set,
698 just test whether it is possible to remove the edge. */
699 static bool
700 loop_delete_branch_edge (edge e, int really_delete)
702 basic_block src = e->src;
703 basic_block newdest;
704 int irr;
705 edge snd;
707 gcc_assert (EDGE_COUNT (src->succs) > 1);
709 /* Cannot handle more than two exit edges. */
710 if (EDGE_COUNT (src->succs) > 2)
711 return false;
712 /* And it must be just a simple branch. */
713 if (!any_condjump_p (BB_END (src)))
714 return false;
716 snd = e == EDGE_SUCC (src, 0) ? EDGE_SUCC (src, 1) : EDGE_SUCC (src, 0);
717 newdest = snd->dest;
718 if (newdest == EXIT_BLOCK_PTR)
719 return false;
721 /* Hopefully the above conditions should suffice. */
722 if (!really_delete)
723 return true;
725 /* Redirecting behaves wrongly wrto this flag. */
726 irr = snd->flags & EDGE_IRREDUCIBLE_LOOP;
728 if (!redirect_edge_and_branch (e, newdest))
729 return false;
730 single_succ_edge (src)->flags &= ~EDGE_IRREDUCIBLE_LOOP;
731 single_succ_edge (src)->flags |= irr;
733 return true;
736 /* Check whether LOOP's body can be duplicated. */
737 bool
738 can_duplicate_loop_p (struct loop *loop)
740 int ret;
741 basic_block *bbs = get_loop_body (loop);
743 ret = can_copy_bbs_p (bbs, loop->num_nodes);
744 free (bbs);
746 return ret;
749 /* The NBBS blocks in BBS will get duplicated and the copies will be placed
750 to LOOP. Update the single_exit information in superloops of LOOP. */
752 static void
753 update_single_exits_after_duplication (basic_block *bbs, unsigned nbbs,
754 struct loop *loop)
756 unsigned i;
758 for (i = 0; i < nbbs; i++)
759 bbs[i]->flags |= BB_DUPLICATED;
761 for (; loop->outer; loop = loop->outer)
763 if (!single_exit (loop))
764 continue;
766 if (single_exit (loop)->src->flags & BB_DUPLICATED)
767 set_single_exit (loop, NULL);
770 for (i = 0; i < nbbs; i++)
771 bbs[i]->flags &= ~BB_DUPLICATED;
774 /* Updates single exit information for the copy of LOOP. */
776 static void
777 update_single_exit_for_duplicated_loop (struct loop *loop)
779 struct loop *copy = loop->copy;
780 basic_block src, dest;
781 edge exit = single_exit (loop);
783 if (!exit)
784 return;
786 src = get_bb_copy (exit->src);
787 dest = exit->dest;
788 if (dest->flags & BB_DUPLICATED)
789 dest = get_bb_copy (dest);
791 exit = find_edge (src, dest);
792 gcc_assert (exit != NULL);
793 set_single_exit (copy, exit);
796 /* Updates single exit information for copies of ORIG_LOOPS and their subloops.
797 N is the number of the loops in the ORIG_LOOPS array. */
799 static void
800 update_single_exit_for_duplicated_loops (struct loop *orig_loops[], unsigned n)
802 unsigned i;
804 for (i = 0; i < n; i++)
805 update_single_exit_for_duplicated_loop (orig_loops[i]);
808 /* Sets probability and count of edge E to zero. The probability and count
809 is redistributed evenly to the remaining edges coming from E->src. */
811 static void
812 set_zero_probability (edge e)
814 basic_block bb = e->src;
815 edge_iterator ei;
816 edge ae, last = NULL;
817 unsigned n = EDGE_COUNT (bb->succs);
818 gcov_type cnt = e->count, cnt1;
819 unsigned prob = e->probability, prob1;
821 gcc_assert (n > 1);
822 cnt1 = cnt / (n - 1);
823 prob1 = prob / (n - 1);
825 FOR_EACH_EDGE (ae, ei, bb->succs)
827 if (ae == e)
828 continue;
830 ae->probability += prob1;
831 ae->count += cnt1;
832 last = ae;
835 /* Move the rest to one of the edges. */
836 last->probability += prob % (n - 1);
837 last->count += cnt % (n - 1);
839 e->probability = 0;
840 e->count = 0;
843 /* Duplicates body of LOOP to given edge E NDUPL times. Takes care of updating
844 loop structure and dominators. E's destination must be LOOP header for
845 this to work, i.e. it must be entry or latch edge of this loop; these are
846 unique, as the loops must have preheaders for this function to work
847 correctly (in case E is latch, the function unrolls the loop, if E is entry
848 edge, it peels the loop). Store edges created by copying ORIG edge from
849 copies corresponding to set bits in WONT_EXIT bitmap (bit 0 corresponds to
850 original LOOP body, the other copies are numbered in order given by control
851 flow through them) into TO_REMOVE array. Returns false if duplication is
852 impossible. */
854 bool
855 duplicate_loop_to_header_edge (struct loop *loop, edge e,
856 unsigned int ndupl, sbitmap wont_exit,
857 edge orig, VEC (edge, heap) **to_remove,
858 int flags)
860 struct loop *target, *aloop;
861 struct loop **orig_loops;
862 unsigned n_orig_loops;
863 basic_block header = loop->header, latch = loop->latch;
864 basic_block *new_bbs, *bbs, *first_active;
865 basic_block new_bb, bb, first_active_latch = NULL;
866 edge ae, latch_edge;
867 edge spec_edges[2], new_spec_edges[2];
868 #define SE_LATCH 0
869 #define SE_ORIG 1
870 unsigned i, j, n;
871 int is_latch = (latch == e->src);
872 int scale_act = 0, *scale_step = NULL, scale_main = 0;
873 int scale_after_exit = 0;
874 int p, freq_in, freq_le, freq_out_orig;
875 int prob_pass_thru, prob_pass_wont_exit, prob_pass_main;
876 int add_irreducible_flag;
877 basic_block place_after;
878 bitmap bbs_to_scale = NULL;
879 bitmap_iterator bi;
881 gcc_assert (e->dest == loop->header);
882 gcc_assert (ndupl > 0);
884 if (orig)
886 /* Orig must be edge out of the loop. */
887 gcc_assert (flow_bb_inside_loop_p (loop, orig->src));
888 gcc_assert (!flow_bb_inside_loop_p (loop, orig->dest));
891 n = loop->num_nodes;
892 bbs = get_loop_body_in_dom_order (loop);
893 gcc_assert (bbs[0] == loop->header);
894 gcc_assert (bbs[n - 1] == loop->latch);
896 /* Check whether duplication is possible. */
897 if (!can_copy_bbs_p (bbs, loop->num_nodes))
899 free (bbs);
900 return false;
902 new_bbs = XNEWVEC (basic_block, loop->num_nodes);
904 /* In case we are doing loop peeling and the loop is in the middle of
905 irreducible region, the peeled copies will be inside it too. */
906 add_irreducible_flag = e->flags & EDGE_IRREDUCIBLE_LOOP;
907 gcc_assert (!is_latch || !add_irreducible_flag);
909 /* Find edge from latch. */
910 latch_edge = loop_latch_edge (loop);
912 if (flags & DLTHE_FLAG_UPDATE_FREQ)
914 /* Calculate coefficients by that we have to scale frequencies
915 of duplicated loop bodies. */
916 freq_in = header->frequency;
917 freq_le = EDGE_FREQUENCY (latch_edge);
918 if (freq_in == 0)
919 freq_in = 1;
920 if (freq_in < freq_le)
921 freq_in = freq_le;
922 freq_out_orig = orig ? EDGE_FREQUENCY (orig) : freq_in - freq_le;
923 if (freq_out_orig > freq_in - freq_le)
924 freq_out_orig = freq_in - freq_le;
925 prob_pass_thru = RDIV (REG_BR_PROB_BASE * freq_le, freq_in);
926 prob_pass_wont_exit =
927 RDIV (REG_BR_PROB_BASE * (freq_le + freq_out_orig), freq_in);
929 if (orig
930 && REG_BR_PROB_BASE - orig->probability != 0)
932 /* The blocks that are dominated by a removed exit edge ORIG have
933 frequencies scaled by this. */
934 scale_after_exit = RDIV (REG_BR_PROB_BASE * REG_BR_PROB_BASE,
935 REG_BR_PROB_BASE - orig->probability);
936 bbs_to_scale = BITMAP_ALLOC (NULL);
937 for (i = 0; i < n; i++)
939 if (bbs[i] != orig->src
940 && dominated_by_p (CDI_DOMINATORS, bbs[i], orig->src))
941 bitmap_set_bit (bbs_to_scale, i);
945 scale_step = XNEWVEC (int, ndupl);
947 for (i = 1; i <= ndupl; i++)
948 scale_step[i - 1] = TEST_BIT (wont_exit, i)
949 ? prob_pass_wont_exit
950 : prob_pass_thru;
952 /* Complete peeling is special as the probability of exit in last
953 copy becomes 1. */
954 if (flags & DLTHE_FLAG_COMPLETTE_PEEL)
956 int wanted_freq = EDGE_FREQUENCY (e);
958 if (wanted_freq > freq_in)
959 wanted_freq = freq_in;
961 gcc_assert (!is_latch);
962 /* First copy has frequency of incoming edge. Each subsequent
963 frequency should be reduced by prob_pass_wont_exit. Caller
964 should've managed the flags so all except for original loop
965 has won't exist set. */
966 scale_act = RDIV (wanted_freq * REG_BR_PROB_BASE, freq_in);
967 /* Now simulate the duplication adjustments and compute header
968 frequency of the last copy. */
969 for (i = 0; i < ndupl; i++)
970 wanted_freq = RDIV (wanted_freq * scale_step[i], REG_BR_PROB_BASE);
971 scale_main = RDIV (wanted_freq * REG_BR_PROB_BASE, freq_in);
973 else if (is_latch)
975 prob_pass_main = TEST_BIT (wont_exit, 0)
976 ? prob_pass_wont_exit
977 : prob_pass_thru;
978 p = prob_pass_main;
979 scale_main = REG_BR_PROB_BASE;
980 for (i = 0; i < ndupl; i++)
982 scale_main += p;
983 p = RDIV (p * scale_step[i], REG_BR_PROB_BASE);
985 scale_main = RDIV (REG_BR_PROB_BASE * REG_BR_PROB_BASE, scale_main);
986 scale_act = RDIV (scale_main * prob_pass_main, REG_BR_PROB_BASE);
988 else
990 scale_main = REG_BR_PROB_BASE;
991 for (i = 0; i < ndupl; i++)
992 scale_main = RDIV (scale_main * scale_step[i], REG_BR_PROB_BASE);
993 scale_act = REG_BR_PROB_BASE - prob_pass_thru;
995 for (i = 0; i < ndupl; i++)
996 gcc_assert (scale_step[i] >= 0 && scale_step[i] <= REG_BR_PROB_BASE);
997 gcc_assert (scale_main >= 0 && scale_main <= REG_BR_PROB_BASE
998 && scale_act >= 0 && scale_act <= REG_BR_PROB_BASE);
1001 /* Loop the new bbs will belong to. */
1002 target = e->src->loop_father;
1004 /* Original loops. */
1005 n_orig_loops = 0;
1006 for (aloop = loop->inner; aloop; aloop = aloop->next)
1007 n_orig_loops++;
1008 orig_loops = XCNEWVEC (struct loop *, n_orig_loops);
1009 for (aloop = loop->inner, i = 0; aloop; aloop = aloop->next, i++)
1010 orig_loops[i] = aloop;
1012 loop->copy = target;
1014 first_active = XNEWVEC (basic_block, n);
1015 if (is_latch)
1017 memcpy (first_active, bbs, n * sizeof (basic_block));
1018 first_active_latch = latch;
1021 /* Update the information about single exits. */
1022 if (current_loops->state & LOOPS_HAVE_MARKED_SINGLE_EXITS)
1023 update_single_exits_after_duplication (bbs, n, target);
1025 spec_edges[SE_ORIG] = orig;
1026 spec_edges[SE_LATCH] = latch_edge;
1028 place_after = e->src;
1029 for (j = 0; j < ndupl; j++)
1031 /* Copy loops. */
1032 copy_loops_to (orig_loops, n_orig_loops, target);
1034 /* Copy bbs. */
1035 copy_bbs (bbs, n, new_bbs, spec_edges, 2, new_spec_edges, loop,
1036 place_after);
1037 place_after = new_spec_edges[SE_LATCH]->src;
1039 if (current_loops->state & LOOPS_HAVE_MARKED_SINGLE_EXITS)
1041 for (i = 0; i < n; i++)
1042 bbs[i]->flags |= BB_DUPLICATED;
1043 update_single_exit_for_duplicated_loops (orig_loops, n_orig_loops);
1044 for (i = 0; i < n; i++)
1045 bbs[i]->flags &= ~BB_DUPLICATED;
1048 if (flags & DLTHE_RECORD_COPY_NUMBER)
1049 for (i = 0; i < n; i++)
1051 gcc_assert (!new_bbs[i]->aux);
1052 new_bbs[i]->aux = (void *)(size_t)(j + 1);
1055 /* Note whether the blocks and edges belong to an irreducible loop. */
1056 if (add_irreducible_flag)
1058 for (i = 0; i < n; i++)
1059 new_bbs[i]->flags |= BB_DUPLICATED;
1060 for (i = 0; i < n; i++)
1062 edge_iterator ei;
1063 new_bb = new_bbs[i];
1064 if (new_bb->loop_father == target)
1065 new_bb->flags |= BB_IRREDUCIBLE_LOOP;
1067 FOR_EACH_EDGE (ae, ei, new_bb->succs)
1068 if ((ae->dest->flags & BB_DUPLICATED)
1069 && (ae->src->loop_father == target
1070 || ae->dest->loop_father == target))
1071 ae->flags |= EDGE_IRREDUCIBLE_LOOP;
1073 for (i = 0; i < n; i++)
1074 new_bbs[i]->flags &= ~BB_DUPLICATED;
1077 /* Redirect the special edges. */
1078 if (is_latch)
1080 redirect_edge_and_branch_force (latch_edge, new_bbs[0]);
1081 redirect_edge_and_branch_force (new_spec_edges[SE_LATCH],
1082 loop->header);
1083 set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], latch);
1084 latch = loop->latch = new_bbs[n - 1];
1085 e = latch_edge = new_spec_edges[SE_LATCH];
1087 else
1089 redirect_edge_and_branch_force (new_spec_edges[SE_LATCH],
1090 loop->header);
1091 redirect_edge_and_branch_force (e, new_bbs[0]);
1092 set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], e->src);
1093 e = new_spec_edges[SE_LATCH];
1096 /* Record exit edge in this copy. */
1097 if (orig && TEST_BIT (wont_exit, j + 1))
1099 if (to_remove)
1100 VEC_safe_push (edge, heap, *to_remove, new_spec_edges[SE_ORIG]);
1101 set_zero_probability (new_spec_edges[SE_ORIG]);
1103 /* Scale the frequencies of the blocks dominated by the exit. */
1104 if (bbs_to_scale)
1106 EXECUTE_IF_SET_IN_BITMAP (bbs_to_scale, 0, i, bi)
1108 scale_bbs_frequencies_int (new_bbs + i, 1, scale_after_exit,
1109 REG_BR_PROB_BASE);
1114 /* Record the first copy in the control flow order if it is not
1115 the original loop (i.e. in case of peeling). */
1116 if (!first_active_latch)
1118 memcpy (first_active, new_bbs, n * sizeof (basic_block));
1119 first_active_latch = new_bbs[n - 1];
1122 /* Set counts and frequencies. */
1123 if (flags & DLTHE_FLAG_UPDATE_FREQ)
1125 scale_bbs_frequencies_int (new_bbs, n, scale_act, REG_BR_PROB_BASE);
1126 scale_act = RDIV (scale_act * scale_step[j], REG_BR_PROB_BASE);
1129 free (new_bbs);
1130 free (orig_loops);
1132 /* Record the exit edge in the original loop body, and update the frequencies. */
1133 if (orig && TEST_BIT (wont_exit, 0))
1135 if (to_remove)
1136 VEC_safe_push (edge, heap, *to_remove, orig);
1137 set_zero_probability (orig);
1139 /* Scale the frequencies of the blocks dominated by the exit. */
1140 if (bbs_to_scale)
1142 EXECUTE_IF_SET_IN_BITMAP (bbs_to_scale, 0, i, bi)
1144 scale_bbs_frequencies_int (bbs + i, 1, scale_after_exit,
1145 REG_BR_PROB_BASE);
1150 /* Update the original loop. */
1151 if (!is_latch)
1152 set_immediate_dominator (CDI_DOMINATORS, e->dest, e->src);
1153 if (flags & DLTHE_FLAG_UPDATE_FREQ)
1155 scale_bbs_frequencies_int (bbs, n, scale_main, REG_BR_PROB_BASE);
1156 free (scale_step);
1159 /* Update dominators of outer blocks if affected. */
1160 for (i = 0; i < n; i++)
1162 basic_block dominated, dom_bb, *dom_bbs;
1163 int n_dom_bbs,j;
1165 bb = bbs[i];
1166 bb->aux = 0;
1168 n_dom_bbs = get_dominated_by (CDI_DOMINATORS, bb, &dom_bbs);
1169 for (j = 0; j < n_dom_bbs; j++)
1171 dominated = dom_bbs[j];
1172 if (flow_bb_inside_loop_p (loop, dominated))
1173 continue;
1174 dom_bb = nearest_common_dominator (
1175 CDI_DOMINATORS, first_active[i], first_active_latch);
1176 set_immediate_dominator (CDI_DOMINATORS, dominated, dom_bb);
1178 free (dom_bbs);
1180 free (first_active);
1182 free (bbs);
1183 BITMAP_FREE (bbs_to_scale);
1185 return true;
1188 /* A callback for make_forwarder block, to redirect all edges except for
1189 MFB_KJ_EDGE to the entry part. E is the edge for that we should decide
1190 whether to redirect it. */
1192 static edge mfb_kj_edge;
1193 static bool
1194 mfb_keep_just (edge e)
1196 return e != mfb_kj_edge;
1199 /* Creates a pre-header for a LOOP. Returns newly created block. Unless
1200 CP_SIMPLE_PREHEADERS is set in FLAGS, we only force LOOP to have single
1201 entry; otherwise we also force preheader block to have only one successor.
1202 The function also updates dominators. */
1204 static basic_block
1205 create_preheader (struct loop *loop, int flags)
1207 edge e, fallthru;
1208 basic_block dummy;
1209 int nentry = 0;
1210 bool irred = false;
1211 bool latch_edge_was_fallthru;
1212 edge one_succ_pred = 0;
1213 edge_iterator ei;
1215 FOR_EACH_EDGE (e, ei, loop->header->preds)
1217 if (e->src == loop->latch)
1218 continue;
1219 irred |= (e->flags & EDGE_IRREDUCIBLE_LOOP) != 0;
1220 nentry++;
1221 if (single_succ_p (e->src))
1222 one_succ_pred = e;
1224 gcc_assert (nentry);
1225 if (nentry == 1)
1227 /* Get an edge that is different from the one from loop->latch
1228 to loop->header. */
1229 e = EDGE_PRED (loop->header,
1230 EDGE_PRED (loop->header, 0)->src == loop->latch);
1232 if (!(flags & CP_SIMPLE_PREHEADERS) || single_succ_p (e->src))
1233 return NULL;
1236 mfb_kj_edge = loop_latch_edge (loop);
1237 latch_edge_was_fallthru = (mfb_kj_edge->flags & EDGE_FALLTHRU) != 0;
1238 fallthru = make_forwarder_block (loop->header, mfb_keep_just, NULL);
1239 dummy = fallthru->src;
1240 loop->header = fallthru->dest;
1242 /* Try to be clever in placing the newly created preheader. The idea is to
1243 avoid breaking any "fallthruness" relationship between blocks.
1245 The preheader was created just before the header and all incoming edges
1246 to the header were redirected to the preheader, except the latch edge.
1247 So the only problematic case is when this latch edge was a fallthru
1248 edge: it is not anymore after the preheader creation so we have broken
1249 the fallthruness. We're therefore going to look for a better place. */
1250 if (latch_edge_was_fallthru)
1252 if (one_succ_pred)
1253 e = one_succ_pred;
1254 else
1255 e = EDGE_PRED (dummy, 0);
1257 move_block_after (dummy, e->src);
1260 if (irred)
1262 dummy->flags |= BB_IRREDUCIBLE_LOOP;
1263 single_succ_edge (dummy)->flags |= EDGE_IRREDUCIBLE_LOOP;
1266 if (dump_file)
1267 fprintf (dump_file, "Created preheader block for loop %i\n",
1268 loop->num);
1270 return dummy;
1273 /* Create preheaders for each loop; for meaning of FLAGS see create_preheader. */
1275 void
1276 create_preheaders (int flags)
1278 loop_iterator li;
1279 struct loop *loop;
1281 FOR_EACH_LOOP (li, loop, 0)
1282 create_preheader (loop, flags);
1283 current_loops->state |= LOOPS_HAVE_PREHEADERS;
1286 /* Forces all loop latches to have only single successor. */
1288 void
1289 force_single_succ_latches (void)
1291 loop_iterator li;
1292 struct loop *loop;
1293 edge e;
1295 FOR_EACH_LOOP (li, loop, 0)
1297 if (loop->latch != loop->header && single_succ_p (loop->latch))
1298 continue;
1300 e = find_edge (loop->latch, loop->header);
1302 split_edge (e);
1304 current_loops->state |= LOOPS_HAVE_SIMPLE_LATCHES;
1307 /* This function is called from loop_version. It splits the entry edge
1308 of the loop we want to version, adds the versioning condition, and
1309 adjust the edges to the two versions of the loop appropriately.
1310 e is an incoming edge. Returns the basic block containing the
1311 condition.
1313 --- edge e ---- > [second_head]
1315 Split it and insert new conditional expression and adjust edges.
1317 --- edge e ---> [cond expr] ---> [first_head]
1319 +---------> [second_head]
1321 THEN_PROB is the probability of then branch of the condition. */
1323 static basic_block
1324 lv_adjust_loop_entry_edge (basic_block first_head, basic_block second_head,
1325 edge e, void *cond_expr, unsigned then_prob)
1327 basic_block new_head = NULL;
1328 edge e1;
1330 gcc_assert (e->dest == second_head);
1332 /* Split edge 'e'. This will create a new basic block, where we can
1333 insert conditional expr. */
1334 new_head = split_edge (e);
1336 lv_add_condition_to_bb (first_head, second_head, new_head,
1337 cond_expr);
1339 /* Don't set EDGE_TRUE_VALUE in RTL mode, as it's invalid there. */
1340 e = single_succ_edge (new_head);
1341 e1 = make_edge (new_head, first_head,
1342 current_ir_type () == IR_GIMPLE ? EDGE_TRUE_VALUE : 0);
1343 e1->probability = then_prob;
1344 e->probability = REG_BR_PROB_BASE - then_prob;
1345 e1->count = RDIV (e->count * e1->probability, REG_BR_PROB_BASE);
1346 e->count = RDIV (e->count * e->probability, REG_BR_PROB_BASE);
1348 set_immediate_dominator (CDI_DOMINATORS, first_head, new_head);
1349 set_immediate_dominator (CDI_DOMINATORS, second_head, new_head);
1351 /* Adjust loop header phi nodes. */
1352 lv_adjust_loop_header_phi (first_head, second_head, new_head, e1);
1354 return new_head;
1357 /* Main entry point for Loop Versioning transformation.
1359 This transformation given a condition and a loop, creates
1360 -if (condition) { loop_copy1 } else { loop_copy2 },
1361 where loop_copy1 is the loop transformed in one way, and loop_copy2
1362 is the loop transformed in another way (or unchanged). 'condition'
1363 may be a run time test for things that were not resolved by static
1364 analysis (overlapping ranges (anti-aliasing), alignment, etc.).
1366 THEN_PROB is the probability of the then edge of the if. THEN_SCALE
1367 is the ratio by that the frequencies in the original loop should
1368 be scaled. ELSE_SCALE is the ratio by that the frequencies in the
1369 new loop should be scaled.
1371 If PLACE_AFTER is true, we place the new loop after LOOP in the
1372 instruction stream, otherwise it is placed before LOOP. */
1374 struct loop *
1375 loop_version (struct loop *loop,
1376 void *cond_expr, basic_block *condition_bb,
1377 unsigned then_prob, unsigned then_scale, unsigned else_scale,
1378 bool place_after)
1380 basic_block first_head, second_head;
1381 edge entry, latch_edge, exit, true_edge, false_edge;
1382 int irred_flag;
1383 struct loop *nloop;
1384 basic_block cond_bb;
1386 /* CHECKME: Loop versioning does not handle nested loop at this point. */
1387 if (loop->inner)
1388 return NULL;
1390 /* Record entry and latch edges for the loop */
1391 entry = loop_preheader_edge (loop);
1392 irred_flag = entry->flags & EDGE_IRREDUCIBLE_LOOP;
1393 entry->flags &= ~EDGE_IRREDUCIBLE_LOOP;
1395 /* Note down head of loop as first_head. */
1396 first_head = entry->dest;
1398 /* Duplicate loop. */
1399 if (!cfg_hook_duplicate_loop_to_header_edge (loop, entry, 1,
1400 NULL, NULL, NULL, 0))
1401 return NULL;
1403 /* After duplication entry edge now points to new loop head block.
1404 Note down new head as second_head. */
1405 second_head = entry->dest;
1407 /* Split loop entry edge and insert new block with cond expr. */
1408 cond_bb = lv_adjust_loop_entry_edge (first_head, second_head,
1409 entry, cond_expr, then_prob);
1410 if (condition_bb)
1411 *condition_bb = cond_bb;
1413 if (!cond_bb)
1415 entry->flags |= irred_flag;
1416 return NULL;
1419 latch_edge = single_succ_edge (get_bb_copy (loop->latch));
1421 extract_cond_bb_edges (cond_bb, &true_edge, &false_edge);
1422 nloop = loopify (latch_edge,
1423 single_pred_edge (get_bb_copy (loop->header)),
1424 cond_bb, true_edge, false_edge,
1425 false /* Do not redirect all edges. */,
1426 then_scale, else_scale);
1428 exit = single_exit (loop);
1429 if (exit)
1430 set_single_exit (nloop, find_edge (get_bb_copy (exit->src), exit->dest));
1432 /* loopify redirected latch_edge. Update its PENDING_STMTS. */
1433 lv_flush_pending_stmts (latch_edge);
1435 /* loopify redirected condition_bb's succ edge. Update its PENDING_STMTS. */
1436 extract_cond_bb_edges (cond_bb, &true_edge, &false_edge);
1437 lv_flush_pending_stmts (false_edge);
1438 /* Adjust irreducible flag. */
1439 if (irred_flag)
1441 cond_bb->flags |= BB_IRREDUCIBLE_LOOP;
1442 loop_preheader_edge (loop)->flags |= EDGE_IRREDUCIBLE_LOOP;
1443 loop_preheader_edge (nloop)->flags |= EDGE_IRREDUCIBLE_LOOP;
1444 single_pred_edge (cond_bb)->flags |= EDGE_IRREDUCIBLE_LOOP;
1447 if (place_after)
1449 basic_block *bbs = get_loop_body_in_dom_order (nloop), after;
1450 unsigned i;
1452 after = loop->latch;
1454 for (i = 0; i < nloop->num_nodes; i++)
1456 move_block_after (bbs[i], after);
1457 after = bbs[i];
1459 free (bbs);
1462 /* At this point condition_bb is loop predheader with two successors,
1463 first_head and second_head. Make sure that loop predheader has only
1464 one successor. */
1465 split_edge (loop_preheader_edge (loop));
1466 split_edge (loop_preheader_edge (nloop));
1468 return nloop;
1471 /* The structure of loops might have changed. Some loops might get removed
1472 (and their headers and latches were set to NULL), loop exists might get
1473 removed (thus the loop nesting may be wrong), and some blocks and edges
1474 were changed (so the information about bb --> loop mapping does not have
1475 to be correct). But still for the remaining loops the header dominates
1476 the latch, and loops did not get new subloobs (new loops might possibly
1477 get created, but we are not interested in them). Fix up the mess.
1479 If CHANGED_BBS is not NULL, basic blocks whose loop has changed are
1480 marked in it. */
1482 void
1483 fix_loop_structure (bitmap changed_bbs)
1485 basic_block bb;
1486 struct loop *loop, *ploop;
1487 loop_iterator li;
1489 /* Remove the old bb -> loop mapping. */
1490 FOR_EACH_BB (bb)
1492 bb->aux = (void *) (size_t) bb->loop_father->depth;
1493 bb->loop_father = current_loops->tree_root;
1496 /* Remove the dead loops from structures. */
1497 current_loops->tree_root->num_nodes = n_basic_blocks;
1498 FOR_EACH_LOOP (li, loop, 0)
1500 loop->num_nodes = 0;
1501 if (loop->header)
1502 continue;
1504 while (loop->inner)
1506 ploop = loop->inner;
1507 flow_loop_tree_node_remove (ploop);
1508 flow_loop_tree_node_add (loop->outer, ploop);
1511 /* Remove the loop and free its data. */
1512 delete_loop (loop);
1515 /* Rescan the bodies of loops, starting from the outermost. */
1516 FOR_EACH_LOOP (li, loop, 0)
1518 loop->num_nodes = flow_loop_nodes_find (loop->header, loop);
1521 /* Now fix the loop nesting. */
1522 FOR_EACH_LOOP (li, loop, 0)
1524 bb = loop_preheader_edge (loop)->src;
1525 if (bb->loop_father != loop->outer)
1527 flow_loop_tree_node_remove (loop);
1528 flow_loop_tree_node_add (bb->loop_father, loop);
1532 /* Mark the blocks whose loop has changed. */
1533 FOR_EACH_BB (bb)
1535 if (changed_bbs
1536 && (void *) (size_t) bb->loop_father->depth != bb->aux)
1537 bitmap_set_bit (changed_bbs, bb->index);
1539 bb->aux = NULL;
1542 if (current_loops->state & LOOPS_HAVE_MARKED_SINGLE_EXITS)
1543 mark_single_exit_loops ();
1544 if (current_loops->state & LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
1545 mark_irreducible_loops ();