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 "basic-block.h"
00029 #include "cfgloop.h"
00030 #include "cfglayout.h"
00031 #include "output.h"
00032
00033 static void duplicate_subloops (struct loops *, struct loop *, struct loop *);
00034 static void copy_loops_to (struct loops *, struct loop **, int,
00035 struct loop *);
00036 static void loop_redirect_edge (edge, basic_block);
00037 static bool loop_delete_branch_edge (edge, int);
00038 static void remove_bbs (basic_block *, int);
00039 static bool rpe_enum_p (basic_block, void *);
00040 static int find_path (edge, basic_block **);
00041 static bool alp_enum_p (basic_block, void *);
00042 static void add_loop (struct loops *, struct loop *);
00043 static void fix_loop_placements (struct loops *, struct loop *);
00044 static bool fix_bb_placement (struct loops *, basic_block);
00045 static void fix_bb_placements (struct loops *, basic_block);
00046 static void place_new_loop (struct loops *, struct loop *);
00047 static void scale_loop_frequencies (struct loop *, int, int);
00048 static void scale_bbs_frequencies (basic_block *, int, int, int);
00049 static basic_block create_preheader (struct loop *, int);
00050 static void fix_irreducible_loops (basic_block);
00051 static void unloop (struct loops *, struct loop *);
00052
00053 #define RDIV(X,Y) (((X) + (Y) / 2) / (Y))
00054
00055
00056
00057 edge
00058 split_loop_bb (basic_block bb, void *insn)
00059 {
00060 edge e;
00061
00062
00063 e = split_block (bb, insn);
00064
00065
00066 add_bb_to_loop (e->dest, e->src->loop_father);
00067
00068 return e;
00069 }
00070
00071
00072 static bool
00073 rpe_enum_p (basic_block bb, void *data)
00074 {
00075 return dominated_by_p (CDI_DOMINATORS, bb, data);
00076 }
00077
00078
00079
00080 static void
00081 remove_bbs (basic_block *bbs, int nbbs)
00082 {
00083 int i;
00084
00085 for (i = 0; i < nbbs; i++)
00086 {
00087 remove_bb_from_loops (bbs[i]);
00088 delete_basic_block (bbs[i]);
00089 }
00090 }
00091
00092
00093
00094
00095
00096
00097
00098 static int
00099 find_path (edge e, basic_block **bbs)
00100 {
00101 gcc_assert (EDGE_COUNT (e->dest->preds) <= 1);
00102
00103
00104 *bbs = xcalloc (n_basic_blocks, sizeof (basic_block));
00105 return dfs_enumerate_from (e->dest, 0, rpe_enum_p, *bbs,
00106 n_basic_blocks, e->dest);
00107 }
00108
00109
00110
00111
00112
00113
00114
00115
00116 static bool
00117 fix_bb_placement (struct loops *loops, basic_block bb)
00118 {
00119 edge e;
00120 edge_iterator ei;
00121 struct loop *loop = loops->tree_root, *act;
00122
00123 FOR_EACH_EDGE (e, ei, bb->succs)
00124 {
00125 if (e->dest == EXIT_BLOCK_PTR)
00126 continue;
00127
00128 act = e->dest->loop_father;
00129 if (act->header == e->dest)
00130 act = act->outer;
00131
00132 if (flow_loop_nested_p (loop, act))
00133 loop = act;
00134 }
00135
00136 if (loop == bb->loop_father)
00137 return false;
00138
00139 remove_bb_from_loops (bb);
00140 add_bb_to_loop (bb, loop);
00141
00142 return true;
00143 }
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 static void
00154 fix_bb_placements (struct loops *loops, basic_block from)
00155 {
00156 sbitmap in_queue;
00157 basic_block *queue, *qtop, *qbeg, *qend;
00158 struct loop *base_loop;
00159 edge e;
00160
00161
00162
00163
00164
00165
00166
00167
00168 base_loop = from->loop_father;
00169 if (base_loop == loops->tree_root)
00170 return;
00171
00172 in_queue = sbitmap_alloc (last_basic_block);
00173 sbitmap_zero (in_queue);
00174 SET_BIT (in_queue, from->index);
00175
00176 SET_BIT (in_queue, base_loop->header->index);
00177
00178 queue = xmalloc ((base_loop->num_nodes + 1) * sizeof (basic_block));
00179 qtop = queue + base_loop->num_nodes + 1;
00180 qbeg = queue;
00181 qend = queue + 1;
00182 *qbeg = from;
00183
00184 while (qbeg != qend)
00185 {
00186 edge_iterator ei;
00187 from = *qbeg;
00188 qbeg++;
00189 if (qbeg == qtop)
00190 qbeg = queue;
00191 RESET_BIT (in_queue, from->index);
00192
00193 if (from->loop_father->header == from)
00194 {
00195
00196 if (!fix_loop_placement (from->loop_father))
00197 continue;
00198 }
00199 else
00200 {
00201
00202 if (!fix_bb_placement (loops, from))
00203 continue;
00204 }
00205
00206
00207 FOR_EACH_EDGE (e, ei, from->preds)
00208 {
00209 basic_block pred = e->src;
00210 struct loop *nca;
00211
00212 if (TEST_BIT (in_queue, pred->index))
00213 continue;
00214
00215
00216
00217
00218 nca = find_common_loop (pred->loop_father, base_loop);
00219 if (pred->loop_father != base_loop
00220 && (nca == base_loop
00221 || nca != pred->loop_father))
00222 pred = pred->loop_father->header;
00223 else if (!flow_loop_nested_p (from->loop_father, pred->loop_father))
00224 {
00225
00226 continue;
00227 }
00228
00229 if (TEST_BIT (in_queue, pred->index))
00230 continue;
00231
00232
00233 *qend = pred;
00234 qend++;
00235 if (qend == qtop)
00236 qend = queue;
00237 SET_BIT (in_queue, pred->index);
00238 }
00239 }
00240 free (in_queue);
00241 free (queue);
00242 }
00243
00244
00245
00246
00247 static void
00248 fix_irreducible_loops (basic_block from)
00249 {
00250 basic_block bb;
00251 basic_block *stack;
00252 int stack_top;
00253 sbitmap on_stack;
00254 edge *edges, e;
00255 unsigned n_edges, i;
00256
00257 if (!(from->flags & BB_IRREDUCIBLE_LOOP))
00258 return;
00259
00260 on_stack = sbitmap_alloc (last_basic_block);
00261 sbitmap_zero (on_stack);
00262 SET_BIT (on_stack, from->index);
00263 stack = xmalloc (from->loop_father->num_nodes * sizeof (basic_block));
00264 stack[0] = from;
00265 stack_top = 1;
00266
00267 while (stack_top)
00268 {
00269 edge_iterator ei;
00270 bb = stack[--stack_top];
00271 RESET_BIT (on_stack, bb->index);
00272
00273 FOR_EACH_EDGE (e, ei, bb->preds)
00274 if (e->flags & EDGE_IRREDUCIBLE_LOOP)
00275 break;
00276 if (e)
00277 continue;
00278
00279 bb->flags &= ~BB_IRREDUCIBLE_LOOP;
00280 if (bb->loop_father->header == bb)
00281 edges = get_loop_exit_edges (bb->loop_father, &n_edges);
00282 else
00283 {
00284 n_edges = EDGE_COUNT (bb->succs);
00285 edges = xmalloc (n_edges * sizeof (edge));
00286 FOR_EACH_EDGE (e, ei, bb->succs)
00287 edges[ei.index] = e;
00288 }
00289
00290 for (i = 0; i < n_edges; i++)
00291 {
00292 e = edges[i];
00293
00294 if (e->flags & EDGE_IRREDUCIBLE_LOOP)
00295 {
00296 if (!flow_bb_inside_loop_p (from->loop_father, e->dest))
00297 continue;
00298
00299 e->flags &= ~EDGE_IRREDUCIBLE_LOOP;
00300 if (TEST_BIT (on_stack, e->dest->index))
00301 continue;
00302
00303 SET_BIT (on_stack, e->dest->index);
00304 stack[stack_top++] = e->dest;
00305 }
00306 }
00307 free (edges);
00308 }
00309
00310 free (on_stack);
00311 free (stack);
00312 }
00313
00314
00315
00316
00317
00318 bool
00319 remove_path (struct loops *loops, edge e)
00320 {
00321 edge ae;
00322 basic_block *rem_bbs, *bord_bbs, *dom_bbs, from, bb;
00323 int i, nrem, n_bord_bbs, n_dom_bbs;
00324 sbitmap seen;
00325 bool deleted;
00326
00327 if (!loop_delete_branch_edge (e, 0))
00328 return false;
00329
00330
00331
00332
00333
00334 if (EDGE_COUNT (e->dest->preds) > 1)
00335 e = EDGE_PRED (loop_split_edge_with (e, NULL_RTX), 0);
00336
00337
00338
00339
00340
00341 while (e->src->loop_father->outer
00342 && dominated_by_p (CDI_DOMINATORS,
00343 e->src->loop_father->latch, e->dest))
00344 unloop (loops, e->src->loop_father);
00345
00346
00347 nrem = find_path (e, &rem_bbs);
00348
00349 n_bord_bbs = 0;
00350 bord_bbs = xcalloc (n_basic_blocks, sizeof (basic_block));
00351 seen = sbitmap_alloc (last_basic_block);
00352 sbitmap_zero (seen);
00353
00354
00355 for (i = 0; i < nrem; i++)
00356 SET_BIT (seen, rem_bbs[i]->index);
00357 for (i = 0; i < nrem; i++)
00358 {
00359 edge_iterator ei;
00360 bb = rem_bbs[i];
00361 FOR_EACH_EDGE (ae, ei, rem_bbs[i]->succs)
00362 if (ae->dest != EXIT_BLOCK_PTR && !TEST_BIT (seen, ae->dest->index))
00363 {
00364 SET_BIT (seen, ae->dest->index);
00365 bord_bbs[n_bord_bbs++] = ae->dest;
00366 }
00367 }
00368
00369
00370 from = e->src;
00371 deleted = loop_delete_branch_edge (e, 1);
00372 gcc_assert (deleted);
00373 dom_bbs = xcalloc (n_basic_blocks, sizeof (basic_block));
00374
00375
00376 for (i = 0; i < nrem; i++)
00377 if (rem_bbs[i]->loop_father->header == rem_bbs[i])
00378 cancel_loop_tree (loops, rem_bbs[i]->loop_father);
00379
00380 remove_bbs (rem_bbs, nrem);
00381 free (rem_bbs);
00382
00383
00384 n_dom_bbs = 0;
00385 sbitmap_zero (seen);
00386 for (i = 0; i < n_bord_bbs; i++)
00387 {
00388 basic_block ldom;
00389
00390 bb = get_immediate_dominator (CDI_DOMINATORS, bord_bbs[i]);
00391 if (TEST_BIT (seen, bb->index))
00392 continue;
00393 SET_BIT (seen, bb->index);
00394
00395 for (ldom = first_dom_son (CDI_DOMINATORS, bb);
00396 ldom;
00397 ldom = next_dom_son (CDI_DOMINATORS, ldom))
00398 if (!dominated_by_p (CDI_DOMINATORS, from, ldom))
00399 dom_bbs[n_dom_bbs++] = ldom;
00400 }
00401
00402 free (seen);
00403
00404
00405 iterate_fix_dominators (CDI_DOMINATORS, dom_bbs, n_dom_bbs);
00406 free (dom_bbs);
00407
00408
00409
00410 for (i = 0; i < n_bord_bbs; i++)
00411 fix_irreducible_loops (bord_bbs[i]);
00412 free (bord_bbs);
00413
00414
00415
00416 fix_bb_placements (loops, from);
00417 fix_loop_placements (loops, from->loop_father);
00418
00419 return true;
00420 }
00421
00422
00423 static bool
00424 alp_enum_p (basic_block bb, void *alp_header)
00425 {
00426 return bb != (basic_block) alp_header;
00427 }
00428
00429
00430
00431 static void
00432 add_loop (struct loops *loops, struct loop *loop)
00433 {
00434 basic_block *bbs;
00435 int i, n;
00436
00437
00438 place_new_loop (loops, loop);
00439 loop->level = 1;
00440
00441
00442 bbs = xcalloc (n_basic_blocks, sizeof (basic_block));
00443 n = dfs_enumerate_from (loop->latch, 1, alp_enum_p,
00444 bbs, n_basic_blocks, loop->header);
00445
00446 for (i = 0; i < n; i++)
00447 add_bb_to_loop (bbs[i], loop);
00448 add_bb_to_loop (loop->header, loop);
00449
00450 free (bbs);
00451 }
00452
00453
00454
00455 static void
00456 scale_bbs_frequencies (basic_block *bbs, int nbbs, int num, int den)
00457 {
00458 int i;
00459 edge e;
00460
00461 for (i = 0; i < nbbs; i++)
00462 {
00463 edge_iterator ei;
00464 bbs[i]->frequency = (bbs[i]->frequency * num) / den;
00465 bbs[i]->count = RDIV (bbs[i]->count * num, den);
00466 FOR_EACH_EDGE (e, ei, bbs[i]->succs)
00467 e->count = (e->count * num) /den;
00468 }
00469 }
00470
00471
00472 static void
00473 scale_loop_frequencies (struct loop *loop, int num, int den)
00474 {
00475 basic_block *bbs;
00476
00477 bbs = get_loop_body (loop);
00478 scale_bbs_frequencies (bbs, loop->num_nodes, num, den);
00479 free (bbs);
00480 }
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491 struct loop *
00492 loopify (struct loops *loops, edge latch_edge, edge header_edge,
00493 basic_block switch_bb, edge true_edge, edge false_edge,
00494 bool redirect_all_edges)
00495 {
00496 basic_block succ_bb = latch_edge->dest;
00497 basic_block pred_bb = header_edge->src;
00498 basic_block *dom_bbs, *body;
00499 unsigned n_dom_bbs, i;
00500 sbitmap seen;
00501 struct loop *loop = xcalloc (1, sizeof (struct loop));
00502 struct loop *outer = succ_bb->loop_father->outer;
00503 int freq, prob, tot_prob;
00504 gcov_type cnt;
00505 edge e;
00506 edge_iterator ei;
00507
00508 loop->header = header_edge->dest;
00509 loop->latch = latch_edge->src;
00510
00511 freq = EDGE_FREQUENCY (header_edge);
00512 cnt = header_edge->count;
00513 prob = EDGE_SUCC (switch_bb, 0)->probability;
00514 tot_prob = prob + EDGE_SUCC (switch_bb, 1)->probability;
00515 if (tot_prob == 0)
00516 tot_prob = 1;
00517
00518
00519 loop_redirect_edge (latch_edge, loop->header);
00520 loop_redirect_edge (true_edge, succ_bb);
00521
00522
00523
00524 if (redirect_all_edges)
00525 {
00526 loop_redirect_edge (header_edge, switch_bb);
00527 loop_redirect_edge (false_edge, loop->header);
00528
00529
00530 set_immediate_dominator (CDI_DOMINATORS, switch_bb, pred_bb);
00531 set_immediate_dominator (CDI_DOMINATORS, loop->header, switch_bb);
00532 }
00533
00534 set_immediate_dominator (CDI_DOMINATORS, succ_bb, switch_bb);
00535
00536
00537 add_loop (loops, loop);
00538 flow_loop_tree_node_add (outer, loop);
00539
00540
00541 add_bb_to_loop (switch_bb, outer);
00542
00543
00544 switch_bb->frequency = freq;
00545 switch_bb->count = cnt;
00546 FOR_EACH_EDGE (e, ei, switch_bb->succs)
00547 e->count = (switch_bb->count * e->probability) / REG_BR_PROB_BASE;
00548 scale_loop_frequencies (loop, prob, tot_prob);
00549 scale_loop_frequencies (succ_bb->loop_father, tot_prob - prob, tot_prob);
00550
00551
00552 dom_bbs = xcalloc (n_basic_blocks, sizeof (basic_block));
00553 n_dom_bbs = 0;
00554 seen = sbitmap_alloc (last_basic_block);
00555 sbitmap_zero (seen);
00556 body = get_loop_body (loop);
00557
00558 for (i = 0; i < loop->num_nodes; i++)
00559 SET_BIT (seen, body[i]->index);
00560
00561 for (i = 0; i < loop->num_nodes; i++)
00562 {
00563 basic_block ldom;
00564
00565 for (ldom = first_dom_son (CDI_DOMINATORS, body[i]);
00566 ldom;
00567 ldom = next_dom_son (CDI_DOMINATORS, ldom))
00568 if (!TEST_BIT (seen, ldom->index))
00569 {
00570 SET_BIT (seen, ldom->index);
00571 dom_bbs[n_dom_bbs++] = ldom;
00572 }
00573 }
00574
00575 iterate_fix_dominators (CDI_DOMINATORS, dom_bbs, n_dom_bbs);
00576
00577 free (body);
00578 free (seen);
00579 free (dom_bbs);
00580
00581 return loop;
00582 }
00583
00584
00585
00586
00587 static void
00588 unloop (struct loops *loops, struct loop *loop)
00589 {
00590 basic_block *body;
00591 struct loop *ploop;
00592 unsigned i, n;
00593 basic_block latch = loop->latch;
00594 edge *edges;
00595 unsigned n_edges;
00596
00597
00598
00599
00600
00601
00602
00603 body = get_loop_body (loop);
00604 edges = get_loop_exit_edges (loop, &n_edges);
00605 n = loop->num_nodes;
00606 for (i = 0; i < n; i++)
00607 if (body[i]->loop_father == loop)
00608 {
00609 remove_bb_from_loops (body[i]);
00610 add_bb_to_loop (body[i], loop->outer);
00611 }
00612 free(body);
00613
00614 while (loop->inner)
00615 {
00616 ploop = loop->inner;
00617 flow_loop_tree_node_remove (ploop);
00618 flow_loop_tree_node_add (loop->outer, ploop);
00619 }
00620
00621
00622 flow_loop_tree_node_remove (loop);
00623 loops->parray[loop->num] = NULL;
00624 flow_loop_free (loop);
00625
00626 remove_edge (EDGE_SUCC (latch, 0));
00627 fix_bb_placements (loops, latch);
00628
00629
00630
00631
00632
00633 for (i = 0; i < n_edges; i++)
00634 if (edges[i]->flags & EDGE_IRREDUCIBLE_LOOP)
00635 break;
00636 if (i != n_edges)
00637 mark_irreducible_loops (loops);
00638 free (edges);
00639 }
00640
00641
00642
00643
00644
00645 int
00646 fix_loop_placement (struct loop *loop)
00647 {
00648 basic_block *body;
00649 unsigned i;
00650 edge e;
00651 edge_iterator ei;
00652 struct loop *father = loop->pred[0], *act;
00653
00654 body = get_loop_body (loop);
00655 for (i = 0; i < loop->num_nodes; i++)
00656 FOR_EACH_EDGE (e, ei, body[i]->succs)
00657 if (!flow_bb_inside_loop_p (loop, e->dest))
00658 {
00659 act = find_common_loop (loop, e->dest->loop_father);
00660 if (flow_loop_nested_p (father, act))
00661 father = act;
00662 }
00663 free (body);
00664
00665 if (father != loop->outer)
00666 {
00667 for (act = loop->outer; act != father; act = act->outer)
00668 act->num_nodes -= loop->num_nodes;
00669 flow_loop_tree_node_remove (loop);
00670 flow_loop_tree_node_add (father, loop);
00671 return 1;
00672 }
00673 return 0;
00674 }
00675
00676
00677
00678
00679
00680 static void
00681 fix_loop_placements (struct loops *loops, struct loop *loop)
00682 {
00683 struct loop *outer;
00684
00685 while (loop->outer)
00686 {
00687 outer = loop->outer;
00688 if (!fix_loop_placement (loop))
00689 break;
00690
00691
00692
00693
00694
00695
00696 fix_bb_placements (loops, loop_preheader_edge (loop)->src);
00697 loop = outer;
00698 }
00699 }
00700
00701
00702 static void
00703 place_new_loop (struct loops *loops, struct loop *loop)
00704 {
00705 loops->parray =
00706 xrealloc (loops->parray, (loops->num + 1) * sizeof (struct loop *));
00707 loops->parray[loops->num] = loop;
00708
00709 loop->num = loops->num++;
00710 }
00711
00712
00713
00714 struct loop *
00715 duplicate_loop (struct loops *loops, struct loop *loop, struct loop *target)
00716 {
00717 struct loop *cloop;
00718 cloop = xcalloc (1, sizeof (struct loop));
00719 place_new_loop (loops, cloop);
00720
00721
00722 cloop->level = loop->level;
00723
00724
00725 loop->copy = cloop;
00726
00727
00728 flow_loop_tree_node_add (target, cloop);
00729
00730 return cloop;
00731 }
00732
00733
00734
00735 static void
00736 duplicate_subloops (struct loops *loops, struct loop *loop, struct loop *target)
00737 {
00738 struct loop *aloop, *cloop;
00739
00740 for (aloop = loop->inner; aloop; aloop = aloop->next)
00741 {
00742 cloop = duplicate_loop (loops, aloop, target);
00743 duplicate_subloops (loops, aloop, cloop);
00744 }
00745 }
00746
00747
00748
00749 static void
00750 copy_loops_to (struct loops *loops, struct loop **copied_loops, int n, struct loop *target)
00751 {
00752 struct loop *aloop;
00753 int i;
00754
00755 for (i = 0; i < n; i++)
00756 {
00757 aloop = duplicate_loop (loops, copied_loops[i], target);
00758 duplicate_subloops (loops, copied_loops[i], aloop);
00759 }
00760 }
00761
00762
00763 static void
00764 loop_redirect_edge (edge e, basic_block dest)
00765 {
00766 if (e->dest == dest)
00767 return;
00768
00769 redirect_edge_and_branch_force (e, dest);
00770 }
00771
00772
00773
00774 static bool
00775 loop_delete_branch_edge (edge e, int really_delete)
00776 {
00777 basic_block src = e->src;
00778 basic_block newdest;
00779 int irr;
00780 edge snd;
00781
00782 gcc_assert (EDGE_COUNT (src->succs) > 1);
00783
00784
00785 if (EDGE_COUNT (src->succs) > 2)
00786 return false;
00787
00788 if (!any_condjump_p (BB_END (src)))
00789 return false;
00790
00791 snd = e == EDGE_SUCC (src, 0) ? EDGE_SUCC (src, 1) : EDGE_SUCC (src, 0);
00792 newdest = snd->dest;
00793 if (newdest == EXIT_BLOCK_PTR)
00794 return false;
00795
00796
00797 if (!really_delete)
00798 return true;
00799
00800
00801 irr = snd->flags & EDGE_IRREDUCIBLE_LOOP;
00802
00803 if (!redirect_edge_and_branch (e, newdest))
00804 return false;
00805 EDGE_SUCC (src, 0)->flags &= ~EDGE_IRREDUCIBLE_LOOP;
00806 EDGE_SUCC (src, 0)->flags |= irr;
00807
00808 return true;
00809 }
00810
00811
00812 bool
00813 can_duplicate_loop_p (struct loop *loop)
00814 {
00815 int ret;
00816 basic_block *bbs = get_loop_body (loop);
00817
00818 ret = can_copy_bbs_p (bbs, loop->num_nodes);
00819 free (bbs);
00820
00821 return ret;
00822 }
00823
00824
00825
00826
00827 static void
00828 update_single_exits_after_duplication (basic_block *bbs, unsigned nbbs,
00829 struct loop *loop)
00830 {
00831 unsigned i;
00832
00833 for (i = 0; i < nbbs; i++)
00834 bbs[i]->rbi->duplicated = 1;
00835
00836 for (; loop->outer; loop = loop->outer)
00837 {
00838 if (!loop->single_exit)
00839 continue;
00840
00841 if (loop->single_exit->src->rbi->duplicated)
00842 loop->single_exit = NULL;
00843 }
00844
00845 for (i = 0; i < nbbs; i++)
00846 bbs[i]->rbi->duplicated = 0;
00847 }
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859 int
00860 duplicate_loop_to_header_edge (struct loop *loop, edge e, struct loops *loops,
00861 unsigned int ndupl, sbitmap wont_exit,
00862 edge orig, edge *to_remove,
00863 unsigned int *n_to_remove, int flags)
00864 {
00865 struct loop *target, *aloop;
00866 struct loop **orig_loops;
00867 unsigned n_orig_loops;
00868 basic_block header = loop->header, latch = loop->latch;
00869 basic_block *new_bbs, *bbs, *first_active;
00870 basic_block new_bb, bb, first_active_latch = NULL;
00871 edge ae, latch_edge;
00872 edge spec_edges[2], new_spec_edges[2];
00873 #define SE_LATCH 0
00874 #define SE_ORIG 1
00875 unsigned i, j, n;
00876 int is_latch = (latch == e->src);
00877 int scale_act = 0, *scale_step = NULL, scale_main = 0;
00878 int p, freq_in, freq_le, freq_out_orig;
00879 int prob_pass_thru, prob_pass_wont_exit, prob_pass_main;
00880 int add_irreducible_flag;
00881
00882 gcc_assert (e->dest == loop->header);
00883 gcc_assert (ndupl > 0);
00884
00885 if (orig)
00886 {
00887
00888 gcc_assert (flow_bb_inside_loop_p (loop, orig->src));
00889 gcc_assert (!flow_bb_inside_loop_p (loop, orig->dest));
00890 }
00891
00892 bbs = get_loop_body (loop);
00893
00894
00895 if (!can_copy_bbs_p (bbs, loop->num_nodes))
00896 {
00897 free (bbs);
00898 return false;
00899 }
00900 new_bbs = xmalloc (sizeof (basic_block) * loop->num_nodes);
00901
00902
00903
00904 add_irreducible_flag = e->flags & EDGE_IRREDUCIBLE_LOOP;
00905 gcc_assert (!is_latch || !add_irreducible_flag);
00906
00907
00908 latch_edge = loop_latch_edge (loop);
00909
00910 if (flags & DLTHE_FLAG_UPDATE_FREQ)
00911 {
00912
00913
00914 freq_in = header->frequency;
00915 freq_le = EDGE_FREQUENCY (latch_edge);
00916 if (freq_in == 0)
00917 freq_in = 1;
00918 if (freq_in < freq_le)
00919 freq_in = freq_le;
00920 freq_out_orig = orig ? EDGE_FREQUENCY (orig) : freq_in - freq_le;
00921 if (freq_out_orig > freq_in - freq_le)
00922 freq_out_orig = freq_in - freq_le;
00923 prob_pass_thru = RDIV (REG_BR_PROB_BASE * freq_le, freq_in);
00924 prob_pass_wont_exit =
00925 RDIV (REG_BR_PROB_BASE * (freq_le + freq_out_orig), freq_in);
00926
00927 scale_step = xmalloc (ndupl * sizeof (int));
00928
00929 for (i = 1; i <= ndupl; i++)
00930 scale_step[i - 1] = TEST_BIT (wont_exit, i)
00931 ? prob_pass_wont_exit
00932 : prob_pass_thru;
00933
00934 if (is_latch)
00935 {
00936 prob_pass_main = TEST_BIT (wont_exit, 0)
00937 ? prob_pass_wont_exit
00938 : prob_pass_thru;
00939 p = prob_pass_main;
00940 scale_main = REG_BR_PROB_BASE;
00941 for (i = 0; i < ndupl; i++)
00942 {
00943 scale_main += p;
00944 p = RDIV (p * scale_step[i], REG_BR_PROB_BASE);
00945 }
00946 scale_main = RDIV (REG_BR_PROB_BASE * REG_BR_PROB_BASE, scale_main);
00947 scale_act = RDIV (scale_main * prob_pass_main, REG_BR_PROB_BASE);
00948 }
00949 else
00950 {
00951 scale_main = REG_BR_PROB_BASE;
00952 for (i = 0; i < ndupl; i++)
00953 scale_main = RDIV (scale_main * scale_step[i], REG_BR_PROB_BASE);
00954 scale_act = REG_BR_PROB_BASE - prob_pass_thru;
00955 }
00956 for (i = 0; i < ndupl; i++)
00957 gcc_assert (scale_step[i] >= 0 && scale_step[i] <= REG_BR_PROB_BASE);
00958 gcc_assert (scale_main >= 0 && scale_main <= REG_BR_PROB_BASE
00959 && scale_act >= 0 && scale_act <= REG_BR_PROB_BASE);
00960 }
00961
00962
00963 target = e->src->loop_father;
00964
00965
00966 n_orig_loops = 0;
00967 for (aloop = loop->inner; aloop; aloop = aloop->next)
00968 n_orig_loops++;
00969 orig_loops = xcalloc (n_orig_loops, sizeof (struct loop *));
00970 for (aloop = loop->inner, i = 0; aloop; aloop = aloop->next, i++)
00971 orig_loops[i] = aloop;
00972
00973 loop->copy = target;
00974
00975 n = loop->num_nodes;
00976
00977 first_active = xmalloc (n * sizeof (basic_block));
00978 if (is_latch)
00979 {
00980 memcpy (first_active, bbs, n * sizeof (basic_block));
00981 first_active_latch = latch;
00982 }
00983
00984
00985 if (loops->state & LOOPS_HAVE_MARKED_SINGLE_EXITS)
00986 update_single_exits_after_duplication (bbs, n, target);
00987
00988
00989 if (orig && TEST_BIT (wont_exit, 0))
00990 to_remove[(*n_to_remove)++] = orig;
00991
00992 spec_edges[SE_ORIG] = orig;
00993 spec_edges[SE_LATCH] = latch_edge;
00994
00995 for (j = 0; j < ndupl; j++)
00996 {
00997
00998 copy_loops_to (loops, orig_loops, n_orig_loops, target);
00999
01000
01001 copy_bbs (bbs, n, new_bbs, spec_edges, 2, new_spec_edges, loop);
01002
01003 for (i = 0; i < n; i++)
01004 new_bbs[i]->rbi->copy_number = j + 1;
01005
01006
01007 if (add_irreducible_flag)
01008 {
01009 for (i = 0; i < n; i++)
01010 new_bbs[i]->rbi->duplicated = 1;
01011 for (i = 0; i < n; i++)
01012 {
01013 edge_iterator ei;
01014 new_bb = new_bbs[i];
01015 if (new_bb->loop_father == target)
01016 new_bb->flags |= BB_IRREDUCIBLE_LOOP;
01017
01018 FOR_EACH_EDGE (ae, ei, new_bb->succs)
01019 if (ae->dest->rbi->duplicated
01020 && (ae->src->loop_father == target
01021 || ae->dest->loop_father == target))
01022 ae->flags |= EDGE_IRREDUCIBLE_LOOP;
01023 }
01024 for (i = 0; i < n; i++)
01025 new_bbs[i]->rbi->duplicated = 0;
01026 }
01027
01028
01029 if (is_latch)
01030 {
01031 redirect_edge_and_branch_force (latch_edge, new_bbs[0]);
01032 redirect_edge_and_branch_force (new_spec_edges[SE_LATCH],
01033 loop->header);
01034 set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], latch);
01035 latch = loop->latch = new_bbs[1];
01036 e = latch_edge = new_spec_edges[SE_LATCH];
01037 }
01038 else
01039 {
01040 redirect_edge_and_branch_force (new_spec_edges[SE_LATCH],
01041 loop->header);
01042 redirect_edge_and_branch_force (e, new_bbs[0]);
01043 set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], e->src);
01044 e = new_spec_edges[SE_LATCH];
01045 }
01046
01047
01048 if (orig && TEST_BIT (wont_exit, j + 1))
01049 to_remove[(*n_to_remove)++] = new_spec_edges[SE_ORIG];
01050
01051
01052
01053 if (!first_active_latch)
01054 {
01055 memcpy (first_active, new_bbs, n * sizeof (basic_block));
01056 first_active_latch = new_bbs[1];
01057 }
01058
01059
01060 if (flags & DLTHE_FLAG_UPDATE_FREQ)
01061 {
01062 scale_bbs_frequencies (new_bbs, n, scale_act, REG_BR_PROB_BASE);
01063 scale_act = RDIV (scale_act * scale_step[j], REG_BR_PROB_BASE);
01064 }
01065 }
01066 free (new_bbs);
01067 free (orig_loops);
01068
01069
01070 if (!is_latch)
01071 set_immediate_dominator (CDI_DOMINATORS, e->dest, e->src);
01072 if (flags & DLTHE_FLAG_UPDATE_FREQ)
01073 {
01074 scale_bbs_frequencies (bbs, n, scale_main, REG_BR_PROB_BASE);
01075 free (scale_step);
01076 }
01077
01078
01079 for (i = 0; i < n; i++)
01080 {
01081 basic_block dominated, dom_bb, *dom_bbs;
01082 int n_dom_bbs,j;
01083
01084 bb = bbs[i];
01085 bb->rbi->copy_number = 0;
01086
01087 n_dom_bbs = get_dominated_by (CDI_DOMINATORS, bb, &dom_bbs);
01088 for (j = 0; j < n_dom_bbs; j++)
01089 {
01090 dominated = dom_bbs[j];
01091 if (flow_bb_inside_loop_p (loop, dominated))
01092 continue;
01093 dom_bb = nearest_common_dominator (
01094 CDI_DOMINATORS, first_active[i], first_active_latch);
01095 set_immediate_dominator (CDI_DOMINATORS, dominated, dom_bb);
01096 }
01097 free (dom_bbs);
01098 }
01099 free (first_active);
01100
01101 free (bbs);
01102
01103 return true;
01104 }
01105
01106
01107
01108
01109
01110 static edge mfb_kj_edge;
01111 static bool
01112 mfb_keep_just (edge e)
01113 {
01114 return e != mfb_kj_edge;
01115 }
01116
01117
01118
01119
01120
01121 static void
01122 mfb_update_loops (basic_block jump)
01123 {
01124 struct loop *loop = EDGE_SUCC (jump, 0)->dest->loop_father;
01125
01126 if (dom_computed[CDI_DOMINATORS])
01127 set_immediate_dominator (CDI_DOMINATORS, jump, EDGE_PRED (jump, 0)->src);
01128 add_bb_to_loop (jump, loop);
01129 loop->latch = jump;
01130 }
01131
01132
01133
01134
01135
01136
01137 static basic_block
01138 create_preheader (struct loop *loop, int flags)
01139 {
01140 edge e, fallthru;
01141 basic_block dummy;
01142 struct loop *cloop, *ploop;
01143 int nentry = 0;
01144 bool irred = false;
01145 bool latch_edge_was_fallthru;
01146 edge one_succ_pred = 0;
01147 edge_iterator ei;
01148
01149 cloop = loop->outer;
01150
01151 FOR_EACH_EDGE (e, ei, loop->header->preds)
01152 {
01153 if (e->src == loop->latch)
01154 continue;
01155 irred |= (e->flags & EDGE_IRREDUCIBLE_LOOP) != 0;
01156 nentry++;
01157 if (EDGE_COUNT (e->src->succs) == 1)
01158 one_succ_pred = e;
01159 }
01160 gcc_assert (nentry);
01161 if (nentry == 1)
01162 {
01163
01164
01165 e = EDGE_PRED (loop->header,
01166 EDGE_PRED (loop->header, 0)->src == loop->latch);
01167
01168 if (!(flags & CP_SIMPLE_PREHEADERS) || EDGE_COUNT (e->src->succs) == 1)
01169 return NULL;
01170 }
01171
01172 mfb_kj_edge = loop_latch_edge (loop);
01173 latch_edge_was_fallthru = (mfb_kj_edge->flags & EDGE_FALLTHRU) != 0;
01174 fallthru = make_forwarder_block (loop->header, mfb_keep_just,
01175 mfb_update_loops);
01176 dummy = fallthru->src;
01177 loop->header = fallthru->dest;
01178
01179
01180
01181 for (ploop = loop; ploop; ploop = ploop->outer)
01182 if (ploop->latch == dummy)
01183 ploop->latch = fallthru->dest;
01184
01185
01186
01187
01188
01189
01190
01191
01192
01193 if (latch_edge_was_fallthru)
01194 {
01195 if (one_succ_pred)
01196 e = one_succ_pred;
01197 else
01198 e = EDGE_PRED (dummy, 0);
01199
01200 move_block_after (dummy, e->src);
01201 }
01202
01203 loop->header->loop_father = loop;
01204 add_bb_to_loop (dummy, cloop);
01205
01206 if (irred)
01207 {
01208 dummy->flags |= BB_IRREDUCIBLE_LOOP;
01209 EDGE_SUCC (dummy, 0)->flags |= EDGE_IRREDUCIBLE_LOOP;
01210 }
01211
01212 if (dump_file)
01213 fprintf (dump_file, "Created preheader block for loop %i\n",
01214 loop->num);
01215
01216 return dummy;
01217 }
01218
01219
01220
01221 void
01222 create_preheaders (struct loops *loops, int flags)
01223 {
01224 unsigned i;
01225 for (i = 1; i < loops->num; i++)
01226 create_preheader (loops->parray[i], flags);
01227 loops->state |= LOOPS_HAVE_PREHEADERS;
01228 }
01229
01230
01231
01232 void
01233 force_single_succ_latches (struct loops *loops)
01234 {
01235 unsigned i;
01236 struct loop *loop;
01237 edge e;
01238
01239 for (i = 1; i < loops->num; i++)
01240 {
01241 loop = loops->parray[i];
01242 if (loop->latch != loop->header && EDGE_COUNT (loop->latch->succs) == 1)
01243 continue;
01244
01245 e = find_edge (loop->latch, loop->header);
01246
01247 loop_split_edge_with (e, NULL_RTX);
01248 }
01249 loops->state |= LOOPS_HAVE_SIMPLE_LATCHES;
01250 }
01251
01252
01253
01254
01255
01256 basic_block
01257 loop_split_edge_with (edge e, rtx insns)
01258 {
01259 basic_block src, dest, new_bb;
01260 struct loop *loop_c;
01261
01262 src = e->src;
01263 dest = e->dest;
01264
01265 loop_c = find_common_loop (src->loop_father, dest->loop_father);
01266
01267
01268
01269 new_bb = split_edge (e);
01270 add_bb_to_loop (new_bb, loop_c);
01271 new_bb->flags |= (insns ? BB_SUPERBLOCK : 0);
01272
01273 if (insns)
01274 emit_insn_after (insns, BB_END (new_bb));
01275
01276 if (dest->loop_father->latch == src)
01277 dest->loop_father->latch = new_bb;
01278
01279 return new_bb;
01280 }
01281
01282
01283 void
01284 create_loop_notes (void)
01285 {
01286 rtx insn, head, end;
01287 struct loops loops;
01288 struct loop *loop;
01289 basic_block *first, *last, bb, pbb;
01290 struct loop **stack, **top;
01291
01292 #ifdef ENABLE_CHECKING
01293
01294 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
01295 gcc_assert (!NOTE_P (insn) ||
01296 NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG);
01297 #endif
01298
01299 flow_loops_find (&loops, LOOP_TREE);
01300 free_dominance_info (CDI_DOMINATORS);
01301 if (loops.num > 1)
01302 {
01303 last = xcalloc (loops.num, sizeof (basic_block));
01304
01305 FOR_EACH_BB (bb)
01306 {
01307 for (loop = bb->loop_father; loop->outer; loop = loop->outer)
01308 last[loop->num] = bb;
01309 }
01310
01311 first = xcalloc (loops.num, sizeof (basic_block));
01312 stack = xcalloc (loops.num, sizeof (struct loop *));
01313 top = stack;
01314
01315 FOR_EACH_BB (bb)
01316 {
01317 for (loop = bb->loop_father; loop->outer; loop = loop->outer)
01318 {
01319 if (!first[loop->num])
01320 {
01321 *top++ = loop;
01322 first[loop->num] = bb;
01323 }
01324
01325 if (bb == last[loop->num])
01326 {
01327
01328 while (*--top != loop)
01329 last[(*top)->num] = EXIT_BLOCK_PTR;
01330
01331
01332
01333 insn = PREV_INSN (BB_HEAD (first[loop->num]));
01334 if (insn
01335 && BARRIER_P (insn))
01336 insn = PREV_INSN (insn);
01337
01338 if (insn
01339 && JUMP_P (insn)
01340 && any_uncondjump_p (insn)
01341 && onlyjump_p (insn))
01342 {
01343 pbb = BLOCK_FOR_INSN (insn);
01344 gcc_assert (pbb && EDGE_COUNT (pbb->succs) == 1);
01345
01346 if (!flow_bb_inside_loop_p (loop, EDGE_SUCC (pbb, 0)->dest))
01347 insn = BB_HEAD (first[loop->num]);
01348 }
01349 else
01350 insn = BB_HEAD (first[loop->num]);
01351
01352 head = BB_HEAD (first[loop->num]);
01353 emit_note_before (NOTE_INSN_LOOP_BEG, insn);
01354 BB_HEAD (first[loop->num]) = head;
01355
01356
01357 insn = BB_END (last[loop->num]);
01358 if (NEXT_INSN (insn)
01359 && BARRIER_P (NEXT_INSN (insn)))
01360 insn = NEXT_INSN (insn);
01361
01362 end = BB_END (last[loop->num]);
01363 emit_note_after (NOTE_INSN_LOOP_END, insn);
01364 BB_END (last[loop->num]) = end;
01365 }
01366 }
01367 }
01368
01369 free (first);
01370 free (last);
01371 free (stack);
01372 }
01373 flow_loops_free (&loops);
01374 }