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