00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #include "config.h"
00054 #include "system.h"
00055 #include "coretypes.h"
00056 #include "tm.h"
00057 #include "rtl.h"
00058 #include "regs.h"
00059 #include "hard-reg-set.h"
00060 #include "flags.h"
00061 #include "real.h"
00062 #include "insn-config.h"
00063 #include "recog.h"
00064 #include "basic-block.h"
00065 #include "output.h"
00066 #include "tm_p.h"
00067 #include "function.h"
00068
00069
00070
00071 #include "insn-attr.h"
00072
00073
00074 static void compute_antinout_edge (sbitmap *, sbitmap *, sbitmap *, sbitmap *);
00075 static void compute_earliest (struct edge_list *, int, sbitmap *, sbitmap *,
00076 sbitmap *, sbitmap *, sbitmap *);
00077 static void compute_laterin (struct edge_list *, sbitmap *, sbitmap *,
00078 sbitmap *, sbitmap *);
00079 static void compute_insert_delete (struct edge_list *edge_list, sbitmap *,
00080 sbitmap *, sbitmap *, sbitmap *, sbitmap *);
00081
00082
00083 static void compute_farthest (struct edge_list *, int, sbitmap *, sbitmap *,
00084 sbitmap*, sbitmap *, sbitmap *);
00085 static void compute_nearerout (struct edge_list *, sbitmap *, sbitmap *,
00086 sbitmap *, sbitmap *);
00087 static void compute_rev_insert_delete (struct edge_list *edge_list, sbitmap *,
00088 sbitmap *, sbitmap *, sbitmap *,
00089 sbitmap *);
00090
00091
00092
00093
00094
00095
00096
00097 static void
00098 compute_antinout_edge (sbitmap *antloc, sbitmap *transp, sbitmap *antin,
00099 sbitmap *antout)
00100 {
00101 basic_block bb;
00102 edge e;
00103 basic_block *worklist, *qin, *qout, *qend;
00104 unsigned int qlen;
00105 edge_iterator ei;
00106
00107
00108
00109
00110 qin = qout = worklist = XNEWVEC (basic_block, n_basic_blocks);
00111
00112
00113
00114 sbitmap_vector_ones (antin, last_basic_block);
00115
00116
00117
00118 FOR_EACH_BB_REVERSE (bb)
00119 {
00120 *qin++ = bb;
00121 bb->aux = bb;
00122 }
00123
00124 qin = worklist;
00125 qend = &worklist[n_basic_blocks - NUM_FIXED_BLOCKS];
00126 qlen = n_basic_blocks - NUM_FIXED_BLOCKS;
00127
00128
00129
00130 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
00131 e->src->aux = EXIT_BLOCK_PTR;
00132
00133
00134 while (qlen)
00135 {
00136
00137 bb = *qout++;
00138 qlen--;
00139
00140 if (qout >= qend)
00141 qout = worklist;
00142
00143 if (bb->aux == EXIT_BLOCK_PTR)
00144
00145
00146
00147 sbitmap_zero (antout[bb->index]);
00148 else
00149 {
00150
00151
00152 bb->aux = NULL;
00153 sbitmap_intersection_of_succs (antout[bb->index], antin, bb->index);
00154 }
00155
00156 if (sbitmap_a_or_b_and_c_cg (antin[bb->index], antloc[bb->index],
00157 transp[bb->index], antout[bb->index]))
00158
00159
00160
00161 FOR_EACH_EDGE (e, ei, bb->preds)
00162 if (!e->src->aux && e->src != ENTRY_BLOCK_PTR)
00163 {
00164 *qin++ = e->src;
00165 e->src->aux = e;
00166 qlen++;
00167 if (qin >= qend)
00168 qin = worklist;
00169 }
00170 }
00171
00172 clear_aux_for_edges ();
00173 clear_aux_for_blocks ();
00174 free (worklist);
00175 }
00176
00177
00178
00179 static void
00180 compute_earliest (struct edge_list *edge_list, int n_exprs, sbitmap *antin,
00181 sbitmap *antout, sbitmap *avout, sbitmap *kill,
00182 sbitmap *earliest)
00183 {
00184 sbitmap difference, temp_bitmap;
00185 int x, num_edges;
00186 basic_block pred, succ;
00187
00188 num_edges = NUM_EDGES (edge_list);
00189
00190 difference = sbitmap_alloc (n_exprs);
00191 temp_bitmap = sbitmap_alloc (n_exprs);
00192
00193 for (x = 0; x < num_edges; x++)
00194 {
00195 pred = INDEX_EDGE_PRED_BB (edge_list, x);
00196 succ = INDEX_EDGE_SUCC_BB (edge_list, x);
00197 if (pred == ENTRY_BLOCK_PTR)
00198 sbitmap_copy (earliest[x], antin[succ->index]);
00199 else
00200 {
00201 if (succ == EXIT_BLOCK_PTR)
00202 sbitmap_zero (earliest[x]);
00203 else
00204 {
00205 sbitmap_difference (difference, antin[succ->index],
00206 avout[pred->index]);
00207 sbitmap_not (temp_bitmap, antout[pred->index]);
00208 sbitmap_a_and_b_or_c (earliest[x], difference,
00209 kill[pred->index], temp_bitmap);
00210 }
00211 }
00212 }
00213
00214 sbitmap_free (temp_bitmap);
00215 sbitmap_free (difference);
00216 }
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247 static void
00248 compute_laterin (struct edge_list *edge_list, sbitmap *earliest,
00249 sbitmap *antloc, sbitmap *later, sbitmap *laterin)
00250 {
00251 int num_edges, i;
00252 edge e;
00253 basic_block *worklist, *qin, *qout, *qend, bb;
00254 unsigned int qlen;
00255 edge_iterator ei;
00256
00257 num_edges = NUM_EDGES (edge_list);
00258
00259
00260
00261
00262 qin = qout = worklist
00263 = XNEWVEC (basic_block, n_basic_blocks);
00264
00265
00266 for (i = 0; i < num_edges; i++)
00267 INDEX_EDGE (edge_list, i)->aux = (void *) (size_t) i;
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279 sbitmap_vector_ones (later, num_edges);
00280
00281
00282
00283
00284
00285 FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
00286 sbitmap_copy (later[(size_t) e->aux], earliest[(size_t) e->aux]);
00287
00288
00289
00290 FOR_EACH_BB (bb)
00291 {
00292 *qin++ = bb;
00293 bb->aux = bb;
00294 }
00295
00296
00297
00298 qin = worklist;
00299 qend = &worklist[n_basic_blocks - NUM_FIXED_BLOCKS];
00300 qlen = n_basic_blocks - NUM_FIXED_BLOCKS;
00301
00302
00303 while (qlen)
00304 {
00305
00306 bb = *qout++;
00307 bb->aux = NULL;
00308 qlen--;
00309 if (qout >= qend)
00310 qout = worklist;
00311
00312
00313 sbitmap_ones (laterin[bb->index]);
00314 FOR_EACH_EDGE (e, ei, bb->preds)
00315 sbitmap_a_and_b (laterin[bb->index], laterin[bb->index],
00316 later[(size_t)e->aux]);
00317
00318
00319 FOR_EACH_EDGE (e, ei, bb->succs)
00320 if (sbitmap_union_of_diff_cg (later[(size_t) e->aux],
00321 earliest[(size_t) e->aux],
00322 laterin[e->src->index],
00323 antloc[e->src->index])
00324
00325
00326 && e->dest != EXIT_BLOCK_PTR && e->dest->aux == 0)
00327 {
00328 *qin++ = e->dest;
00329 e->dest->aux = e;
00330 qlen++;
00331 if (qin >= qend)
00332 qin = worklist;
00333 }
00334 }
00335
00336
00337
00338
00339 sbitmap_ones (laterin[last_basic_block]);
00340 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
00341 sbitmap_a_and_b (laterin[last_basic_block],
00342 laterin[last_basic_block],
00343 later[(size_t) e->aux]);
00344
00345 clear_aux_for_edges ();
00346 free (worklist);
00347 }
00348
00349
00350
00351 static void
00352 compute_insert_delete (struct edge_list *edge_list, sbitmap *antloc,
00353 sbitmap *later, sbitmap *laterin, sbitmap *insert,
00354 sbitmap *delete)
00355 {
00356 int x;
00357 basic_block bb;
00358
00359 FOR_EACH_BB (bb)
00360 sbitmap_difference (delete[bb->index], antloc[bb->index],
00361 laterin[bb->index]);
00362
00363 for (x = 0; x < NUM_EDGES (edge_list); x++)
00364 {
00365 basic_block b = INDEX_EDGE_SUCC_BB (edge_list, x);
00366
00367 if (b == EXIT_BLOCK_PTR)
00368 sbitmap_difference (insert[x], later[x], laterin[last_basic_block]);
00369 else
00370 sbitmap_difference (insert[x], later[x], laterin[b->index]);
00371 }
00372 }
00373
00374
00375
00376
00377
00378 struct edge_list *
00379 pre_edge_lcm (int n_exprs, sbitmap *transp,
00380 sbitmap *avloc, sbitmap *antloc, sbitmap *kill,
00381 sbitmap **insert, sbitmap **delete)
00382 {
00383 sbitmap *antin, *antout, *earliest;
00384 sbitmap *avin, *avout;
00385 sbitmap *later, *laterin;
00386 struct edge_list *edge_list;
00387 int num_edges;
00388
00389 edge_list = create_edge_list ();
00390 num_edges = NUM_EDGES (edge_list);
00391
00392 #ifdef LCM_DEBUG_INFO
00393 if (dump_file)
00394 {
00395 fprintf (dump_file, "Edge List:\n");
00396 verify_edge_list (dump_file, edge_list);
00397 print_edge_list (dump_file, edge_list);
00398 dump_sbitmap_vector (dump_file, "transp", "", transp, last_basic_block);
00399 dump_sbitmap_vector (dump_file, "antloc", "", antloc, last_basic_block);
00400 dump_sbitmap_vector (dump_file, "avloc", "", avloc, last_basic_block);
00401 dump_sbitmap_vector (dump_file, "kill", "", kill, last_basic_block);
00402 }
00403 #endif
00404
00405
00406 avin = sbitmap_vector_alloc (last_basic_block, n_exprs);
00407 avout = sbitmap_vector_alloc (last_basic_block, n_exprs);
00408 compute_available (avloc, kill, avout, avin);
00409 sbitmap_vector_free (avin);
00410
00411
00412 antin = sbitmap_vector_alloc (last_basic_block, n_exprs);
00413 antout = sbitmap_vector_alloc (last_basic_block, n_exprs);
00414 compute_antinout_edge (antloc, transp, antin, antout);
00415
00416 #ifdef LCM_DEBUG_INFO
00417 if (dump_file)
00418 {
00419 dump_sbitmap_vector (dump_file, "antin", "", antin, last_basic_block);
00420 dump_sbitmap_vector (dump_file, "antout", "", antout, last_basic_block);
00421 }
00422 #endif
00423
00424
00425 earliest = sbitmap_vector_alloc (num_edges, n_exprs);
00426 compute_earliest (edge_list, n_exprs, antin, antout, avout, kill, earliest);
00427
00428 #ifdef LCM_DEBUG_INFO
00429 if (dump_file)
00430 dump_sbitmap_vector (dump_file, "earliest", "", earliest, num_edges);
00431 #endif
00432
00433 sbitmap_vector_free (antout);
00434 sbitmap_vector_free (antin);
00435 sbitmap_vector_free (avout);
00436
00437 later = sbitmap_vector_alloc (num_edges, n_exprs);
00438
00439
00440 laterin = sbitmap_vector_alloc (last_basic_block + 1, n_exprs);
00441 compute_laterin (edge_list, earliest, antloc, later, laterin);
00442
00443 #ifdef LCM_DEBUG_INFO
00444 if (dump_file)
00445 {
00446 dump_sbitmap_vector (dump_file, "laterin", "", laterin, last_basic_block + 1);
00447 dump_sbitmap_vector (dump_file, "later", "", later, num_edges);
00448 }
00449 #endif
00450
00451 sbitmap_vector_free (earliest);
00452
00453 *insert = sbitmap_vector_alloc (num_edges, n_exprs);
00454 *delete = sbitmap_vector_alloc (last_basic_block, n_exprs);
00455 compute_insert_delete (edge_list, antloc, later, laterin, *insert, *delete);
00456
00457 sbitmap_vector_free (laterin);
00458 sbitmap_vector_free (later);
00459
00460 #ifdef LCM_DEBUG_INFO
00461 if (dump_file)
00462 {
00463 dump_sbitmap_vector (dump_file, "pre_insert_map", "", *insert, num_edges);
00464 dump_sbitmap_vector (dump_file, "pre_delete_map", "", *delete,
00465 last_basic_block);
00466 }
00467 #endif
00468
00469 return edge_list;
00470 }
00471
00472
00473
00474
00475 void
00476 compute_available (sbitmap *avloc, sbitmap *kill, sbitmap *avout,
00477 sbitmap *avin)
00478 {
00479 edge e;
00480 basic_block *worklist, *qin, *qout, *qend, bb;
00481 unsigned int qlen;
00482 edge_iterator ei;
00483
00484
00485
00486
00487 qin = qout = worklist =
00488 XNEWVEC (basic_block, n_basic_blocks - NUM_FIXED_BLOCKS);
00489
00490
00491 sbitmap_vector_ones (avout, last_basic_block);
00492
00493
00494
00495 FOR_EACH_BB (bb)
00496 {
00497 *qin++ = bb;
00498 bb->aux = bb;
00499 }
00500
00501 qin = worklist;
00502 qend = &worklist[n_basic_blocks - NUM_FIXED_BLOCKS];
00503 qlen = n_basic_blocks - NUM_FIXED_BLOCKS;
00504
00505
00506
00507 FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
00508 e->dest->aux = ENTRY_BLOCK_PTR;
00509
00510
00511 while (qlen)
00512 {
00513
00514 bb = *qout++;
00515 qlen--;
00516
00517 if (qout >= qend)
00518 qout = worklist;
00519
00520
00521
00522
00523 if (bb->aux == ENTRY_BLOCK_PTR)
00524
00525
00526 sbitmap_zero (avin[bb->index]);
00527 else
00528 {
00529
00530
00531 bb->aux = NULL;
00532 sbitmap_intersection_of_preds (avin[bb->index], avout, bb->index);
00533 }
00534
00535 if (sbitmap_union_of_diff_cg (avout[bb->index], avloc[bb->index],
00536 avin[bb->index], kill[bb->index]))
00537
00538
00539
00540 FOR_EACH_EDGE (e, ei, bb->succs)
00541 if (!e->dest->aux && e->dest != EXIT_BLOCK_PTR)
00542 {
00543 *qin++ = e->dest;
00544 e->dest->aux = e;
00545 qlen++;
00546
00547 if (qin >= qend)
00548 qin = worklist;
00549 }
00550 }
00551
00552 clear_aux_for_edges ();
00553 clear_aux_for_blocks ();
00554 free (worklist);
00555 }
00556
00557
00558
00559 static void
00560 compute_farthest (struct edge_list *edge_list, int n_exprs,
00561 sbitmap *st_avout, sbitmap *st_avin, sbitmap *st_antin,
00562 sbitmap *kill, sbitmap *farthest)
00563 {
00564 sbitmap difference, temp_bitmap;
00565 int x, num_edges;
00566 basic_block pred, succ;
00567
00568 num_edges = NUM_EDGES (edge_list);
00569
00570 difference = sbitmap_alloc (n_exprs);
00571 temp_bitmap = sbitmap_alloc (n_exprs);
00572
00573 for (x = 0; x < num_edges; x++)
00574 {
00575 pred = INDEX_EDGE_PRED_BB (edge_list, x);
00576 succ = INDEX_EDGE_SUCC_BB (edge_list, x);
00577 if (succ == EXIT_BLOCK_PTR)
00578 sbitmap_copy (farthest[x], st_avout[pred->index]);
00579 else
00580 {
00581 if (pred == ENTRY_BLOCK_PTR)
00582 sbitmap_zero (farthest[x]);
00583 else
00584 {
00585 sbitmap_difference (difference, st_avout[pred->index],
00586 st_antin[succ->index]);
00587 sbitmap_not (temp_bitmap, st_avin[succ->index]);
00588 sbitmap_a_and_b_or_c (farthest[x], difference,
00589 kill[succ->index], temp_bitmap);
00590 }
00591 }
00592 }
00593
00594 sbitmap_free (temp_bitmap);
00595 sbitmap_free (difference);
00596 }
00597
00598
00599
00600
00601
00602
00603 static void
00604 compute_nearerout (struct edge_list *edge_list, sbitmap *farthest,
00605 sbitmap *st_avloc, sbitmap *nearer, sbitmap *nearerout)
00606 {
00607 int num_edges, i;
00608 edge e;
00609 basic_block *worklist, *tos, bb;
00610 edge_iterator ei;
00611
00612 num_edges = NUM_EDGES (edge_list);
00613
00614
00615
00616
00617 tos = worklist = XNEWVEC (basic_block, n_basic_blocks + 1);
00618
00619
00620
00621 for (i = 0; i < num_edges; i++)
00622 INDEX_EDGE (edge_list, i)->aux = (void *) (size_t) i;
00623
00624
00625 sbitmap_vector_ones (nearer, num_edges);
00626
00627
00628
00629
00630
00631 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
00632 sbitmap_copy (nearer[(size_t)e->aux], farthest[(size_t)e->aux]);
00633
00634
00635
00636 FOR_EACH_BB (bb)
00637 {
00638 *tos++ = bb;
00639 bb->aux = bb;
00640 }
00641
00642
00643 while (tos != worklist)
00644 {
00645
00646 bb = *--tos;
00647 bb->aux = NULL;
00648
00649
00650 sbitmap_ones (nearerout[bb->index]);
00651 FOR_EACH_EDGE (e, ei, bb->succs)
00652 sbitmap_a_and_b (nearerout[bb->index], nearerout[bb->index],
00653 nearer[(size_t) e->aux]);
00654
00655
00656 FOR_EACH_EDGE (e, ei, bb->preds)
00657 if (sbitmap_union_of_diff_cg (nearer[(size_t) e->aux],
00658 farthest[(size_t) e->aux],
00659 nearerout[e->dest->index],
00660 st_avloc[e->dest->index])
00661
00662
00663 && e->src != ENTRY_BLOCK_PTR && e->src->aux == 0)
00664 {
00665 *tos++ = e->src;
00666 e->src->aux = e;
00667 }
00668 }
00669
00670
00671
00672
00673 sbitmap_ones (nearerout[last_basic_block]);
00674 FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
00675 sbitmap_a_and_b (nearerout[last_basic_block],
00676 nearerout[last_basic_block],
00677 nearer[(size_t) e->aux]);
00678
00679 clear_aux_for_edges ();
00680 free (tos);
00681 }
00682
00683
00684
00685 static void
00686 compute_rev_insert_delete (struct edge_list *edge_list, sbitmap *st_avloc,
00687 sbitmap *nearer, sbitmap *nearerout,
00688 sbitmap *insert, sbitmap *delete)
00689 {
00690 int x;
00691 basic_block bb;
00692
00693 FOR_EACH_BB (bb)
00694 sbitmap_difference (delete[bb->index], st_avloc[bb->index],
00695 nearerout[bb->index]);
00696
00697 for (x = 0; x < NUM_EDGES (edge_list); x++)
00698 {
00699 basic_block b = INDEX_EDGE_PRED_BB (edge_list, x);
00700 if (b == ENTRY_BLOCK_PTR)
00701 sbitmap_difference (insert[x], nearer[x], nearerout[last_basic_block]);
00702 else
00703 sbitmap_difference (insert[x], nearer[x], nearerout[b->index]);
00704 }
00705 }
00706
00707
00708
00709
00710
00711
00712 struct edge_list *
00713 pre_edge_rev_lcm (int n_exprs, sbitmap *transp,
00714 sbitmap *st_avloc, sbitmap *st_antloc, sbitmap *kill,
00715 sbitmap **insert, sbitmap **delete)
00716 {
00717 sbitmap *st_antin, *st_antout;
00718 sbitmap *st_avout, *st_avin, *farthest;
00719 sbitmap *nearer, *nearerout;
00720 struct edge_list *edge_list;
00721 int num_edges;
00722
00723 edge_list = create_edge_list ();
00724 num_edges = NUM_EDGES (edge_list);
00725
00726 st_antin = sbitmap_vector_alloc (last_basic_block, n_exprs);
00727 st_antout = sbitmap_vector_alloc (last_basic_block, n_exprs);
00728 sbitmap_vector_zero (st_antin, last_basic_block);
00729 sbitmap_vector_zero (st_antout, last_basic_block);
00730 compute_antinout_edge (st_antloc, transp, st_antin, st_antout);
00731
00732
00733 st_avout = sbitmap_vector_alloc (last_basic_block, n_exprs);
00734 st_avin = sbitmap_vector_alloc (last_basic_block, n_exprs);
00735 compute_available (st_avloc, kill, st_avout, st_avin);
00736
00737 #ifdef LCM_DEBUG_INFO
00738 if (dump_file)
00739 {
00740 fprintf (dump_file, "Edge List:\n");
00741 verify_edge_list (dump_file, edge_list);
00742 print_edge_list (dump_file, edge_list);
00743 dump_sbitmap_vector (dump_file, "transp", "", transp, last_basic_block);
00744 dump_sbitmap_vector (dump_file, "st_avloc", "", st_avloc, last_basic_block);
00745 dump_sbitmap_vector (dump_file, "st_antloc", "", st_antloc, last_basic_block);
00746 dump_sbitmap_vector (dump_file, "st_antin", "", st_antin, last_basic_block);
00747 dump_sbitmap_vector (dump_file, "st_antout", "", st_antout, last_basic_block);
00748 dump_sbitmap_vector (dump_file, "st_kill", "", kill, last_basic_block);
00749 }
00750 #endif
00751
00752 #ifdef LCM_DEBUG_INFO
00753 if (dump_file)
00754 {
00755 dump_sbitmap_vector (dump_file, "st_avout", "", st_avout, last_basic_block);
00756 dump_sbitmap_vector (dump_file, "st_avin", "", st_avin, last_basic_block);
00757 }
00758 #endif
00759
00760
00761 farthest = sbitmap_vector_alloc (num_edges, n_exprs);
00762 compute_farthest (edge_list, n_exprs, st_avout, st_avin, st_antin,
00763 kill, farthest);
00764
00765 #ifdef LCM_DEBUG_INFO
00766 if (dump_file)
00767 dump_sbitmap_vector (dump_file, "farthest", "", farthest, num_edges);
00768 #endif
00769
00770 sbitmap_vector_free (st_antin);
00771 sbitmap_vector_free (st_antout);
00772
00773 sbitmap_vector_free (st_avin);
00774 sbitmap_vector_free (st_avout);
00775
00776 nearer = sbitmap_vector_alloc (num_edges, n_exprs);
00777
00778
00779 nearerout = sbitmap_vector_alloc (last_basic_block + 1, n_exprs);
00780 compute_nearerout (edge_list, farthest, st_avloc, nearer, nearerout);
00781
00782 #ifdef LCM_DEBUG_INFO
00783 if (dump_file)
00784 {
00785 dump_sbitmap_vector (dump_file, "nearerout", "", nearerout,
00786 last_basic_block + 1);
00787 dump_sbitmap_vector (dump_file, "nearer", "", nearer, num_edges);
00788 }
00789 #endif
00790
00791 sbitmap_vector_free (farthest);
00792
00793 *insert = sbitmap_vector_alloc (num_edges, n_exprs);
00794 *delete = sbitmap_vector_alloc (last_basic_block, n_exprs);
00795 compute_rev_insert_delete (edge_list, st_avloc, nearer, nearerout,
00796 *insert, *delete);
00797
00798 sbitmap_vector_free (nearerout);
00799 sbitmap_vector_free (nearer);
00800
00801 #ifdef LCM_DEBUG_INFO
00802 if (dump_file)
00803 {
00804 dump_sbitmap_vector (dump_file, "pre_insert_map", "", *insert, num_edges);
00805 dump_sbitmap_vector (dump_file, "pre_delete_map", "", *delete,
00806 last_basic_block);
00807 }
00808 #endif
00809 return edge_list;
00810 }
00811