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