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