]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cfgloop.c
Add loop_exits_from_bb_p.
[thirdparty/gcc.git] / gcc / cfgloop.c
CommitLineData
402209ff 1/* Natural loop discovery code for GNU compiler.
66647d44 2 Copyright (C) 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008
6fb5fa3c 3 Free Software Foundation, Inc.
402209ff
JH
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9dcd6f09 9Software Foundation; either version 3, or (at your option) any later
402209ff
JH
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
9dcd6f09
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
402209ff
JH
20
21#include "config.h"
22#include "system.h"
4977bab6
ZW
23#include "coretypes.h"
24#include "tm.h"
402209ff
JH
25#include "rtl.h"
26#include "hard-reg-set.h"
7932a3db 27#include "obstack.h"
a310245f 28#include "function.h"
402209ff 29#include "basic-block.h"
3d436d2a 30#include "cfgloop.h"
718f9c0f 31#include "diagnostic-core.h"
3d436d2a 32#include "flags.h"
6de9cd9a
DN
33#include "tree.h"
34#include "tree-flow.h"
89f8f30f
ZD
35#include "pointer-set.h"
36#include "output.h"
9e2f83a5 37#include "ggc.h"
f470c378 38
d73be268 39static void flow_loops_cfg_dump (FILE *);
402209ff
JH
40\f
41/* Dump loop related CFG information. */
42
43static void
d73be268 44flow_loops_cfg_dump (FILE *file)
402209ff 45{
e0082a72 46 basic_block bb;
402209ff 47
d73be268 48 if (!file)
402209ff
JH
49 return;
50
e0082a72 51 FOR_EACH_BB (bb)
402209ff
JH
52 {
53 edge succ;
628f6a4e 54 edge_iterator ei;
402209ff 55
e0082a72 56 fprintf (file, ";; %d succs { ", bb->index);
628f6a4e 57 FOR_EACH_EDGE (succ, ei, bb->succs)
0b17ab2f 58 fprintf (file, "%d ", succ->dest->index);
2ecfd709 59 fprintf (file, "}\n");
402209ff 60 }
402209ff
JH
61}
62
da7d8304 63/* Return nonzero if the nodes of LOOP are a subset of OUTER. */
402209ff 64
2ecfd709 65bool
d329e058 66flow_loop_nested_p (const struct loop *outer, const struct loop *loop)
402209ff 67{
9ba025a2
ZD
68 unsigned odepth = loop_depth (outer);
69
70 return (loop_depth (loop) > odepth
71 && VEC_index (loop_p, loop->superloops, odepth) == outer);
402209ff
JH
72}
73
1ad03593
SP
74/* Returns the loop such that LOOP is nested DEPTH (indexed from zero)
75 loops within LOOP. */
a7e5372d
ZD
76
77struct loop *
78superloop_at_depth (struct loop *loop, unsigned depth)
79{
9ba025a2
ZD
80 unsigned ldepth = loop_depth (loop);
81
82 gcc_assert (depth <= ldepth);
a7e5372d 83
9ba025a2 84 if (depth == ldepth)
a7e5372d
ZD
85 return loop;
86
9ba025a2 87 return VEC_index (loop_p, loop->superloops, depth);
a7e5372d
ZD
88}
89
89f8f30f
ZD
90/* Returns the list of the latch edges of LOOP. */
91
92static VEC (edge, heap) *
93get_loop_latch_edges (const struct loop *loop)
94{
95 edge_iterator ei;
96 edge e;
97 VEC (edge, heap) *ret = NULL;
98
99 FOR_EACH_EDGE (e, ei, loop->header->preds)
100 {
101 if (dominated_by_p (CDI_DOMINATORS, e->src, loop->header))
102 VEC_safe_push (edge, heap, ret, e);
103 }
104
105 return ret;
106}
107
402209ff
JH
108/* Dump the loop information specified by LOOP to the stream FILE
109 using auxiliary dump callback function LOOP_DUMP_AUX if non null. */
110
111void
d329e058
AJ
112flow_loop_dump (const struct loop *loop, FILE *file,
113 void (*loop_dump_aux) (const struct loop *, FILE *, int),
114 int verbose)
402209ff 115{
2ecfd709 116 basic_block *bbs;
3d436d2a 117 unsigned i;
89f8f30f
ZD
118 VEC (edge, heap) *latches;
119 edge e;
2ecfd709 120
402209ff
JH
121 if (! loop || ! loop->header)
122 return;
123
7490e6c4 124 fprintf (file, ";;\n;; Loop %d\n", loop->num);
402209ff 125
89f8f30f
ZD
126 fprintf (file, ";; header %d, ", loop->header->index);
127 if (loop->latch)
128 fprintf (file, "latch %d\n", loop->latch->index);
129 else
130 {
131 fprintf (file, "multiple latches:");
132 latches = get_loop_latch_edges (loop);
133 for (i = 0; VEC_iterate (edge, latches, i, e); i++)
134 fprintf (file, " %d", e->src->index);
135 VEC_free (edge, heap, latches);
136 fprintf (file, "\n");
137 }
138
99f8a411 139 fprintf (file, ";; depth %d, outer %ld\n",
9ba025a2
ZD
140 loop_depth (loop), (long) (loop_outer (loop)
141 ? loop_outer (loop)->num : -1));
402209ff 142
2ecfd709
ZD
143 fprintf (file, ";; nodes:");
144 bbs = get_loop_body (loop);
145 for (i = 0; i < loop->num_nodes; i++)
146 fprintf (file, " %d", bbs[i]->index);
147 free (bbs);
148 fprintf (file, "\n");
5f0d2358 149
402209ff
JH
150 if (loop_dump_aux)
151 loop_dump_aux (loop, file, verbose);
152}
153
d73be268 154/* Dump the loop information about loops to the stream FILE,
402209ff
JH
155 using auxiliary dump callback function LOOP_DUMP_AUX if non null. */
156
157void
d73be268 158flow_loops_dump (FILE *file, void (*loop_dump_aux) (const struct loop *, FILE *, int), int verbose)
402209ff 159{
42fd6772
ZD
160 loop_iterator li;
161 struct loop *loop;
402209ff 162
d73be268 163 if (!current_loops || ! file)
402209ff
JH
164 return;
165
42fd6772 166 fprintf (file, ";; %d loops found\n", number_of_loops ());
2ecfd709 167
42fd6772 168 FOR_EACH_LOOP (li, loop, LI_INCLUDE_ROOT)
402209ff 169 {
2ecfd709 170 flow_loop_dump (loop, file, loop_dump_aux, verbose);
402209ff
JH
171 }
172
173 if (verbose)
d73be268 174 flow_loops_cfg_dump (file);
402209ff
JH
175}
176
2ecfd709 177/* Free data allocated for LOOP. */
9e2f83a5 178
35b07080 179void
d329e058 180flow_loop_free (struct loop *loop)
2ecfd709 181{
6270df4c
ZD
182 struct loop_exit *exit, *next;
183
9e2f83a5 184 VEC_free (loop_p, gc, loop->superloops);
6270df4c
ZD
185
186 /* Break the list of the loop exit records. They will be freed when the
187 corresponding edge is rescanned or removed, and this avoids
188 accessing the (already released) head of the list stored in the
189 loop structure. */
9e2f83a5 190 for (exit = loop->exits->next; exit != loop->exits; exit = next)
6270df4c
ZD
191 {
192 next = exit->next;
193 exit->next = exit;
194 exit->prev = exit;
195 }
9e2f83a5
ZD
196
197 ggc_free (loop->exits);
198 ggc_free (loop);
2ecfd709
ZD
199}
200
402209ff
JH
201/* Free all the memory allocated for LOOPS. */
202
203void
d329e058 204flow_loops_free (struct loops *loops)
402209ff 205{
42fd6772 206 if (loops->larray)
402209ff 207 {
3d436d2a 208 unsigned i;
42fd6772 209 loop_p loop;
402209ff
JH
210
211 /* Free the loop descriptors. */
42fd6772 212 for (i = 0; VEC_iterate (loop_p, loops->larray, i, loop); i++)
402209ff 213 {
2ecfd709
ZD
214 if (!loop)
215 continue;
216
217 flow_loop_free (loop);
402209ff 218 }
5f0d2358 219
9e2f83a5 220 VEC_free (loop_p, gc, loops->larray);
402209ff
JH
221 }
222}
223
2ecfd709
ZD
224/* Find the nodes contained within the LOOP with header HEADER.
225 Return the number of nodes within the loop. */
402209ff 226
2b271002 227int
d329e058 228flow_loop_nodes_find (basic_block header, struct loop *loop)
402209ff 229{
89f8f30f 230 VEC (basic_block, heap) *stack = NULL;
2ecfd709 231 int num_nodes = 1;
89f8f30f
ZD
232 edge latch;
233 edge_iterator latch_ei;
9ba025a2 234 unsigned depth = loop_depth (loop);
402209ff 235
2ecfd709 236 header->loop_father = loop;
9ba025a2 237 header->loop_depth = depth;
402209ff 238
89f8f30f 239 FOR_EACH_EDGE (latch, latch_ei, loop->header->preds)
402209ff 240 {
89f8f30f
ZD
241 if (latch->src->loop_father == loop
242 || !dominated_by_p (CDI_DOMINATORS, latch->src, loop->header))
243 continue;
244
402209ff 245 num_nodes++;
89f8f30f
ZD
246 VEC_safe_push (basic_block, heap, stack, latch->src);
247 latch->src->loop_father = loop;
9ba025a2 248 latch->src->loop_depth = depth;
d329e058 249
89f8f30f 250 while (!VEC_empty (basic_block, stack))
402209ff 251 {
2ecfd709
ZD
252 basic_block node;
253 edge e;
628f6a4e 254 edge_iterator ei;
402209ff 255
89f8f30f 256 node = VEC_pop (basic_block, stack);
d329e058 257
628f6a4e 258 FOR_EACH_EDGE (e, ei, node->preds)
402209ff 259 {
2ecfd709
ZD
260 basic_block ancestor = e->src;
261
89f8f30f 262 if (ancestor->loop_father != loop)
2ecfd709
ZD
263 {
264 ancestor->loop_father = loop;
9ba025a2 265 ancestor->loop_depth = depth;
2ecfd709 266 num_nodes++;
89f8f30f 267 VEC_safe_push (basic_block, heap, stack, ancestor);
2ecfd709 268 }
402209ff
JH
269 }
270 }
271 }
89f8f30f
ZD
272 VEC_free (basic_block, heap, stack);
273
402209ff
JH
274 return num_nodes;
275}
276
9ba025a2
ZD
277/* Records the vector of superloops of the loop LOOP, whose immediate
278 superloop is FATHER. */
279
35b07080 280static void
9ba025a2 281establish_preds (struct loop *loop, struct loop *father)
35b07080 282{
9ba025a2
ZD
283 loop_p ploop;
284 unsigned depth = loop_depth (father) + 1;
285 unsigned i;
a310245f 286
9ba025a2 287 VEC_truncate (loop_p, loop->superloops, 0);
9e2f83a5 288 VEC_reserve (loop_p, gc, loop->superloops, depth);
9ba025a2
ZD
289 for (i = 0; VEC_iterate (loop_p, father->superloops, i, ploop); i++)
290 VEC_quick_push (loop_p, loop->superloops, ploop);
291 VEC_quick_push (loop_p, loop->superloops, father);
35b07080
ZD
292
293 for (ploop = loop->inner; ploop; ploop = ploop->next)
9ba025a2 294 establish_preds (ploop, loop);
35b07080
ZD
295}
296
2ecfd709 297/* Add LOOP to the loop hierarchy tree where FATHER is father of the
35b07080
ZD
298 added loop. If LOOP has some children, take care of that their
299 pred field will be initialized correctly. */
402209ff 300
2ecfd709 301void
d329e058 302flow_loop_tree_node_add (struct loop *father, struct loop *loop)
402209ff 303{
2ecfd709
ZD
304 loop->next = father->inner;
305 father->inner = loop;
2ecfd709 306
9ba025a2 307 establish_preds (loop, father);
402209ff
JH
308}
309
2ecfd709 310/* Remove LOOP from the loop hierarchy tree. */
402209ff 311
2ecfd709 312void
d329e058 313flow_loop_tree_node_remove (struct loop *loop)
402209ff 314{
2ecfd709 315 struct loop *prev, *father;
402209ff 316
9ba025a2 317 father = loop_outer (loop);
402209ff 318
2ecfd709
ZD
319 /* Remove loop from the list of sons. */
320 if (father->inner == loop)
321 father->inner = loop->next;
322 else
323 {
9ba025a2
ZD
324 for (prev = father->inner; prev->next != loop; prev = prev->next)
325 continue;
2ecfd709
ZD
326 prev->next = loop->next;
327 }
402209ff 328
9ba025a2 329 VEC_truncate (loop_p, loop->superloops, 0);
402209ff
JH
330}
331
6270df4c
ZD
332/* Allocates and returns new loop structure. */
333
334struct loop *
335alloc_loop (void)
336{
a9429e29 337 struct loop *loop = ggc_alloc_cleared_loop ();
9e2f83a5 338
a9429e29 339 loop->exits = ggc_alloc_cleared_loop_exit ();
9e2f83a5 340 loop->exits->next = loop->exits->prev = loop->exits;
204b560f 341 loop->can_be_parallel = false;
6270df4c 342
6270df4c
ZD
343 return loop;
344}
345
4ed88ee3
ZD
346/* Initializes loops structure LOOPS, reserving place for NUM_LOOPS loops
347 (including the root of the loop tree). */
348
349static void
350init_loops_structure (struct loops *loops, unsigned num_loops)
351{
352 struct loop *root;
353
354 memset (loops, 0, sizeof *loops);
355 loops->larray = VEC_alloc (loop_p, gc, num_loops);
356
357 /* Dummy loop containing whole function. */
358 root = alloc_loop ();
359 root->num_nodes = n_basic_blocks;
360 root->latch = EXIT_BLOCK_PTR;
361 root->header = ENTRY_BLOCK_PTR;
362 ENTRY_BLOCK_PTR->loop_father = root;
363 EXIT_BLOCK_PTR->loop_father = root;
364
365 VEC_quick_push (loop_p, loops->larray, root);
366 loops->tree_root = root;
367}
368
5f0d2358 369/* Find all the natural loops in the function and save in LOOPS structure and
70388d94
ZD
370 recalculate loop_depth information in basic block structures.
371 Return the number of natural loops found. */
402209ff
JH
372
373int
70388d94 374flow_loops_find (struct loops *loops)
402209ff 375{
0b17ab2f 376 int b;
402209ff
JH
377 int num_loops;
378 edge e;
379 sbitmap headers;
402209ff
JH
380 int *dfs_order;
381 int *rc_order;
355be0dc
JH
382 basic_block header;
383 basic_block bb;
402209ff 384
4ed88ee3
ZD
385 /* Ensure that the dominators are computed. */
386 calculate_dominance_info (CDI_DOMINATORS);
402209ff
JH
387
388 /* Taking care of this degenerate case makes the rest of
389 this code simpler. */
24bd1a0b 390 if (n_basic_blocks == NUM_FIXED_BLOCKS)
4ed88ee3
ZD
391 {
392 init_loops_structure (loops, 1);
393 return 1;
394 }
402209ff
JH
395
396 dfs_order = NULL;
397 rc_order = NULL;
398
2ecfd709 399 /* Count the number of loop headers. This should be the
402209ff 400 same as the number of natural loops. */
2ecfd709
ZD
401 headers = sbitmap_alloc (last_basic_block);
402 sbitmap_zero (headers);
403
402209ff 404 num_loops = 0;
e0082a72 405 FOR_EACH_BB (header)
402209ff 406 {
628f6a4e 407 edge_iterator ei;
d329e058 408
402209ff
JH
409 header->loop_depth = 0;
410
16f2b86a
ZD
411 /* If we have an abnormal predecessor, do not consider the
412 loop (not worth the problems). */
628f6a4e 413 FOR_EACH_EDGE (e, ei, header->preds)
16f2b86a
ZD
414 if (e->flags & EDGE_ABNORMAL)
415 break;
416 if (e)
417 continue;
418
628f6a4e 419 FOR_EACH_EDGE (e, ei, header->preds)
402209ff
JH
420 {
421 basic_block latch = e->src;
422
341c100f 423 gcc_assert (!(e->flags & EDGE_ABNORMAL));
2ecfd709 424
402209ff
JH
425 /* Look for back edges where a predecessor is dominated
426 by this block. A natural loop has a single entry
427 node (header) that dominates all the nodes in the
428 loop. It also has single back edge to the header
2ecfd709 429 from a latch node. */
d47cc544
SB
430 if (latch != ENTRY_BLOCK_PTR
431 && dominated_by_p (CDI_DOMINATORS, latch, header))
2ecfd709
ZD
432 {
433 /* Shared headers should be eliminated by now. */
2ecfd709
ZD
434 SET_BIT (headers, header->index);
435 num_loops++;
436 }
402209ff
JH
437 }
438 }
439
2ecfd709 440 /* Allocate loop structures. */
4ed88ee3 441 init_loops_structure (loops, num_loops + 1);
2ecfd709
ZD
442
443 /* Find and record information about all the natural loops
444 in the CFG. */
2ecfd709
ZD
445 FOR_EACH_BB (bb)
446 bb->loop_father = loops->tree_root;
447
402209ff
JH
448 if (num_loops)
449 {
450 /* Compute depth first search order of the CFG so that outer
451 natural loops will be found before inner natural loops. */
5ed6ace5
MD
452 dfs_order = XNEWVEC (int, n_basic_blocks);
453 rc_order = XNEWVEC (int, n_basic_blocks);
f91a0beb 454 pre_and_rev_post_order_compute (dfs_order, rc_order, false);
402209ff 455
2ecfd709 456 num_loops = 1;
402209ff 457
24bd1a0b 458 for (b = 0; b < n_basic_blocks - NUM_FIXED_BLOCKS; b++)
402209ff 459 {
2ecfd709 460 struct loop *loop;
628f6a4e 461 edge_iterator ei;
402209ff
JH
462
463 /* Search the nodes of the CFG in reverse completion order
464 so that we can find outer loops first. */
2ecfd709
ZD
465 if (!TEST_BIT (headers, rc_order[b]))
466 continue;
467
468 header = BASIC_BLOCK (rc_order[b]);
d329e058 469
6270df4c 470 loop = alloc_loop ();
42fd6772 471 VEC_quick_push (loop_p, loops->larray, loop);
402209ff 472
2ecfd709
ZD
473 loop->header = header;
474 loop->num = num_loops;
475 num_loops++;
476
89f8f30f
ZD
477 flow_loop_tree_node_add (header->loop_father, loop);
478 loop->num_nodes = flow_loop_nodes_find (loop->header, loop);
479
480 /* Look for the latch for this header block, if it has just a
481 single one. */
628f6a4e 482 FOR_EACH_EDGE (e, ei, header->preds)
402209ff 483 {
2ecfd709
ZD
484 basic_block latch = e->src;
485
89f8f30f 486 if (flow_bb_inside_loop_p (loop, latch))
402209ff 487 {
89f8f30f
ZD
488 if (loop->latch != NULL)
489 {
490 /* More than one latch edge. */
491 loop->latch = NULL;
492 break;
493 }
402209ff 494 loop->latch = latch;
402209ff
JH
495 }
496 }
402209ff
JH
497 }
498
598ec7bd
ZD
499 free (dfs_order);
500 free (rc_order);
2ecfd709 501 }
3d436d2a 502
36579663
AP
503 sbitmap_free (headers);
504
6270df4c 505 loops->exits = NULL;
42fd6772 506 return VEC_length (loop_p, loops->larray);
402209ff
JH
507}
508
89f8f30f
ZD
509/* Ratio of frequencies of edges so that one of more latch edges is
510 considered to belong to inner loop with same header. */
511#define HEAVY_EDGE_RATIO 8
512
513/* Minimum number of samples for that we apply
514 find_subloop_latch_edge_by_profile heuristics. */
515#define HEAVY_EDGE_MIN_SAMPLES 10
516
517/* If the profile info is available, finds an edge in LATCHES that much more
518 frequent than the remaining edges. Returns such an edge, or NULL if we do
519 not find one.
520
521 We do not use guessed profile here, only the measured one. The guessed
522 profile is usually too flat and unreliable for this (and it is mostly based
523 on the loop structure of the program, so it does not make much sense to
524 derive the loop structure from it). */
b8698a0f 525
89f8f30f
ZD
526static edge
527find_subloop_latch_edge_by_profile (VEC (edge, heap) *latches)
528{
529 unsigned i;
530 edge e, me = NULL;
531 gcov_type mcount = 0, tcount = 0;
532
533 for (i = 0; VEC_iterate (edge, latches, i, e); i++)
534 {
535 if (e->count > mcount)
536 {
537 me = e;
538 mcount = e->count;
539 }
540 tcount += e->count;
541 }
542
543 if (tcount < HEAVY_EDGE_MIN_SAMPLES
544 || (tcount - mcount) * HEAVY_EDGE_RATIO > tcount)
545 return NULL;
546
547 if (dump_file)
548 fprintf (dump_file,
549 "Found latch edge %d -> %d using profile information.\n",
550 me->src->index, me->dest->index);
551 return me;
552}
553
554/* Among LATCHES, guesses a latch edge of LOOP corresponding to subloop, based
555 on the structure of induction variables. Returns this edge, or NULL if we
556 do not find any.
557
558 We are quite conservative, and look just for an obvious simple innermost
559 loop (which is the case where we would lose the most performance by not
560 disambiguating the loop). More precisely, we look for the following
561 situation: The source of the chosen latch edge dominates sources of all
562 the other latch edges. Additionally, the header does not contain a phi node
563 such that the argument from the chosen edge is equal to the argument from
564 another edge. */
565
566static edge
726a989a 567find_subloop_latch_edge_by_ivs (struct loop *loop ATTRIBUTE_UNUSED, VEC (edge, heap) *latches)
89f8f30f
ZD
568{
569 edge e, latch = VEC_index (edge, latches, 0);
570 unsigned i;
726a989a
RB
571 gimple phi;
572 gimple_stmt_iterator psi;
573 tree lop;
89f8f30f
ZD
574 basic_block bb;
575
576 /* Find the candidate for the latch edge. */
577 for (i = 1; VEC_iterate (edge, latches, i, e); i++)
578 if (dominated_by_p (CDI_DOMINATORS, latch->src, e->src))
579 latch = e;
580
581 /* Verify that it dominates all the latch edges. */
582 for (i = 0; VEC_iterate (edge, latches, i, e); i++)
583 if (!dominated_by_p (CDI_DOMINATORS, e->src, latch->src))
584 return NULL;
585
586 /* Check for a phi node that would deny that this is a latch edge of
587 a subloop. */
726a989a 588 for (psi = gsi_start_phis (loop->header); !gsi_end_p (psi); gsi_next (&psi))
89f8f30f 589 {
726a989a 590 phi = gsi_stmt (psi);
89f8f30f
ZD
591 lop = PHI_ARG_DEF_FROM_EDGE (phi, latch);
592
593 /* Ignore the values that are not changed inside the subloop. */
594 if (TREE_CODE (lop) != SSA_NAME
595 || SSA_NAME_DEF_STMT (lop) == phi)
596 continue;
726a989a 597 bb = gimple_bb (SSA_NAME_DEF_STMT (lop));
89f8f30f
ZD
598 if (!bb || !flow_bb_inside_loop_p (loop, bb))
599 continue;
600
601 for (i = 0; VEC_iterate (edge, latches, i, e); i++)
602 if (e != latch
603 && PHI_ARG_DEF_FROM_EDGE (phi, e) == lop)
604 return NULL;
605 }
606
607 if (dump_file)
608 fprintf (dump_file,
609 "Found latch edge %d -> %d using iv structure.\n",
610 latch->src->index, latch->dest->index);
611 return latch;
612}
613
614/* If we can determine that one of the several latch edges of LOOP behaves
615 as a latch edge of a separate subloop, returns this edge. Otherwise
616 returns NULL. */
617
618static edge
619find_subloop_latch_edge (struct loop *loop)
620{
621 VEC (edge, heap) *latches = get_loop_latch_edges (loop);
622 edge latch = NULL;
623
624 if (VEC_length (edge, latches) > 1)
625 {
626 latch = find_subloop_latch_edge_by_profile (latches);
627
628 if (!latch
629 /* We consider ivs to guess the latch edge only in SSA. Perhaps we
630 should use cfghook for this, but it is hard to imagine it would
631 be useful elsewhere. */
632 && current_ir_type () == IR_GIMPLE)
633 latch = find_subloop_latch_edge_by_ivs (loop, latches);
634 }
635
636 VEC_free (edge, heap, latches);
637 return latch;
638}
639
640/* Callback for make_forwarder_block. Returns true if the edge E is marked
641 in the set MFB_REIS_SET. */
642
643static struct pointer_set_t *mfb_reis_set;
644static bool
645mfb_redirect_edges_in_set (edge e)
646{
647 return pointer_set_contains (mfb_reis_set, e);
648}
649
650/* Creates a subloop of LOOP with latch edge LATCH. */
651
652static void
653form_subloop (struct loop *loop, edge latch)
654{
655 edge_iterator ei;
656 edge e, new_entry;
657 struct loop *new_loop;
b8698a0f 658
89f8f30f
ZD
659 mfb_reis_set = pointer_set_create ();
660 FOR_EACH_EDGE (e, ei, loop->header->preds)
661 {
662 if (e != latch)
663 pointer_set_insert (mfb_reis_set, e);
664 }
665 new_entry = make_forwarder_block (loop->header, mfb_redirect_edges_in_set,
666 NULL);
667 pointer_set_destroy (mfb_reis_set);
668
669 loop->header = new_entry->src;
670
671 /* Find the blocks and subloops that belong to the new loop, and add it to
672 the appropriate place in the loop tree. */
673 new_loop = alloc_loop ();
674 new_loop->header = new_entry->dest;
675 new_loop->latch = latch->src;
676 add_loop (new_loop, loop);
677}
678
679/* Make all the latch edges of LOOP to go to a single forwarder block --
680 a new latch of LOOP. */
681
682static void
683merge_latch_edges (struct loop *loop)
684{
685 VEC (edge, heap) *latches = get_loop_latch_edges (loop);
686 edge latch, e;
687 unsigned i;
688
689 gcc_assert (VEC_length (edge, latches) > 0);
690
691 if (VEC_length (edge, latches) == 1)
692 loop->latch = VEC_index (edge, latches, 0)->src;
693 else
694 {
695 if (dump_file)
696 fprintf (dump_file, "Merged latch edges of loop %d\n", loop->num);
697
698 mfb_reis_set = pointer_set_create ();
699 for (i = 0; VEC_iterate (edge, latches, i, e); i++)
700 pointer_set_insert (mfb_reis_set, e);
701 latch = make_forwarder_block (loop->header, mfb_redirect_edges_in_set,
702 NULL);
703 pointer_set_destroy (mfb_reis_set);
704
705 loop->header = latch->dest;
706 loop->latch = latch->src;
707 }
708
709 VEC_free (edge, heap, latches);
710}
711
712/* LOOP may have several latch edges. Transform it into (possibly several)
713 loops with single latch edge. */
714
715static void
716disambiguate_multiple_latches (struct loop *loop)
717{
718 edge e;
719
ea2c620c 720 /* We eliminate the multiple latches by splitting the header to the forwarder
89f8f30f
ZD
721 block F and the rest R, and redirecting the edges. There are two cases:
722
723 1) If there is a latch edge E that corresponds to a subloop (we guess
724 that based on profile -- if it is taken much more often than the
725 remaining edges; and on trees, using the information about induction
726 variables of the loops), we redirect E to R, all the remaining edges to
727 F, then rescan the loops and try again for the outer loop.
728 2) If there is no such edge, we redirect all latch edges to F, and the
729 entry edges to R, thus making F the single latch of the loop. */
730
731 if (dump_file)
732 fprintf (dump_file, "Disambiguating loop %d with multiple latches\n",
733 loop->num);
734
735 /* During latch merging, we may need to redirect the entry edges to a new
736 block. This would cause problems if the entry edge was the one from the
737 entry block. To avoid having to handle this case specially, split
738 such entry edge. */
739 e = find_edge (ENTRY_BLOCK_PTR, loop->header);
740 if (e)
741 split_edge (e);
742
743 while (1)
744 {
745 e = find_subloop_latch_edge (loop);
746 if (!e)
747 break;
748
749 form_subloop (loop, e);
750 }
751
752 merge_latch_edges (loop);
753}
754
755/* Split loops with multiple latch edges. */
756
757void
758disambiguate_loops_with_multiple_latches (void)
759{
760 loop_iterator li;
761 struct loop *loop;
762
763 FOR_EACH_LOOP (li, loop, 0)
764 {
765 if (!loop->latch)
766 disambiguate_multiple_latches (loop);
767 }
768}
769
da7d8304 770/* Return nonzero if basic block BB belongs to LOOP. */
2ecfd709 771bool
ed7a4b4b 772flow_bb_inside_loop_p (const struct loop *loop, const_basic_block bb)
2ecfd709
ZD
773{
774 struct loop *source_loop;
775
776 if (bb == ENTRY_BLOCK_PTR || bb == EXIT_BLOCK_PTR)
777 return 0;
778
779 source_loop = bb->loop_father;
780 return loop == source_loop || flow_loop_nested_p (loop, source_loop);
781}
782
89f8f30f 783/* Enumeration predicate for get_loop_body_with_size. */
2ecfd709 784static bool
ed7a4b4b 785glb_enum_p (const_basic_block bb, const void *glb_loop)
2ecfd709 786{
ed7a4b4b 787 const struct loop *const loop = (const struct loop *) glb_loop;
89f8f30f
ZD
788 return (bb != loop->header
789 && dominated_by_p (CDI_DOMINATORS, bb, loop->header));
790}
791
792/* Gets basic blocks of a LOOP. Header is the 0-th block, rest is in dfs
793 order against direction of edges from latch. Specially, if
794 header != latch, latch is the 1-st block. LOOP cannot be the fake
795 loop tree root, and its size must be at most MAX_SIZE. The blocks
796 in the LOOP body are stored to BODY, and the size of the LOOP is
797 returned. */
798
799unsigned
800get_loop_body_with_size (const struct loop *loop, basic_block *body,
801 unsigned max_size)
802{
803 return dfs_enumerate_from (loop->header, 1, glb_enum_p,
ed7a4b4b 804 body, max_size, loop);
2ecfd709
ZD
805}
806
8d28e87d
ZD
807/* Gets basic blocks of a LOOP. Header is the 0-th block, rest is in dfs
808 order against direction of edges from latch. Specially, if
809 header != latch, latch is the 1-st block. */
89f8f30f 810
2ecfd709 811basic_block *
d329e058 812get_loop_body (const struct loop *loop)
2ecfd709 813{
89f8f30f 814 basic_block *body, bb;
3d436d2a 815 unsigned tv = 0;
2ecfd709 816
341c100f 817 gcc_assert (loop->num_nodes);
2ecfd709 818
89f8f30f 819 body = XCNEWVEC (basic_block, loop->num_nodes);
2ecfd709
ZD
820
821 if (loop->latch == EXIT_BLOCK_PTR)
822 {
89f8f30f
ZD
823 /* There may be blocks unreachable from EXIT_BLOCK, hence we need to
824 special-case the fake loop that contains the whole function. */
24bd1a0b 825 gcc_assert (loop->num_nodes == (unsigned) n_basic_blocks);
89f8f30f
ZD
826 body[tv++] = loop->header;
827 body[tv++] = EXIT_BLOCK_PTR;
2ecfd709 828 FOR_EACH_BB (bb)
89f8f30f 829 body[tv++] = bb;
2ecfd709 830 }
89f8f30f
ZD
831 else
832 tv = get_loop_body_with_size (loop, body, loop->num_nodes);
2ecfd709 833
341c100f 834 gcc_assert (tv == loop->num_nodes);
89f8f30f 835 return body;
2ecfd709
ZD
836}
837
50654f6c
ZD
838/* Fills dominance descendants inside LOOP of the basic block BB into
839 array TOVISIT from index *TV. */
840
841static void
842fill_sons_in_loop (const struct loop *loop, basic_block bb,
843 basic_block *tovisit, int *tv)
844{
845 basic_block son, postpone = NULL;
846
847 tovisit[(*tv)++] = bb;
848 for (son = first_dom_son (CDI_DOMINATORS, bb);
849 son;
850 son = next_dom_son (CDI_DOMINATORS, son))
851 {
852 if (!flow_bb_inside_loop_p (loop, son))
853 continue;
854
855 if (dominated_by_p (CDI_DOMINATORS, loop->latch, son))
856 {
857 postpone = son;
858 continue;
859 }
860 fill_sons_in_loop (loop, son, tovisit, tv);
861 }
862
863 if (postpone)
864 fill_sons_in_loop (loop, postpone, tovisit, tv);
865}
866
867/* Gets body of a LOOP (that must be different from the outermost loop)
868 sorted by dominance relation. Additionally, if a basic block s dominates
869 the latch, then only blocks dominated by s are be after it. */
870
871basic_block *
872get_loop_body_in_dom_order (const struct loop *loop)
873{
874 basic_block *tovisit;
875 int tv;
876
341c100f 877 gcc_assert (loop->num_nodes);
50654f6c 878
5ed6ace5 879 tovisit = XCNEWVEC (basic_block, loop->num_nodes);
50654f6c 880
341c100f 881 gcc_assert (loop->latch != EXIT_BLOCK_PTR);
50654f6c
ZD
882
883 tv = 0;
884 fill_sons_in_loop (loop, loop->header, tovisit, &tv);
885
341c100f 886 gcc_assert (tv == (int) loop->num_nodes);
50654f6c
ZD
887
888 return tovisit;
889}
890
e855c69d
AB
891/* Gets body of a LOOP sorted via provided BB_COMPARATOR. */
892
893basic_block *
b8698a0f 894get_loop_body_in_custom_order (const struct loop *loop,
e855c69d
AB
895 int (*bb_comparator) (const void *, const void *))
896{
897 basic_block *bbs = get_loop_body (loop);
898
899 qsort (bbs, loop->num_nodes, sizeof (basic_block), bb_comparator);
900
901 return bbs;
902}
903
40923b20
DP
904/* Get body of a LOOP in breadth first sort order. */
905
906basic_block *
907get_loop_body_in_bfs_order (const struct loop *loop)
908{
909 basic_block *blocks;
910 basic_block bb;
911 bitmap visited;
912 unsigned int i = 0;
913 unsigned int vc = 1;
914
341c100f
NS
915 gcc_assert (loop->num_nodes);
916 gcc_assert (loop->latch != EXIT_BLOCK_PTR);
40923b20 917
5ed6ace5 918 blocks = XCNEWVEC (basic_block, loop->num_nodes);
8bdbfff5 919 visited = BITMAP_ALLOC (NULL);
40923b20
DP
920
921 bb = loop->header;
922 while (i < loop->num_nodes)
923 {
924 edge e;
628f6a4e 925 edge_iterator ei;
c22cacf3 926
40923b20 927 if (!bitmap_bit_p (visited, bb->index))
c22cacf3
MS
928 {
929 /* This basic block is now visited */
930 bitmap_set_bit (visited, bb->index);
931 blocks[i++] = bb;
932 }
933
628f6a4e 934 FOR_EACH_EDGE (e, ei, bb->succs)
c22cacf3
MS
935 {
936 if (flow_bb_inside_loop_p (loop, e->dest))
937 {
938 if (!bitmap_bit_p (visited, e->dest->index))
939 {
940 bitmap_set_bit (visited, e->dest->index);
941 blocks[i++] = e->dest;
942 }
943 }
944 }
945
341c100f 946 gcc_assert (i >= vc);
c22cacf3 947
40923b20
DP
948 bb = blocks[vc++];
949 }
c22cacf3 950
8bdbfff5 951 BITMAP_FREE (visited);
40923b20
DP
952 return blocks;
953}
954
6270df4c
ZD
955/* Hash function for struct loop_exit. */
956
957static hashval_t
958loop_exit_hash (const void *ex)
959{
5f754896 960 const struct loop_exit *const exit = (const struct loop_exit *) ex;
6270df4c
ZD
961
962 return htab_hash_pointer (exit->e);
963}
964
965/* Equality function for struct loop_exit. Compares with edge. */
966
967static int
968loop_exit_eq (const void *ex, const void *e)
969{
5f754896 970 const struct loop_exit *const exit = (const struct loop_exit *) ex;
6270df4c
ZD
971
972 return exit->e == e;
973}
974
975/* Frees the list of loop exit descriptions EX. */
976
977static void
978loop_exit_free (void *ex)
979{
980 struct loop_exit *exit = (struct loop_exit *) ex, *next;
981
982 for (; exit; exit = next)
983 {
984 next = exit->next_e;
b8698a0f 985
6270df4c
ZD
986 exit->next->prev = exit->prev;
987 exit->prev->next = exit->next;
988
9e2f83a5 989 ggc_free (exit);
6270df4c
ZD
990 }
991}
992
993/* Returns the list of records for E as an exit of a loop. */
994
995static struct loop_exit *
996get_exit_descriptions (edge e)
997{
ae50c0cb
TN
998 return (struct loop_exit *) htab_find_with_hash (current_loops->exits, e,
999 htab_hash_pointer (e));
6270df4c
ZD
1000}
1001
1002/* Updates the lists of loop exits in that E appears.
1003 If REMOVED is true, E is being removed, and we
1004 just remove it from the lists of exits.
1005 If NEW_EDGE is true and E is not a loop exit, we
1006 do not try to remove it from loop exit lists. */
1007
1008void
1009rescan_loop_exit (edge e, bool new_edge, bool removed)
1010{
1011 void **slot;
1012 struct loop_exit *exits = NULL, *exit;
1013 struct loop *aloop, *cloop;
1014
f87000d0 1015 if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
6270df4c
ZD
1016 return;
1017
1018 if (!removed
1019 && e->src->loop_father != NULL
1020 && e->dest->loop_father != NULL
1021 && !flow_bb_inside_loop_p (e->src->loop_father, e->dest))
1022 {
1023 cloop = find_common_loop (e->src->loop_father, e->dest->loop_father);
1024 for (aloop = e->src->loop_father;
1025 aloop != cloop;
9ba025a2 1026 aloop = loop_outer (aloop))
6270df4c 1027 {
a9429e29 1028 exit = ggc_alloc_loop_exit ();
6270df4c
ZD
1029 exit->e = e;
1030
9e2f83a5
ZD
1031 exit->next = aloop->exits->next;
1032 exit->prev = aloop->exits;
6270df4c
ZD
1033 exit->next->prev = exit;
1034 exit->prev->next = exit;
1035
1036 exit->next_e = exits;
1037 exits = exit;
1038 }
b8698a0f 1039 }
6270df4c
ZD
1040
1041 if (!exits && new_edge)
1042 return;
1043
1044 slot = htab_find_slot_with_hash (current_loops->exits, e,
1045 htab_hash_pointer (e),
1046 exits ? INSERT : NO_INSERT);
1047 if (!slot)
1048 return;
1049
1050 if (exits)
1051 {
1052 if (*slot)
1053 loop_exit_free (*slot);
1054 *slot = exits;
1055 }
1056 else
1057 htab_clear_slot (current_loops->exits, slot);
1058}
1059
1060/* For each loop, record list of exit edges, and start maintaining these
1061 lists. */
1062
1063void
1064record_loop_exits (void)
1065{
1066 basic_block bb;
1067 edge_iterator ei;
1068 edge e;
1069
4839cb59
ZD
1070 if (!current_loops)
1071 return;
1072
f87000d0 1073 if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
6270df4c 1074 return;
f87000d0 1075 loops_state_set (LOOPS_HAVE_RECORDED_EXITS);
6270df4c
ZD
1076
1077 gcc_assert (current_loops->exits == NULL);
a9429e29
LB
1078 current_loops->exits = htab_create_ggc (2 * number_of_loops (),
1079 loop_exit_hash, loop_exit_eq,
1080 loop_exit_free);
6270df4c
ZD
1081
1082 FOR_EACH_BB (bb)
1083 {
1084 FOR_EACH_EDGE (e, ei, bb->succs)
1085 {
1086 rescan_loop_exit (e, true, false);
1087 }
1088 }
1089}
1090
1091/* Dumps information about the exit in *SLOT to FILE.
1092 Callback for htab_traverse. */
1093
1094static int
1095dump_recorded_exit (void **slot, void *file)
1096{
ae50c0cb 1097 struct loop_exit *exit = (struct loop_exit *) *slot;
6270df4c
ZD
1098 unsigned n = 0;
1099 edge e = exit->e;
1100
1101 for (; exit != NULL; exit = exit->next_e)
1102 n++;
1103
ae50c0cb 1104 fprintf ((FILE*) file, "Edge %d->%d exits %u loops\n",
6270df4c
ZD
1105 e->src->index, e->dest->index, n);
1106
1107 return 1;
1108}
1109
1110/* Dumps the recorded exits of loops to FILE. */
1111
1112extern void dump_recorded_exits (FILE *);
1113void
1114dump_recorded_exits (FILE *file)
1115{
1116 if (!current_loops->exits)
1117 return;
1118 htab_traverse (current_loops->exits, dump_recorded_exit, file);
1119}
1120
1121/* Releases lists of loop exits. */
1122
1123void
1124release_recorded_exits (void)
1125{
f87000d0 1126 gcc_assert (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS));
6270df4c
ZD
1127 htab_delete (current_loops->exits);
1128 current_loops->exits = NULL;
f87000d0 1129 loops_state_clear (LOOPS_HAVE_RECORDED_EXITS);
6270df4c
ZD
1130}
1131
ca83d385
ZD
1132/* Returns the list of the exit edges of a LOOP. */
1133
1134VEC (edge, heap) *
1135get_loop_exit_edges (const struct loop *loop)
35b07080 1136{
ca83d385
ZD
1137 VEC (edge, heap) *edges = NULL;
1138 edge e;
1139 unsigned i;
1140 basic_block *body;
628f6a4e 1141 edge_iterator ei;
6270df4c 1142 struct loop_exit *exit;
35b07080 1143
341c100f 1144 gcc_assert (loop->latch != EXIT_BLOCK_PTR);
35b07080 1145
6270df4c
ZD
1146 /* If we maintain the lists of exits, use them. Otherwise we must
1147 scan the body of the loop. */
f87000d0 1148 if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
6270df4c 1149 {
9e2f83a5 1150 for (exit = loop->exits->next; exit->e; exit = exit->next)
6270df4c
ZD
1151 VEC_safe_push (edge, heap, edges, exit->e);
1152 }
1153 else
1154 {
1155 body = get_loop_body (loop);
1156 for (i = 0; i < loop->num_nodes; i++)
1157 FOR_EACH_EDGE (e, ei, body[i]->succs)
1158 {
1159 if (!flow_bb_inside_loop_p (loop, e->dest))
1160 VEC_safe_push (edge, heap, edges, e);
1161 }
1162 free (body);
1163 }
35b07080
ZD
1164
1165 return edges;
1166}
1167
50654f6c
ZD
1168/* Counts the number of conditional branches inside LOOP. */
1169
1170unsigned
1171num_loop_branches (const struct loop *loop)
1172{
1173 unsigned i, n;
1174 basic_block * body;
1175
341c100f 1176 gcc_assert (loop->latch != EXIT_BLOCK_PTR);
50654f6c
ZD
1177
1178 body = get_loop_body (loop);
1179 n = 0;
1180 for (i = 0; i < loop->num_nodes; i++)
628f6a4e 1181 if (EDGE_COUNT (body[i]->succs) >= 2)
50654f6c
ZD
1182 n++;
1183 free (body);
1184
1185 return n;
1186}
1187
2ecfd709
ZD
1188/* Adds basic block BB to LOOP. */
1189void
d329e058
AJ
1190add_bb_to_loop (basic_block bb, struct loop *loop)
1191{
9ba025a2
ZD
1192 unsigned i;
1193 loop_p ploop;
6270df4c
ZD
1194 edge_iterator ei;
1195 edge e;
1196
1197 gcc_assert (bb->loop_father == NULL);
1198 bb->loop_father = loop;
9ba025a2 1199 bb->loop_depth = loop_depth (loop);
6270df4c 1200 loop->num_nodes++;
9ba025a2
ZD
1201 for (i = 0; VEC_iterate (loop_p, loop->superloops, i, ploop); i++)
1202 ploop->num_nodes++;
6270df4c
ZD
1203
1204 FOR_EACH_EDGE (e, ei, bb->succs)
1205 {
1206 rescan_loop_exit (e, true, false);
1207 }
1208 FOR_EACH_EDGE (e, ei, bb->preds)
1209 {
1210 rescan_loop_exit (e, true, false);
1211 }
598ec7bd 1212}
2ecfd709
ZD
1213
1214/* Remove basic block BB from loops. */
1215void
d329e058
AJ
1216remove_bb_from_loops (basic_block bb)
1217{
6270df4c
ZD
1218 int i;
1219 struct loop *loop = bb->loop_father;
9ba025a2 1220 loop_p ploop;
6270df4c
ZD
1221 edge_iterator ei;
1222 edge e;
1223
1224 gcc_assert (loop != NULL);
1225 loop->num_nodes--;
9ba025a2
ZD
1226 for (i = 0; VEC_iterate (loop_p, loop->superloops, i, ploop); i++)
1227 ploop->num_nodes--;
6270df4c
ZD
1228 bb->loop_father = NULL;
1229 bb->loop_depth = 0;
1230
1231 FOR_EACH_EDGE (e, ei, bb->succs)
1232 {
1233 rescan_loop_exit (e, false, true);
1234 }
1235 FOR_EACH_EDGE (e, ei, bb->preds)
1236 {
1237 rescan_loop_exit (e, false, true);
1238 }
a310245f 1239}
2ecfd709
ZD
1240
1241/* Finds nearest common ancestor in loop tree for given loops. */
1242struct loop *
d329e058 1243find_common_loop (struct loop *loop_s, struct loop *loop_d)
2ecfd709 1244{
9ba025a2
ZD
1245 unsigned sdepth, ddepth;
1246
2ecfd709
ZD
1247 if (!loop_s) return loop_d;
1248 if (!loop_d) return loop_s;
d329e058 1249
9ba025a2
ZD
1250 sdepth = loop_depth (loop_s);
1251 ddepth = loop_depth (loop_d);
1252
1253 if (sdepth < ddepth)
1254 loop_d = VEC_index (loop_p, loop_d->superloops, sdepth);
1255 else if (sdepth > ddepth)
1256 loop_s = VEC_index (loop_p, loop_s->superloops, ddepth);
2ecfd709
ZD
1257
1258 while (loop_s != loop_d)
1259 {
9ba025a2
ZD
1260 loop_s = loop_outer (loop_s);
1261 loop_d = loop_outer (loop_d);
2ecfd709
ZD
1262 }
1263 return loop_s;
1264}
1265
42fd6772
ZD
1266/* Removes LOOP from structures and frees its data. */
1267
1268void
1269delete_loop (struct loop *loop)
1270{
1271 /* Remove the loop from structure. */
1272 flow_loop_tree_node_remove (loop);
1273
1274 /* Remove loop from loops array. */
1275 VEC_replace (loop_p, current_loops->larray, loop->num, NULL);
1276
1277 /* Free loop data. */
1278 flow_loop_free (loop);
1279}
1280
3d436d2a 1281/* Cancels the LOOP; it must be innermost one. */
b00bf166
KH
1282
1283static void
d73be268 1284cancel_loop (struct loop *loop)
3d436d2a
ZD
1285{
1286 basic_block *bbs;
1287 unsigned i;
9ba025a2 1288 struct loop *outer = loop_outer (loop);
3d436d2a 1289
341c100f 1290 gcc_assert (!loop->inner);
3d436d2a
ZD
1291
1292 /* Move blocks up one level (they should be removed as soon as possible). */
1293 bbs = get_loop_body (loop);
1294 for (i = 0; i < loop->num_nodes; i++)
9ba025a2 1295 bbs[i]->loop_father = outer;
3d436d2a 1296
42fd6772 1297 delete_loop (loop);
3d436d2a
ZD
1298}
1299
1300/* Cancels LOOP and all its subloops. */
1301void
d73be268 1302cancel_loop_tree (struct loop *loop)
3d436d2a
ZD
1303{
1304 while (loop->inner)
d73be268
ZD
1305 cancel_loop_tree (loop->inner);
1306 cancel_loop (loop);
3d436d2a
ZD
1307}
1308
d73be268 1309/* Checks that information about loops is correct
e0bb17a8 1310 -- sizes of loops are all right
2ecfd709
ZD
1311 -- results of get_loop_body really belong to the loop
1312 -- loop header have just single entry edge and single latch edge
1313 -- loop latches have only single successor that is header of their loop
3d436d2a 1314 -- irreducible loops are correctly marked
2ecfd709 1315 */
24e47c76 1316DEBUG_FUNCTION void
d73be268 1317verify_loop_structure (void)
2ecfd709 1318{
3d436d2a
ZD
1319 unsigned *sizes, i, j;
1320 sbitmap irreds;
2ecfd709
ZD
1321 basic_block *bbs, bb;
1322 struct loop *loop;
1323 int err = 0;
35b07080 1324 edge e;
42fd6772
ZD
1325 unsigned num = number_of_loops ();
1326 loop_iterator li;
6270df4c 1327 struct loop_exit *exit, *mexit;
2ecfd709
ZD
1328
1329 /* Check sizes. */
42fd6772 1330 sizes = XCNEWVEC (unsigned, num);
2ecfd709
ZD
1331 sizes[0] = 2;
1332
1333 FOR_EACH_BB (bb)
9ba025a2 1334 for (loop = bb->loop_father; loop; loop = loop_outer (loop))
2ecfd709
ZD
1335 sizes[loop->num]++;
1336
42fd6772 1337 FOR_EACH_LOOP (li, loop, LI_INCLUDE_ROOT)
2ecfd709 1338 {
42fd6772 1339 i = loop->num;
2ecfd709 1340
42fd6772 1341 if (loop->num_nodes != sizes[i])
2ecfd709 1342 {
ab532386 1343 error ("size of loop %d should be %d, not %d",
42fd6772 1344 i, sizes[i], loop->num_nodes);
2ecfd709
ZD
1345 err = 1;
1346 }
1347 }
1348
2ecfd709 1349 /* Check get_loop_body. */
42fd6772 1350 FOR_EACH_LOOP (li, loop, 0)
2ecfd709 1351 {
2ecfd709
ZD
1352 bbs = get_loop_body (loop);
1353
1354 for (j = 0; j < loop->num_nodes; j++)
1355 if (!flow_bb_inside_loop_p (loop, bbs[j]))
1356 {
ab532386 1357 error ("bb %d do not belong to loop %d",
42fd6772 1358 bbs[j]->index, loop->num);
2ecfd709
ZD
1359 err = 1;
1360 }
1361 free (bbs);
1362 }
1363
1364 /* Check headers and latches. */
42fd6772 1365 FOR_EACH_LOOP (li, loop, 0)
2ecfd709 1366 {
42fd6772 1367 i = loop->num;
2ecfd709 1368
f87000d0 1369 if (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS)
628f6a4e 1370 && EDGE_COUNT (loop->header->preds) != 2)
2ecfd709 1371 {
ab532386 1372 error ("loop %d's header does not have exactly 2 entries", i);
2ecfd709
ZD
1373 err = 1;
1374 }
f87000d0 1375 if (loops_state_satisfies_p (LOOPS_HAVE_SIMPLE_LATCHES))
2ecfd709 1376 {
c5cbcccf 1377 if (!single_succ_p (loop->latch))
2ecfd709 1378 {
ab532386 1379 error ("loop %d's latch does not have exactly 1 successor", i);
2ecfd709
ZD
1380 err = 1;
1381 }
c5cbcccf 1382 if (single_succ (loop->latch) != loop->header)
2ecfd709 1383 {
ab532386 1384 error ("loop %d's latch does not have header as successor", i);
2ecfd709
ZD
1385 err = 1;
1386 }
1387 if (loop->latch->loop_father != loop)
1388 {
ab532386 1389 error ("loop %d's latch does not belong directly to it", i);
2ecfd709
ZD
1390 err = 1;
1391 }
1392 }
1393 if (loop->header->loop_father != loop)
1394 {
ab532386 1395 error ("loop %d's header does not belong directly to it", i);
2ecfd709
ZD
1396 err = 1;
1397 }
f87000d0 1398 if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
35b07080
ZD
1399 && (loop_latch_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP))
1400 {
ab532386 1401 error ("loop %d's latch is marked as part of irreducible region", i);
35b07080
ZD
1402 err = 1;
1403 }
2ecfd709
ZD
1404 }
1405
3d436d2a 1406 /* Check irreducible loops. */
f87000d0 1407 if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS))
3d436d2a
ZD
1408 {
1409 /* Record old info. */
1410 irreds = sbitmap_alloc (last_basic_block);
1411 FOR_EACH_BB (bb)
35b07080 1412 {
628f6a4e 1413 edge_iterator ei;
35b07080
ZD
1414 if (bb->flags & BB_IRREDUCIBLE_LOOP)
1415 SET_BIT (irreds, bb->index);
1416 else
1417 RESET_BIT (irreds, bb->index);
628f6a4e 1418 FOR_EACH_EDGE (e, ei, bb->succs)
35b07080 1419 if (e->flags & EDGE_IRREDUCIBLE_LOOP)
d329e058 1420 e->flags |= EDGE_ALL_FLAGS + 1;
35b07080 1421 }
3d436d2a
ZD
1422
1423 /* Recount it. */
d73be268 1424 mark_irreducible_loops ();
3d436d2a
ZD
1425
1426 /* Compare. */
1427 FOR_EACH_BB (bb)
1428 {
628f6a4e
BE
1429 edge_iterator ei;
1430
3d436d2a
ZD
1431 if ((bb->flags & BB_IRREDUCIBLE_LOOP)
1432 && !TEST_BIT (irreds, bb->index))
1433 {
ab532386 1434 error ("basic block %d should be marked irreducible", bb->index);
3d436d2a
ZD
1435 err = 1;
1436 }
1437 else if (!(bb->flags & BB_IRREDUCIBLE_LOOP)
1438 && TEST_BIT (irreds, bb->index))
1439 {
ab532386 1440 error ("basic block %d should not be marked irreducible", bb->index);
3d436d2a
ZD
1441 err = 1;
1442 }
628f6a4e 1443 FOR_EACH_EDGE (e, ei, bb->succs)
35b07080
ZD
1444 {
1445 if ((e->flags & EDGE_IRREDUCIBLE_LOOP)
1446 && !(e->flags & (EDGE_ALL_FLAGS + 1)))
1447 {
ab532386 1448 error ("edge from %d to %d should be marked irreducible",
35b07080
ZD
1449 e->src->index, e->dest->index);
1450 err = 1;
1451 }
1452 else if (!(e->flags & EDGE_IRREDUCIBLE_LOOP)
1453 && (e->flags & (EDGE_ALL_FLAGS + 1)))
1454 {
ab532386 1455 error ("edge from %d to %d should not be marked irreducible",
35b07080
ZD
1456 e->src->index, e->dest->index);
1457 err = 1;
1458 }
1459 e->flags &= ~(EDGE_ALL_FLAGS + 1);
1460 }
3d436d2a
ZD
1461 }
1462 free (irreds);
1463 }
1464
6270df4c
ZD
1465 /* Check the recorded loop exits. */
1466 FOR_EACH_LOOP (li, loop, 0)
82b85a85 1467 {
9e2f83a5 1468 if (!loop->exits || loop->exits->e != NULL)
6270df4c
ZD
1469 {
1470 error ("corrupted head of the exits list of loop %d",
1471 loop->num);
1472 err = 1;
1473 }
1474 else
1475 {
1476 /* Check that the list forms a cycle, and all elements except
1477 for the head are nonnull. */
9e2f83a5 1478 for (mexit = loop->exits, exit = mexit->next, i = 0;
6270df4c
ZD
1479 exit->e && exit != mexit;
1480 exit = exit->next)
1481 {
1482 if (i++ & 1)
1483 mexit = mexit->next;
1484 }
1485
9e2f83a5 1486 if (exit != loop->exits)
6270df4c
ZD
1487 {
1488 error ("corrupted exits list of loop %d", loop->num);
1489 err = 1;
1490 }
1491 }
1492
f87000d0 1493 if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
6270df4c 1494 {
9e2f83a5 1495 if (loop->exits->next != loop->exits)
6270df4c
ZD
1496 {
1497 error ("nonempty exits list of loop %d, but exits are not recorded",
1498 loop->num);
1499 err = 1;
1500 }
1501 }
1502 }
1503
f87000d0 1504 if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
6270df4c
ZD
1505 {
1506 unsigned n_exits = 0, eloops;
1507
42fd6772 1508 memset (sizes, 0, sizeof (unsigned) * num);
82b85a85
ZD
1509 FOR_EACH_BB (bb)
1510 {
628f6a4e 1511 edge_iterator ei;
d73be268 1512 if (bb->loop_father == current_loops->tree_root)
82b85a85 1513 continue;
628f6a4e 1514 FOR_EACH_EDGE (e, ei, bb->succs)
82b85a85 1515 {
82b85a85
ZD
1516 if (flow_bb_inside_loop_p (bb->loop_father, e->dest))
1517 continue;
1518
6270df4c
ZD
1519 n_exits++;
1520 exit = get_exit_descriptions (e);
1521 if (!exit)
1522 {
b8698a0f 1523 error ("Exit %d->%d not recorded",
6270df4c
ZD
1524 e->src->index, e->dest->index);
1525 err = 1;
1526 }
1527 eloops = 0;
1528 for (; exit; exit = exit->next_e)
1529 eloops++;
1530
82b85a85
ZD
1531 for (loop = bb->loop_father;
1532 loop != e->dest->loop_father;
9ba025a2 1533 loop = loop_outer (loop))
82b85a85 1534 {
6270df4c 1535 eloops--;
82b85a85 1536 sizes[loop->num]++;
6270df4c
ZD
1537 }
1538
1539 if (eloops != 0)
1540 {
b8698a0f 1541 error ("Wrong list of exited loops for edge %d->%d",
6270df4c
ZD
1542 e->src->index, e->dest->index);
1543 err = 1;
82b85a85
ZD
1544 }
1545 }
1546 }
1547
6270df4c 1548 if (n_exits != htab_elements (current_loops->exits))
82b85a85 1549 {
6270df4c
ZD
1550 error ("Too many loop exits recorded");
1551 err = 1;
1552 }
82b85a85 1553
6270df4c
ZD
1554 FOR_EACH_LOOP (li, loop, 0)
1555 {
1556 eloops = 0;
9e2f83a5 1557 for (exit = loop->exits->next; exit->e; exit = exit->next)
6270df4c
ZD
1558 eloops++;
1559 if (eloops != sizes[loop->num])
82b85a85 1560 {
6270df4c
ZD
1561 error ("%d exits recorded for loop %d (having %d exits)",
1562 eloops, loop->num, sizes[loop->num]);
82b85a85
ZD
1563 err = 1;
1564 }
1565 }
1566 }
1567
341c100f 1568 gcc_assert (!err);
82b85a85
ZD
1569
1570 free (sizes);
2ecfd709
ZD
1571}
1572
1573/* Returns latch edge of LOOP. */
1574edge
d329e058 1575loop_latch_edge (const struct loop *loop)
2ecfd709 1576{
9ff3d2de 1577 return find_edge (loop->latch, loop->header);
402209ff 1578}
2ecfd709
ZD
1579
1580/* Returns preheader edge of LOOP. */
1581edge
d329e058 1582loop_preheader_edge (const struct loop *loop)
2ecfd709
ZD
1583{
1584 edge e;
628f6a4e 1585 edge_iterator ei;
2ecfd709 1586
f87000d0 1587 gcc_assert (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS));
c7b852c8 1588
628f6a4e
BE
1589 FOR_EACH_EDGE (e, ei, loop->header->preds)
1590 if (e->src != loop->latch)
1591 break;
2ecfd709
ZD
1592
1593 return e;
1594}
70388d94
ZD
1595
1596/* Returns true if E is an exit of LOOP. */
1597
1598bool
ed7a4b4b 1599loop_exit_edge_p (const struct loop *loop, const_edge e)
70388d94
ZD
1600{
1601 return (flow_bb_inside_loop_p (loop, e->src)
1602 && !flow_bb_inside_loop_p (loop, e->dest));
1603}
ac8f6c69
ZD
1604
1605/* Returns the single exit edge of LOOP, or NULL if LOOP has either no exit
6270df4c
ZD
1606 or more than one exit. If loops do not have the exits recorded, NULL
1607 is returned always. */
ac8f6c69
ZD
1608
1609edge
1610single_exit (const struct loop *loop)
1611{
9e2f83a5 1612 struct loop_exit *exit = loop->exits->next;
ac8f6c69 1613
f87000d0 1614 if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
6270df4c 1615 return NULL;
ac8f6c69 1616
9e2f83a5 1617 if (exit->e && exit->next == loop->exits)
6270df4c
ZD
1618 return exit->e;
1619 else
1620 return NULL;
ac8f6c69 1621}
f8bf9252 1622
f4ce375d 1623/* Returns true when BB has an incoming edge exiting LOOP. */
f8bf9252
SP
1624
1625bool
f4ce375d 1626loop_exits_to_bb_p (struct loop *loop, basic_block bb)
f8bf9252
SP
1627{
1628 edge e;
1629 edge_iterator ei;
1630
1631 FOR_EACH_EDGE (e, ei, bb->preds)
1632 if (loop_exit_edge_p (loop, e))
1633 return true;
1634
1635 return false;
1636}
f4ce375d
VK
1637
1638/* Returns true when BB has an outgoing edge exiting LOOP. */
1639
1640bool
1641loop_exits_from_bb_p (struct loop *loop, basic_block bb)
1642{
1643 edge e;
1644 edge_iterator ei;
1645
1646 FOR_EACH_EDGE (e, ei, bb->succs)
1647 if (loop_exit_edge_p (loop, e))
1648 return true;
1649
1650 return false;
1651}