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
00054
00055
00056
00057
00058
00059
00060
00061
00062 #ifdef USE_PCH
00063 #include "cg_pch.h"
00064 #endif // USE_PCH
00065 #pragma hdrstop
00066
00067 #include "defs.h"
00068 #include "tracing.h"
00069 #include "errors.h"
00070 #include "mempool.h"
00071 #include "cxx_memory.h"
00072 #include "bitset.h"
00073 #include "cgir.h"
00074 #include "data_layout.h"
00075 #include "calls.h"
00076 #include "tn_set.h"
00077 #include "tn_list.h"
00078 #include "gtn_universe.h"
00079 #include "gtn_set.h"
00080 #include "gtn_tn_set.h"
00081 #include "bb_list.h"
00082 #include "bb_set.h"
00083 #include "register.h"
00084 #include "bbregs.h"
00085 #include "gra_live.h"
00086 #include "region_util.h"
00087 #include "cg_region.h"
00088 #include "cg_flags.h"
00089 #include "tn_map.h"
00090 #include "cg.h"
00091 #include "cg_internal.h"
00092 #include "whirl2ops.h"
00093 #include "reg_live.h"
00094 #include "cg_loop.h"
00095 #include "pqs_cg.h"
00096 #include "cgtarget.h"
00097 #include "eh_region.h"
00098
00099 #ifdef TARG_IA64
00100 extern TN *Caller_GP_TN;
00101 #endif
00102
00103 static BB_LIST *region_entry_list;
00104 static BB_SET *region_exit_set;
00105 static MEM_POOL gra_live_pool;
00106 static MEM_POOL gra_live_local_pool;
00107 static MEM_POOL tn_bb_list_map_pool;
00108 static BOOL gra_live_pools_initialized = FALSE;
00109 static BOOL change;
00110 static MEM_POOL liveness_pool;
00111 static BOOL liveness_pool_initialized = FALSE;
00112 static BB_LIST *new_bbs;
00113 static TN_SET *tmp_live_use;
00114 static TN_SET *tmp_live_def;
00115
00116
00117
00118
00119 GTN_SET *force_live_gtns;
00120
00121
00122
00123
00124
00125 static RID *gra_live_scope_rid;
00126
00127
00128
00129
00130
00131 static UINT32 visited_mark;
00132 static UINT32 *bb_visited_mark;
00133
00134 #define BB_visited_mark(bb) (bb_visited_mark[BB_id(bb)])
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 typedef struct {
00148 INT32 tn_bbs_size;
00149 BB_LIST **tn_bbs;
00150 TN_LIST *tns_with_bbs;
00151 } TN_BB_LIST_MAP;
00152
00153 #define TN_BB_LIST_MAP_tn_bbs_size(x) ((x)->tn_bbs_size)
00154 #define TN_BB_LIST_MAP_tn_bbs(x) ((x)->tn_bbs)
00155 #define TN_BB_LIST_MAP_tns_with_bbs(x) ((x)->tns_with_bbs)
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217 static TN_BB_LIST_MAP *
00218 TN_BB_LIST_MAP_Create(void)
00219 {
00220 return TYPE_MEM_POOL_ALLOC(TN_BB_LIST_MAP,&tn_bb_list_map_pool);
00221 }
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232 static BB_LIST *
00233 TN_BB_LIST_MAP_TN_To_BB_LIST(
00234 TN_BB_LIST_MAP *map,
00235 TN *tn
00236 )
00237 {
00238 if ( TN_BB_LIST_MAP_tn_bbs_size(map) <= TN_number(tn) )
00239 return NULL;
00240 else
00241 return TN_BB_LIST_MAP_tn_bbs(map)[TN_number(tn)];
00242 }
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253 static void
00254 TN_BB_LIST_MAP_Add(
00255 TN_BB_LIST_MAP *map,
00256 TN *tn,
00257 BB *bb
00258 )
00259 {
00260
00261
00262
00263 if ( TN_BB_LIST_MAP_tn_bbs_size(map) == 0 ) {
00264 TN_BB_LIST_MAP_tn_bbs(map) =
00265 TYPE_MEM_POOL_ALLOC_N(BB_LIST*,&tn_bb_list_map_pool,Last_TN + 1);
00266 TN_BB_LIST_MAP_tn_bbs_size(map) = Last_TN + 1;
00267 }
00268 else if ( TN_BB_LIST_MAP_tn_bbs_size(map) <= TN_number(tn) ) {
00269 INT32 old_size = TN_BB_LIST_MAP_tn_bbs_size(map);
00270 INT32 new_size = MAX(Last_TN + 1, 2 * old_size);
00271 TN_BB_LIST_MAP_tn_bbs(map) =
00272 TYPE_MEM_POOL_REALLOC_N(BB_LIST*,&tn_bb_list_map_pool,
00273 TN_BB_LIST_MAP_tn_bbs(map),
00274 old_size,
00275 new_size);
00276 TN_BB_LIST_MAP_tn_bbs_size(map) = new_size;
00277 }
00278
00279
00280
00281 if ( TN_BB_LIST_MAP_tn_bbs(map)[TN_number(tn)] == NULL ) {
00282 TN_BB_LIST_MAP_tns_with_bbs(map) =
00283 TN_LIST_Push(tn,TN_BB_LIST_MAP_tns_with_bbs(map),
00284 &tn_bb_list_map_pool);
00285 }
00286
00287
00288
00289 TN_BB_LIST_MAP_tn_bbs(map)[TN_number(tn)] =
00290 BB_LIST_Push(bb,TN_BB_LIST_MAP_tn_bbs(map)[TN_number(tn)],
00291 &tn_bb_list_map_pool);
00292 }
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304 static void
00305 TN_BB_LIST_MAP_Process_Pairs(
00306 TN_BB_LIST_MAP *map,
00307 void (*union1_fn)(BB *,TN *)
00308 )
00309 {
00310 TN_LIST *tn_list;
00311
00312 for ( tn_list = TN_BB_LIST_MAP_tns_with_bbs(map);
00313 tn_list != NULL;
00314 tn_list = TN_LIST_rest(tn_list)
00315 ) {
00316 TN *tn = TN_LIST_first(tn_list);
00317 BB_LIST *bb_list;
00318
00319 if (TN_is_global_reg(tn)) {
00320
00321 for ( bb_list = TN_BB_LIST_MAP_TN_To_BB_LIST(map,tn);
00322 bb_list != NULL;
00323 bb_list = BB_LIST_rest(bb_list)
00324 ) {
00325 BB *bb = BB_LIST_first(bb_list);
00326
00327 union1_fn (bb, tn);
00328 }
00329 }
00330 }
00331 }
00332
00333
00334
00335
00336 static BOOL tn_bb_list_maps_allocated;
00337
00338
00339
00340
00341 static TN_BB_LIST_MAP *tn_live_use_bbs_map;
00342 static TN_BB_LIST_MAP *tn_live_def_bbs_map;
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354 static void
00355 Check_TN_BB_LIST_MAPs_Allocated(void)
00356 {
00357 if ( ! tn_bb_list_maps_allocated ) {
00358 MEM_POOL_Push(&tn_bb_list_map_pool);
00359 tn_live_def_bbs_map = TN_BB_LIST_MAP_Create();
00360 tn_live_use_bbs_map = TN_BB_LIST_MAP_Create();
00361 tn_bb_list_maps_allocated = TRUE;
00362 }
00363 }
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375 static void
00376 Deallocate_TN_BB_LIST_MAPs(void)
00377 {
00378 MEM_POOL_Pop(&tn_bb_list_map_pool);
00379 tn_live_def_bbs_map = NULL;
00380 tn_live_use_bbs_map = NULL;
00381 tn_bb_list_maps_allocated = FALSE;
00382 }
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394 static void
00395 BB_Live_Def_Union1(
00396 BB *bb,
00397 TN *tn
00398 )
00399 {
00400 FmtAssert(TN_is_global_reg (tn),
00401 ("TN%d not in GTN Universe\n",TN_number(tn)));
00402
00403 BB_live_def(bb) = GTN_SET_Union1D(BB_live_def(bb),tn,
00404 &liveness_pool);
00405 }
00406
00407 static void
00408 BB_Live_Use_Union1(
00409 BB *bb,
00410 TN *tn
00411 )
00412 {
00413 FmtAssert(TN_is_global_reg (tn),
00414 ("TN%d not in GTN Universe\n",TN_number(tn)));
00415
00416 BB_live_use(bb) = GTN_SET_Union1D(BB_live_use(bb),tn,
00417 &liveness_pool);
00418 }
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437 static void
00438 Distribute_TN_BB_LIST_MAPs(void)
00439 {
00440 if ( tn_bb_list_maps_allocated ) {
00441 TN_BB_LIST_MAP_Process_Pairs(tn_live_def_bbs_map, BB_Live_Def_Union1);
00442 TN_BB_LIST_MAP_Process_Pairs(tn_live_use_bbs_map, BB_Live_Use_Union1);
00443
00444 Deallocate_TN_BB_LIST_MAPs();
00445 }
00446 }
00447
00448
00449
00450 static void
00451 Union1D_BB_Defreach_In(
00452 TN *tn,
00453 BB *bb
00454 )
00455 {
00456 FmtAssert(TN_is_global_reg (tn),
00457 ("TN%d not in GTN Universe\n",TN_number(tn)));
00458
00459 BB_defreach_in(bb) = GTN_SET_Union1D(BB_defreach_in(bb),
00460 tn,
00461 &liveness_pool);
00462 }
00463
00464
00465 static void
00466 Union1D_BB_Live_Out(
00467 TN *tn,
00468 BB *bb
00469 )
00470 {
00471 FmtAssert(TN_is_global_reg (tn),
00472 ("TN%d not in GTN Universe\n",TN_number(tn)));
00473
00474 BB_live_out(bb) = GTN_SET_Union1D(BB_live_out(bb),
00475 tn,
00476 &liveness_pool);
00477 }
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487 static void
00488 GRA_LIVE_Initialize_Memory(void)
00489 {
00490 BB *bb;
00491
00492 if ( ! liveness_pool_initialized ) {
00493 MEM_POOL_Initialize(&liveness_pool,"MEM_Liveness_pool",TRUE);
00494 MEM_POOL_Push(&liveness_pool);
00495 liveness_pool_initialized = TRUE;
00496 }
00497
00498 if ( ! gra_live_pools_initialized ) {
00499 MEM_POOL_Initialize(&gra_live_pool,"GRA_LIVE_pool",TRUE);
00500 MEM_POOL_Push(&gra_live_pool);
00501 MEM_POOL_Initialize(&gra_live_local_pool,"GRA_LIVE_local_pool",TRUE);
00502 MEM_POOL_Push(&gra_live_local_pool);
00503 MEM_POOL_Initialize(&tn_bb_list_map_pool,
00504 "GRA_LIVE_tn_bb_list_map_pool",
00505 TRUE);
00506 gra_live_pools_initialized = TRUE;
00507 }
00508
00509 for ( bb = REGION_First_BB; bb != NULL; bb = BB_next(bb)) {
00510
00511 if ( BB_bbregs(bb) == NULL )
00512 BB_bbregs(bb) = TYPE_MEM_POOL_ALLOC(BBREGS,&MEM_pu_pool);
00513
00514
00515 BB_live_in(bb) = NULL;
00516 }
00517
00518 new_bbs = NULL;
00519 }
00520
00521
00522
00523
00524
00525
00526
00527
00528 static void
00529 GRA_LIVE_Finalize_Memory(void)
00530 {
00531 if ( liveness_pool_initialized ) {
00532 MEM_POOL_Pop (&liveness_pool);
00533 MEM_POOL_Delete(&liveness_pool);
00534 liveness_pool_initialized = FALSE;
00535 }
00536 if ( gra_live_pools_initialized ) {
00537 MEM_POOL_Pop(&gra_live_pool);
00538 MEM_POOL_Delete(&gra_live_pool);
00539 MEM_POOL_Pop(&gra_live_local_pool);
00540 MEM_POOL_Delete(&gra_live_local_pool);
00541 MEM_POOL_Delete(&tn_bb_list_map_pool);
00542 gra_live_pools_initialized = FALSE;
00543 }
00544 }
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554 void
00555 Force_Live_Add( TN* tn )
00556 {
00557 GTN_UNIVERSE_Add_TN(tn);
00558 force_live_gtns = GTN_SET_Union1D(force_live_gtns, tn, &liveness_pool);
00559 }
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569 void
00570 Force_Live_Remove( TN* tn )
00571 {
00572 force_live_gtns = GTN_SET_Difference1D(force_live_gtns, tn);
00573 }
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587 static void
00588 Compute_Force_TNs(void)
00589 {
00590 INT i;
00591
00592 force_live_gtns = GTN_SET_Create(Callee_Saved_Regs_Count, &liveness_pool);
00593
00594 for ( i = Callee_Saved_Regs_Count - 1; i >= 0; --i ) {
00595 if ( TN_is_save_reg(CALLEE_tn(i)))
00596 Force_Live_Add(CALLEE_tn(i));
00597 }
00598
00599 if (Find_Special_Return_Address_Symbol() == NULL &&
00600 RA_TN != NULL) {
00601
00602
00603
00604
00605 Force_Live_Add(SAVE_tn(Return_Address_Reg));
00606 }
00607 #ifdef TARG_MIPS
00608 else if (SAVE_tn(Return_Address_Reg) != NULL) {
00609 Force_Live_Add(SAVE_tn(Return_Address_Reg));
00610 }
00611 #endif
00612
00613 #ifndef TARG_X8664
00614
00615 if (Caller_GP_TN != NULL) {
00616 Force_Live_Add(Caller_GP_TN);
00617 }
00618 #endif
00619 }
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630 void
00631 GRA_LIVE_Print_Liveness( BB* bb )
00632 {
00633 if ( GRA_LIVE_Phase_Invoked && BB_bbregs(bb) && BB_live_in(bb) ) {
00634 fprintf ( TFile, " defreach_in : " );
00635 GTN_TN_SET_Print( BB_defreach_in(bb), TFile );
00636 fprintf ( TFile, "\n" );
00637 fprintf ( TFile, " live_in : " );
00638 GTN_TN_SET_Print( BB_live_in(bb), TFile );
00639 fprintf ( TFile, "\n" );
00640 fprintf ( TFile, " defreach_out: " );
00641 GTN_TN_SET_Print( BB_defreach_out(bb), TFile );
00642 fprintf ( TFile, "\n" );
00643 fprintf ( TFile, " live_out : " );
00644 GTN_TN_SET_Print( BB_live_out(bb), TFile );
00645 fprintf ( TFile, "\n" );
00646 fprintf ( TFile, " live_def : " );
00647 GTN_TN_SET_Print( BB_live_def(bb), TFile );
00648 fprintf ( TFile, "\n" );
00649 fprintf ( TFile, " live_use : " );
00650 GTN_TN_SET_Print( BB_live_use(bb), TFile );
00651 fprintf ( TFile, "\n" );
00652 }
00653 }
00654
00655 void
00656 GRA_LIVE_fdump_liveness(FILE *f)
00657 {
00658 FILE *save_tfile=TFile;
00659 Set_Trace_File_internal(f);
00660 BB *bb;
00661
00662 fprintf(TFile,"GRA_LIVE dump =======================================================\n");
00663 FOR_ALL_BBLIST_ITEMS(REGION_First_BB,bb) {
00664 fprintf(TFile,"--- BB %d ----\n",BB_id(bb));
00665 GRA_LIVE_Print_Liveness(bb);
00666 }
00667 fprintf(TFile,"=====================================================================\n");
00668 Set_Trace_File_internal(save_tfile);
00669 }
00670
00671 void
00672 GRA_LIVE_dump_liveness(void)
00673 {
00674 GRA_LIVE_fdump_liveness(stdout);
00675 }
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723 static void
00724 GRA_LIVE_Init_BB_Start(BB *bb)
00725 {
00726 new_bbs = BB_LIST_Push(bb,new_bbs,&gra_live_local_pool);
00727
00728 MEM_POOL_Push(&gra_live_local_pool);
00729
00730 tmp_live_use = TN_SET_Create(Last_TN + 1,&gra_live_local_pool);
00731 tmp_live_def = TN_SET_Create(Last_TN + 1,&gra_live_local_pool);
00732 }
00733
00734
00735
00736 static void
00737 GRA_LIVE_Init_BB_End(BB *bb)
00738 {
00739 TN *tn;
00740
00741 Check_TN_BB_LIST_MAPs_Allocated();
00742
00743 for ( tn = TN_SET_Choose(tmp_live_use);
00744 tn != TN_SET_CHOOSE_FAILURE;
00745 tn = TN_SET_Choose_Next(tmp_live_use,tn)
00746 ) {
00747 GTN_UNIVERSE_Add_TN(tn);
00748
00749 TN_BB_LIST_MAP_Add(tn_live_use_bbs_map,tn,bb);
00750 }
00751
00752 ANNOTATION *annot = ANNOT_Get(BB_annotations(bb), ANNOT_LOOPINFO);
00753 if (annot) {
00754 LOOPINFO *info = ANNOT_loopinfo(annot);
00755 TN *tn = LOOPINFO_trip_count_tn(info);
00756 if (tn != NULL && TN_is_register(tn)) {
00757 GTN_UNIVERSE_Add_TN(tn);
00758 TN_BB_LIST_MAP_Add(tn_live_use_bbs_map,tn,bb);
00759 }
00760 }
00761
00762 for ( tn = TN_SET_Choose(tmp_live_def);
00763 tn != TN_SET_CHOOSE_FAILURE;
00764 tn = TN_SET_Choose_Next(tmp_live_def,tn)
00765 ) {
00766 TN_BB_LIST_MAP_Add(tn_live_def_bbs_map,tn,bb);
00767 }
00768
00769 MEM_POOL_Pop(&gra_live_local_pool);
00770 }
00771
00772
00773
00774 static void
00775 Localize_TNs_For_BB (BB *bb)
00776 {
00777 OP *op;
00778
00779 FOR_ALL_BB_OPs_FWD (bb, op) {
00780 TN *tn;
00781 INT i;
00782 for (i = 0; i < OP_results(op); i++) {
00783 tn = OP_result(op, i);
00784 if (TN_is_constant(tn)) continue;
00785 if (TN_is_global_reg(tn)) Reset_TN_is_global_reg(tn);
00786 }
00787 for (i = 0; i < OP_opnds(op); i++) {
00788 tn = OP_opnd(op, i);
00789 if (TN_is_constant(tn)) continue;
00790 if (TN_is_global_reg(tn)) Reset_TN_is_global_reg(tn);
00791 }
00792 }
00793 }
00794
00795 #define TN_is_local_reg(r) (!(TN_is_dedicated(r) | TN_is_global_reg(r)))
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808 static void
00809 Detect_GTNs (void)
00810 {
00811 BB_LIST *bb_list;
00812 TN_MAP bb_for_tn = TN_MAP_Create ();
00813
00814 for ( bb_list = new_bbs;
00815 bb_list != NULL;
00816 bb_list = BB_LIST_rest(bb_list))
00817 {
00818 BB *bb = BB_LIST_first(bb_list);
00819
00820 ANNOTATION *annot = ANNOT_Get(BB_annotations(bb), ANNOT_LOOPINFO);
00821 if (annot) {
00822 LOOPINFO *info = ANNOT_loopinfo(annot);
00823 TN *tn = LOOPINFO_trip_count_tn(info);
00824 if (tn != NULL && TN_is_register(tn))
00825 GTN_UNIVERSE_Add_TN(tn);
00826 }
00827
00828 OP *op;
00829 INT i;
00830 FOR_ALL_BB_OPs_FWD (bb, op) {
00831 for (i = 0; i < OP_results(op); i++) {
00832 TN *tn = OP_result(op, i);
00833 if (TN_is_local_reg(tn)) {
00834 BB *tn_bb = (BB *)TN_MAP_Get (bb_for_tn, tn);
00835 if (tn_bb != NULL) {
00836 if (tn_bb != bb)
00837 GTN_UNIVERSE_Add_TN(tn);
00838 }
00839 else {
00840 TN_MAP_Set (bb_for_tn, tn, bb);
00841 }
00842 }
00843 }
00844 for (i = 0; i < OP_opnds(op); i++) {
00845 TN *tn = OP_opnd(op, i);
00846 if (TN_is_register(tn) && TN_is_local_reg(tn)) {
00847 BB *tn_bb = (BB *)TN_MAP_Get (bb_for_tn, tn);
00848 if (tn_bb != NULL) {
00849 if (tn_bb != bb)
00850 GTN_UNIVERSE_Add_TN(tn);
00851 }
00852 else {
00853 TN_MAP_Set (bb_for_tn, tn, bb);
00854 }
00855 }
00856 }
00857 }
00858 }
00859 TN_MAP_Delete (bb_for_tn);
00860 }
00861
00862
00863
00864
00865
00866
00867
00868
00869 static void
00870 Detect_Multiply_Defined_GTNs (GTN_SET *multiple_defined_set, MEM_POOL *pool)
00871 {
00872 TN_MAP op_for_tn = TN_MAP_Create ();
00873 BB *bb;
00874
00875 for (bb= REGION_First_BB; bb != NULL; bb = BB_next(bb)) {
00876 OP *op;
00877 INT i;
00878 FOR_ALL_BB_OPs_FWD (bb, op) {
00879 for (i = 0; i < OP_results(op); i++) {
00880 TN *tn = OP_result(op, i);
00881
00882 if (TN_is_global_reg(tn)) {
00883 OP *op_tn = (OP *) TN_MAP_Get (op_for_tn, tn);
00884 if (op_tn && op_tn != op) {
00885 multiple_defined_set = GTN_SET_Union1D (multiple_defined_set, tn, pool);
00886 } else {
00887 TN_MAP_Set (op_for_tn, tn, op);
00888 }
00889 }
00890 }
00891 }
00892 }
00893
00894 TN_MAP_Delete (op_for_tn);
00895 }
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905 void
00906 GRA_LIVE_Detect_GTNs_In_Set (BB_SET *bbs)
00907 {
00908 BB *bb;
00909 TN_MAP bb_for_tn = TN_MAP_Create ();
00910
00911 FOR_ALL_BB_SET_members(bbs, bb) {
00912 OP *op;
00913 INT i;
00914 FOR_ALL_BB_OPs_FWD (bb, op) {
00915 for (i = 0; i < OP_results(op); i++) {
00916 TN *tn = OP_result(op, i);
00917 if (TN_is_local_reg(tn)) {
00918 BB *tn_bb = (BB *) TN_MAP_Get (bb_for_tn, tn);
00919 if (tn_bb != NULL) {
00920 if (tn_bb != bb) {
00921 GTN_UNIVERSE_Add_TN(tn);
00922 }
00923 }
00924 else {
00925 TN_MAP_Set (bb_for_tn, tn, bb);
00926 }
00927 }
00928 else {
00929 TN_MAP_Set (bb_for_tn, tn, bb);
00930 }
00931 }
00932
00933
00934 for (i = 0; i < OP_opnds(op); i++) {
00935 TN *tn = OP_opnd(op, i);
00936 if (TN_is_register(tn) && TN_is_local_reg(tn)) {
00937 BB *tn_bb = (BB *) TN_MAP_Get (bb_for_tn, tn);
00938 if (tn_bb != NULL) {
00939 if (tn_bb != bb) {
00940 GTN_UNIVERSE_Add_TN(tn);
00941 }
00942 }
00943 else {
00944 TN_MAP_Set (bb_for_tn, tn, bb);
00945 }
00946 }
00947 }
00948 }
00949 }
00950
00951 TN_MAP_Delete (bb_for_tn);
00952 }
00953
00954
00955 static void
00956 GRA_LIVE_Localize_TNs (void)
00957 {
00958 BB *bb;
00959
00960 for (bb = REGION_First_BB; bb != NULL; bb = BB_next(bb)) {
00961 if (!BB_reg_alloc(bb) &&
00962 ((BB_rid( bb ) == NULL) ||
00963 (RID_level(BB_rid(bb)) < RL_CGSCHED)))
00964 {
00965 Localize_TNs_For_BB (bb);
00966 }
00967 }
00968 }
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001 static void
01002 Update_Local_Liveness_Info(void)
01003 {
01004 INT32 size = GTN_UNIVERSE_size;
01005 BB_LIST *bb_list;
01006
01007 Detect_GTNs ();
01008
01009 for ( bb_list = new_bbs;
01010 bb_list != NULL;
01011 bb_list = BB_LIST_rest(bb_list)
01012 ) {
01013 BB *bb = BB_LIST_first(bb_list);
01014
01015 if ( BB_bbregs(bb) == NULL ) {
01016 BB_bbregs(bb) = TYPE_MEM_POOL_ALLOC(BBREGS,&MEM_pu_pool);
01017 BB_live_in(bb) = NULL;
01018 }
01019
01020 if ( BB_live_in(bb) == NULL ) {
01021 BB_live_in(bb) = GTN_SET_Create(size,&liveness_pool);
01022 BB_live_out(bb) = GTN_SET_Create(size,&liveness_pool);
01023 BB_defreach_in(bb) = GTN_SET_Create(size,&liveness_pool);
01024 BB_defreach_out(bb) = GTN_SET_Create(size,&liveness_pool);
01025 BB_live_use(bb) = GTN_SET_Create(size,&liveness_pool);
01026 BB_live_def(bb) = GTN_SET_Create(size,&liveness_pool);
01027 }
01028 else {
01029 BB_live_in(bb) = GTN_SET_ClearD(BB_live_in(bb));
01030 BB_live_out(bb) = GTN_SET_ClearD(BB_live_out(bb));
01031 BB_defreach_in(bb) = GTN_SET_ClearD(BB_defreach_in(bb));
01032 BB_defreach_out(bb) = GTN_SET_ClearD(BB_defreach_out(bb));
01033 BB_live_use(bb) = GTN_SET_ClearD(BB_live_use(bb));
01034 BB_live_def(bb) = GTN_SET_ClearD(BB_live_def(bb));
01035 }
01036 }
01037
01038
01039
01040
01041
01042
01043
01044
01045
01046
01047
01048 if ( new_bbs != NULL ) {
01049 new_bbs = NULL;
01050 Distribute_TN_BB_LIST_MAPs();
01051 }
01052 }
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064 static void
01065 GRA_LIVE_Set_Entries_Exits( RID *rid )
01066 {
01067 CGRIN *cgrin;
01068 BB *bb;
01069 INT i,n;
01070
01071 if ( rid == NULL ) {
01072
01073
01074
01075 for ( bb = REGION_First_BB; bb; bb = BB_next(bb) ) {
01076 if ( BB_succs(bb) == NULL )
01077 GRA_LIVE_Region_Exit(bb);
01078 if ( BB_preds(bb) == NULL )
01079 GRA_LIVE_Region_Entry(bb);
01080 }
01081 return;
01082 }
01083
01084
01085
01086
01087 cgrin = RID_cginfo( rid );
01088 bb = CGRIN_entry( cgrin );
01089 GRA_LIVE_Region_Entry( bb );
01090 n = RID_num_exits( rid );
01091 for ( i = 0; i < n; i++ ) {
01092 bb = CGRIN_exit_i( cgrin, i );
01093 GRA_LIVE_Region_Exit( bb );
01094 }
01095 gra_live_scope_rid = rid;
01096 }
01097
01098
01099
01100
01101
01102
01103
01104
01105
01106
01107
01108
01109
01110
01111
01112
01113
01114
01115 static void
01116 Region_Boundary_Fixup(void)
01117 {
01118 BB *bb;
01119 TN_LIST *tnl;
01120 TN_LIST *tns_in;
01121 TN_LIST *tns_out;
01122 CGRIN *cgrin;
01123 INT i,n;
01124 TN *tn;
01125
01126 if ( gra_live_scope_rid == NULL ) return;
01127
01128 cgrin = RID_cginfo( gra_live_scope_rid );
01129
01130 tns_in = REGION_Get_TN_In_List (gra_live_scope_rid);
01131 if ( tns_in ) {
01132 bb = CGRIN_entry( cgrin );
01133 for ( tnl = tns_in; tnl; tnl = TN_LIST_rest( tnl ) ) {
01134 tn = TN_LIST_first( tnl );
01135 if ( ! TN_is_dedicated( tn ) ) {
01136 BB_defreach_in( bb ) = GTN_SET_Union1D( BB_defreach_in( bb ), tn, &liveness_pool );
01137 }
01138 }
01139 }
01140
01141 n = RID_num_exits( gra_live_scope_rid );
01142 for ( i = 0; i < n; i++ ) {
01143 bb = CGRIN_exit_i( cgrin, i );
01144 tns_out = REGION_Get_TN_Out_List (gra_live_scope_rid, i);
01145 if (tns_out) {
01146 for ( tnl = tns_out; tnl; tnl = TN_LIST_rest( tnl ) ) {
01147 tn = TN_LIST_first( tnl );
01148 if ( ! TN_is_dedicated( tn ) ) {
01149 BB_live_out( bb ) = GTN_SET_Union1D( BB_live_out( bb ), tn, &liveness_pool );
01150 }
01151 }
01152 }
01153 }
01154 }
01155
01156
01157 #ifdef TARG_MIPS
01158
01159
01160
01161
01162
01163
01164
01165
01166
01167 static void
01168 Handler_Boundary_Fixup(void)
01169 {
01170 BB *bb;
01171
01172 for (bb = REGION_First_BB; bb != NULL; bb = BB_next(bb)) {
01173 if (BB_handler(bb)) {
01174 if (SAVE_tn(Return_Address_Reg) != NULL) {
01175 BB_defreach_in(bb) = GTN_SET_Union1D(BB_defreach_in(bb),
01176 SAVE_tn(Return_Address_Reg),
01177 &liveness_pool);
01178 }
01179 if (Caller_GP_TN != NULL) {
01180 BB_defreach_in(bb) = GTN_SET_Union1D(BB_defreach_in(bb),
01181 Caller_GP_TN,
01182 &liveness_pool);
01183 }
01184 }
01185 }
01186 }
01187 #endif
01188
01189
01190
01191
01192
01193
01194
01195
01196
01197
01198 static void
01199 Live_Init(
01200 BB *bb
01201 )
01202 {
01203
01204
01205
01206
01207
01208
01209 if (!BB_exit(bb)) {
01210 BB_live_out(bb) = GTN_SET_CopyD(BB_live_out(bb), force_live_gtns,
01211 &liveness_pool);
01212 } else {
01213 BB_live_out(bb) = GTN_SET_ClearD(BB_live_out(bb));
01214 }
01215
01216
01217
01218
01219 if (BB_call(bb)) {
01220 GTN_UNIVERSE_Add_TN(SP_TN);
01221 GTN_SET_Union1D (BB_live_out(bb), SP_TN, &liveness_pool);
01222 if( GP_TN != NULL ){
01223 GTN_UNIVERSE_Add_TN(GP_TN);
01224 GTN_SET_Union1D (BB_live_out(bb), GP_TN, &liveness_pool);
01225 }
01226 }
01227
01228 BB_defreach_in(bb) = GTN_SET_ClearD(BB_defreach_in(bb));
01229
01230
01231
01232
01233
01234
01235
01236
01237
01238
01239
01240
01241
01242
01243
01244 BB_live_in(bb) = GTN_SET_CopyD(BB_live_in(bb),
01245 BB_live_use(bb),
01246 &liveness_pool);
01247 #ifdef TARG_IA64
01248
01249
01250
01251 if (PU_has_exc_scopes(Get_Current_PU()) && !PU_Need_Not_Create_LSDA ()) {
01252 extern TN *Caller_GP_TN;
01253 extern TN *Caller_FP_TN;
01254 extern TN *Caller_Pfs_TN;
01255 extern TN *ra_intsave_tn;
01256 if (BB_handler(bb)) {
01257 BB_defreach_in(bb) = GTN_SET_CopyD(BB_defreach_in(bb), force_live_gtns, &liveness_pool);
01258 if (Caller_GP_TN) {
01259 BB_defreach_in(bb) = GTN_SET_Union1D(BB_defreach_in(bb), Caller_GP_TN, &liveness_pool);
01260 GTN_UNIVERSE_Add_TN(Caller_GP_TN);
01261 }
01262 if (ra_intsave_tn) {
01263 BB_defreach_in(bb) = GTN_SET_Union1D(BB_defreach_in(bb), ra_intsave_tn, &liveness_pool);
01264 GTN_UNIVERSE_Add_TN(ra_intsave_tn);
01265 }
01266 if (Caller_FP_TN) {
01267 BB_defreach_in(bb) = GTN_SET_Union1D(BB_defreach_in(bb), Caller_FP_TN, &liveness_pool);
01268 GTN_UNIVERSE_Add_TN(Caller_FP_TN);
01269 }
01270 if (Caller_Pfs_TN) {
01271 BB_defreach_in(bb) = GTN_SET_Union1D(BB_defreach_in(bb), Caller_Pfs_TN, &liveness_pool);
01272 GTN_UNIVERSE_Add_TN(Caller_Pfs_TN);
01273 }
01274 }
01275
01276 if (BB_Has_Exc_Label(bb) || (!BB_exit(bb) && !BB_succs(bb))) {
01277 BB_live_out(bb) = GTN_SET_CopyD(BB_live_out(bb), force_live_gtns, &liveness_pool);
01278 if (Caller_GP_TN) {
01279 BB_live_out(bb) = GTN_SET_Union1D(BB_live_out(bb), Caller_GP_TN, &liveness_pool);
01280 GTN_UNIVERSE_Add_TN(Caller_GP_TN);
01281 }
01282 if (ra_intsave_tn) {
01283 BB_live_out(bb) = GTN_SET_Union1D(BB_live_out(bb), ra_intsave_tn, &liveness_pool);
01284 GTN_UNIVERSE_Add_TN(ra_intsave_tn);
01285 }
01286 if (Caller_FP_TN) {
01287 BB_live_out(bb) = GTN_SET_Union1D(BB_live_out(bb), Caller_FP_TN, &liveness_pool);
01288 GTN_UNIVERSE_Add_TN(Caller_FP_TN);
01289 }
01290 if (Caller_Pfs_TN) {
01291 BB_live_out(bb) = GTN_SET_Union1D(BB_live_out(bb), Caller_Pfs_TN, &liveness_pool);
01292 GTN_UNIVERSE_Add_TN(Caller_Pfs_TN);
01293 }
01294 }
01295 }
01296 #endif
01297
01298
01299
01300
01301 BB_defreach_out(bb) = GTN_SET_ClearD(BB_defreach_out(bb));
01302
01303 OP *op;
01304 INT i;
01305 FOR_ALL_BB_OPs_FWD (bb, op) {
01306 for (i = 0; i < OP_results(op); i++) {
01307 TN *tn = OP_result(op, i);
01308 if (TN_is_global_reg(tn) && !TN_is_const_reg(tn)) {
01309 BB_defreach_out(bb) = GTN_SET_Union1D (BB_defreach_out(bb), tn, &liveness_pool);
01310 }
01311 }
01312 }
01313
01314
01315
01316 if (BB_rotating_kernel(bb)) {
01317 ANNOTATION *annot = ANNOT_Get(BB_annotations(bb), ANNOT_ROTATING_KERNEL);
01318 ROTATING_KERNEL_INFO *info = ANNOT_rotating_kernel(annot);
01319
01320 INT i;
01321 for (i = 0; i < ROTATING_KERNEL_INFO_copyin(info).size(); i++) {
01322 TN *tn = ROTATING_KERNEL_INFO_copyin(info)[i];
01323 BB_live_in(bb) = GTN_SET_Union1D(BB_live_in(bb), tn, &liveness_pool);
01324 }
01325 for (i = 0; i < ROTATING_KERNEL_INFO_copyout(info).size(); i++) {
01326 TN *tn = ROTATING_KERNEL_INFO_copyout(info)[i];
01327 BB_defreach_out(bb) = GTN_SET_Union1D(BB_defreach_out(bb), tn, &liveness_pool);
01328 }
01329 #ifdef TARG_IA64
01330 for (i = 0; i < ROTATING_KERNEL_INFO_localdef(info).size(); i++) {
01331 TN *tn = ROTATING_KERNEL_INFO_localdef(info)[i];
01332 BB_defreach_out(bb) = GTN_SET_Union1D(BB_defreach_out(bb), tn, &liveness_pool);
01333 }
01334 #endif
01335 }
01336 #ifdef TARG_IA64
01337
01338 if (BB_call (bb)) {
01339 ANNOTATION* annot = ANNOT_Get(BB_annotations(bb),ANNOT_CALLINFO);
01340 WN *call_wn = CALLINFO_call_wn(ANNOT_callinfo(annot));
01341 ST *call_st = (WN_operator(call_wn) != OPR_ICALL) ? WN_st(call_wn) : NULL;
01342 TY_IDX call_ty = (call_st != NULL) ? ST_pu_type(call_st) : WN_ty(call_wn);
01343
01344 RETURN_INFO return_info = Get_Return_Info (TY_ret_type(call_ty), No_Simulated
01345 #ifdef TARG_X8664
01346 ,call_st ? PU_ff2c_abi(Pu_Table[ST_pu(call_st)]) : FALSE
01347 #endif
01348 );
01349
01350 for (i = 0; i < RETURN_INFO_count(return_info); i++) {
01351 PREG_NUM rt_preg = RETURN_INFO_preg (return_info, i);
01352 TYPE_ID rt_mtype = RETURN_INFO_mtype (return_info, i);
01353 Is_True (Preg_Is_Dedicated(rt_preg),
01354 ("return value PREG (%d) is not dedicated", (INT)rt_preg));
01355 TN* tn = PREG_To_TN (MTYPE_TO_PREG_array[rt_mtype], rt_preg);
01356 GTN_UNIVERSE_Add_TN(tn);
01357 BB_defreach_out(bb) = GTN_SET_Union1D (BB_defreach_out(bb), tn, &liveness_pool);
01358 }
01359 }
01360 #endif
01361 }
01362
01363
01364
01365
01366
01367
01368
01369
01370
01371
01372
01373 void
01374 GRA_LIVE_Local_Live_Propagate(
01375 BB *bb
01376 )
01377 {
01378 if ( new_bbs != NULL )
01379 Update_Local_Liveness_Info();
01380
01381 BB_live_in(bb) = GTN_SET_CopyD(BB_live_in(bb),
01382 BB_live_out(bb),
01383 &liveness_pool);
01384
01385
01386 BB_live_in(bb) = GTN_SET_UnionD(GTN_SET_DifferenceD(BB_live_in(bb),
01387 BB_live_def(bb)),
01388 BB_live_use(bb),
01389 &liveness_pool);
01390 }
01391
01392
01393
01394
01395
01396
01397
01398
01399
01400
01401 void
01402 GRA_LIVE_Local_Live_Propagate2(
01403 BB *pred,
01404 BB *succ
01405 )
01406 {
01407 Update_Local_Liveness_Info();
01408 GRA_LIVE_Local_Live_Propagate(succ);
01409 BB_live_out(pred) =
01410 GTN_SET_CopyD(BB_live_out(pred),BB_live_in(succ),&liveness_pool);
01411 GRA_LIVE_Local_Live_Propagate(pred);
01412 }
01413
01414
01415
01416
01417
01418
01419
01420
01421
01422
01423
01424 static void
01425 Live_Propagate(
01426 BB *bb
01427 )
01428 {
01429 BBLIST *lst;
01430 BB *succ;
01431
01432 FOR_ALL_BB_SUCCS (bb, lst) {
01433 succ = BBLIST_item(lst);
01434 if ( ! GTN_SET_ContainsP(BB_live_out(bb),BB_live_in(succ)) ) {
01435 change = TRUE;
01436 BB_live_out(bb) = GTN_SET_UnionD(BB_live_out(bb),
01437 BB_live_in(succ),
01438 &liveness_pool);
01439 }
01440 }
01441
01442
01443
01444
01445 GRA_LIVE_Local_Live_Propagate(bb);
01446 }
01447
01448
01449
01450
01451
01452
01453
01454
01455
01456
01457
01458 static void
01459 Defreach_Propagate(
01460 BB *bb
01461 )
01462 {
01463 BBLIST *lst;
01464 BB *pred;
01465
01466 FOR_ALL_BB_PREDS (bb, lst) {
01467 pred = BBLIST_item(lst);
01468 if ( ! GTN_SET_ContainsP(BB_defreach_in(bb),BB_defreach_out(pred)) ) {
01469 change = TRUE;
01470 BB_defreach_in(bb) = GTN_SET_UnionD(BB_defreach_in(bb),
01471 BB_defreach_out(pred),
01472 &liveness_pool);
01473 }
01474 }
01475
01476 BB_defreach_out(bb) = GTN_SET_UnionD(BB_defreach_out(bb),
01477 BB_defreach_in(bb),
01478 &liveness_pool);
01479 }
01480
01481
01482
01483
01484
01485
01486
01487
01488
01489
01490
01491 static void
01492 BB_Forward_Depth_First_Visit(
01493 BB *bb,
01494 BB_SET *border_bb_set,
01495 void (*pre_visit_func) (BB *bb),
01496 void (*post_visit_func) (BB *bb)
01497 )
01498 {
01499 BB *bbi;
01500 BBLIST *lst;
01501
01502 BB_visited_mark(bb) = visited_mark;
01503
01504 pre_visit_func(bb);
01505
01506 if ( ! BB_SET_MemberP(border_bb_set,bb) ) {
01507
01508 FOR_ALL_BB_SUCCS (bb, lst) {
01509 bbi = BBLIST_item(lst);
01510 if ( BB_visited_mark(bbi) != visited_mark ) {
01511 BB_Forward_Depth_First_Visit(bbi,border_bb_set,pre_visit_func,
01512 post_visit_func);
01513 }
01514 }
01515 }
01516
01517 post_visit_func(bb);
01518 }
01519
01520
01521
01522
01523
01524
01525
01526
01527
01528
01529
01530
01531 static void
01532 Do_Nothing(
01533 BB *bb
01534 )
01535 {
01536 }
01537
01538
01539
01540
01541
01542
01543
01544
01545
01546
01547
01548
01549
01550
01551
01552
01553
01554
01555
01556
01557
01558
01559 static void
01560 BB_Forward_Depth_First(
01561 BB_LIST *start_bb_list,
01562 BB_SET *border_bb_set,
01563 void (*pre_visit_func) (BB *bb),
01564 void (*post_visit_func) (BB *bb)
01565 )
01566 {
01567 BB_LIST *l;
01568
01569 ++visited_mark;
01570
01571 for ( l = start_bb_list; l; l = BB_LIST_rest(l) ) {
01572 BB *bb = BB_LIST_first(l);
01573
01574 if ( BB_visited_mark(bb) != visited_mark )
01575 BB_Forward_Depth_First_Visit(bb,border_bb_set,pre_visit_func,
01576 post_visit_func);
01577 }
01578 }
01579
01580
01581
01582
01583
01584
01585
01586
01587
01588
01589 void
01590 GRA_LIVE_Region_Compute_Global_Live_Info(void)
01591 {
01592 Update_Local_Liveness_Info();
01593
01594 bb_visited_mark = TYPE_MEM_POOL_ALLOC_N(UINT32,&gra_live_pool,
01595 PU_BB_Count + 2);
01596 visited_mark = 0;
01597
01598 BB_Forward_Depth_First(region_entry_list,region_exit_set,
01599 Live_Init,
01600 Do_Nothing);
01601
01602 Region_Boundary_Fixup();
01603
01604 #ifdef TARG_MIPS
01605 Handler_Boundary_Fixup();
01606 #endif
01607
01608
01609
01610
01611
01612
01613
01614 do {
01615 change = FALSE;
01616 BB_Forward_Depth_First(region_entry_list,region_exit_set,
01617 Defreach_Propagate,
01618 Live_Propagate);
01619 }
01620 while (change);
01621
01622 if (Get_Trace(TP_FIND_GLOB, 0x1)) {
01623 GRA_LIVE_fdump_liveness(TFile);
01624 }
01625
01626
01627 MEM_POOL_Pop(&gra_live_pool);
01628
01629 }
01630
01631
01632
01633
01634
01635
01636
01637
01638
01639
01640 void
01641 GRA_LIVE_Region_Start(void)
01642 {
01643 MEM_POOL_Push(&gra_live_pool);
01644
01645
01646
01647 region_exit_set = BB_SET_Create(PU_BB_Count + 2,&gra_live_pool);
01648
01649 region_entry_list = NULL;
01650
01651 gra_live_scope_rid = NULL;
01652 }
01653
01654
01655
01656
01657
01658
01659
01660
01661
01662
01663 void
01664 GRA_LIVE_Region_Entry(BB *bb)
01665 {
01666 region_entry_list = BB_LIST_Push(bb,region_entry_list,&gra_live_pool);
01667 }
01668
01669
01670
01671
01672
01673
01674
01675
01676
01677
01678 void
01679 GRA_LIVE_Region_Exit(BB *bb)
01680 {
01681 region_exit_set = BB_SET_Union1D(region_exit_set,bb,&gra_live_pool);
01682 }
01683
01684
01685
01686
01687
01688
01689
01690
01691
01692
01693
01694 static void
01695 BB_REGION_Forward_Depth_First_Visit_BB(
01696 BB *bb,
01697 BB_VISITED_COUNTER *counter,
01698 void (*pre_visit_func) (BB *bb),
01699 void (*post_visit_func) (BB *bb)
01700 )
01701 {
01702 counter->Set_visited(bb);
01703 pre_visit_func(bb);
01704
01705 BBLIST *lst;
01706 FOR_ALL_BB_SUCCS (bb, lst) {
01707 BB *succ = BBLIST_item(lst);
01708 if ( !counter->Visited(succ) )
01709 BB_REGION_Forward_Depth_First_Visit_BB(succ,
01710 counter,
01711 pre_visit_func,
01712 post_visit_func);
01713 }
01714
01715 post_visit_func(bb);
01716 }
01717
01718
01719
01720
01721
01722
01723
01724
01725
01726
01727
01728
01729 static void
01730 BB_REGION_Forward_Depth_First_Visit(const BB_REGION& region,
01731 BB_VISITED_COUNTER *counter,
01732 void (*pre_visit_func) (BB *bb),
01733 void (*post_visit_func) (BB *bb))
01734 {
01735 counter->Init();
01736
01737
01738 INT i;
01739 for (i = 0; i < region.exits.size(); i++)
01740 counter->Set_visited(region.exits[i]);
01741
01742
01743 for (i = 0; i < region.entries.size(); i++) {
01744 if (!counter->Visited(region.entries[i]))
01745 BB_REGION_Forward_Depth_First_Visit_BB(region.entries[i], counter, pre_visit_func, post_visit_func);
01746 }
01747 }
01748
01749
01750
01751
01752
01753
01754
01755
01756
01757
01758 void
01759 BB_REGION_Recompute_Global_Live_Info(const BB_REGION& region, BOOL recompute_local_info)
01760 {
01761
01762 MEM_POOL_Push(&gra_live_pool);
01763
01764 BB_VISITED_COUNTER counter(&gra_live_pool);
01765
01766 #ifdef Is_True_On
01767 region.Verify();
01768 #endif
01769
01770 if (recompute_local_info) {
01771 BB_REGION_Forward_Depth_First_Visit(region,
01772 &counter,
01773 GRA_LIVE_Compute_Local_Info,
01774 Do_Nothing);
01775
01776
01777
01778 Update_Local_Liveness_Info();
01779 }
01780
01781 BB_REGION_Forward_Depth_First_Visit(region,
01782 &counter,
01783 Live_Init,
01784 Do_Nothing);
01785
01786
01787
01788
01789
01790
01791
01792 do {
01793 change = FALSE;
01794 BB_REGION_Forward_Depth_First_Visit(region,
01795 &counter,
01796 Defreach_Propagate,
01797 Live_Propagate);
01798 }
01799 while (change);
01800
01801 if (Get_Trace(TP_FIND_GLOB, 0x1)) {
01802 GRA_LIVE_fdump_liveness(TFile);
01803 }
01804 MEM_POOL_Pop(&gra_live_pool);
01805 }
01806
01807
01808
01809
01810
01811
01812
01813
01814
01815
01816
01817
01818
01819
01820
01821
01822
01823
01824
01825
01826
01827
01828 void
01829 GRA_LIVE_Add_Live_In_GTN( BB* bb, TN* tn )
01830 {
01831 Is_True(TN_is_global_reg(tn), ("TN is not GTN."));
01832 BB_live_in(bb) = GTN_SET_Union1D(BB_live_in(bb),tn,&liveness_pool);
01833 }
01834
01835 void
01836 GRA_LIVE_Remove_Live_In_GTN( BB* bb, TN* tn )
01837 {
01838 Is_True(TN_is_global_reg(tn), ("TN is not GTN."));
01839 BB_live_in(bb) = GTN_SET_Difference1D(BB_live_in(bb),tn);
01840 }
01841
01842 void
01843 GRA_LIVE_Add_Live_Out_GTN( BB* bb, TN* tn )
01844 {
01845 BB_live_out(bb) = GTN_SET_Union1D(BB_live_out(bb),tn,&liveness_pool);
01846 }
01847
01848 void
01849 GRA_LIVE_Remove_Live_Out_GTN( BB* bb, TN* tn )
01850 {
01851 Is_True(TN_is_global_reg(tn), ("TN is not GTN."));
01852 BB_live_out(bb) = GTN_SET_Difference1D(BB_live_out(bb),tn);
01853 }
01854
01855 void
01856 GRA_LIVE_Add_Defreach_In_GTN( BB* bb, TN* tn )
01857 {
01858 Is_True(TN_is_global_reg(tn), ("TN is not GTN."));
01859 BB_defreach_in(bb) =
01860 GTN_SET_Union1D(BB_defreach_in(bb),tn,&liveness_pool);
01861 }
01862
01863 void
01864 GRA_LIVE_Remove_Defreach_In_GTN( BB* bb, TN* tn )
01865 {
01866 Is_True(TN_is_global_reg(tn), ("TN is not GTN."));
01867 BB_defreach_in(bb) = GTN_SET_Difference1D(BB_defreach_in(bb),tn);
01868 }
01869
01870
01871 void
01872 GRA_LIVE_Add_Defreach_Out_GTN( BB* bb, TN* tn )
01873 {
01874 Is_True(TN_is_global_reg(tn), ("TN is not GTN."));
01875 BB_defreach_out(bb) =
01876 GTN_SET_Union1D(BB_defreach_out(bb),tn,&liveness_pool);
01877 }
01878
01879 void
01880 GRA_LIVE_Remove_Defreach_Out_GTN( BB* bb, TN* tn )
01881 {
01882 Is_True(TN_is_global_reg(tn), ("TN is not GTN."));
01883 BB_defreach_out(bb) = GTN_SET_Difference1D(BB_defreach_out(bb),tn);
01884 }
01885
01886
01887 void
01888 GRA_LIVE_Add_Live_Use_GTN( BB* bb, TN* tn )
01889 {
01890 Is_True(TN_is_global_reg(tn), ("TN is not GTN."));
01891 BB_live_use(bb) =
01892 GTN_SET_Union1D(BB_live_use(bb),tn,&liveness_pool);
01893 }
01894
01895 void
01896 GRA_LIVE_Remove_Live_Use_GTN( BB* bb, TN* tn )
01897 {
01898 Is_True(TN_is_global_reg(tn), ("TN is not GTN."));
01899 BB_live_use(bb) = GTN_SET_Difference1D(BB_live_use(bb),tn);
01900 }
01901
01902 void
01903 GRA_LIVE_Add_Live_Def_GTN( BB* bb, TN* tn )
01904 {
01905 Is_True(TN_is_global_reg(tn), ("TN is not GTN."));
01906 BB_live_def(bb) =
01907 GTN_SET_Union1D(BB_live_def(bb),tn,&liveness_pool);
01908 }
01909
01910 void
01911 GRA_LIVE_Remove_Live_Def_GTN( BB* bb, TN* tn )
01912 {
01913 Is_True(TN_is_global_reg(tn), ("TN is not GTN."));
01914 BB_live_def(bb) = GTN_SET_Difference1D(BB_live_def(bb),tn);
01915 }
01916
01917
01918
01919
01920
01921
01922
01923
01924
01925
01926 void
01927 GRA_LIVE_Merge_Blocks( BB *dst, BB *a, BB *b )
01928 {
01929 GTN_SET *live_use;
01930 GTN_SET *live_def;
01931
01932 #if 0
01933
01934
01935
01936
01937 BB_live_in(dst) = GTN_SET_CopyD(BB_live_in(a),&liveness_pool);
01938 BB_defreach_in(dst) = GTN_SET_CopyD(BB_defreach_in(a),&liveness_pool);
01939 #endif
01940
01941
01942
01943
01944 BB_live_out(dst) = GTN_SET_CopyD(BB_live_out(a),BB_live_out(b),&liveness_pool);
01945 BB_defreach_out(dst) = GTN_SET_CopyD(BB_defreach_out(a),BB_defreach_out(b),&liveness_pool);
01946
01947 live_use = GTN_SET_DifferenceD(GTN_SET_Copy(BB_live_use(b),&liveness_pool),
01948 BB_live_def(a));
01949 live_def = GTN_SET_DifferenceD(GTN_SET_Copy(BB_live_def(b),&liveness_pool),
01950 BB_live_use(a));
01951 BB_live_use(dst) = GTN_SET_UnionD(live_use,BB_live_use(a),&liveness_pool);
01952 BB_live_def(dst) = GTN_SET_UnionD(live_def,BB_live_def(a),&liveness_pool);
01953 }
01954
01955
01956
01957
01958
01959
01960
01961
01962
01963 void
01964 GRA_LIVE_Compute_Liveness_For_BB(BB *bb)
01965 {
01966 GRA_LIVE_Compute_Local_Info(bb);
01967 GRA_LIVE_Region_Start();
01968 GRA_LIVE_Region_Entry(bb);
01969 GRA_LIVE_Region_Exit(bb);
01970 GRA_LIVE_Region_Compute_Global_Live_Info();
01971 }
01972
01973
01974
01975
01976
01977
01978
01979 void
01980 GRA_LIVE_Init( RID *rid )
01981 {
01982 BB *bb;
01983
01984 GRA_LIVE_Phase_Invoked = TRUE;
01985
01986 GRA_LIVE_Init_Loop(NULL, NULL, NULL, NULL, NULL);
01987
01988 GRA_LIVE_Initialize_Memory();
01989 if (rid) {
01990
01991
01992
01993 force_live_gtns = GTN_SET_Create_Empty(1, &liveness_pool);
01994 }
01995 else if (!force_live_gtns) Compute_Force_TNs();
01996
01997 if (GRA_LIVE_Predicate_Aware) {
01998 PQSCG_reinit(REGION_First_BB);
01999 }
02000
02001 for ( bb = REGION_First_BB; bb != NULL; bb = BB_next(bb) ) {
02002 GRA_LIVE_Compute_Local_Info(bb);
02003 }
02004
02005 GRA_LIVE_Region_Start();
02006 GRA_LIVE_Set_Entries_Exits( rid );
02007 GRA_LIVE_Region_Compute_Global_Live_Info();
02008
02009 }
02010
02011
02012
02013
02014
02015
02016
02017 void
02018 GRA_LIVE_Recalc_Liveness( RID *rid )
02019 {
02020
02021 if (rid) {
02022 GRA_LIVE_Finish_REGION();
02023 } else {
02024 GTN_UNIVERSE_Pu_End ();
02025 GTN_UNIVERSE_Pu_Begin();
02026 GRA_LIVE_Finalize_Memory();
02027 }
02028
02029 force_live_gtns = NULL;
02030 GRA_LIVE_Localize_TNs ();
02031 GRA_LIVE_Init(rid);
02032 }
02033
02034
02035
02036
02037
02038
02039
02040
02041
02042 void
02043 GRA_LIVE_Finish_PU(void)
02044 {
02045 force_live_gtns = NULL;
02046 GRA_LIVE_Phase_Invoked = FALSE;
02047 GRA_LIVE_Finalize_Memory();
02048 }
02049
02050
02051
02052
02053
02054
02055
02056
02057
02058 void
02059 GRA_LIVE_Finish_REGION(void)
02060 {
02061 force_live_gtns = NULL;
02062 GRA_LIVE_Phase_Invoked = FALSE;
02063 return;
02064 }
02065
02066
02067
02068
02069
02070
02071
02072
02073
02074
02075 static BB *prolog_bb;
02076 static BB *body_bb;
02077 static BB *epilog_bb;
02078 static CG_LOOP_BACKPATCH *prolog_bp;
02079 static CG_LOOP_BACKPATCH *epilog_bp;
02080
02081 void GRA_LIVE_Init_Loop(BB *pbb, BB *bbb, BB *ebb, CG_LOOP_BACKPATCH *pbp, CG_LOOP_BACKPATCH *ebp)
02082 {
02083 body_bb = bbb;
02084 prolog_bb = pbb;
02085 prolog_bp = pbp;
02086 epilog_bb = ebb;
02087 epilog_bp = ebp;
02088 }
02089
02090
02091
02092
02093
02094
02095
02096
02097
02098
02099 void GRA_LIVE_Fini_Loop()
02100 {
02101 body_bb = (BB*)NULL;
02102 prolog_bb = (BB*)NULL;
02103 epilog_bb = (BB*)NULL;
02104 prolog_bp = (CG_LOOP_BACKPATCH*)NULL;
02105 epilog_bp = (CG_LOOP_BACKPATCH*)NULL;
02106 }
02107
02108
02109
02110
02111 static PQS_TN_SET * get_usedef_set(TN_MAP map, TN *tn) {
02112 PQS_TN_SET * def_set;
02113 def_set = (PQS_TN_SET *) TN_MAP_Get(map,tn);
02114 if (!def_set) {
02115 def_set = CXX_NEW(PQS_TN_SET,&PQS_mem_pool);
02116 TN_MAP_Set(map,tn,def_set);
02117 }
02118 return def_set;
02119 }
02120
02121
02122
02123
02124
02125
02126
02127
02128
02129
02130
02131 void
02132 GRA_LIVE_Compute_Local_Info(
02133 BB *bb
02134 )
02135 {
02136 INT32 i;
02137 OP *op;
02138 RID *bbrid;
02139 CGRIN *cgrin;
02140 TN_LIST *tns_in, *tnl;
02141 TN *tn;
02142 TN *pred_tn;
02143 PQS_TN_SET *def_set;
02144 PQS_TN_SET *use_set;
02145 TN_MAP def_map;
02146 TN_MAP use_map;
02147 BOOL sub_from_use;
02148 BOOL add_to_def;
02149
02150 GRA_LIVE_Init_BB_Start(bb);
02151
02152 if (bb == prolog_bb) {
02153 for (CG_LOOP_BACKPATCH *bp = prolog_bp; bp != NULL; bp = CG_LOOP_Backpatch_Next(bp)) {
02154 TN *def_tn = CG_LOOP_BACKPATCH_body_tn(bp);
02155 TN *use_tn = CG_LOOP_BACKPATCH_non_body_tn(bp);
02156 tmp_live_def = TN_SET_Union1D(tmp_live_def,def_tn,&gra_live_local_pool);
02157 tmp_live_use = TN_SET_Difference1D(tmp_live_use,def_tn);
02158 tmp_live_use = TN_SET_Union1D(tmp_live_use,use_tn,&gra_live_local_pool);
02159 }
02160 }
02161
02162
02163 if (GRA_LIVE_Predicate_Aware && PQSCG_pqs_valid()) {
02164 MEM_POOL_Push(&PQS_mem_pool);
02165 def_map = TN_MAP_Create();
02166 use_map = TN_MAP_Create();
02167 for ( op = BB_last_op(bb); op != NULL; op = OP_prev(op) ) {
02168
02169 if (OP_has_predicate(op)) {
02170 pred_tn = OP_opnd(op, OP_PREDICATE_OPND);
02171
02172 use_set = get_usedef_set(use_map,pred_tn);
02173 use_set->Insert(True_TN);
02174 } else {
02175 pred_tn = True_TN;
02176 }
02177
02178 for ( i = OP_results(op) - 1; i >= 0; --i ) {
02179 TN *result_tn = OP_result(op, i);
02180 if (TN_is_register(result_tn) && !TN_is_const_reg(result_tn)) {
02181
02182
02183
02184
02185 def_set = get_usedef_set(def_map,result_tn);
02186 use_set = get_usedef_set(use_map,result_tn);
02187
02188
02189
02190
02191 if (PQSCG_sets_results_if_qual_true(op)) {
02192 def_set->Insert(pred_tn);
02193 } else {
02194
02195
02196 tmp_live_use = TN_SET_Union1D(tmp_live_use,result_tn,&gra_live_local_pool);
02197 tmp_live_def = TN_SET_Union1D(tmp_live_def,result_tn,&gra_live_local_pool);
02198 def_set->Clear();
02199 use_set->Clear();
02200 continue;
02201 }
02202
02203
02204
02205
02206
02207 sub_from_use = PQSCG_is_subset_of(*use_set, *def_set);
02208 add_to_def = PQSCG_is_subset_of(True_TN, *def_set);
02209 if (sub_from_use) {
02210 tmp_live_use =
02211 TN_SET_Difference1D(tmp_live_use,result_tn);
02212 }
02213 if (add_to_def) {
02214 tmp_live_def =
02215 TN_SET_Union1D(tmp_live_def,result_tn,&gra_live_local_pool);
02216 }
02217 if (add_to_def || sub_from_use) {
02218
02219 use_set->Clear();
02220 def_set->Clear();
02221 }
02222 }
02223 }
02224
02225
02226 for ( i = OP_opnds(op) - 1; i >= 0; --i ) {
02227 TN *opnd_tn = OP_opnd(op, i);
02228 if (TN_is_register(opnd_tn) && !TN_is_const_reg(opnd_tn)) {
02229
02230 tmp_live_use = TN_SET_Union1D(tmp_live_use,opnd_tn,&gra_live_local_pool);
02231 use_set = get_usedef_set(use_map,opnd_tn);
02232 use_set->Insert(pred_tn);
02233
02234 tmp_live_def = TN_SET_Difference1D(tmp_live_def,opnd_tn);
02235 def_set = get_usedef_set(def_map,opnd_tn);
02236 def_set->Clear();
02237 }
02238 }
02239 }
02240 TN_MAP_Delete(def_map);
02241 TN_MAP_Delete(use_map);
02242 MEM_POOL_Pop(&PQS_mem_pool);
02243
02244 } else {
02245
02246 for ( op = BB_last_op(bb); op != NULL; op = OP_prev(op) ) {
02247
02248 for ( i = OP_results(op) - 1; i >= 0; --i ) {
02249 TN *result_tn = OP_result(op, i);
02250 if (TN_is_register(result_tn) && !TN_is_const_reg(result_tn)) {
02251 tmp_live_def =
02252 TN_SET_Union1D(tmp_live_def,result_tn,&gra_live_local_pool);
02253
02254
02255
02256 if (OP_cond_def(op)) {
02257 tmp_live_use =
02258 TN_SET_Union1D(tmp_live_use,result_tn,&gra_live_local_pool);
02259 } else {
02260 tmp_live_use =
02261 TN_SET_Difference1D(tmp_live_use,result_tn);
02262 }
02263 }
02264 }
02265
02266 for ( i = OP_opnds(op) - 1; i >= 0; --i ) {
02267 TN *opnd_tn = OP_opnd(op, i);
02268 if (TN_is_register(opnd_tn) && !TN_is_const_reg(opnd_tn)) {
02269 tmp_live_use = TN_SET_Union1D(tmp_live_use,opnd_tn,&gra_live_local_pool);
02270 tmp_live_def = TN_SET_Difference1D(tmp_live_def,opnd_tn);
02271 }
02272 }
02273 }
02274 }
02275
02276 if (bb == body_bb) {
02277 OP *op;
02278 FOR_ALL_BB_OPs(bb, op) {
02279 for (INT opnd = 0; opnd < OP_opnds(op); opnd++) {
02280 TN *tn = OP_opnd(op,opnd);
02281 if (Is_CG_LOOP_Op(op) &&
02282 OP_omega(op, opnd) != 0)
02283 tmp_live_use = TN_SET_Union1D(tmp_live_use,tn,&gra_live_local_pool);
02284 }
02285 }
02286 }
02287
02288 if (bb == epilog_bb) {
02289 for (CG_LOOP_BACKPATCH *bp = epilog_bp; bp != NULL; bp = CG_LOOP_Backpatch_Next(bp)) {
02290 TN *use_tn = CG_LOOP_BACKPATCH_body_tn(bp);
02291 TN *def_tn = CG_LOOP_BACKPATCH_non_body_tn(bp);
02292 tmp_live_def = TN_SET_Union1D(tmp_live_def,def_tn,&gra_live_local_pool);
02293 tmp_live_use = TN_SET_Difference1D(tmp_live_use,def_tn);
02294 tmp_live_use = TN_SET_Union1D(tmp_live_use,use_tn,&gra_live_local_pool);
02295 }
02296 }
02297
02298
02299
02300
02301
02302
02303
02304
02305 if ( ( bbrid = BB_rid( bb ) )
02306 && ( RID_level( bbrid ) >= RL_CGSCHED )
02307 && ( cgrin = RID_cginfo( bbrid ) )
02308 && ( bb == CGRIN_entry( cgrin ) )
02309 && ( tns_in = CGRIN_tns_in( cgrin ) ) ) {
02310
02311 for ( tnl = tns_in; tnl; tnl = TN_LIST_rest( tnl ) ) {
02312 tn = TN_LIST_first( tnl );
02313 tmp_live_use = TN_SET_Union1D(tmp_live_use,tn,&gra_live_local_pool);
02314 }
02315 }
02316
02317
02318
02319 if (BB_rotating_kernel(bb)) {
02320 ANNOTATION *annot = ANNOT_Get(BB_annotations(bb), ANNOT_ROTATING_KERNEL);
02321 ROTATING_KERNEL_INFO *info = ANNOT_rotating_kernel(annot);
02322
02323 INT i;
02324 for (i = 0; i < ROTATING_KERNEL_INFO_copyin(info).size(); i++) {
02325 TN *tn = ROTATING_KERNEL_INFO_copyin(info)[i];
02326 tmp_live_use = TN_SET_Union1D(tmp_live_use,tn,&gra_live_local_pool);
02327
02328 }
02329 for (i = 0; i < ROTATING_KERNEL_INFO_copyout(info).size(); i++) {
02330 TN *tn = ROTATING_KERNEL_INFO_copyout(info)[i];
02331 tmp_live_def = TN_SET_Union1D(tmp_live_def,tn,&gra_live_local_pool);
02332 }
02333 #ifdef TARG_IA64
02334 for (i = 0; i < ROTATING_KERNEL_INFO_localdef(info).size(); i++) {
02335 TN *tn = ROTATING_KERNEL_INFO_localdef(info)[i];
02336 tmp_live_def = TN_SET_Union1D(tmp_live_def,tn,&gra_live_local_pool);
02337 }
02338 #endif
02339 }
02340
02341 GRA_LIVE_Init_BB_End(bb);
02342 }
02343
02344
02345
02346 BOOL GRA_LIVE_TN_Live_Outof_BB (TN *tn, BB *bb)
02347 {
02348 if (TN_is_global_reg(tn) &&
02349 GTN_SET_Intersection_MemberP(BB_live_out(bb), BB_defreach_out(bb), tn))
02350 {
02351 return TRUE;
02352 }
02353
02354 if (TN_is_dedicated (tn)) {
02355 return REG_LIVE_Implicit_Use_Outof_BB (TN_register_class(tn),
02356 TN_register(tn),
02357 bb);
02358 }
02359 return FALSE;
02360 }
02361
02362
02363 BOOL GRA_LIVE_TN_Live_Into_BB (TN *tn, BB *bb)
02364 {
02365 if (TN_is_global_reg(tn) &&
02366 GTN_SET_Intersection_MemberP (BB_live_in(bb), BB_defreach_in(bb), tn))
02367 {
02368 return TRUE;
02369 }
02370 if (TN_is_dedicated (tn)) {
02371 return REG_LIVE_Implicit_Def_Into_BB (TN_register_class(tn),
02372 TN_register(tn),
02373 bb);
02374 }
02375 return FALSE;
02376 }
02377
02378
02379
02380
02381
02382
02383 static void
02384 Rename_TN_In_Range (TN *tn, OP *op1, OP *op2)
02385 {
02386 TN *new_tn = Dup_TN (tn);
02387 OP *op = op1;
02388 INT i;
02389
02390 #ifdef TARG_IA64
02391 if (Get_Trace(TP_CGPREP, 0x8))
02392 #else
02393 if (Get_Trace(TP_FIND_GLOB, 0x8))
02394 #endif
02395 fprintf (TFile, "<Rename_TNs> TN%d renamed to TN%d in BB:%d\n",
02396 TN_number(tn), TN_number(new_tn), BB_id(OP_bb(op1)));
02397
02398 do {
02399 for (i = 0; i < OP_results(op); i++) {
02400 if (OP_result(op, i) == tn) {
02401 Set_OP_result (op, i, new_tn);
02402 }
02403 }
02404 op = OP_next(op);
02405 if (op == NULL) break;
02406 for (i = 0; i < OP_opnds(op); i++) {
02407 if (OP_opnd(op, i) == tn) {
02408 Set_OP_opnd (op, i, new_tn);
02409 }
02410 }
02411 } while (op != op2);
02412 }
02413
02414
02415
02416
02417
02418
02419
02420
02421
02422
02423 static TN *defreach_tn;
02424 static void
02425 Clear_Defreach(
02426 BB *bb
02427 )
02428 {
02429 if (GTN_SET_MemberP(BB_defreach_in(bb), defreach_tn))
02430 GRA_LIVE_Remove_Defreach_In_GTN(bb, defreach_tn);
02431
02432 if (GTN_SET_MemberP(BB_defreach_out(bb), defreach_tn))
02433 GRA_LIVE_Remove_Defreach_Out_GTN(bb, defreach_tn);
02434 }
02435
02436
02437
02438
02439 void
02440 Rename_TNs_For_BB (BB *bb, GTN_SET *multiple_defined_set
02441 #ifdef KEY
02442 , OP *rename_local_TN_op
02443 #endif
02444 )
02445 {
02446 TN_MAP op_for_tn = TN_MAP_Create ();
02447 OP *op;
02448 #ifdef KEY
02449 BOOL rename_local_TNs = FALSE;
02450 #endif
02451
02452 FOR_ALL_BB_OPs_FWD (bb, op) {
02453 #ifdef KEY
02454
02455
02456 rename_local_TNs |= (rename_local_TN_op == op);
02457 #endif
02458 for (INT i = 0; i < OP_results(op); i++) {
02459 TN *tn = OP_result(op, i);
02460
02461 if (TN_is_dedicated(tn) || OP_cond_def(op) || OP_same_res(op)) continue;
02462
02463 OP *last_def = (OP *) TN_MAP_Get (op_for_tn, tn);
02464 if (last_def != NULL) {
02465
02466 Rename_TN_In_Range (tn, last_def, op);
02467 }
02468 #ifdef TARG_IA64
02469 else if (tn == Caller_GP_TN) {
02470
02471 }
02472 #endif
02473 #ifdef TARG_MIPS
02474 else if (PU_Has_Exc_Handler &&
02475 (tn == Caller_GP_TN ||
02476 tn == SAVE_tn(Return_Address_Reg))) {
02477
02478
02479 }
02480 #endif
02481 else if (TN_is_global_reg(tn) &&
02482 !TN_is_const_reg(tn) &&
02483 !GTN_SET_MemberP(BB_live_out(bb), tn)) {
02484
02485
02486 Rename_TN_In_Range (tn, op, NULL);
02487
02488
02489 GRA_LIVE_Remove_Live_Def_GTN(bb, tn);
02490 GRA_LIVE_Remove_Defreach_Out_GTN(bb, tn);
02491 Force_Live_Remove(tn);
02492
02493 if (multiple_defined_set && !TN_is_constant(tn) &&
02494 !GTN_SET_MemberP(BB_live_in(bb), tn) &&
02495 !GTN_SET_MemberP(multiple_defined_set, tn)) {
02496
02497
02498
02499
02500
02501 #ifdef TARG_IA64
02502 BB *cur_bb;
02503 for (cur_bb = bb; cur_bb != NULL; cur_bb = BB_next(cur_bb)) {
02504 if (GTN_SET_MemberP(BB_defreach_in(cur_bb), tn))
02505 GRA_LIVE_Remove_Defreach_In_GTN(cur_bb, tn);
02506
02507 if (GTN_SET_MemberP(BB_defreach_out(cur_bb), tn))
02508 GRA_LIVE_Remove_Defreach_Out_GTN(cur_bb, tn);
02509 }
02510 #else // TARG_IA64
02511 defreach_tn = tn;
02512 #ifndef KEY
02513
02514
02515
02516
02517 BB_VISITED_COUNTER counter_data(&gra_live_pool);
02518 #else
02519 BB_VISITED_COUNTER counter_data(&MEM_local_pool);
02520 #endif
02521 BB_VISITED_COUNTER *counter = &counter_data;
02522 counter->Init();
02523 BB_REGION_Forward_Depth_First_Visit_BB (bb, counter, Clear_Defreach, Do_Nothing);
02524 #ifndef KEY
02525
02526
02527
02528 MEM_POOL_Pop(&gra_live_pool);
02529 #endif
02530 #endif // TARG_IA64
02531 Reset_TN_is_global_reg (tn);
02532
02533 }
02534
02535 }
02536 #ifdef KEY
02537 else if (rename_local_TNs &&
02538 !TN_is_global_reg(tn) &&
02539 !TN_is_const_reg(tn)) {
02540
02541 Rename_TN_In_Range (tn, op, NULL);
02542 }
02543 #endif
02544 TN_MAP_Set (op_for_tn, OP_result(op, i), op);
02545 }
02546 }
02547 TN_MAP_Delete (op_for_tn);
02548 }
02549
02550
02551 void GRA_LIVE_Rename_TNs (void)
02552 {
02553 BB *bb;
02554
02555 MEM_POOL_Push (&MEM_local_pool);
02556 GTN_SET *multiple_defined_set = GTN_SET_Create(GTN_UNIVERSE_size, &MEM_local_pool);
02557 Detect_Multiply_Defined_GTNs (multiple_defined_set, &MEM_local_pool);
02558
02559 for (bb = REGION_First_BB; bb != NULL; bb = BB_next(bb)) {
02560 if (!BB_reg_alloc(bb) &&
02561 ((BB_rid( bb ) == NULL) ||
02562 (RID_level(BB_rid(bb)) < RL_CGSCHED)))
02563 {
02564 Rename_TNs_For_BB (bb, multiple_defined_set);
02565 }
02566 }
02567
02568 MEM_POOL_Pop (&MEM_local_pool);
02569 }