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