]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cfgloop.c
[testsuite] Add missing dg-require-effective-target label_values
[thirdparty/gcc.git] / gcc / cfgloop.c
CommitLineData
65f34de5 1/* Natural loop discovery code for GNU compiler.
fbd26352 2 Copyright (C) 2000-2019 Free Software Foundation, Inc.
65f34de5 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
65f34de5 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/>. */
65f34de5 19
20#include "config.h"
21#include "system.h"
805e22b2 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"
28#include "gimple-ssa.h"
29#include "diagnostic-core.h"
94ea8568 30#include "cfganal.h"
862be747 31#include "cfgloop.h"
dcf1a1ec 32#include "gimple-iterator.h"
b9ed1410 33#include "dumpfile.h"
5f5d4cd1 34
7194de72 35static void flow_loops_cfg_dump (FILE *);
65f34de5 36\f
37/* Dump loop related CFG information. */
38
39static void
7194de72 40flow_loops_cfg_dump (FILE *file)
65f34de5 41{
4c26117a 42 basic_block bb;
65f34de5 43
7194de72 44 if (!file)
65f34de5 45 return;
46
fc00614f 47 FOR_EACH_BB_FN (bb, cfun)
65f34de5 48 {
49 edge succ;
cd665a06 50 edge_iterator ei;
65f34de5 51
4c26117a 52 fprintf (file, ";; %d succs { ", bb->index);
cd665a06 53 FOR_EACH_EDGE (succ, ei, bb->succs)
b3d6de89 54 fprintf (file, "%d ", succ->dest->index);
7fb12188 55 fprintf (file, "}\n");
65f34de5 56 }
65f34de5 57}
58
d10cfa8d 59/* Return nonzero if the nodes of LOOP are a subset of OUTER. */
65f34de5 60
7fb12188 61bool
4c9e08a4 62flow_loop_nested_p (const struct loop *outer, const struct loop *loop)
65f34de5 63{
9e3536f4 64 unsigned odepth = loop_depth (outer);
65
66 return (loop_depth (loop) > odepth
f1f41a6c 67 && (*loop->superloops)[odepth] == outer);
65f34de5 68}
69
b4d679c5 70/* Returns the loop such that LOOP is nested DEPTH (indexed from zero)
71 loops within LOOP. */
7d23383d 72
73struct loop *
74superloop_at_depth (struct loop *loop, unsigned depth)
75{
9e3536f4 76 unsigned ldepth = loop_depth (loop);
77
78 gcc_assert (depth <= ldepth);
7d23383d 79
9e3536f4 80 if (depth == ldepth)
7d23383d 81 return loop;
82
f1f41a6c 83 return (*loop->superloops)[depth];
7d23383d 84}
85
4a6f9e19 86/* Returns the list of the latch edges of LOOP. */
87
f1f41a6c 88static vec<edge>
4a6f9e19 89get_loop_latch_edges (const struct loop *loop)
90{
91 edge_iterator ei;
92 edge e;
1e094109 93 vec<edge> ret = vNULL;
4a6f9e19 94
95 FOR_EACH_EDGE (e, ei, loop->header->preds)
96 {
97 if (dominated_by_p (CDI_DOMINATORS, e->src, loop->header))
f1f41a6c 98 ret.safe_push (e);
4a6f9e19 99 }
100
101 return ret;
102}
103
65f34de5 104/* Dump the loop information specified by LOOP to the stream FILE
105 using auxiliary dump callback function LOOP_DUMP_AUX if non null. */
106
107void
4c9e08a4 108flow_loop_dump (const struct loop *loop, FILE *file,
109 void (*loop_dump_aux) (const struct loop *, FILE *, int),
110 int verbose)
65f34de5 111{
7fb12188 112 basic_block *bbs;
862be747 113 unsigned i;
f1f41a6c 114 vec<edge> latches;
4a6f9e19 115 edge e;
7fb12188 116
65f34de5 117 if (! loop || ! loop->header)
118 return;
119
58b3f902 120 fprintf (file, ";;\n;; Loop %d\n", loop->num);
65f34de5 121
4a6f9e19 122 fprintf (file, ";; header %d, ", loop->header->index);
123 if (loop->latch)
124 fprintf (file, "latch %d\n", loop->latch->index);
125 else
126 {
127 fprintf (file, "multiple latches:");
128 latches = get_loop_latch_edges (loop);
f1f41a6c 129 FOR_EACH_VEC_ELT (latches, i, e)
4a6f9e19 130 fprintf (file, " %d", e->src->index);
f1f41a6c 131 latches.release ();
4a6f9e19 132 fprintf (file, "\n");
133 }
134
8543a448 135 fprintf (file, ";; depth %d, outer %ld\n",
9e3536f4 136 loop_depth (loop), (long) (loop_outer (loop)
137 ? loop_outer (loop)->num : -1));
65f34de5 138
fbf561f4 139 if (loop->latch)
140 {
141 bool read_profile_p;
142 gcov_type nit = expected_loop_iterations_unbounded (loop, &read_profile_p);
143 if (read_profile_p && !loop->any_estimate)
eac41296 144 fprintf (file, ";; profile-based iteration count: %" PRIu64 "\n",
145 (uint64_t) nit);
fbf561f4 146 }
147
7fb12188 148 fprintf (file, ";; nodes:");
149 bbs = get_loop_body (loop);
150 for (i = 0; i < loop->num_nodes; i++)
151 fprintf (file, " %d", bbs[i]->index);
152 free (bbs);
153 fprintf (file, "\n");
5cc577b6 154
65f34de5 155 if (loop_dump_aux)
156 loop_dump_aux (loop, file, verbose);
157}
158
7194de72 159/* Dump the loop information about loops to the stream FILE,
65f34de5 160 using auxiliary dump callback function LOOP_DUMP_AUX if non null. */
161
162void
7194de72 163flow_loops_dump (FILE *file, void (*loop_dump_aux) (const struct loop *, FILE *, int), int verbose)
65f34de5 164{
17519ba0 165 struct loop *loop;
65f34de5 166
7194de72 167 if (!current_loops || ! file)
65f34de5 168 return;
169
41f75a99 170 fprintf (file, ";; %d loops found\n", number_of_loops (cfun));
7fb12188 171
f21d4d00 172 FOR_EACH_LOOP (loop, LI_INCLUDE_ROOT)
65f34de5 173 {
7fb12188 174 flow_loop_dump (loop, file, loop_dump_aux, verbose);
65f34de5 175 }
176
177 if (verbose)
7194de72 178 flow_loops_cfg_dump (file);
65f34de5 179}
180
7fb12188 181/* Free data allocated for LOOP. */
ccae4f9f 182
a5414ff5 183void
4c9e08a4 184flow_loop_free (struct loop *loop)
7fb12188 185{
dce58e66 186 struct loop_exit *exit, *next;
187
f1f41a6c 188 vec_free (loop->superloops);
dce58e66 189
190 /* Break the list of the loop exit records. They will be freed when the
191 corresponding edge is rescanned or removed, and this avoids
192 accessing the (already released) head of the list stored in the
193 loop structure. */
ccae4f9f 194 for (exit = loop->exits->next; exit != loop->exits; exit = next)
dce58e66 195 {
196 next = exit->next;
197 exit->next = exit;
198 exit->prev = exit;
199 }
ccae4f9f 200
201 ggc_free (loop->exits);
202 ggc_free (loop);
7fb12188 203}
204
65f34de5 205/* Free all the memory allocated for LOOPS. */
206
207void
4c9e08a4 208flow_loops_free (struct loops *loops)
65f34de5 209{
17519ba0 210 if (loops->larray)
65f34de5 211 {
862be747 212 unsigned i;
17519ba0 213 loop_p loop;
65f34de5 214
215 /* Free the loop descriptors. */
f1f41a6c 216 FOR_EACH_VEC_SAFE_ELT (loops->larray, i, loop)
65f34de5 217 {
7fb12188 218 if (!loop)
219 continue;
220
221 flow_loop_free (loop);
65f34de5 222 }
5cc577b6 223
f1f41a6c 224 vec_free (loops->larray);
65f34de5 225 }
226}
227
7fb12188 228/* Find the nodes contained within the LOOP with header HEADER.
229 Return the number of nodes within the loop. */
65f34de5 230
053fdd99 231int
4c9e08a4 232flow_loop_nodes_find (basic_block header, struct loop *loop)
65f34de5 233{
1e094109 234 vec<basic_block> stack = vNULL;
7fb12188 235 int num_nodes = 1;
4a6f9e19 236 edge latch;
237 edge_iterator latch_ei;
65f34de5 238
7fb12188 239 header->loop_father = loop;
65f34de5 240
4a6f9e19 241 FOR_EACH_EDGE (latch, latch_ei, loop->header->preds)
65f34de5 242 {
4a6f9e19 243 if (latch->src->loop_father == loop
244 || !dominated_by_p (CDI_DOMINATORS, latch->src, loop->header))
245 continue;
246
65f34de5 247 num_nodes++;
f1f41a6c 248 stack.safe_push (latch->src);
4a6f9e19 249 latch->src->loop_father = loop;
4c9e08a4 250
f1f41a6c 251 while (!stack.is_empty ())
65f34de5 252 {
7fb12188 253 basic_block node;
254 edge e;
cd665a06 255 edge_iterator ei;
65f34de5 256
f1f41a6c 257 node = stack.pop ();
4c9e08a4 258
cd665a06 259 FOR_EACH_EDGE (e, ei, node->preds)
65f34de5 260 {
7fb12188 261 basic_block ancestor = e->src;
262
4a6f9e19 263 if (ancestor->loop_father != loop)
7fb12188 264 {
265 ancestor->loop_father = loop;
7fb12188 266 num_nodes++;
f1f41a6c 267 stack.safe_push (ancestor);
7fb12188 268 }
65f34de5 269 }
270 }
271 }
f1f41a6c 272 stack.release ();
4a6f9e19 273
65f34de5 274 return num_nodes;
275}
276
9e3536f4 277/* Records the vector of superloops of the loop LOOP, whose immediate
278 superloop is FATHER. */
279
a5414ff5 280static void
9e3536f4 281establish_preds (struct loop *loop, struct loop *father)
a5414ff5 282{
9e3536f4 283 loop_p ploop;
284 unsigned depth = loop_depth (father) + 1;
285 unsigned i;
b811afb0 286
f1f41a6c 287 loop->superloops = 0;
288 vec_alloc (loop->superloops, depth);
289 FOR_EACH_VEC_SAFE_ELT (father->superloops, i, ploop)
290 loop->superloops->quick_push (ploop);
291 loop->superloops->quick_push (father);
a5414ff5 292
293 for (ploop = loop->inner; ploop; ploop = ploop->next)
9e3536f4 294 establish_preds (ploop, loop);
a5414ff5 295}
296
7fb12188 297/* Add LOOP to the loop hierarchy tree where FATHER is father of the
a5414ff5 298 added loop. If LOOP has some children, take care of that their
baf1c4a6 299 pred field will be initialized correctly. If AFTER is non-null
300 then it's expected it's a pointer into FATHERs inner sibling
301 list and LOOP is added behind AFTER, otherwise it's added in front
302 of FATHERs siblings. */
65f34de5 303
7fb12188 304void
baf1c4a6 305flow_loop_tree_node_add (struct loop *father, struct loop *loop,
306 struct loop *after)
65f34de5 307{
baf1c4a6 308 if (after)
309 {
310 loop->next = after->next;
311 after->next = loop;
312 }
313 else
314 {
315 loop->next = father->inner;
316 father->inner = loop;
317 }
7fb12188 318
9e3536f4 319 establish_preds (loop, father);
65f34de5 320}
321
7fb12188 322/* Remove LOOP from the loop hierarchy tree. */
65f34de5 323
7fb12188 324void
4c9e08a4 325flow_loop_tree_node_remove (struct loop *loop)
65f34de5 326{
7fb12188 327 struct loop *prev, *father;
65f34de5 328
9e3536f4 329 father = loop_outer (loop);
65f34de5 330
7fb12188 331 /* Remove loop from the list of sons. */
332 if (father->inner == loop)
333 father->inner = loop->next;
334 else
335 {
9e3536f4 336 for (prev = father->inner; prev->next != loop; prev = prev->next)
337 continue;
7fb12188 338 prev->next = loop->next;
339 }
65f34de5 340
f1f41a6c 341 loop->superloops = NULL;
65f34de5 342}
343
dce58e66 344/* Allocates and returns new loop structure. */
345
346struct loop *
347alloc_loop (void)
348{
25a27413 349 struct loop *loop = ggc_cleared_alloc<struct loop> ();
ccae4f9f 350
25a27413 351 loop->exits = ggc_cleared_alloc<loop_exit> ();
ccae4f9f 352 loop->exits->next = loop->exits->prev = loop->exits;
26c166eb 353 loop->can_be_parallel = false;
85168485 354 loop->constraints = 0;
e913b5cd 355 loop->nb_iterations_upper_bound = 0;
332409d3 356 loop->nb_iterations_likely_upper_bound = 0;
e913b5cd 357 loop->nb_iterations_estimate = 0;
dce58e66 358 return loop;
359}
360
a8a97201 361/* Initializes loops structure LOOPS, reserving place for NUM_LOOPS loops
362 (including the root of the loop tree). */
363
7a569539 364void
365init_loops_structure (struct function *fn,
366 struct loops *loops, unsigned num_loops)
a8a97201 367{
368 struct loop *root;
369
370 memset (loops, 0, sizeof *loops);
f1f41a6c 371 vec_alloc (loops->larray, num_loops);
a8a97201 372
373 /* Dummy loop containing whole function. */
374 root = alloc_loop ();
a28770e1 375 root->num_nodes = n_basic_blocks_for_fn (fn);
34154e27 376 root->latch = EXIT_BLOCK_PTR_FOR_FN (fn);
377 root->header = ENTRY_BLOCK_PTR_FOR_FN (fn);
378 ENTRY_BLOCK_PTR_FOR_FN (fn)->loop_father = root;
379 EXIT_BLOCK_PTR_FOR_FN (fn)->loop_father = root;
a8a97201 380
f1f41a6c 381 loops->larray->quick_push (root);
a8a97201 382 loops->tree_root = root;
383}
384
ff829efa 385/* Returns whether HEADER is a loop header. */
386
387bool
388bb_loop_header_p (basic_block header)
389{
390 edge_iterator ei;
391 edge e;
392
393 /* If we have an abnormal predecessor, do not consider the
394 loop (not worth the problems). */
395 if (bb_has_abnormal_pred (header))
396 return false;
397
398 /* Look for back edges where a predecessor is dominated
399 by this block. A natural loop has a single entry
400 node (header) that dominates all the nodes in the
401 loop. It also has single back edge to the header
402 from a latch node. */
403 FOR_EACH_EDGE (e, ei, header->preds)
404 {
405 basic_block latch = e->src;
34154e27 406 if (latch != ENTRY_BLOCK_PTR_FOR_FN (cfun)
ff829efa 407 && dominated_by_p (CDI_DOMINATORS, latch, header))
408 return true;
409 }
410
411 return false;
412}
413
5cc577b6 414/* Find all the natural loops in the function and save in LOOPS structure and
6b42039a 415 recalculate loop_father information in basic block structures.
ff829efa 416 If LOOPS is non-NULL then the loop structures for already recorded loops
417 will be re-used and their number will not change. We assume that no
418 stale loops exist in LOOPS.
419 When LOOPS is NULL it is allocated and re-built from scratch.
420 Return the built LOOPS structure. */
65f34de5 421
ff829efa 422struct loops *
ffc6b5d5 423flow_loops_find (struct loops *loops)
65f34de5 424{
ff829efa 425 bool from_scratch = (loops == NULL);
65f34de5 426 int *rc_order;
ff829efa 427 int b;
428 unsigned i;
65f34de5 429
a8a97201 430 /* Ensure that the dominators are computed. */
431 calculate_dominance_info (CDI_DOMINATORS);
65f34de5 432
ff829efa 433 if (!loops)
a8a97201 434 {
25a27413 435 loops = ggc_cleared_alloc<struct loops> ();
7a569539 436 init_loops_structure (cfun, loops, 1);
a8a97201 437 }
65f34de5 438
ff829efa 439 /* Ensure that loop exits were released. */
440 gcc_assert (loops->exits == NULL);
65f34de5 441
ff829efa 442 /* Taking care of this degenerate case makes the rest of
443 this code simpler. */
a28770e1 444 if (n_basic_blocks_for_fn (cfun) == NUM_FIXED_BLOCKS)
ff829efa 445 return loops;
7fb12188 446
ff829efa 447 /* The root loop node contains all basic-blocks. */
a28770e1 448 loops->tree_root->num_nodes = n_basic_blocks_for_fn (cfun);
4c9e08a4 449
ff829efa 450 /* Compute depth first search order of the CFG so that outer
451 natural loops will be found before inner natural loops. */
a28770e1 452 rc_order = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
ff829efa 453 pre_and_rev_post_order_compute (NULL, rc_order, false);
743f4ee2 454
ff829efa 455 /* Gather all loop headers in reverse completion order and allocate
456 loop structures for loops that are not already present. */
c2078b80 457 auto_vec<loop_p> larray (loops->larray->length ());
a28770e1 458 for (b = 0; b < n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS; b++)
ff829efa 459 {
f5a6b05f 460 basic_block header = BASIC_BLOCK_FOR_FN (cfun, rc_order[b]);
ff829efa 461 if (bb_loop_header_p (header))
65f34de5 462 {
ff829efa 463 struct loop *loop;
7fb12188 464
ff829efa 465 /* The current active loop tree has valid loop-fathers for
466 header blocks. */
467 if (!from_scratch
468 && header->loop_father->header == header)
7fb12188 469 {
ff829efa 470 loop = header->loop_father;
471 /* If we found an existing loop remove it from the
472 loop tree. It is going to be inserted again
473 below. */
474 flow_loop_tree_node_remove (loop);
7fb12188 475 }
ff829efa 476 else
477 {
478 /* Otherwise allocate a new loop structure for the loop. */
479 loop = alloc_loop ();
480 /* ??? We could re-use unused loop slots here. */
481 loop->num = loops->larray->length ();
482 vec_safe_push (loops->larray, loop);
483 loop->header = header;
484
485 if (!from_scratch
486 && dump_file && (dump_flags & TDF_DETAILS))
487 fprintf (dump_file, "flow_loops_find: discovered new "
488 "loop %d with header %d\n",
489 loop->num, header->index);
490 }
b375c775 491 /* Reset latch, we recompute it below. */
492 loop->latch = NULL;
ff829efa 493 larray.safe_push (loop);
65f34de5 494 }
65f34de5 495
ff829efa 496 /* Make blocks part of the loop root node at start. */
497 header->loop_father = loops->tree_root;
498 }
7fb12188 499
ff829efa 500 free (rc_order);
7fb12188 501
ff829efa 502 /* Now iterate over the loops found, insert them into the loop tree
503 and assign basic-block ownership. */
504 for (i = 0; i < larray.length (); ++i)
65f34de5 505 {
ff829efa 506 struct loop *loop = larray[i];
507 basic_block header = loop->header;
fcc86201 508 edge_iterator ei;
509 edge e;
65f34de5 510
ff829efa 511 flow_loop_tree_node_add (header->loop_father, loop);
512 loop->num_nodes = flow_loop_nodes_find (loop->header, loop);
fcc86201 513
514 /* Look for the latch for this header block, if it has just a
515 single one. */
516 FOR_EACH_EDGE (e, ei, header->preds)
517 {
518 basic_block latch = e->src;
519
520 if (flow_bb_inside_loop_p (loop, latch))
521 {
522 if (loop->latch != NULL)
523 {
524 /* More than one latch edge. */
525 loop->latch = NULL;
526 break;
527 }
528 loop->latch = latch;
529 }
530 }
7fb12188 531 }
862be747 532
ff829efa 533 return loops;
65f34de5 534}
535
d6f263c0 536/* qsort helper for sort_sibling_loops. */
537
538static int *sort_sibling_loops_cmp_rpo;
539static int
540sort_sibling_loops_cmp (const void *la_, const void *lb_)
541{
542 const struct loop *la = *(const struct loop * const *)la_;
543 const struct loop *lb = *(const struct loop * const *)lb_;
544 return (sort_sibling_loops_cmp_rpo[la->header->index]
545 - sort_sibling_loops_cmp_rpo[lb->header->index]);
546}
547
548/* Sort sibling loops in RPO order. */
549
550void
551sort_sibling_loops (function *fn)
552{
553 /* Match flow_loops_find in the order we sort sibling loops. */
554 sort_sibling_loops_cmp_rpo = XNEWVEC (int, last_basic_block_for_fn (cfun));
555 int *rc_order = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
556 pre_and_rev_post_order_compute_fn (fn, NULL, rc_order, false);
557 for (int i = 0; i < n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS; ++i)
558 sort_sibling_loops_cmp_rpo[rc_order[i]] = i;
559 free (rc_order);
560
561 auto_vec<loop_p, 3> siblings;
562 loop_p loop;
563 FOR_EACH_LOOP_FN (fn, loop, LI_INCLUDE_ROOT)
564 if (loop->inner && loop->inner->next)
565 {
566 loop_p sibling = loop->inner;
567 do
568 {
569 siblings.safe_push (sibling);
570 sibling = sibling->next;
571 }
572 while (sibling);
573 siblings.qsort (sort_sibling_loops_cmp);
574 loop_p *siblingp = &loop->inner;
575 for (unsigned i = 0; i < siblings.length (); ++i)
576 {
577 *siblingp = siblings[i];
578 siblingp = &(*siblingp)->next;
579 }
580 *siblingp = NULL;
581 siblings.truncate (0);
582 }
583
584 free (sort_sibling_loops_cmp_rpo);
585 sort_sibling_loops_cmp_rpo = NULL;
586}
587
4a6f9e19 588/* Ratio of frequencies of edges so that one of more latch edges is
589 considered to belong to inner loop with same header. */
590#define HEAVY_EDGE_RATIO 8
591
592/* Minimum number of samples for that we apply
593 find_subloop_latch_edge_by_profile heuristics. */
594#define HEAVY_EDGE_MIN_SAMPLES 10
595
596/* If the profile info is available, finds an edge in LATCHES that much more
597 frequent than the remaining edges. Returns such an edge, or NULL if we do
598 not find one.
599
600 We do not use guessed profile here, only the measured one. The guessed
601 profile is usually too flat and unreliable for this (and it is mostly based
602 on the loop structure of the program, so it does not make much sense to
603 derive the loop structure from it). */
48e1416a 604
4a6f9e19 605static edge
f1f41a6c 606find_subloop_latch_edge_by_profile (vec<edge> latches)
4a6f9e19 607{
608 unsigned i;
609 edge e, me = NULL;
db9cef39 610 profile_count mcount = profile_count::zero (), tcount = profile_count::zero ();
4a6f9e19 611
f1f41a6c 612 FOR_EACH_VEC_ELT (latches, i, e)
4a6f9e19 613 {
ea5d3981 614 if (e->count ()> mcount)
4a6f9e19 615 {
616 me = e;
ea5d3981 617 mcount = e->count();
4a6f9e19 618 }
ea5d3981 619 tcount += e->count();
4a6f9e19 620 }
621
205ce1aa 622 if (!tcount.initialized_p () || !(tcount.ipa () > HEAVY_EDGE_MIN_SAMPLES)
db9cef39 623 || (tcount - mcount).apply_scale (HEAVY_EDGE_RATIO, 1) > tcount)
4a6f9e19 624 return NULL;
625
626 if (dump_file)
627 fprintf (dump_file,
628 "Found latch edge %d -> %d using profile information.\n",
629 me->src->index, me->dest->index);
630 return me;
631}
632
633/* Among LATCHES, guesses a latch edge of LOOP corresponding to subloop, based
634 on the structure of induction variables. Returns this edge, or NULL if we
635 do not find any.
636
637 We are quite conservative, and look just for an obvious simple innermost
638 loop (which is the case where we would lose the most performance by not
639 disambiguating the loop). More precisely, we look for the following
640 situation: The source of the chosen latch edge dominates sources of all
641 the other latch edges. Additionally, the header does not contain a phi node
642 such that the argument from the chosen edge is equal to the argument from
643 another edge. */
644
645static edge
f1f41a6c 646find_subloop_latch_edge_by_ivs (struct loop *loop ATTRIBUTE_UNUSED, vec<edge> latches)
4a6f9e19 647{
f1f41a6c 648 edge e, latch = latches[0];
4a6f9e19 649 unsigned i;
1a91d914 650 gphi *phi;
651 gphi_iterator psi;
75a70cf9 652 tree lop;
4a6f9e19 653 basic_block bb;
654
655 /* Find the candidate for the latch edge. */
f1f41a6c 656 for (i = 1; latches.iterate (i, &e); i++)
4a6f9e19 657 if (dominated_by_p (CDI_DOMINATORS, latch->src, e->src))
658 latch = e;
659
660 /* Verify that it dominates all the latch edges. */
f1f41a6c 661 FOR_EACH_VEC_ELT (latches, i, e)
4a6f9e19 662 if (!dominated_by_p (CDI_DOMINATORS, e->src, latch->src))
663 return NULL;
664
665 /* Check for a phi node that would deny that this is a latch edge of
666 a subloop. */
75a70cf9 667 for (psi = gsi_start_phis (loop->header); !gsi_end_p (psi); gsi_next (&psi))
4a6f9e19 668 {
1a91d914 669 phi = psi.phi ();
4a6f9e19 670 lop = PHI_ARG_DEF_FROM_EDGE (phi, latch);
671
672 /* Ignore the values that are not changed inside the subloop. */
673 if (TREE_CODE (lop) != SSA_NAME
674 || SSA_NAME_DEF_STMT (lop) == phi)
675 continue;
75a70cf9 676 bb = gimple_bb (SSA_NAME_DEF_STMT (lop));
4a6f9e19 677 if (!bb || !flow_bb_inside_loop_p (loop, bb))
678 continue;
679
f1f41a6c 680 FOR_EACH_VEC_ELT (latches, i, e)
4a6f9e19 681 if (e != latch
682 && PHI_ARG_DEF_FROM_EDGE (phi, e) == lop)
683 return NULL;
684 }
685
686 if (dump_file)
687 fprintf (dump_file,
688 "Found latch edge %d -> %d using iv structure.\n",
689 latch->src->index, latch->dest->index);
690 return latch;
691}
692
693/* If we can determine that one of the several latch edges of LOOP behaves
694 as a latch edge of a separate subloop, returns this edge. Otherwise
695 returns NULL. */
696
697static edge
698find_subloop_latch_edge (struct loop *loop)
699{
f1f41a6c 700 vec<edge> latches = get_loop_latch_edges (loop);
4a6f9e19 701 edge latch = NULL;
702
f1f41a6c 703 if (latches.length () > 1)
4a6f9e19 704 {
705 latch = find_subloop_latch_edge_by_profile (latches);
706
707 if (!latch
708 /* We consider ivs to guess the latch edge only in SSA. Perhaps we
709 should use cfghook for this, but it is hard to imagine it would
710 be useful elsewhere. */
711 && current_ir_type () == IR_GIMPLE)
712 latch = find_subloop_latch_edge_by_ivs (loop, latches);
713 }
714
f1f41a6c 715 latches.release ();
4a6f9e19 716 return latch;
717}
718
719/* Callback for make_forwarder_block. Returns true if the edge E is marked
720 in the set MFB_REIS_SET. */
721
431205b7 722static hash_set<edge> *mfb_reis_set;
4a6f9e19 723static bool
724mfb_redirect_edges_in_set (edge e)
725{
431205b7 726 return mfb_reis_set->contains (e);
4a6f9e19 727}
728
729/* Creates a subloop of LOOP with latch edge LATCH. */
730
731static void
732form_subloop (struct loop *loop, edge latch)
733{
734 edge_iterator ei;
735 edge e, new_entry;
736 struct loop *new_loop;
48e1416a 737
431205b7 738 mfb_reis_set = new hash_set<edge>;
4a6f9e19 739 FOR_EACH_EDGE (e, ei, loop->header->preds)
740 {
741 if (e != latch)
431205b7 742 mfb_reis_set->add (e);
4a6f9e19 743 }
744 new_entry = make_forwarder_block (loop->header, mfb_redirect_edges_in_set,
745 NULL);
431205b7 746 delete mfb_reis_set;
4a6f9e19 747
748 loop->header = new_entry->src;
749
750 /* Find the blocks and subloops that belong to the new loop, and add it to
751 the appropriate place in the loop tree. */
752 new_loop = alloc_loop ();
753 new_loop->header = new_entry->dest;
754 new_loop->latch = latch->src;
755 add_loop (new_loop, loop);
756}
757
758/* Make all the latch edges of LOOP to go to a single forwarder block --
759 a new latch of LOOP. */
760
761static void
762merge_latch_edges (struct loop *loop)
763{
f1f41a6c 764 vec<edge> latches = get_loop_latch_edges (loop);
4a6f9e19 765 edge latch, e;
766 unsigned i;
767
f1f41a6c 768 gcc_assert (latches.length () > 0);
4a6f9e19 769
f1f41a6c 770 if (latches.length () == 1)
771 loop->latch = latches[0]->src;
4a6f9e19 772 else
773 {
774 if (dump_file)
775 fprintf (dump_file, "Merged latch edges of loop %d\n", loop->num);
776
431205b7 777 mfb_reis_set = new hash_set<edge>;
f1f41a6c 778 FOR_EACH_VEC_ELT (latches, i, e)
431205b7 779 mfb_reis_set->add (e);
4a6f9e19 780 latch = make_forwarder_block (loop->header, mfb_redirect_edges_in_set,
781 NULL);
431205b7 782 delete mfb_reis_set;
4a6f9e19 783
784 loop->header = latch->dest;
785 loop->latch = latch->src;
786 }
787
f1f41a6c 788 latches.release ();
4a6f9e19 789}
790
791/* LOOP may have several latch edges. Transform it into (possibly several)
792 loops with single latch edge. */
793
794static void
795disambiguate_multiple_latches (struct loop *loop)
796{
797 edge e;
798
85694bac 799 /* We eliminate the multiple latches by splitting the header to the forwarder
4a6f9e19 800 block F and the rest R, and redirecting the edges. There are two cases:
801
802 1) If there is a latch edge E that corresponds to a subloop (we guess
803 that based on profile -- if it is taken much more often than the
804 remaining edges; and on trees, using the information about induction
805 variables of the loops), we redirect E to R, all the remaining edges to
806 F, then rescan the loops and try again for the outer loop.
807 2) If there is no such edge, we redirect all latch edges to F, and the
808 entry edges to R, thus making F the single latch of the loop. */
809
810 if (dump_file)
811 fprintf (dump_file, "Disambiguating loop %d with multiple latches\n",
812 loop->num);
813
814 /* During latch merging, we may need to redirect the entry edges to a new
815 block. This would cause problems if the entry edge was the one from the
816 entry block. To avoid having to handle this case specially, split
817 such entry edge. */
34154e27 818 e = find_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun), loop->header);
4a6f9e19 819 if (e)
820 split_edge (e);
821
822 while (1)
823 {
824 e = find_subloop_latch_edge (loop);
825 if (!e)
826 break;
827
828 form_subloop (loop, e);
829 }
830
831 merge_latch_edges (loop);
832}
833
834/* Split loops with multiple latch edges. */
835
836void
837disambiguate_loops_with_multiple_latches (void)
838{
4a6f9e19 839 struct loop *loop;
840
f21d4d00 841 FOR_EACH_LOOP (loop, 0)
4a6f9e19 842 {
843 if (!loop->latch)
844 disambiguate_multiple_latches (loop);
845 }
846}
847
d10cfa8d 848/* Return nonzero if basic block BB belongs to LOOP. */
7fb12188 849bool
7ecb5bb2 850flow_bb_inside_loop_p (const struct loop *loop, const_basic_block bb)
7fb12188 851{
852 struct loop *source_loop;
853
34154e27 854 if (bb == ENTRY_BLOCK_PTR_FOR_FN (cfun)
855 || bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
7fb12188 856 return 0;
857
858 source_loop = bb->loop_father;
859 return loop == source_loop || flow_loop_nested_p (loop, source_loop);
860}
861
4a6f9e19 862/* Enumeration predicate for get_loop_body_with_size. */
7fb12188 863static bool
7ecb5bb2 864glb_enum_p (const_basic_block bb, const void *glb_loop)
7fb12188 865{
7ecb5bb2 866 const struct loop *const loop = (const struct loop *) glb_loop;
4a6f9e19 867 return (bb != loop->header
868 && dominated_by_p (CDI_DOMINATORS, bb, loop->header));
869}
870
871/* Gets basic blocks of a LOOP. Header is the 0-th block, rest is in dfs
872 order against direction of edges from latch. Specially, if
873 header != latch, latch is the 1-st block. LOOP cannot be the fake
874 loop tree root, and its size must be at most MAX_SIZE. The blocks
875 in the LOOP body are stored to BODY, and the size of the LOOP is
876 returned. */
877
878unsigned
879get_loop_body_with_size (const struct loop *loop, basic_block *body,
880 unsigned max_size)
881{
882 return dfs_enumerate_from (loop->header, 1, glb_enum_p,
7ecb5bb2 883 body, max_size, loop);
7fb12188 884}
885
dbfc1664 886/* Gets basic blocks of a LOOP. Header is the 0-th block, rest is in dfs
887 order against direction of edges from latch. Specially, if
888 header != latch, latch is the 1-st block. */
4a6f9e19 889
7fb12188 890basic_block *
4c9e08a4 891get_loop_body (const struct loop *loop)
7fb12188 892{
4a6f9e19 893 basic_block *body, bb;
862be747 894 unsigned tv = 0;
7fb12188 895
cc636d56 896 gcc_assert (loop->num_nodes);
7fb12188 897
ed7e2206 898 body = XNEWVEC (basic_block, loop->num_nodes);
7fb12188 899
34154e27 900 if (loop->latch == EXIT_BLOCK_PTR_FOR_FN (cfun))
7fb12188 901 {
4a6f9e19 902 /* There may be blocks unreachable from EXIT_BLOCK, hence we need to
903 special-case the fake loop that contains the whole function. */
a28770e1 904 gcc_assert (loop->num_nodes == (unsigned) n_basic_blocks_for_fn (cfun));
4a6f9e19 905 body[tv++] = loop->header;
34154e27 906 body[tv++] = EXIT_BLOCK_PTR_FOR_FN (cfun);
fc00614f 907 FOR_EACH_BB_FN (bb, cfun)
4a6f9e19 908 body[tv++] = bb;
7fb12188 909 }
4a6f9e19 910 else
911 tv = get_loop_body_with_size (loop, body, loop->num_nodes);
7fb12188 912
cc636d56 913 gcc_assert (tv == loop->num_nodes);
4a6f9e19 914 return body;
7fb12188 915}
916
f9cce2dc 917/* Fills dominance descendants inside LOOP of the basic block BB into
918 array TOVISIT from index *TV. */
919
920static void
921fill_sons_in_loop (const struct loop *loop, basic_block bb,
922 basic_block *tovisit, int *tv)
923{
924 basic_block son, postpone = NULL;
925
926 tovisit[(*tv)++] = bb;
927 for (son = first_dom_son (CDI_DOMINATORS, bb);
928 son;
929 son = next_dom_son (CDI_DOMINATORS, son))
930 {
931 if (!flow_bb_inside_loop_p (loop, son))
932 continue;
933
934 if (dominated_by_p (CDI_DOMINATORS, loop->latch, son))
935 {
936 postpone = son;
937 continue;
938 }
939 fill_sons_in_loop (loop, son, tovisit, tv);
940 }
941
942 if (postpone)
943 fill_sons_in_loop (loop, postpone, tovisit, tv);
944}
945
946/* Gets body of a LOOP (that must be different from the outermost loop)
947 sorted by dominance relation. Additionally, if a basic block s dominates
948 the latch, then only blocks dominated by s are be after it. */
949
950basic_block *
951get_loop_body_in_dom_order (const struct loop *loop)
952{
953 basic_block *tovisit;
954 int tv;
955
cc636d56 956 gcc_assert (loop->num_nodes);
f9cce2dc 957
ed7e2206 958 tovisit = XNEWVEC (basic_block, loop->num_nodes);
f9cce2dc 959
34154e27 960 gcc_assert (loop->latch != EXIT_BLOCK_PTR_FOR_FN (cfun));
f9cce2dc 961
962 tv = 0;
963 fill_sons_in_loop (loop, loop->header, tovisit, &tv);
964
cc636d56 965 gcc_assert (tv == (int) loop->num_nodes);
f9cce2dc 966
967 return tovisit;
968}
969
e1ab7874 970/* Gets body of a LOOP sorted via provided BB_COMPARATOR. */
971
972basic_block *
48e1416a 973get_loop_body_in_custom_order (const struct loop *loop,
e1ab7874 974 int (*bb_comparator) (const void *, const void *))
975{
976 basic_block *bbs = get_loop_body (loop);
977
978 qsort (bbs, loop->num_nodes, sizeof (basic_block), bb_comparator);
979
980 return bbs;
981}
982
07c03fb0 983/* Get body of a LOOP in breadth first sort order. */
984
985basic_block *
986get_loop_body_in_bfs_order (const struct loop *loop)
987{
988 basic_block *blocks;
989 basic_block bb;
6674f8f4 990 unsigned int i = 1;
991 unsigned int vc = 0;
07c03fb0 992
cc636d56 993 gcc_assert (loop->num_nodes);
34154e27 994 gcc_assert (loop->latch != EXIT_BLOCK_PTR_FOR_FN (cfun));
07c03fb0 995
ed7e2206 996 blocks = XNEWVEC (basic_block, loop->num_nodes);
035def86 997 auto_bitmap visited;
6674f8f4 998 blocks[0] = loop->header;
999 bitmap_set_bit (visited, loop->header->index);
07c03fb0 1000 while (i < loop->num_nodes)
1001 {
1002 edge e;
cd665a06 1003 edge_iterator ei;
6674f8f4 1004 gcc_assert (i > vc);
1005 bb = blocks[vc++];
a0c938f0 1006
cd665a06 1007 FOR_EACH_EDGE (e, ei, bb->succs)
a0c938f0 1008 {
1009 if (flow_bb_inside_loop_p (loop, e->dest))
1010 {
6674f8f4 1011 /* This bb is now visited. */
6ef9bbe0 1012 if (bitmap_set_bit (visited, e->dest->index))
1013 blocks[i++] = e->dest;
a0c938f0 1014 }
1015 }
07c03fb0 1016 }
a0c938f0 1017
07c03fb0 1018 return blocks;
1019}
1020
dce58e66 1021/* Hash function for struct loop_exit. */
1022
2ef51f0e 1023hashval_t
1024loop_exit_hasher::hash (loop_exit *exit)
dce58e66 1025{
dce58e66 1026 return htab_hash_pointer (exit->e);
1027}
1028
1029/* Equality function for struct loop_exit. Compares with edge. */
1030
2ef51f0e 1031bool
1032loop_exit_hasher::equal (loop_exit *exit, edge e)
dce58e66 1033{
dce58e66 1034 return exit->e == e;
1035}
1036
1037/* Frees the list of loop exit descriptions EX. */
1038
2ef51f0e 1039void
1040loop_exit_hasher::remove (loop_exit *exit)
dce58e66 1041{
2ef51f0e 1042 loop_exit *next;
dce58e66 1043 for (; exit; exit = next)
1044 {
1045 next = exit->next_e;
48e1416a 1046
dce58e66 1047 exit->next->prev = exit->prev;
1048 exit->prev->next = exit->next;
1049
ccae4f9f 1050 ggc_free (exit);
dce58e66 1051 }
1052}
1053
1054/* Returns the list of records for E as an exit of a loop. */
1055
1056static struct loop_exit *
1057get_exit_descriptions (edge e)
1058{
2ef51f0e 1059 return current_loops->exits->find_with_hash (e, htab_hash_pointer (e));
dce58e66 1060}
1061
1062/* Updates the lists of loop exits in that E appears.
1063 If REMOVED is true, E is being removed, and we
1064 just remove it from the lists of exits.
1065 If NEW_EDGE is true and E is not a loop exit, we
1066 do not try to remove it from loop exit lists. */
1067
1068void
1069rescan_loop_exit (edge e, bool new_edge, bool removed)
1070{
dce58e66 1071 struct loop_exit *exits = NULL, *exit;
1072 struct loop *aloop, *cloop;
1073
f24ec26f 1074 if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
dce58e66 1075 return;
1076
1077 if (!removed
1078 && e->src->loop_father != NULL
1079 && e->dest->loop_father != NULL
1080 && !flow_bb_inside_loop_p (e->src->loop_father, e->dest))
1081 {
1082 cloop = find_common_loop (e->src->loop_father, e->dest->loop_father);
1083 for (aloop = e->src->loop_father;
1084 aloop != cloop;
9e3536f4 1085 aloop = loop_outer (aloop))
dce58e66 1086 {
25a27413 1087 exit = ggc_alloc<loop_exit> ();
dce58e66 1088 exit->e = e;
1089
ccae4f9f 1090 exit->next = aloop->exits->next;
1091 exit->prev = aloop->exits;
dce58e66 1092 exit->next->prev = exit;
1093 exit->prev->next = exit;
1094
1095 exit->next_e = exits;
1096 exits = exit;
1097 }
48e1416a 1098 }
dce58e66 1099
1100 if (!exits && new_edge)
1101 return;
1102
2ef51f0e 1103 loop_exit **slot
1104 = current_loops->exits->find_slot_with_hash (e, htab_hash_pointer (e),
1105 exits ? INSERT : NO_INSERT);
dce58e66 1106 if (!slot)
1107 return;
1108
1109 if (exits)
1110 {
1111 if (*slot)
2ef51f0e 1112 loop_exit_hasher::remove (*slot);
dce58e66 1113 *slot = exits;
1114 }
1115 else
2ef51f0e 1116 current_loops->exits->clear_slot (slot);
dce58e66 1117}
1118
1119/* For each loop, record list of exit edges, and start maintaining these
1120 lists. */
1121
1122void
1123record_loop_exits (void)
1124{
1125 basic_block bb;
1126 edge_iterator ei;
1127 edge e;
1128
d500fef3 1129 if (!current_loops)
1130 return;
1131
f24ec26f 1132 if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
dce58e66 1133 return;
f24ec26f 1134 loops_state_set (LOOPS_HAVE_RECORDED_EXITS);
dce58e66 1135
1136 gcc_assert (current_loops->exits == NULL);
2ef51f0e 1137 current_loops->exits
1138 = hash_table<loop_exit_hasher>::create_ggc (2 * number_of_loops (cfun));
dce58e66 1139
fc00614f 1140 FOR_EACH_BB_FN (bb, cfun)
dce58e66 1141 {
1142 FOR_EACH_EDGE (e, ei, bb->succs)
1143 {
1144 rescan_loop_exit (e, true, false);
1145 }
1146 }
1147}
1148
1149/* Dumps information about the exit in *SLOT to FILE.
1150 Callback for htab_traverse. */
1151
2ef51f0e 1152int
1153dump_recorded_exit (loop_exit **slot, FILE *file)
dce58e66 1154{
2ef51f0e 1155 struct loop_exit *exit = *slot;
dce58e66 1156 unsigned n = 0;
1157 edge e = exit->e;
1158
1159 for (; exit != NULL; exit = exit->next_e)
1160 n++;
1161
2ef51f0e 1162 fprintf (file, "Edge %d->%d exits %u loops\n",
dce58e66 1163 e->src->index, e->dest->index, n);
1164
1165 return 1;
1166}
1167
1168/* Dumps the recorded exits of loops to FILE. */
1169
1170extern void dump_recorded_exits (FILE *);
1171void
1172dump_recorded_exits (FILE *file)
1173{
1174 if (!current_loops->exits)
1175 return;
2ef51f0e 1176 current_loops->exits->traverse<FILE *, dump_recorded_exit> (file);
dce58e66 1177}
1178
1179/* Releases lists of loop exits. */
1180
1181void
d4f078b5 1182release_recorded_exits (function *fn)
dce58e66 1183{
d4f078b5 1184 gcc_assert (loops_state_satisfies_p (fn, LOOPS_HAVE_RECORDED_EXITS));
1185 loops_for_fn (fn)->exits->empty ();
1186 loops_for_fn (fn)->exits = NULL;
1187 loops_state_clear (fn, LOOPS_HAVE_RECORDED_EXITS);
dce58e66 1188}
1189
749ea85f 1190/* Returns the list of the exit edges of a LOOP. */
1191
f1f41a6c 1192vec<edge>
749ea85f 1193get_loop_exit_edges (const struct loop *loop)
a5414ff5 1194{
1e094109 1195 vec<edge> edges = vNULL;
749ea85f 1196 edge e;
1197 unsigned i;
1198 basic_block *body;
cd665a06 1199 edge_iterator ei;
dce58e66 1200 struct loop_exit *exit;
a5414ff5 1201
34154e27 1202 gcc_assert (loop->latch != EXIT_BLOCK_PTR_FOR_FN (cfun));
a5414ff5 1203
dce58e66 1204 /* If we maintain the lists of exits, use them. Otherwise we must
1205 scan the body of the loop. */
f24ec26f 1206 if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
dce58e66 1207 {
ccae4f9f 1208 for (exit = loop->exits->next; exit->e; exit = exit->next)
f1f41a6c 1209 edges.safe_push (exit->e);
dce58e66 1210 }
1211 else
1212 {
1213 body = get_loop_body (loop);
1214 for (i = 0; i < loop->num_nodes; i++)
1215 FOR_EACH_EDGE (e, ei, body[i]->succs)
1216 {
1217 if (!flow_bb_inside_loop_p (loop, e->dest))
f1f41a6c 1218 edges.safe_push (e);
dce58e66 1219 }
1220 free (body);
1221 }
a5414ff5 1222
1223 return edges;
1224}
1225
f9cce2dc 1226/* Counts the number of conditional branches inside LOOP. */
1227
1228unsigned
1229num_loop_branches (const struct loop *loop)
1230{
1231 unsigned i, n;
1232 basic_block * body;
1233
34154e27 1234 gcc_assert (loop->latch != EXIT_BLOCK_PTR_FOR_FN (cfun));
f9cce2dc 1235
1236 body = get_loop_body (loop);
1237 n = 0;
1238 for (i = 0; i < loop->num_nodes; i++)
cd665a06 1239 if (EDGE_COUNT (body[i]->succs) >= 2)
f9cce2dc 1240 n++;
1241 free (body);
1242
1243 return n;
1244}
1245
7fb12188 1246/* Adds basic block BB to LOOP. */
1247void
4c9e08a4 1248add_bb_to_loop (basic_block bb, struct loop *loop)
1249{
9e3536f4 1250 unsigned i;
1251 loop_p ploop;
dce58e66 1252 edge_iterator ei;
1253 edge e;
1254
1255 gcc_assert (bb->loop_father == NULL);
1256 bb->loop_father = loop;
dce58e66 1257 loop->num_nodes++;
f1f41a6c 1258 FOR_EACH_VEC_SAFE_ELT (loop->superloops, i, ploop)
9e3536f4 1259 ploop->num_nodes++;
dce58e66 1260
1261 FOR_EACH_EDGE (e, ei, bb->succs)
1262 {
1263 rescan_loop_exit (e, true, false);
1264 }
1265 FOR_EACH_EDGE (e, ei, bb->preds)
1266 {
1267 rescan_loop_exit (e, true, false);
1268 }
88e6f696 1269}
7fb12188 1270
1271/* Remove basic block BB from loops. */
1272void
4c9e08a4 1273remove_bb_from_loops (basic_block bb)
1274{
f1f41a6c 1275 unsigned i;
dce58e66 1276 struct loop *loop = bb->loop_father;
9e3536f4 1277 loop_p ploop;
dce58e66 1278 edge_iterator ei;
1279 edge e;
1280
1281 gcc_assert (loop != NULL);
1282 loop->num_nodes--;
f1f41a6c 1283 FOR_EACH_VEC_SAFE_ELT (loop->superloops, i, ploop)
9e3536f4 1284 ploop->num_nodes--;
dce58e66 1285 bb->loop_father = NULL;
dce58e66 1286
1287 FOR_EACH_EDGE (e, ei, bb->succs)
1288 {
1289 rescan_loop_exit (e, false, true);
1290 }
1291 FOR_EACH_EDGE (e, ei, bb->preds)
1292 {
1293 rescan_loop_exit (e, false, true);
1294 }
b811afb0 1295}
7fb12188 1296
1297/* Finds nearest common ancestor in loop tree for given loops. */
1298struct loop *
4c9e08a4 1299find_common_loop (struct loop *loop_s, struct loop *loop_d)
7fb12188 1300{
9e3536f4 1301 unsigned sdepth, ddepth;
1302
7fb12188 1303 if (!loop_s) return loop_d;
1304 if (!loop_d) return loop_s;
4c9e08a4 1305
9e3536f4 1306 sdepth = loop_depth (loop_s);
1307 ddepth = loop_depth (loop_d);
1308
1309 if (sdepth < ddepth)
f1f41a6c 1310 loop_d = (*loop_d->superloops)[sdepth];
9e3536f4 1311 else if (sdepth > ddepth)
f1f41a6c 1312 loop_s = (*loop_s->superloops)[ddepth];
7fb12188 1313
1314 while (loop_s != loop_d)
1315 {
9e3536f4 1316 loop_s = loop_outer (loop_s);
1317 loop_d = loop_outer (loop_d);
7fb12188 1318 }
1319 return loop_s;
1320}
1321
17519ba0 1322/* Removes LOOP from structures and frees its data. */
1323
1324void
1325delete_loop (struct loop *loop)
1326{
1327 /* Remove the loop from structure. */
1328 flow_loop_tree_node_remove (loop);
1329
1330 /* Remove loop from loops array. */
f1f41a6c 1331 (*current_loops->larray)[loop->num] = NULL;
17519ba0 1332
1333 /* Free loop data. */
1334 flow_loop_free (loop);
1335}
1336
862be747 1337/* Cancels the LOOP; it must be innermost one. */
77cbebb3 1338
1339static void
7194de72 1340cancel_loop (struct loop *loop)
862be747 1341{
1342 basic_block *bbs;
1343 unsigned i;
9e3536f4 1344 struct loop *outer = loop_outer (loop);
862be747 1345
cc636d56 1346 gcc_assert (!loop->inner);
862be747 1347
1348 /* Move blocks up one level (they should be removed as soon as possible). */
1349 bbs = get_loop_body (loop);
1350 for (i = 0; i < loop->num_nodes; i++)
9e3536f4 1351 bbs[i]->loop_father = outer;
862be747 1352
bf4b25d7 1353 free (bbs);
17519ba0 1354 delete_loop (loop);
862be747 1355}
1356
1357/* Cancels LOOP and all its subloops. */
1358void
7194de72 1359cancel_loop_tree (struct loop *loop)
862be747 1360{
1361 while (loop->inner)
7194de72 1362 cancel_loop_tree (loop->inner);
1363 cancel_loop (loop);
862be747 1364}
1365
62c34df8 1366/* Disable warnings about missing quoting in GCC diagnostics for
1367 the verification errors. Their format strings don't follow GCC
1368 diagnostic conventions and the calls are ultimately followed by
1369 a deliberate ICE triggered by a failed assertion. */
1370#if __GNUC__ >= 10
1371# pragma GCC diagnostic push
1372# pragma GCC diagnostic ignored "-Wformat-diag"
1373#endif
1374
7194de72 1375/* Checks that information about loops is correct
d01481af 1376 -- sizes of loops are all right
7fb12188 1377 -- results of get_loop_body really belong to the loop
1378 -- loop header have just single entry edge and single latch edge
1379 -- loop latches have only single successor that is header of their loop
862be747 1380 -- irreducible loops are correctly marked
4e976818 1381 -- the cached loop depth and loop father of each bb is correct
7fb12188 1382 */
4b987fac 1383DEBUG_FUNCTION void
7194de72 1384verify_loop_structure (void)
7fb12188 1385{
862be747 1386 unsigned *sizes, i, j;
cd9916a9 1387 basic_block bb, *bbs;
7fb12188 1388 struct loop *loop;
1389 int err = 0;
a5414ff5 1390 edge e;
41f75a99 1391 unsigned num = number_of_loops (cfun);
dce58e66 1392 struct loop_exit *exit, *mexit;
79f958cb 1393 bool dom_available = dom_info_available_p (CDI_DOMINATORS);
7fb12188 1394
f6568ea4 1395 if (loops_state_satisfies_p (LOOPS_NEED_FIXUP))
1396 {
1397 error ("loop verification on loop tree that needs fixup");
1398 err = 1;
1399 }
1400
79f958cb 1401 /* We need up-to-date dominators, compute or verify them. */
1402 if (!dom_available)
1403 calculate_dominance_info (CDI_DOMINATORS);
1404 else
1405 verify_dominators (CDI_DOMINATORS);
ef0e6535 1406
1ebce849 1407 /* Check the loop tree root. */
1408 if (current_loops->tree_root->header != ENTRY_BLOCK_PTR_FOR_FN (cfun)
1409 || current_loops->tree_root->latch != EXIT_BLOCK_PTR_FOR_FN (cfun)
1410 || (current_loops->tree_root->num_nodes
1411 != (unsigned) n_basic_blocks_for_fn (cfun)))
1412 {
1413 error ("corrupt loop tree root");
1414 err = 1;
1415 }
1416
14a0d8d7 1417 /* Check the headers. */
fc00614f 1418 FOR_EACH_BB_FN (bb, cfun)
cd9916a9 1419 if (bb_loop_header_p (bb))
14a0d8d7 1420 {
cd9916a9 1421 if (bb->loop_father->header == NULL)
1422 {
1423 error ("loop with header %d marked for removal", bb->index);
1424 err = 1;
1425 }
1426 else if (bb->loop_father->header != bb)
1427 {
1428 error ("loop with header %d not in loop tree", bb->index);
1429 err = 1;
1430 }
1431 }
1432 else if (bb->loop_father->header == bb)
1433 {
1434 error ("non-loop with header %d not marked for removal", bb->index);
14a0d8d7 1435 err = 1;
1436 }
1437
cd9916a9 1438 /* Check the recorded loop father and sizes of loops. */
3c6549f8 1439 auto_sbitmap visited (last_basic_block_for_fn (cfun));
53c5d9d4 1440 bitmap_clear (visited);
a28770e1 1441 bbs = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun));
f21d4d00 1442 FOR_EACH_LOOP (loop, LI_FROM_INNERMOST)
4e976818 1443 {
cd9916a9 1444 unsigned n;
4e976818 1445
cd9916a9 1446 if (loop->header == NULL)
1447 {
1448 error ("removed loop %d in loop tree", loop->num);
1449 err = 1;
1450 continue;
1451 }
1452
a28770e1 1453 n = get_loop_body_with_size (loop, bbs, n_basic_blocks_for_fn (cfun));
cd9916a9 1454 if (loop->num_nodes != n)
1455 {
1456 error ("size of loop %d should be %d, not %d",
1457 loop->num, n, loop->num_nodes);
1458 err = 1;
1459 }
1460
1461 for (j = 0; j < n; j++)
4e976818 1462 {
1463 bb = bbs[j];
1464
ff829efa 1465 if (!flow_bb_inside_loop_p (loop, bb))
1466 {
1467 error ("bb %d does not belong to loop %d",
1468 bb->index, loop->num);
1469 err = 1;
1470 }
1471
4e976818 1472 /* Ignore this block if it is in an inner loop. */
08b7917c 1473 if (bitmap_bit_p (visited, bb->index))
4e976818 1474 continue;
08b7917c 1475 bitmap_set_bit (visited, bb->index);
4e976818 1476
1477 if (bb->loop_father != loop)
1478 {
1479 error ("bb %d has father loop %d, should be loop %d",
1480 bb->index, bb->loop_father->num, loop->num);
1481 err = 1;
1482 }
1483 }
4e976818 1484 }
cd9916a9 1485 free (bbs);
7fb12188 1486
1487 /* Check headers and latches. */
f21d4d00 1488 FOR_EACH_LOOP (loop, 0)
7fb12188 1489 {
17519ba0 1490 i = loop->num;
cd9916a9 1491 if (loop->header == NULL)
1492 continue;
ff829efa 1493 if (!bb_loop_header_p (loop->header))
1494 {
1495 error ("loop %d%'s header is not a loop header", i);
1496 err = 1;
1497 }
f24ec26f 1498 if (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS)
cd665a06 1499 && EDGE_COUNT (loop->header->preds) != 2)
7fb12188 1500 {
bf776685 1501 error ("loop %d%'s header does not have exactly 2 entries", i);
7fb12188 1502 err = 1;
1503 }
b375c775 1504 if (loop->latch)
1505 {
1506 if (!find_edge (loop->latch, loop->header))
1507 {
1508 error ("loop %d%'s latch does not have an edge to its header", i);
1509 err = 1;
1510 }
1511 if (!dominated_by_p (CDI_DOMINATORS, loop->latch, loop->header))
1512 {
1513 error ("loop %d%'s latch is not dominated by its header", i);
1514 err = 1;
1515 }
1516 }
f24ec26f 1517 if (loops_state_satisfies_p (LOOPS_HAVE_SIMPLE_LATCHES))
7fb12188 1518 {
ea091dfd 1519 if (!single_succ_p (loop->latch))
7fb12188 1520 {
bf776685 1521 error ("loop %d%'s latch does not have exactly 1 successor", i);
7fb12188 1522 err = 1;
1523 }
ea091dfd 1524 if (single_succ (loop->latch) != loop->header)
7fb12188 1525 {
bf776685 1526 error ("loop %d%'s latch does not have header as successor", i);
7fb12188 1527 err = 1;
1528 }
1529 if (loop->latch->loop_father != loop)
1530 {
bf776685 1531 error ("loop %d%'s latch does not belong directly to it", i);
7fb12188 1532 err = 1;
1533 }
1534 }
1535 if (loop->header->loop_father != loop)
1536 {
bf776685 1537 error ("loop %d%'s header does not belong directly to it", i);
7fb12188 1538 err = 1;
1539 }
f24ec26f 1540 if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
a5414ff5 1541 && (loop_latch_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP))
1542 {
bf776685 1543 error ("loop %d%'s latch is marked as part of irreducible region", i);
a5414ff5 1544 err = 1;
1545 }
7fb12188 1546 }
1547
862be747 1548 /* Check irreducible loops. */
f24ec26f 1549 if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS))
862be747 1550 {
2515797e 1551 auto_edge_flag saved_irr_mask (cfun);
862be747 1552 /* Record old info. */
3c6549f8 1553 auto_sbitmap irreds (last_basic_block_for_fn (cfun));
fc00614f 1554 FOR_EACH_BB_FN (bb, cfun)
a5414ff5 1555 {
cd665a06 1556 edge_iterator ei;
a5414ff5 1557 if (bb->flags & BB_IRREDUCIBLE_LOOP)
08b7917c 1558 bitmap_set_bit (irreds, bb->index);
a5414ff5 1559 else
08b7917c 1560 bitmap_clear_bit (irreds, bb->index);
cd665a06 1561 FOR_EACH_EDGE (e, ei, bb->succs)
a5414ff5 1562 if (e->flags & EDGE_IRREDUCIBLE_LOOP)
2515797e 1563 e->flags |= saved_irr_mask;
a5414ff5 1564 }
862be747 1565
1566 /* Recount it. */
7194de72 1567 mark_irreducible_loops ();
862be747 1568
1569 /* Compare. */
fc00614f 1570 FOR_EACH_BB_FN (bb, cfun)
862be747 1571 {
cd665a06 1572 edge_iterator ei;
1573
862be747 1574 if ((bb->flags & BB_IRREDUCIBLE_LOOP)
08b7917c 1575 && !bitmap_bit_p (irreds, bb->index))
862be747 1576 {
0a81f5a0 1577 error ("basic block %d should be marked irreducible", bb->index);
862be747 1578 err = 1;
1579 }
1580 else if (!(bb->flags & BB_IRREDUCIBLE_LOOP)
08b7917c 1581 && bitmap_bit_p (irreds, bb->index))
862be747 1582 {
0a81f5a0 1583 error ("basic block %d should not be marked irreducible", bb->index);
862be747 1584 err = 1;
1585 }
cd665a06 1586 FOR_EACH_EDGE (e, ei, bb->succs)
a5414ff5 1587 {
1588 if ((e->flags & EDGE_IRREDUCIBLE_LOOP)
2515797e 1589 && !(e->flags & saved_irr_mask))
a5414ff5 1590 {
0a81f5a0 1591 error ("edge from %d to %d should be marked irreducible",
a5414ff5 1592 e->src->index, e->dest->index);
1593 err = 1;
1594 }
1595 else if (!(e->flags & EDGE_IRREDUCIBLE_LOOP)
2515797e 1596 && (e->flags & saved_irr_mask))
a5414ff5 1597 {
0a81f5a0 1598 error ("edge from %d to %d should not be marked irreducible",
a5414ff5 1599 e->src->index, e->dest->index);
1600 err = 1;
1601 }
2515797e 1602 e->flags &= ~saved_irr_mask;
a5414ff5 1603 }
862be747 1604 }
862be747 1605 }
1606
dce58e66 1607 /* Check the recorded loop exits. */
f21d4d00 1608 FOR_EACH_LOOP (loop, 0)
bb445479 1609 {
ccae4f9f 1610 if (!loop->exits || loop->exits->e != NULL)
dce58e66 1611 {
1612 error ("corrupted head of the exits list of loop %d",
1613 loop->num);
1614 err = 1;
1615 }
1616 else
1617 {
1618 /* Check that the list forms a cycle, and all elements except
1619 for the head are nonnull. */
ccae4f9f 1620 for (mexit = loop->exits, exit = mexit->next, i = 0;
dce58e66 1621 exit->e && exit != mexit;
1622 exit = exit->next)
1623 {
1624 if (i++ & 1)
1625 mexit = mexit->next;
1626 }
1627
ccae4f9f 1628 if (exit != loop->exits)
dce58e66 1629 {
1630 error ("corrupted exits list of loop %d", loop->num);
1631 err = 1;
1632 }
1633 }
1634
f24ec26f 1635 if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
dce58e66 1636 {
ccae4f9f 1637 if (loop->exits->next != loop->exits)
dce58e66 1638 {
1639 error ("nonempty exits list of loop %d, but exits are not recorded",
1640 loop->num);
1641 err = 1;
1642 }
1643 }
1644 }
1645
f24ec26f 1646 if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
dce58e66 1647 {
1648 unsigned n_exits = 0, eloops;
1649
cd9916a9 1650 sizes = XCNEWVEC (unsigned, num);
17519ba0 1651 memset (sizes, 0, sizeof (unsigned) * num);
fc00614f 1652 FOR_EACH_BB_FN (bb, cfun)
bb445479 1653 {
cd665a06 1654 edge_iterator ei;
7194de72 1655 if (bb->loop_father == current_loops->tree_root)
bb445479 1656 continue;
cd665a06 1657 FOR_EACH_EDGE (e, ei, bb->succs)
bb445479 1658 {
bb445479 1659 if (flow_bb_inside_loop_p (bb->loop_father, e->dest))
1660 continue;
1661
dce58e66 1662 n_exits++;
1663 exit = get_exit_descriptions (e);
1664 if (!exit)
1665 {
bf776685 1666 error ("exit %d->%d not recorded",
dce58e66 1667 e->src->index, e->dest->index);
1668 err = 1;
1669 }
1670 eloops = 0;
1671 for (; exit; exit = exit->next_e)
1672 eloops++;
1673
bb445479 1674 for (loop = bb->loop_father;
1032e48d 1675 loop != e->dest->loop_father
1676 /* When a loop exit is also an entry edge which
1677 can happen when avoiding CFG manipulations
1678 then the last loop exited is the outer loop
1679 of the loop entered. */
1680 && loop != loop_outer (e->dest->loop_father);
9e3536f4 1681 loop = loop_outer (loop))
bb445479 1682 {
dce58e66 1683 eloops--;
bb445479 1684 sizes[loop->num]++;
dce58e66 1685 }
1686
1687 if (eloops != 0)
1688 {
62c34df8 1689 error ("wrong list of exited loops for edge %d->%d",
dce58e66 1690 e->src->index, e->dest->index);
1691 err = 1;
bb445479 1692 }
1693 }
1694 }
1695
2ef51f0e 1696 if (n_exits != current_loops->exits->elements ())
bb445479 1697 {
bf776685 1698 error ("too many loop exits recorded");
dce58e66 1699 err = 1;
1700 }
bb445479 1701
f21d4d00 1702 FOR_EACH_LOOP (loop, 0)
dce58e66 1703 {
1704 eloops = 0;
ccae4f9f 1705 for (exit = loop->exits->next; exit->e; exit = exit->next)
dce58e66 1706 eloops++;
1707 if (eloops != sizes[loop->num])
bb445479 1708 {
dce58e66 1709 error ("%d exits recorded for loop %d (having %d exits)",
1710 eloops, loop->num, sizes[loop->num]);
bb445479 1711 err = 1;
1712 }
1713 }
cd9916a9 1714
1715 free (sizes);
bb445479 1716 }
1717
cc636d56 1718 gcc_assert (!err);
bb445479 1719
79f958cb 1720 if (!dom_available)
1721 free_dominance_info (CDI_DOMINATORS);
7fb12188 1722}
1723
62c34df8 1724#if __GNUC__ >= 10
1725# pragma GCC diagnostic pop
1726#endif
1727
7fb12188 1728/* Returns latch edge of LOOP. */
1729edge
4c9e08a4 1730loop_latch_edge (const struct loop *loop)
7fb12188 1731{
c6356c17 1732 return find_edge (loop->latch, loop->header);
65f34de5 1733}
7fb12188 1734
1735/* Returns preheader edge of LOOP. */
1736edge
4c9e08a4 1737loop_preheader_edge (const struct loop *loop)
7fb12188 1738{
1739 edge e;
cd665a06 1740 edge_iterator ei;
7fb12188 1741
453841f9 1742 gcc_assert (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS)
1743 && ! loops_state_satisfies_p (LOOPS_MAY_HAVE_MULTIPLE_LATCHES));
d8a0d6b8 1744
cd665a06 1745 FOR_EACH_EDGE (e, ei, loop->header->preds)
1746 if (e->src != loop->latch)
1747 break;
7fb12188 1748
453841f9 1749 if (! e)
1750 {
1751 gcc_assert (! loop_outer (loop));
1752 return single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun));
1753 }
1754
7fb12188 1755 return e;
1756}
ffc6b5d5 1757
1758/* Returns true if E is an exit of LOOP. */
1759
1760bool
7ecb5bb2 1761loop_exit_edge_p (const struct loop *loop, const_edge e)
ffc6b5d5 1762{
1763 return (flow_bb_inside_loop_p (loop, e->src)
1764 && !flow_bb_inside_loop_p (loop, e->dest));
1765}
d9e7e1a2 1766
1767/* Returns the single exit edge of LOOP, or NULL if LOOP has either no exit
dce58e66 1768 or more than one exit. If loops do not have the exits recorded, NULL
1769 is returned always. */
d9e7e1a2 1770
1771edge
1772single_exit (const struct loop *loop)
1773{
ccae4f9f 1774 struct loop_exit *exit = loop->exits->next;
d9e7e1a2 1775
f24ec26f 1776 if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
dce58e66 1777 return NULL;
d9e7e1a2 1778
ccae4f9f 1779 if (exit->e && exit->next == loop->exits)
dce58e66 1780 return exit->e;
1781 else
1782 return NULL;
d9e7e1a2 1783}
255b6be7 1784
259c0e44 1785/* Returns true when BB has an incoming edge exiting LOOP. */
255b6be7 1786
1787bool
259c0e44 1788loop_exits_to_bb_p (struct loop *loop, basic_block bb)
255b6be7 1789{
1790 edge e;
1791 edge_iterator ei;
1792
1793 FOR_EACH_EDGE (e, ei, bb->preds)
1794 if (loop_exit_edge_p (loop, e))
1795 return true;
1796
1797 return false;
1798}
259c0e44 1799
1800/* Returns true when BB has an outgoing edge exiting LOOP. */
1801
1802bool
1803loop_exits_from_bb_p (struct loop *loop, basic_block bb)
1804{
1805 edge e;
1806 edge_iterator ei;
1807
1808 FOR_EACH_EDGE (e, ei, bb->succs)
1809 if (loop_exit_edge_p (loop, e))
1810 return true;
1811
1812 return false;
1813}
f55775aa 1814
1815/* Return location corresponding to the loop control condition if possible. */
1816
c309657f 1817dump_user_location_t
f55775aa 1818get_loop_location (struct loop *loop)
1819{
cb534875 1820 rtx_insn *insn = NULL;
f55775aa 1821 struct niter_desc *desc = NULL;
1822 edge exit;
1823
1824 /* For a for or while loop, we would like to return the location
1825 of the for or while statement, if possible. To do this, look
1826 for the branch guarding the loop back-edge. */
1827
1828 /* If this is a simple loop with an in_edge, then the loop control
1829 branch is typically at the end of its source. */
1830 desc = get_simple_loop_desc (loop);
1831 if (desc->in_edge)
1832 {
1833 FOR_BB_INSNS_REVERSE (desc->in_edge->src, insn)
1834 {
1835 if (INSN_P (insn) && INSN_HAS_LOCATION (insn))
c309657f 1836 return insn;
f55775aa 1837 }
1838 }
1839 /* If loop has a single exit, then the loop control branch
1840 must be at the end of its source. */
1841 if ((exit = single_exit (loop)))
1842 {
1843 FOR_BB_INSNS_REVERSE (exit->src, insn)
1844 {
1845 if (INSN_P (insn) && INSN_HAS_LOCATION (insn))
c309657f 1846 return insn;
f55775aa 1847 }
1848 }
1849 /* Next check the latch, to see if it is non-empty. */
1850 FOR_BB_INSNS_REVERSE (loop->latch, insn)
1851 {
1852 if (INSN_P (insn) && INSN_HAS_LOCATION (insn))
c309657f 1853 return insn;
f55775aa 1854 }
1855 /* Finally, if none of the above identifies the loop control branch,
1856 return the first location in the loop header. */
1857 FOR_BB_INSNS (loop->header, insn)
1858 {
1859 if (INSN_P (insn) && INSN_HAS_LOCATION (insn))
c309657f 1860 return insn;
f55775aa 1861 }
1862 /* If all else fails, simply return the current function location. */
c309657f 1863 return dump_user_location_t::from_function_decl (current_function_decl);
f55775aa 1864}
1865
f86b328b 1866/* Records that every statement in LOOP is executed I_BOUND times.
1867 REALISTIC is true if I_BOUND is expected to be close to the real number
1868 of iterations. UPPER is true if we are sure the loop iterates at most
1869 I_BOUND times. */
1870
1871void
5de9d3ed 1872record_niter_bound (struct loop *loop, const widest_int &i_bound,
6b409616 1873 bool realistic, bool upper)
f86b328b 1874{
1875 /* Update the bounds only when there is no previous estimation, or when the
1876 current estimation is smaller. */
1877 if (upper
1878 && (!loop->any_upper_bound
6b409616 1879 || wi::ltu_p (i_bound, loop->nb_iterations_upper_bound)))
f86b328b 1880 {
1881 loop->any_upper_bound = true;
1882 loop->nb_iterations_upper_bound = i_bound;
8e3ffe30 1883 if (!loop->any_likely_upper_bound)
1884 {
1885 loop->any_likely_upper_bound = true;
1886 loop->nb_iterations_likely_upper_bound = i_bound;
1887 }
f86b328b 1888 }
1889 if (realistic
1890 && (!loop->any_estimate
6b409616 1891 || wi::ltu_p (i_bound, loop->nb_iterations_estimate)))
f86b328b 1892 {
1893 loop->any_estimate = true;
1894 loop->nb_iterations_estimate = i_bound;
1895 }
8e3ffe30 1896 if (!realistic
1897 && (!loop->any_likely_upper_bound
1898 || wi::ltu_p (i_bound, loop->nb_iterations_likely_upper_bound)))
1899 {
1900 loop->any_likely_upper_bound = true;
1901 loop->nb_iterations_likely_upper_bound = i_bound;
1902 }
f86b328b 1903
1904 /* If an upper bound is smaller than the realistic estimate of the
1905 number of iterations, use the upper bound instead. */
1906 if (loop->any_upper_bound
1907 && loop->any_estimate
6b409616 1908 && wi::ltu_p (loop->nb_iterations_upper_bound,
1909 loop->nb_iterations_estimate))
f86b328b 1910 loop->nb_iterations_estimate = loop->nb_iterations_upper_bound;
8e3ffe30 1911 if (loop->any_upper_bound
1912 && loop->any_likely_upper_bound
1913 && wi::ltu_p (loop->nb_iterations_upper_bound,
1914 loop->nb_iterations_likely_upper_bound))
1915 loop->nb_iterations_likely_upper_bound = loop->nb_iterations_upper_bound;
f86b328b 1916}
1917
4e948f5a 1918/* Similar to get_estimated_loop_iterations, but returns the estimate only
f86b328b 1919 if it fits to HOST_WIDE_INT. If this is not the case, or the estimate
1920 on the number of iterations of LOOP could not be derived, returns -1. */
1921
1922HOST_WIDE_INT
4e948f5a 1923get_estimated_loop_iterations_int (struct loop *loop)
f86b328b 1924{
5de9d3ed 1925 widest_int nit;
f86b328b 1926 HOST_WIDE_INT hwi_nit;
1927
1928 if (!get_estimated_loop_iterations (loop, &nit))
1929 return -1;
1930
6b409616 1931 if (!wi::fits_shwi_p (nit))
f86b328b 1932 return -1;
1933 hwi_nit = nit.to_shwi ();
1934
1935 return hwi_nit < 0 ? -1 : hwi_nit;
1936}
1937
1938/* Returns an upper bound on the number of executions of statements
1939 in the LOOP. For statements before the loop exit, this exceeds
1940 the number of execution of the latch by one. */
1941
1942HOST_WIDE_INT
1943max_stmt_executions_int (struct loop *loop)
1944{
4e948f5a 1945 HOST_WIDE_INT nit = get_max_loop_iterations_int (loop);
f86b328b 1946 HOST_WIDE_INT snit;
1947
1948 if (nit == -1)
1949 return -1;
1950
1951 snit = (HOST_WIDE_INT) ((unsigned HOST_WIDE_INT) nit + 1);
1952
1953 /* If the computation overflows, return -1. */
1954 return snit < 0 ? -1 : snit;
1955}
1956
8e3ffe30 1957/* Returns an likely upper bound on the number of executions of statements
1958 in the LOOP. For statements before the loop exit, this exceeds
1959 the number of execution of the latch by one. */
1960
1961HOST_WIDE_INT
1962likely_max_stmt_executions_int (struct loop *loop)
1963{
1964 HOST_WIDE_INT nit = get_likely_max_loop_iterations_int (loop);
1965 HOST_WIDE_INT snit;
1966
1967 if (nit == -1)
1968 return -1;
1969
1970 snit = (HOST_WIDE_INT) ((unsigned HOST_WIDE_INT) nit + 1);
1971
1972 /* If the computation overflows, return -1. */
1973 return snit < 0 ? -1 : snit;
1974}
1975
f86b328b 1976/* Sets NIT to the estimated number of executions of the latch of the
1977 LOOP. If we have no reliable estimate, the function returns false, otherwise
1978 returns true. */
1979
1980bool
5de9d3ed 1981get_estimated_loop_iterations (struct loop *loop, widest_int *nit)
f86b328b 1982{
1983 /* Even if the bound is not recorded, possibly we can derrive one from
1984 profile. */
1985 if (!loop->any_estimate)
1986 {
db9cef39 1987 if (loop->header->count.reliable_p ())
f86b328b 1988 {
6b409616 1989 *nit = gcov_type_to_wide_int
f86b328b 1990 (expected_loop_iterations_unbounded (loop) + 1);
1991 return true;
1992 }
1993 return false;
1994 }
1995
1996 *nit = loop->nb_iterations_estimate;
1997 return true;
1998}
1999
2000/* Sets NIT to an upper bound for the maximum number of executions of the
2001 latch of the LOOP. If we have no reliable estimate, the function returns
2002 false, otherwise returns true. */
2003
2004bool
fbf561f4 2005get_max_loop_iterations (const struct loop *loop, widest_int *nit)
f86b328b 2006{
2007 if (!loop->any_upper_bound)
2008 return false;
2009
2010 *nit = loop->nb_iterations_upper_bound;
2011 return true;
2012}
4e948f5a 2013
2014/* Similar to get_max_loop_iterations, but returns the estimate only
2015 if it fits to HOST_WIDE_INT. If this is not the case, or the estimate
2016 on the number of iterations of LOOP could not be derived, returns -1. */
2017
2018HOST_WIDE_INT
fbf561f4 2019get_max_loop_iterations_int (const struct loop *loop)
4e948f5a 2020{
5de9d3ed 2021 widest_int nit;
4e948f5a 2022 HOST_WIDE_INT hwi_nit;
2023
2024 if (!get_max_loop_iterations (loop, &nit))
2025 return -1;
2026
6b409616 2027 if (!wi::fits_shwi_p (nit))
4e948f5a 2028 return -1;
2029 hwi_nit = nit.to_shwi ();
2030
2031 return hwi_nit < 0 ? -1 : hwi_nit;
2032}
2033
8e3ffe30 2034/* Sets NIT to an upper bound for the maximum number of executions of the
2035 latch of the LOOP. If we have no reliable estimate, the function returns
2036 false, otherwise returns true. */
2037
2038bool
2039get_likely_max_loop_iterations (struct loop *loop, widest_int *nit)
2040{
2041 if (!loop->any_likely_upper_bound)
2042 return false;
2043
2044 *nit = loop->nb_iterations_likely_upper_bound;
2045 return true;
2046}
2047
2048/* Similar to get_max_loop_iterations, but returns the estimate only
2049 if it fits to HOST_WIDE_INT. If this is not the case, or the estimate
2050 on the number of iterations of LOOP could not be derived, returns -1. */
2051
2052HOST_WIDE_INT
2053get_likely_max_loop_iterations_int (struct loop *loop)
2054{
2055 widest_int nit;
2056 HOST_WIDE_INT hwi_nit;
2057
2058 if (!get_likely_max_loop_iterations (loop, &nit))
2059 return -1;
2060
2061 if (!wi::fits_shwi_p (nit))
2062 return -1;
2063 hwi_nit = nit.to_shwi ();
2064
2065 return hwi_nit < 0 ? -1 : hwi_nit;
2066}
2067
424a4a92 2068/* Returns the loop depth of the loop BB belongs to. */
4e948f5a 2069
424a4a92 2070int
2071bb_loop_depth (const_basic_block bb)
2072{
2073 return bb->loop_father ? loop_depth (bb->loop_father) : 0;
2074}
d25159cc 2075
2076/* Marks LOOP for removal and sets LOOPS_NEED_FIXUP. */
2077
2078void
2079mark_loop_for_removal (loop_p loop)
2080{
4b42315a 2081 if (loop->header == NULL)
2082 return;
6437689e 2083 loop->former_header = loop->header;
d25159cc 2084 loop->header = NULL;
2085 loop->latch = NULL;
2086 loops_state_set (LOOPS_NEED_FIXUP);
2087}