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