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