00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "config.h"
00022 #include "system.h"
00023 #include "coretypes.h"
00024 #include "tm.h"
00025 #include "rtl.h"
00026 #include "hard-reg-set.h"
00027 #include "obstack.h"
00028 #include "function.h"
00029 #include "basic-block.h"
00030 #include "toplev.h"
00031 #include "cfgloop.h"
00032 #include "flags.h"
00033 #include "tree.h"
00034 #include "tree-flow.h"
00035
00036
00037
00038 #define HEAVY_EDGE_RATIO 8
00039
00040 #define HEADER_BLOCK(B) (* (int *) (B)->aux)
00041 #define LATCH_EDGE(E) (*(int *) (E)->aux)
00042
00043 static void flow_loops_cfg_dump (const struct loops *, FILE *);
00044 static void flow_loop_entry_edges_find (struct loop *);
00045 static void flow_loop_exit_edges_find (struct loop *);
00046 static int flow_loop_nodes_find (basic_block, struct loop *);
00047 static void flow_loop_pre_header_scan (struct loop *);
00048 static basic_block flow_loop_pre_header_find (basic_block);
00049 static int flow_loop_level_compute (struct loop *);
00050 static void flow_loops_level_compute (struct loops *);
00051 static void establish_preds (struct loop *);
00052 static void canonicalize_loop_headers (void);
00053 static bool glb_enum_p (basic_block, void *);
00054
00055
00056
00057 static void
00058 flow_loops_cfg_dump (const struct loops *loops, FILE *file)
00059 {
00060 int i;
00061 basic_block bb;
00062
00063 if (! loops->num || ! file)
00064 return;
00065
00066 FOR_EACH_BB (bb)
00067 {
00068 edge succ;
00069 edge_iterator ei;
00070
00071 fprintf (file, ";; %d succs { ", bb->index);
00072 FOR_EACH_EDGE (succ, ei, bb->succs)
00073 fprintf (file, "%d ", succ->dest->index);
00074 fprintf (file, "}\n");
00075 }
00076
00077
00078 if (loops->cfg.dfs_order)
00079 {
00080 fputs (";; DFS order: ", file);
00081 for (i = 0; i < n_basic_blocks; i++)
00082 fprintf (file, "%d ", loops->cfg.dfs_order[i]);
00083
00084 fputs ("\n", file);
00085 }
00086
00087
00088 if (loops->cfg.rc_order)
00089 {
00090 fputs (";; RC order: ", file);
00091 for (i = 0; i < n_basic_blocks; i++)
00092 fprintf (file, "%d ", loops->cfg.rc_order[i]);
00093
00094 fputs ("\n", file);
00095 }
00096 }
00097
00098
00099
00100 bool
00101 flow_loop_nested_p (const struct loop *outer, const struct loop *loop)
00102 {
00103 return (loop->depth > outer->depth
00104 && loop->pred[outer->depth] == outer);
00105 }
00106
00107
00108
00109
00110 struct loop *
00111 superloop_at_depth (struct loop *loop, unsigned depth)
00112 {
00113 gcc_assert (depth <= (unsigned) loop->depth);
00114
00115 if (depth == (unsigned) loop->depth)
00116 return loop;
00117
00118 return loop->pred[depth];
00119 }
00120
00121
00122
00123
00124 void
00125 flow_loop_dump (const struct loop *loop, FILE *file,
00126 void (*loop_dump_aux) (const struct loop *, FILE *, int),
00127 int verbose)
00128 {
00129 basic_block *bbs;
00130 unsigned i;
00131
00132 if (! loop || ! loop->header)
00133 return;
00134
00135 fprintf (file, ";;\n;; Loop %d:%s\n", loop->num,
00136 loop->invalid ? " invalid" : "");
00137
00138 fprintf (file, ";; header %d, latch %d, pre-header %d\n",
00139 loop->header->index, loop->latch->index,
00140 loop->pre_header ? loop->pre_header->index : -1);
00141 fprintf (file, ";; depth %d, level %d, outer %ld\n",
00142 loop->depth, loop->level,
00143 (long) (loop->outer ? loop->outer->num : -1));
00144
00145 if (loop->pre_header_edges)
00146 flow_edge_list_print (";; pre-header edges", loop->pre_header_edges,
00147 loop->num_pre_header_edges, file);
00148
00149 flow_edge_list_print (";; entry edges", loop->entry_edges,
00150 loop->num_entries, file);
00151 fprintf (file, ";; nodes:");
00152 bbs = get_loop_body (loop);
00153 for (i = 0; i < loop->num_nodes; i++)
00154 fprintf (file, " %d", bbs[i]->index);
00155 free (bbs);
00156 fprintf (file, "\n");
00157 flow_edge_list_print (";; exit edges", loop->exit_edges,
00158 loop->num_exits, file);
00159
00160 if (loop_dump_aux)
00161 loop_dump_aux (loop, file, verbose);
00162 }
00163
00164
00165
00166
00167 void
00168 flow_loops_dump (const struct loops *loops, FILE *file, void (*loop_dump_aux) (const struct loop *, FILE *, int), int verbose)
00169 {
00170 int i;
00171 int num_loops;
00172
00173 num_loops = loops->num;
00174 if (! num_loops || ! file)
00175 return;
00176
00177 fprintf (file, ";; %d loops found\n", num_loops);
00178
00179 for (i = 0; i < num_loops; i++)
00180 {
00181 struct loop *loop = loops->parray[i];
00182
00183 if (!loop)
00184 continue;
00185
00186 flow_loop_dump (loop, file, loop_dump_aux, verbose);
00187 }
00188
00189 if (verbose)
00190 flow_loops_cfg_dump (loops, file);
00191 }
00192
00193
00194 void
00195 flow_loop_free (struct loop *loop)
00196 {
00197 if (loop->pre_header_edges)
00198 free (loop->pre_header_edges);
00199 if (loop->entry_edges)
00200 free (loop->entry_edges);
00201 if (loop->exit_edges)
00202 free (loop->exit_edges);
00203 if (loop->pred)
00204 free (loop->pred);
00205 free (loop);
00206 }
00207
00208
00209
00210 void
00211 flow_loops_free (struct loops *loops)
00212 {
00213 if (loops->parray)
00214 {
00215 unsigned i;
00216
00217 gcc_assert (loops->num);
00218
00219
00220 for (i = 0; i < loops->num; i++)
00221 {
00222 struct loop *loop = loops->parray[i];
00223
00224 if (!loop)
00225 continue;
00226
00227 flow_loop_free (loop);
00228 }
00229
00230 free (loops->parray);
00231 loops->parray = NULL;
00232
00233 if (loops->cfg.dfs_order)
00234 free (loops->cfg.dfs_order);
00235 if (loops->cfg.rc_order)
00236 free (loops->cfg.rc_order);
00237
00238 }
00239 }
00240
00241
00242
00243 static void
00244 flow_loop_entry_edges_find (struct loop *loop)
00245 {
00246 edge e;
00247 edge_iterator ei;
00248 int num_entries;
00249
00250 num_entries = 0;
00251 FOR_EACH_EDGE (e, ei, loop->header->preds)
00252 {
00253 if (flow_loop_outside_edge_p (loop, e))
00254 num_entries++;
00255 }
00256
00257 gcc_assert (num_entries);
00258
00259 loop->entry_edges = xmalloc (num_entries * sizeof (edge *));
00260
00261 num_entries = 0;
00262 FOR_EACH_EDGE (e, ei, loop->header->preds)
00263 {
00264 if (flow_loop_outside_edge_p (loop, e))
00265 loop->entry_edges[num_entries++] = e;
00266 }
00267
00268 loop->num_entries = num_entries;
00269 }
00270
00271
00272
00273 static void
00274 flow_loop_exit_edges_find (struct loop *loop)
00275 {
00276 edge e;
00277 basic_block node, *bbs;
00278 unsigned num_exits, i;
00279
00280 loop->exit_edges = NULL;
00281 loop->num_exits = 0;
00282
00283
00284
00285
00286 num_exits = 0;
00287 bbs = get_loop_body (loop);
00288 for (i = 0; i < loop->num_nodes; i++)
00289 {
00290 edge_iterator ei;
00291 node = bbs[i];
00292 FOR_EACH_EDGE (e, ei, node->succs)
00293 {
00294 basic_block dest = e->dest;
00295
00296 if (!flow_bb_inside_loop_p (loop, dest))
00297 num_exits++;
00298 }
00299 }
00300
00301 if (! num_exits)
00302 {
00303 free (bbs);
00304 return;
00305 }
00306
00307 loop->exit_edges = xmalloc (num_exits * sizeof (edge *));
00308
00309
00310 num_exits = 0;
00311 for (i = 0; i < loop->num_nodes; i++)
00312 {
00313 edge_iterator ei;
00314 node = bbs[i];
00315 FOR_EACH_EDGE (e, ei, node->succs)
00316 {
00317 basic_block dest = e->dest;
00318
00319 if (!flow_bb_inside_loop_p (loop, dest))
00320 {
00321 e->flags |= EDGE_LOOP_EXIT;
00322 loop->exit_edges[num_exits++] = e;
00323 }
00324 }
00325 }
00326 free (bbs);
00327 loop->num_exits = num_exits;
00328 }
00329
00330
00331
00332
00333 static int
00334 flow_loop_nodes_find (basic_block header, struct loop *loop)
00335 {
00336 basic_block *stack;
00337 int sp;
00338 int num_nodes = 1;
00339
00340 header->loop_father = loop;
00341 header->loop_depth = loop->depth;
00342
00343 if (loop->latch->loop_father != loop)
00344 {
00345 stack = xmalloc (n_basic_blocks * sizeof (basic_block));
00346 sp = 0;
00347 num_nodes++;
00348 stack[sp++] = loop->latch;
00349 loop->latch->loop_father = loop;
00350 loop->latch->loop_depth = loop->depth;
00351
00352 while (sp)
00353 {
00354 basic_block node;
00355 edge e;
00356 edge_iterator ei;
00357
00358 node = stack[--sp];
00359
00360 FOR_EACH_EDGE (e, ei, node->preds)
00361 {
00362 basic_block ancestor = e->src;
00363
00364 if (ancestor != ENTRY_BLOCK_PTR
00365 && ancestor->loop_father != loop)
00366 {
00367 ancestor->loop_father = loop;
00368 ancestor->loop_depth = loop->depth;
00369 num_nodes++;
00370 stack[sp++] = ancestor;
00371 }
00372 }
00373 }
00374 free (stack);
00375 }
00376 return num_nodes;
00377 }
00378
00379
00380
00381
00382 void
00383 mark_single_exit_loops (struct loops *loops)
00384 {
00385 basic_block bb;
00386 edge e;
00387 struct loop *loop;
00388 unsigned i;
00389
00390 for (i = 1; i < loops->num; i++)
00391 {
00392 loop = loops->parray[i];
00393 if (loop)
00394 loop->single_exit = NULL;
00395 }
00396
00397 FOR_EACH_BB (bb)
00398 {
00399 edge_iterator ei;
00400 if (bb->loop_father == loops->tree_root)
00401 continue;
00402 FOR_EACH_EDGE (e, ei, bb->succs)
00403 {
00404 if (e->dest == EXIT_BLOCK_PTR)
00405 continue;
00406
00407 if (flow_bb_inside_loop_p (bb->loop_father, e->dest))
00408 continue;
00409
00410 for (loop = bb->loop_father;
00411 loop != e->dest->loop_father;
00412 loop = loop->outer)
00413 {
00414
00415
00416 if (loop->single_exit)
00417 loop->single_exit = EDGE_SUCC (ENTRY_BLOCK_PTR, 0);
00418 else
00419 loop->single_exit = e;
00420 }
00421 }
00422 }
00423
00424 for (i = 1; i < loops->num; i++)
00425 {
00426 loop = loops->parray[i];
00427 if (!loop)
00428 continue;
00429
00430 if (loop->single_exit == EDGE_SUCC (ENTRY_BLOCK_PTR, 0))
00431 loop->single_exit = NULL;
00432 }
00433
00434 loops->state |= LOOPS_HAVE_MARKED_SINGLE_EXITS;
00435 }
00436
00437
00438
00439
00440 static void
00441 flow_loop_pre_header_scan (struct loop *loop)
00442 {
00443 int num;
00444 basic_block ebb;
00445 edge e;
00446
00447 loop->num_pre_header_edges = 0;
00448 if (loop->num_entries != 1)
00449 return;
00450
00451 ebb = loop->entry_edges[0]->src;
00452 if (ebb == ENTRY_BLOCK_PTR)
00453 return;
00454
00455
00456
00457
00458 for (num = 1;
00459 EDGE_PRED (ebb, 0)->src != ENTRY_BLOCK_PTR && EDGE_COUNT (ebb->preds) == 1;
00460 num++)
00461 ebb = EDGE_PRED (ebb, 0)->src;
00462
00463 loop->pre_header_edges = xmalloc (num * sizeof (edge));
00464 loop->num_pre_header_edges = num;
00465
00466
00467
00468
00469 for (e = loop->entry_edges[0]; num; e = EDGE_PRED (e->src, 0))
00470 loop->pre_header_edges[--num] = e;
00471 }
00472
00473
00474
00475
00476 static basic_block
00477 flow_loop_pre_header_find (basic_block header)
00478 {
00479 basic_block pre_header;
00480 edge e;
00481 edge_iterator ei;
00482
00483
00484
00485 pre_header = NULL;
00486 FOR_EACH_EDGE (e, ei, header->preds)
00487 {
00488 basic_block node = e->src;
00489
00490 if (node != ENTRY_BLOCK_PTR
00491 && ! dominated_by_p (CDI_DOMINATORS, node, header))
00492 {
00493 if (pre_header == NULL)
00494 pre_header = node;
00495 else
00496 {
00497
00498
00499 pre_header = NULL;
00500 break;
00501 }
00502 }
00503 }
00504
00505 return pre_header;
00506 }
00507
00508 static void
00509 establish_preds (struct loop *loop)
00510 {
00511 struct loop *ploop, *father = loop->outer;
00512
00513 loop->depth = father->depth + 1;
00514
00515
00516 cfun->max_loop_depth = MAX (cfun->max_loop_depth, loop->depth);
00517
00518 if (loop->pred)
00519 free (loop->pred);
00520 loop->pred = xmalloc (sizeof (struct loop *) * loop->depth);
00521 memcpy (loop->pred, father->pred, sizeof (struct loop *) * father->depth);
00522 loop->pred[father->depth] = father;
00523
00524 for (ploop = loop->inner; ploop; ploop = ploop->next)
00525 establish_preds (ploop);
00526 }
00527
00528
00529
00530
00531
00532 void
00533 flow_loop_tree_node_add (struct loop *father, struct loop *loop)
00534 {
00535 loop->next = father->inner;
00536 father->inner = loop;
00537 loop->outer = father;
00538
00539 establish_preds (loop);
00540 }
00541
00542
00543
00544 void
00545 flow_loop_tree_node_remove (struct loop *loop)
00546 {
00547 struct loop *prev, *father;
00548
00549 father = loop->outer;
00550 loop->outer = NULL;
00551
00552
00553 if (father->inner == loop)
00554 father->inner = loop->next;
00555 else
00556 {
00557 for (prev = father->inner; prev->next != loop; prev = prev->next);
00558 prev->next = loop->next;
00559 }
00560
00561 loop->depth = -1;
00562 free (loop->pred);
00563 loop->pred = NULL;
00564 }
00565
00566
00567
00568
00569 static int
00570 flow_loop_level_compute (struct loop *loop)
00571 {
00572 struct loop *inner;
00573 int level = 1;
00574
00575 if (! loop)
00576 return 0;
00577
00578
00579
00580
00581
00582
00583 for (inner = loop->inner; inner; inner = inner->next)
00584 {
00585 int ilevel = flow_loop_level_compute (inner) + 1;
00586
00587 if (ilevel > level)
00588 level = ilevel;
00589 }
00590
00591 loop->level = level;
00592 return level;
00593 }
00594
00595
00596
00597
00598
00599 static void
00600 flow_loops_level_compute (struct loops *loops)
00601 {
00602 flow_loop_level_compute (loops->tree_root);
00603 }
00604
00605
00606
00607
00608 int
00609 flow_loop_scan (struct loop *loop, int flags)
00610 {
00611 if (flags & LOOP_ENTRY_EDGES)
00612 {
00613
00614
00615
00616 flow_loop_entry_edges_find (loop);
00617 }
00618
00619 if (flags & LOOP_EXIT_EDGES)
00620 {
00621
00622 flow_loop_exit_edges_find (loop);
00623 }
00624
00625 if (flags & LOOP_PRE_HEADER)
00626 {
00627
00628 loop->pre_header = flow_loop_pre_header_find (loop->header);
00629
00630
00631
00632 flow_loop_pre_header_scan (loop);
00633 }
00634
00635 return 1;
00636 }
00637
00638
00639
00640
00641 static void
00642 update_latch_info (basic_block jump)
00643 {
00644 alloc_aux_for_block (jump, sizeof (int));
00645 HEADER_BLOCK (jump) = 0;
00646 alloc_aux_for_edge (EDGE_PRED (jump, 0), sizeof (int));
00647 LATCH_EDGE (EDGE_PRED (jump, 0)) = 0;
00648 set_immediate_dominator (CDI_DOMINATORS, jump, EDGE_PRED (jump, 0)->src);
00649 }
00650
00651
00652
00653
00654
00655 static edge mfb_kj_edge;
00656 static bool
00657 mfb_keep_just (edge e)
00658 {
00659 return e != mfb_kj_edge;
00660 }
00661
00662
00663
00664
00665
00666 static bool
00667 mfb_keep_nonlatch (edge e)
00668 {
00669 return LATCH_EDGE (e);
00670 }
00671
00672
00673
00674 static void
00675 canonicalize_loop_headers (void)
00676 {
00677 basic_block header;
00678 edge e;
00679
00680 alloc_aux_for_blocks (sizeof (int));
00681 alloc_aux_for_edges (sizeof (int));
00682
00683
00684 FOR_EACH_BB (header)
00685 {
00686 edge_iterator ei;
00687 int num_latches = 0;
00688 int have_abnormal_edge = 0;
00689
00690 FOR_EACH_EDGE (e, ei, header->preds)
00691 {
00692 basic_block latch = e->src;
00693
00694 if (e->flags & EDGE_ABNORMAL)
00695 have_abnormal_edge = 1;
00696
00697 if (latch != ENTRY_BLOCK_PTR
00698 && dominated_by_p (CDI_DOMINATORS, latch, header))
00699 {
00700 num_latches++;
00701 LATCH_EDGE (e) = 1;
00702 }
00703 }
00704 if (have_abnormal_edge)
00705 HEADER_BLOCK (header) = 0;
00706 else
00707 HEADER_BLOCK (header) = num_latches;
00708 }
00709
00710 if (HEADER_BLOCK (EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest))
00711 {
00712 basic_block bb;
00713
00714
00715
00716 bb = split_edge (EDGE_SUCC (ENTRY_BLOCK_PTR, 0));
00717
00718 alloc_aux_for_edge (EDGE_SUCC (bb, 0), sizeof (int));
00719 LATCH_EDGE (EDGE_SUCC (bb, 0)) = 0;
00720 alloc_aux_for_block (bb, sizeof (int));
00721 HEADER_BLOCK (bb) = 0;
00722 }
00723
00724 FOR_EACH_BB (header)
00725 {
00726 int max_freq, is_heavy;
00727 edge heavy, tmp_edge;
00728 edge_iterator ei;
00729
00730 if (HEADER_BLOCK (header) <= 1)
00731 continue;
00732
00733
00734 is_heavy = 1;
00735 heavy = NULL;
00736 max_freq = 0;
00737 FOR_EACH_EDGE (e, ei, header->preds)
00738 if (LATCH_EDGE (e) &&
00739 EDGE_FREQUENCY (e) > max_freq)
00740 max_freq = EDGE_FREQUENCY (e);
00741 FOR_EACH_EDGE (e, ei, header->preds)
00742 if (LATCH_EDGE (e) &&
00743 EDGE_FREQUENCY (e) >= max_freq / HEAVY_EDGE_RATIO)
00744 {
00745 if (heavy)
00746 {
00747 is_heavy = 0;
00748 break;
00749 }
00750 else
00751 heavy = e;
00752 }
00753
00754 if (is_heavy)
00755 {
00756
00757 mfb_kj_edge = heavy;
00758 tmp_edge = make_forwarder_block (header, mfb_keep_just,
00759 update_latch_info);
00760 alloc_aux_for_block (tmp_edge->dest, sizeof (int));
00761 HEADER_BLOCK (tmp_edge->dest) = 1;
00762 alloc_aux_for_edge (tmp_edge, sizeof (int));
00763 LATCH_EDGE (tmp_edge) = 0;
00764 HEADER_BLOCK (header)--;
00765 }
00766
00767 if (HEADER_BLOCK (header) > 1)
00768 {
00769
00770 tmp_edge = make_forwarder_block (header, mfb_keep_nonlatch,
00771 update_latch_info);
00772 alloc_aux_for_block (tmp_edge->dest, sizeof (int));
00773 HEADER_BLOCK (tmp_edge->src) = 0;
00774 HEADER_BLOCK (tmp_edge->dest) = 1;
00775 alloc_aux_for_edge (tmp_edge, sizeof (int));
00776 LATCH_EDGE (tmp_edge) = 1;
00777 }
00778 }
00779
00780 free_aux_for_blocks ();
00781 free_aux_for_edges ();
00782
00783 #ifdef ENABLE_CHECKING
00784 verify_dominators (CDI_DOMINATORS);
00785 #endif
00786 }
00787
00788
00789
00790 static void
00791 initialize_loops_parallel_p (struct loops *loops)
00792 {
00793 unsigned int i;
00794
00795 for (i = 0; i < loops->num; i++)
00796 {
00797 struct loop *loop = loops->parray[i];
00798 loop->parallel_p = true;
00799 }
00800 }
00801
00802
00803
00804
00805
00806
00807 int
00808 flow_loops_find (struct loops *loops, int flags)
00809 {
00810 int i;
00811 int b;
00812 int num_loops;
00813 edge e;
00814 sbitmap headers;
00815 int *dfs_order;
00816 int *rc_order;
00817 basic_block header;
00818 basic_block bb;
00819
00820
00821
00822
00823 gcc_assert (flags & LOOP_TREE);
00824
00825 memset (loops, 0, sizeof *loops);
00826
00827
00828
00829 cfun->max_loop_depth = 0;
00830
00831
00832
00833 if (n_basic_blocks == 0)
00834 return 0;
00835
00836 dfs_order = NULL;
00837 rc_order = NULL;
00838
00839
00840 calculate_dominance_info (CDI_DOMINATORS);
00841
00842
00843 canonicalize_loop_headers ();
00844
00845
00846
00847 headers = sbitmap_alloc (last_basic_block);
00848 sbitmap_zero (headers);
00849
00850 num_loops = 0;
00851 FOR_EACH_BB (header)
00852 {
00853 edge_iterator ei;
00854 int more_latches = 0;
00855
00856 header->loop_depth = 0;
00857
00858
00859
00860 FOR_EACH_EDGE (e, ei, header->preds)
00861 if (e->flags & EDGE_ABNORMAL)
00862 break;
00863 if (e)
00864 continue;
00865
00866 FOR_EACH_EDGE (e, ei, header->preds)
00867 {
00868 basic_block latch = e->src;
00869
00870 gcc_assert (!(e->flags & EDGE_ABNORMAL));
00871
00872
00873
00874
00875
00876
00877 if (latch != ENTRY_BLOCK_PTR
00878 && dominated_by_p (CDI_DOMINATORS, latch, header))
00879 {
00880
00881 gcc_assert (!more_latches);
00882 more_latches = 1;
00883 SET_BIT (headers, header->index);
00884 num_loops++;
00885 }
00886 }
00887 }
00888
00889
00890 loops->parray = xcalloc (num_loops + 1, sizeof (struct loop *));
00891
00892
00893 loops->parray[0] = xcalloc (1, sizeof (struct loop));
00894 loops->parray[0]->next = NULL;
00895 loops->parray[0]->inner = NULL;
00896 loops->parray[0]->outer = NULL;
00897 loops->parray[0]->depth = 0;
00898 loops->parray[0]->pred = NULL;
00899 loops->parray[0]->num_nodes = n_basic_blocks + 2;
00900 loops->parray[0]->latch = EXIT_BLOCK_PTR;
00901 loops->parray[0]->header = ENTRY_BLOCK_PTR;
00902 ENTRY_BLOCK_PTR->loop_father = loops->parray[0];
00903 EXIT_BLOCK_PTR->loop_father = loops->parray[0];
00904
00905 loops->tree_root = loops->parray[0];
00906
00907
00908
00909 loops->num = 1;
00910 FOR_EACH_BB (bb)
00911 bb->loop_father = loops->tree_root;
00912
00913 if (num_loops)
00914 {
00915
00916
00917 dfs_order = xmalloc (n_basic_blocks * sizeof (int));
00918 rc_order = xmalloc (n_basic_blocks * sizeof (int));
00919 flow_depth_first_order_compute (dfs_order, rc_order);
00920
00921
00922 loops->cfg.dfs_order = dfs_order;
00923 loops->cfg.rc_order = rc_order;
00924
00925 num_loops = 1;
00926
00927 for (b = 0; b < n_basic_blocks; b++)
00928 {
00929 struct loop *loop;
00930 edge_iterator ei;
00931
00932
00933
00934 if (!TEST_BIT (headers, rc_order[b]))
00935 continue;
00936
00937 header = BASIC_BLOCK (rc_order[b]);
00938
00939 loop = loops->parray[num_loops] = xcalloc (1, sizeof (struct loop));
00940
00941 loop->header = header;
00942 loop->num = num_loops;
00943 num_loops++;
00944
00945
00946 FOR_EACH_EDGE (e, ei, header->preds)
00947 {
00948 basic_block latch = e->src;
00949
00950 if (latch != ENTRY_BLOCK_PTR
00951 && dominated_by_p (CDI_DOMINATORS, latch, header))
00952 {
00953 loop->latch = latch;
00954 break;
00955 }
00956 }
00957
00958 flow_loop_tree_node_add (header->loop_father, loop);
00959 loop->num_nodes = flow_loop_nodes_find (loop->header, loop);
00960 }
00961
00962
00963
00964 flow_loops_level_compute (loops);
00965
00966
00967 for (i = 1; i < num_loops; i++)
00968 flow_loop_scan (loops->parray[i], flags);
00969
00970 loops->num = num_loops;
00971 initialize_loops_parallel_p (loops);
00972 }
00973
00974 sbitmap_free (headers);
00975
00976 loops->state = 0;
00977 #ifdef ENABLE_CHECKING
00978 verify_flow_info ();
00979 verify_loop_structure (loops);
00980 #endif
00981
00982 return loops->num;
00983 }
00984
00985
00986 bool
00987 flow_bb_inside_loop_p (const struct loop *loop, const basic_block bb)
00988 {
00989 struct loop *source_loop;
00990
00991 if (bb == ENTRY_BLOCK_PTR || bb == EXIT_BLOCK_PTR)
00992 return 0;
00993
00994 source_loop = bb->loop_father;
00995 return loop == source_loop || flow_loop_nested_p (loop, source_loop);
00996 }
00997
00998
00999
01000 bool
01001 flow_loop_outside_edge_p (const struct loop *loop, edge e)
01002 {
01003 gcc_assert (e->dest == loop->header);
01004 return !flow_bb_inside_loop_p (loop, e->src);
01005 }
01006
01007
01008 static bool
01009 glb_enum_p (basic_block bb, void *glb_header)
01010 {
01011 return bb != (basic_block) glb_header;
01012 }
01013
01014
01015
01016
01017 basic_block *
01018 get_loop_body (const struct loop *loop)
01019 {
01020 basic_block *tovisit, bb;
01021 unsigned tv = 0;
01022
01023 gcc_assert (loop->num_nodes);
01024
01025 tovisit = xcalloc (loop->num_nodes, sizeof (basic_block));
01026 tovisit[tv++] = loop->header;
01027
01028 if (loop->latch == EXIT_BLOCK_PTR)
01029 {
01030
01031 gcc_assert (loop->num_nodes == (unsigned) n_basic_blocks + 2);
01032 FOR_EACH_BB (bb)
01033 tovisit[tv++] = bb;
01034 tovisit[tv++] = EXIT_BLOCK_PTR;
01035 }
01036 else if (loop->latch != loop->header)
01037 {
01038 tv = dfs_enumerate_from (loop->latch, 1, glb_enum_p,
01039 tovisit + 1, loop->num_nodes - 1,
01040 loop->header) + 1;
01041 }
01042
01043 gcc_assert (tv == loop->num_nodes);
01044 return tovisit;
01045 }
01046
01047
01048
01049
01050 static void
01051 fill_sons_in_loop (const struct loop *loop, basic_block bb,
01052 basic_block *tovisit, int *tv)
01053 {
01054 basic_block son, postpone = NULL;
01055
01056 tovisit[(*tv)++] = bb;
01057 for (son = first_dom_son (CDI_DOMINATORS, bb);
01058 son;
01059 son = next_dom_son (CDI_DOMINATORS, son))
01060 {
01061 if (!flow_bb_inside_loop_p (loop, son))
01062 continue;
01063
01064 if (dominated_by_p (CDI_DOMINATORS, loop->latch, son))
01065 {
01066 postpone = son;
01067 continue;
01068 }
01069 fill_sons_in_loop (loop, son, tovisit, tv);
01070 }
01071
01072 if (postpone)
01073 fill_sons_in_loop (loop, postpone, tovisit, tv);
01074 }
01075
01076
01077
01078
01079
01080 basic_block *
01081 get_loop_body_in_dom_order (const struct loop *loop)
01082 {
01083 basic_block *tovisit;
01084 int tv;
01085
01086 gcc_assert (loop->num_nodes);
01087
01088 tovisit = xcalloc (loop->num_nodes, sizeof (basic_block));
01089
01090 gcc_assert (loop->latch != EXIT_BLOCK_PTR);
01091
01092 tv = 0;
01093 fill_sons_in_loop (loop, loop->header, tovisit, &tv);
01094
01095 gcc_assert (tv == (int) loop->num_nodes);
01096
01097 return tovisit;
01098 }
01099
01100
01101
01102 basic_block *
01103 get_loop_body_in_bfs_order (const struct loop *loop)
01104 {
01105 basic_block *blocks;
01106 basic_block bb;
01107 bitmap visited;
01108 unsigned int i = 0;
01109 unsigned int vc = 1;
01110
01111 gcc_assert (loop->num_nodes);
01112 gcc_assert (loop->latch != EXIT_BLOCK_PTR);
01113
01114 blocks = xcalloc (loop->num_nodes, sizeof (basic_block));
01115 visited = BITMAP_ALLOC (NULL);
01116
01117 bb = loop->header;
01118 while (i < loop->num_nodes)
01119 {
01120 edge e;
01121 edge_iterator ei;
01122
01123 if (!bitmap_bit_p (visited, bb->index))
01124 {
01125
01126 bitmap_set_bit (visited, bb->index);
01127 blocks[i++] = bb;
01128 }
01129
01130 FOR_EACH_EDGE (e, ei, bb->succs)
01131 {
01132 if (flow_bb_inside_loop_p (loop, e->dest))
01133 {
01134 if (!bitmap_bit_p (visited, e->dest->index))
01135 {
01136 bitmap_set_bit (visited, e->dest->index);
01137 blocks[i++] = e->dest;
01138 }
01139 }
01140 }
01141
01142 gcc_assert (i >= vc);
01143
01144 bb = blocks[vc++];
01145 }
01146
01147 BITMAP_FREE (visited);
01148 return blocks;
01149 }
01150
01151
01152 edge *
01153 get_loop_exit_edges (const struct loop *loop, unsigned int *n_edges)
01154 {
01155 edge *edges, e;
01156 unsigned i, n;
01157 basic_block * body;
01158 edge_iterator ei;
01159
01160 gcc_assert (loop->latch != EXIT_BLOCK_PTR);
01161
01162 body = get_loop_body (loop);
01163 n = 0;
01164 for (i = 0; i < loop->num_nodes; i++)
01165 FOR_EACH_EDGE (e, ei, body[i]->succs)
01166 if (!flow_bb_inside_loop_p (loop, e->dest))
01167 n++;
01168 edges = xmalloc (n * sizeof (edge));
01169 *n_edges = n;
01170 n = 0;
01171 for (i = 0; i < loop->num_nodes; i++)
01172 FOR_EACH_EDGE (e, ei, body[i]->succs)
01173 if (!flow_bb_inside_loop_p (loop, e->dest))
01174 edges[n++] = e;
01175 free (body);
01176
01177 return edges;
01178 }
01179
01180
01181
01182 unsigned
01183 num_loop_branches (const struct loop *loop)
01184 {
01185 unsigned i, n;
01186 basic_block * body;
01187
01188 gcc_assert (loop->latch != EXIT_BLOCK_PTR);
01189
01190 body = get_loop_body (loop);
01191 n = 0;
01192 for (i = 0; i < loop->num_nodes; i++)
01193 if (EDGE_COUNT (body[i]->succs) >= 2)
01194 n++;
01195 free (body);
01196
01197 return n;
01198 }
01199
01200
01201 void
01202 add_bb_to_loop (basic_block bb, struct loop *loop)
01203 {
01204 int i;
01205
01206 bb->loop_father = loop;
01207 bb->loop_depth = loop->depth;
01208 loop->num_nodes++;
01209 for (i = 0; i < loop->depth; i++)
01210 loop->pred[i]->num_nodes++;
01211 }
01212
01213
01214 void
01215 remove_bb_from_loops (basic_block bb)
01216 {
01217 int i;
01218 struct loop *loop = bb->loop_father;
01219
01220 loop->num_nodes--;
01221 for (i = 0; i < loop->depth; i++)
01222 loop->pred[i]->num_nodes--;
01223 bb->loop_father = NULL;
01224 bb->loop_depth = 0;
01225 }
01226
01227
01228 struct loop *
01229 find_common_loop (struct loop *loop_s, struct loop *loop_d)
01230 {
01231 if (!loop_s) return loop_d;
01232 if (!loop_d) return loop_s;
01233
01234 if (loop_s->depth < loop_d->depth)
01235 loop_d = loop_d->pred[loop_s->depth];
01236 else if (loop_s->depth > loop_d->depth)
01237 loop_s = loop_s->pred[loop_d->depth];
01238
01239 while (loop_s != loop_d)
01240 {
01241 loop_s = loop_s->outer;
01242 loop_d = loop_d->outer;
01243 }
01244 return loop_s;
01245 }
01246
01247
01248 void
01249 cancel_loop (struct loops *loops, struct loop *loop)
01250 {
01251 basic_block *bbs;
01252 unsigned i;
01253
01254 gcc_assert (!loop->inner);
01255
01256
01257 bbs = get_loop_body (loop);
01258 for (i = 0; i < loop->num_nodes; i++)
01259 bbs[i]->loop_father = loop->outer;
01260
01261
01262 flow_loop_tree_node_remove (loop);
01263
01264
01265 loops->parray[loop->num] = NULL;
01266
01267
01268 flow_loop_free (loop);
01269 }
01270
01271
01272 void
01273 cancel_loop_tree (struct loops *loops, struct loop *loop)
01274 {
01275 while (loop->inner)
01276 cancel_loop_tree (loops, loop->inner);
01277 cancel_loop (loops, loop);
01278 }
01279
01280
01281
01282
01283
01284
01285
01286
01287 void
01288 verify_loop_structure (struct loops *loops)
01289 {
01290 unsigned *sizes, i, j;
01291 sbitmap irreds;
01292 basic_block *bbs, bb;
01293 struct loop *loop;
01294 int err = 0;
01295 edge e;
01296
01297
01298 sizes = xcalloc (loops->num, sizeof (int));
01299 sizes[0] = 2;
01300
01301 FOR_EACH_BB (bb)
01302 for (loop = bb->loop_father; loop; loop = loop->outer)
01303 sizes[loop->num]++;
01304
01305 for (i = 0; i < loops->num; i++)
01306 {
01307 if (!loops->parray[i])
01308 continue;
01309
01310 if (loops->parray[i]->num_nodes != sizes[i])
01311 {
01312 error ("Size of loop %d should be %d, not %d.",
01313 i, sizes[i], loops->parray[i]->num_nodes);
01314 err = 1;
01315 }
01316 }
01317
01318
01319 for (i = 1; i < loops->num; i++)
01320 {
01321 loop = loops->parray[i];
01322 if (!loop)
01323 continue;
01324 bbs = get_loop_body (loop);
01325
01326 for (j = 0; j < loop->num_nodes; j++)
01327 if (!flow_bb_inside_loop_p (loop, bbs[j]))
01328 {
01329 error ("Bb %d do not belong to loop %d.",
01330 bbs[j]->index, i);
01331 err = 1;
01332 }
01333 free (bbs);
01334 }
01335
01336
01337 for (i = 1; i < loops->num; i++)
01338 {
01339 loop = loops->parray[i];
01340 if (!loop)
01341 continue;
01342
01343 if ((loops->state & LOOPS_HAVE_PREHEADERS)
01344 && EDGE_COUNT (loop->header->preds) != 2)
01345 {
01346 error ("Loop %d's header does not have exactly 2 entries.", i);
01347 err = 1;
01348 }
01349 if (loops->state & LOOPS_HAVE_SIMPLE_LATCHES)
01350 {
01351 if (EDGE_COUNT (loop->latch->succs) != 1)
01352 {
01353 error ("Loop %d's latch does not have exactly 1 successor.", i);
01354 err = 1;
01355 }
01356 if (EDGE_SUCC (loop->latch, 0)->dest != loop->header)
01357 {
01358 error ("Loop %d's latch does not have header as successor.", i);
01359 err = 1;
01360 }
01361 if (loop->latch->loop_father != loop)
01362 {
01363 error ("Loop %d's latch does not belong directly to it.", i);
01364 err = 1;
01365 }
01366 }
01367 if (loop->header->loop_father != loop)
01368 {
01369 error ("Loop %d's header does not belong directly to it.", i);
01370 err = 1;
01371 }
01372 if ((loops->state & LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
01373 && (loop_latch_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP))
01374 {
01375 error ("Loop %d's latch is marked as part of irreducible region.", i);
01376 err = 1;
01377 }
01378 }
01379
01380
01381 if (loops->state & LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
01382 {
01383
01384 irreds = sbitmap_alloc (last_basic_block);
01385 FOR_EACH_BB (bb)
01386 {
01387 edge_iterator ei;
01388 if (bb->flags & BB_IRREDUCIBLE_LOOP)
01389 SET_BIT (irreds, bb->index);
01390 else
01391 RESET_BIT (irreds, bb->index);
01392 FOR_EACH_EDGE (e, ei, bb->succs)
01393 if (e->flags & EDGE_IRREDUCIBLE_LOOP)
01394 e->flags |= EDGE_ALL_FLAGS + 1;
01395 }
01396
01397
01398 mark_irreducible_loops (loops);
01399
01400
01401 FOR_EACH_BB (bb)
01402 {
01403 edge_iterator ei;
01404
01405 if ((bb->flags & BB_IRREDUCIBLE_LOOP)
01406 && !TEST_BIT (irreds, bb->index))
01407 {
01408 error ("Basic block %d should be marked irreducible.", bb->index);
01409 err = 1;
01410 }
01411 else if (!(bb->flags & BB_IRREDUCIBLE_LOOP)
01412 && TEST_BIT (irreds, bb->index))
01413 {
01414 error ("Basic block %d should not be marked irreducible.", bb->index);
01415 err = 1;
01416 }
01417 FOR_EACH_EDGE (e, ei, bb->succs)
01418 {
01419 if ((e->flags & EDGE_IRREDUCIBLE_LOOP)
01420 && !(e->flags & (EDGE_ALL_FLAGS + 1)))
01421 {
01422 error ("Edge from %d to %d should be marked irreducible.",
01423 e->src->index, e->dest->index);
01424 err = 1;
01425 }
01426 else if (!(e->flags & EDGE_IRREDUCIBLE_LOOP)
01427 && (e->flags & (EDGE_ALL_FLAGS + 1)))
01428 {
01429 error ("Edge from %d to %d should not be marked irreducible.",
01430 e->src->index, e->dest->index);
01431 err = 1;
01432 }
01433 e->flags &= ~(EDGE_ALL_FLAGS + 1);
01434 }
01435 }
01436 free (irreds);
01437 }
01438
01439
01440 if (loops->state & LOOPS_HAVE_MARKED_SINGLE_EXITS)
01441 {
01442 memset (sizes, 0, sizeof (unsigned) * loops->num);
01443 FOR_EACH_BB (bb)
01444 {
01445 edge_iterator ei;
01446 if (bb->loop_father == loops->tree_root)
01447 continue;
01448 FOR_EACH_EDGE (e, ei, bb->succs)
01449 {
01450 if (e->dest == EXIT_BLOCK_PTR)
01451 continue;
01452
01453 if (flow_bb_inside_loop_p (bb->loop_father, e->dest))
01454 continue;
01455
01456 for (loop = bb->loop_father;
01457 loop != e->dest->loop_father;
01458 loop = loop->outer)
01459 {
01460 sizes[loop->num]++;
01461 if (loop->single_exit
01462 && loop->single_exit != e)
01463 {
01464 error ("Wrong single exit %d->%d recorded for loop %d.",
01465 loop->single_exit->src->index,
01466 loop->single_exit->dest->index,
01467 loop->num);
01468 error ("Right exit is %d->%d.",
01469 e->src->index, e->dest->index);
01470 err = 1;
01471 }
01472 }
01473 }
01474 }
01475
01476 for (i = 1; i < loops->num; i++)
01477 {
01478 loop = loops->parray[i];
01479 if (!loop)
01480 continue;
01481
01482 if (sizes[i] == 1
01483 && !loop->single_exit)
01484 {
01485 error ("Single exit not recorded for loop %d.", loop->num);
01486 err = 1;
01487 }
01488
01489 if (sizes[i] != 1
01490 && loop->single_exit)
01491 {
01492 error ("Loop %d should not have single exit (%d -> %d).",
01493 loop->num,
01494 loop->single_exit->src->index,
01495 loop->single_exit->dest->index);
01496 err = 1;
01497 }
01498 }
01499 }
01500
01501 gcc_assert (!err);
01502
01503 free (sizes);
01504 }
01505
01506
01507 edge
01508 loop_latch_edge (const struct loop *loop)
01509 {
01510 return find_edge (loop->latch, loop->header);
01511 }
01512
01513
01514 edge
01515 loop_preheader_edge (const struct loop *loop)
01516 {
01517 edge e;
01518 edge_iterator ei;
01519
01520 FOR_EACH_EDGE (e, ei, loop->header->preds)
01521 if (e->src != loop->latch)
01522 break;
01523
01524 return e;
01525 }