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