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
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00056
00057
00058
00059
00060
00061
00062
00063 #ifdef USE_PCH
00064 #include "cg_pch.h"
00065 #endif // USE_PCH
00066 #pragma hdrstop
00067
00068 #ifdef _KEEP_RCS_ID
00069 static char *rcs_id = "$Source: /scratch/mee/2.4-65/kpro64-pending/be/cg/gra_mon/SCCS/s.gra_create.cxx $ $Revision: 1.13 $";
00070 #endif
00071
00072 #include "defs.h"
00073 #include "mempool.h"
00074 #include "cg.h"
00075 #include "cgir.h"
00076 #include "cgtarget.h"
00077 #include "gtn_universe.h"
00078 #include "gtn_set.h"
00079 #include "op.h"
00080 #include "whirl2ops.h"
00081 #include "dominate.h"
00082 #include "findloops.h"
00083 #include "cg_flags.h"
00084 #include "cg_region.h"
00085 #include "gra_bb.h"
00086 #include "gra_lrange.h"
00087 #include "gra_lunit.h"
00088 #include "gra_region.h"
00089 #include "gra_loop.h"
00090 #include "gra_trace.h"
00091 #include "gra_cflow.h"
00092 #include "gra_pref.h"
00093 #include "register.h"
00094 #ifdef TARG_SL2 //para_region_mgr
00095 #include "gra_para_region.h"
00096 #endif
00097 #include "tracing.h"
00098
00099 #define FREE(ptr) MEM_POOL_FREE(Malloc_Mem_Pool,ptr)
00100
00101 INT GRA_non_preference_tn_id = -1;
00102 static BOOL gbb_needs_rename;
00103
00104
00105
00106 #ifdef TARG_IA64
00107 BOOL fat_self_recursive = FALSE;
00108 extern BOOL gra_self_recursive;
00109 extern char *Cur_PU_Name;
00110 BOOL OP_maybe_unc_cmp(OP* op)
00111 {
00112 TOP op_code = OP_code(op);
00113 switch (op_code) {
00114 case TOP_cmp_ne:
00115 case TOP_cmp_ge:
00116 case TOP_cmp_le:
00117 case TOP_cmp_lt:
00118 case TOP_cmp_ltu:
00119 case TOP_cmp_leu:
00120 case TOP_cmp_gt:
00121 case TOP_cmp_gtu:
00122 case TOP_cmp_geu:
00123 case TOP_cmp_i_ne:
00124 case TOP_cmp_i_ge:
00125 case TOP_cmp_i_le:
00126 case TOP_cmp_i_lt:
00127 case TOP_cmp_i_ltu:
00128 case TOP_cmp_i_leu:
00129 case TOP_cmp_i_gt:
00130 case TOP_cmp_i_gtu:
00131 case TOP_cmp_i_geu:
00132 case TOP_cmp4_ne:
00133 case TOP_cmp4_ge:
00134 case TOP_cmp4_le:
00135 case TOP_cmp4_lt:
00136 case TOP_cmp4_ltu:
00137 case TOP_cmp4_leu:
00138 case TOP_cmp4_gt:
00139 case TOP_cmp4_gtu:
00140 case TOP_cmp4_geu:
00141 case TOP_cmp4_i_ne:
00142 case TOP_cmp4_i_ge:
00143 case TOP_cmp4_i_le:
00144 case TOP_cmp4_i_gt:
00145 case TOP_cmp4_i_lt:
00146 case TOP_cmp4_i_ltu:
00147 case TOP_cmp4_i_leu:
00148 case TOP_cmp4_i_gtu:
00149 case TOP_cmp4_i_geu:
00150
00151 { return TRUE;
00152 }
00153 default: return FALSE;
00154 }
00155
00156 }
00157 OP* Search_Pair_OP(OP *op,OP* def_op1,TN* res_tn,TN* predicated_tn)
00158 {
00159 for (OP* find_op=BB_first_op(OP_bb(op));find_op;find_op=OP_next(find_op)){
00160 if (OP_cond_def(find_op)) {
00161 TN *pn = OP_opnd(find_op, OP_PREDICATE_OPND);
00162 DEF_KIND kind ;
00163 OP *def_op2 = TN_Reaching_Value_At_Op(pn,find_op,&kind,TRUE);
00164 if ((pn!=predicated_tn)&&(def_op2==def_op1)&&(OP_results(find_op)==1)&&(OP_result(find_op,0)==res_tn)) {
00165 return find_op;
00166 }
00167 }
00168 }
00169 return NULL;
00170 }
00171 OP* Check_Disjoint_Predicate_Guarded_Def (OP* xop)
00172 {
00173 if (OP_cond_def(xop)||(OP_results(xop)==1)) {
00174 TOP opcode=OP_code(xop);
00175 TN *pn = OP_opnd(xop, OP_PREDICATE_OPND);
00176 if (pn==True_TN) return FALSE;
00177 DEF_KIND kind ;
00178 OP *def_op = TN_Reaching_Value_At_Op(pn,xop,&kind,TRUE);
00179 BOOL Yes=FALSE;
00180 if ((def_op)&&(OP_bb(def_op)==OP_bb(xop))) {
00181 if((OP_cmp_unc(def_op))||(OP_maybe_unc_cmp(def_op))) {
00182 OP* find_op=Search_Pair_OP(xop,def_op,OP_result(xop,0),pn);
00183 if (find_op) {
00184 return find_op;
00185 }
00186 }
00187 }
00188 }
00189 return NULL;
00190 }
00191 class OP_OF_ONLY_DEF
00192 {
00193 typedef struct OP_IDX {
00194 INT idx;
00195 OP_IDX *next;
00196 }OP_IDX_TYPE;
00197 OP_IDX_TYPE *op_idx_array;
00198 MEM_POOL *own_mem;
00199 public:
00200 INT *op_idx ;
00201 OP_OF_ONLY_DEF(MEM_POOL *pool) {
00202 own_mem=pool;
00203 op_idx_array = NULL;
00204 }
00205 OP_IDX_TYPE* Create_Array_Member (void) {
00206 OP_IDX_TYPE *new_op_idx_array ;
00207 new_op_idx_array = TYPE_MEM_POOL_ALLOC(OP_IDX_TYPE,own_mem);
00208 new_op_idx_array->idx=0 ;
00209 new_op_idx_array->next =NULL;
00210 return new_op_idx_array;
00211 }
00212 void Add (OP* op) {
00213 OP_IDX_TYPE *head= op_idx_array;
00214 if (head == NULL) {
00215 OP_IDX_TYPE *s_op_idx_array=Create_Array_Member();
00216 s_op_idx_array->idx = OP_map_idx(op);
00217 head=s_op_idx_array;
00218 op_idx_array=s_op_idx_array;
00219 }else {
00220 while (head->next!=NULL) {
00221 if (head->idx == OP_map_idx(op))
00222 return;
00223 head = head->next;
00224 }
00225 if (head->idx == OP_map_idx(op))
00226 return;
00227 OP_IDX_TYPE *s_op_idx_array=Create_Array_Member();
00228 s_op_idx_array->idx = OP_map_idx(op);
00229 head->next = s_op_idx_array;
00230 }
00231 }
00232 BOOL FIND_OP(OP* find_op) {
00233 OP* op;
00234 OP_IDX_TYPE *head= op_idx_array;
00235 head= op_idx_array;
00236 while (head !=NULL) {
00237 if (OP_map_idx(find_op)==head->idx){
00238 return TRUE;
00239 }else
00240 head = head->next;
00241 }
00242 return FALSE;
00243 }
00244
00245 ~OP_OF_ONLY_DEF(void){
00246 }
00247 void Set_OPS_OF_ONLY_DEF(GRA_BB* gbb)
00248 {
00249 GRA_BB_OP_FORWARD_ITER iter;
00250 INT op_count;
00251 for (iter.Init(gbb),op_count=1;!iter.Done();iter.Step(),op_count++)
00252 {
00253
00254 OP* xop = iter.Current();
00255 if(OP_cond_def(xop)){
00256 OP* another_op =Check_Disjoint_Predicate_Guarded_Def(xop);
00257 if (another_op) {
00258 Add(xop);
00259 Add(another_op);
00260 }
00261 }
00262 }
00263 return;
00264 }
00265
00266 };
00267 #endif // TARG_IA64
00268
00269 static void
00270 Identify_Region_Boundries(void)
00272
00273
00275 {
00276 GRA_REGION_PREV_ALLOC_ITER iter;
00277
00278 for (iter.Init(); ! iter.Done(); iter.Step()) {
00279 GRA_REGION *region = iter.Current();
00280 RID *rid = region->Rid();
00281 GRA_REGION_GBB_ITER gbb_iter;
00282
00283
00284
00285
00286
00287 if (RID_type(rid) == RID_TYPE_swp) {
00288 continue;
00289 }
00290
00291 for (gbb_iter.Init(region); ! gbb_iter.Done(); gbb_iter.Step()) {
00292 GRA_BB* gbb = gbb_iter.Current();
00293 GRA_BB_FLOW_NEIGHBOR_ITER bb_iter;
00294
00295
00296 for (bb_iter.Preds_Init(gbb); ! bb_iter.Done(); bb_iter.Step()) {
00297 GRA_BB* pred = bb_iter.Current();
00298 if (BB_rid(pred->Bb()) == Current_Rid) {
00299 pred->Region_Prolog_Set();
00300 }
00301 }
00302
00303
00304 for (bb_iter.Succs_Init(gbb); ! bb_iter.Done(); bb_iter.Step()) {
00305 GRA_BB* succ = bb_iter.Current();
00306 if (BB_rid(succ->Bb()) == Current_Rid) {
00307 succ->Region_Epilog_Set();
00308 }
00309 }
00310 }
00311 }
00312 }
00313
00315 static void
00316 Create_GRA_BB_Call_Spill_Block(BB *bb)
00318
00319
00320
00321
00322
00323
00325 {
00326 BB *succ = BB_Unique_Successor(bb);
00327
00328
00329
00330
00331 if (succ == NULL || BB_freq(bb) == BB_freq(succ)) {
00332 return;
00333 }
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344 if (!BB_call(succ)) {
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355 for (TN *tn = GTN_SET_Choose(BB_live_use(succ));
00356 tn != GTN_SET_CHOOSE_FAILURE;
00357 tn = GTN_SET_Choose_Next(BB_live_use(succ), tn)) {
00358 REGISTER_SET func_val =
00359 REGISTER_CLASS_function_value(TN_register_class(tn));
00360 if (TN_is_register(tn) &&
00361 (TN_register(tn) != REGISTER_UNDEFINED) &&
00362 GTN_SET_MemberP(BB_live_in(succ), tn) &&
00363 REGISTER_SET_MemberP(func_val, TN_register(tn))) {
00364 return;
00365 }
00366 }
00367
00368 } else if (OP_has_predicate(BB_last_op(bb)) &&
00369 OP_has_predicate(BB_last_op(succ)) &&
00370 !TN_is_const_reg(OP_opnd(BB_last_op(bb), OP_PREDICATE_OPND)) &&
00371 !TNs_Are_Equivalent(OP_opnd(BB_last_op(bb), OP_PREDICATE_OPND),
00372 OP_opnd(BB_last_op(succ), OP_PREDICATE_OPND))) {
00373
00374 goto block_needed;
00375 } else {
00376
00377
00378
00379 for (TN *tn = GTN_SET_Choose(BB_live_use(succ));
00380 tn != GTN_SET_CHOOSE_FAILURE;
00381 tn = GTN_SET_Choose_Next(BB_live_use(succ), tn)) {
00382 OP *op;
00383 REGISTER_SET func_val =
00384 REGISTER_CLASS_function_value(TN_register_class(tn));
00385
00386 if (TN_is_register(tn) &&
00387 (TN_register(tn) != REGISTER_UNDEFINED) &&
00388 GTN_SET_MemberP(BB_live_in(succ), tn) &&
00389 REGISTER_SET_MemberP(func_val, TN_register(tn))) {
00390
00391 FOR_ALL_BB_OPs(bb, op) {
00392 for (INT j = 0; j < OP_opnds(op); j++) {
00393 TN *cktn = OP_opnd(op, j);
00394 if (TN_is_register(cktn) &&
00395 TNs_Are_Equivalent(tn, cktn)) {
00396
00397
00398
00399 return;
00400 }
00401 }
00402 for (INT k = 0; k < OP_results(op); k++) {
00403 TN *cktn = OP_result(op, k);
00404 if (TN_is_register(cktn) &&
00405 TNs_Are_Equivalent(tn, cktn)) {
00406
00407
00408 goto block_needed;
00409 }
00410 }
00411 }
00412 }
00413 }
00414
00415 }
00416
00417 block_needed:
00418
00419
00420
00421
00422 GRA_Add_Call_Spill_Block(bb, succ);
00423 }
00424
00426 static void
00427 Create_Spill_Blocks(void)
00429
00430
00431
00433 {
00434 BB *bb;
00435
00436 for ( bb = REGION_First_BB; bb != NULL; bb = BB_next(bb) ) {
00437
00438
00439
00440
00441 if (BB_call(bb)) {
00442 Create_GRA_BB_Call_Spill_Block(bb);
00443 }
00444 }
00445 }
00446
00448
00449
00450
00451
00452
00453
00454 static void
00455 Create_GRA_BBs_And_Regions(void)
00456 {
00457 BB *bb;
00458
00459 GRA_Init_Trace_Memory();
00460
00461
00462
00463
00464
00465 if (GRA_loop_splitting) {
00466 Calculate_Dominators();
00467 gra_loop_mgr.Find_Loops();
00468 }
00469 GRA_Trace_Memory("After Find Loops");
00470
00471 Create_Spill_Blocks();
00472
00473 GRA_Init_Trace_Memory();
00474 for ( bb = REGION_First_BB; bb != NULL; bb = BB_next(bb) ) {
00475 GRA_REGION* region = gra_region_mgr.Get(BB_rid(bb));
00476 GRA_BB* gbb = gbb_mgr.Create(bb,region);
00477 region->Add_GBB(gbb);
00478 gra_loop_mgr.Set_GBB_Loop(gbb);
00479
00480 #ifdef TARG_SL //minor_reg_mgr
00481 RID * rid = BB_rid(bb);
00482 GRA_PARA_REGION* para_region = gra_para_region_mgr.Get(rid);
00483 if(rid && RID_TYPE_minor(rid)) {
00484 gra_para_region_mgr.Add_Rid_Into_Minor_Vector(rid);
00485 }
00486 if(para_region)
00487 para_region->Add_BB(bb);
00488 #endif
00489
00490
00491 if (!GRA_use_old_conflict) {
00492 GTN_SET* needs_a_register = GTN_SET_Create(GTN_UNIVERSE_size,
00493 GRA_pool);
00494 needs_a_register = GTN_SET_CopyD(needs_a_register,BB_live_in(gbb->Bb()),
00495 GRA_pool);
00496 needs_a_register = GTN_SET_IntersectionD(needs_a_register,
00497 BB_defreach_in(gbb->Bb()));
00498 needs_a_register =
00499 GTN_SET_UnionD_Intersection(needs_a_register,BB_live_out(gbb->Bb()),
00500 BB_defreach_out(gbb->Bb()),
00501 GRA_pool);
00502 gbb->Needs_A_Register_Set(needs_a_register);
00503 }
00504 }
00505
00506
00507
00508
00509
00510 GRA_REGION_PREV_ALLOC_ITER iter;
00511 for (iter.Init(); ! iter.Done(); iter.Step()) {
00512 GRA_REGION *region = iter.Current();
00513 region->Alloc_Subuniverses();
00514 }
00515
00516 GRA_Trace_Memory("After Create_GRA_BBs_And_Regions()");
00517
00518 Identify_Region_Boundries();
00519 GRA_Trace_Memory_Counts();
00520 }
00521
00523 inline void
00524 Region_TN_Reference( TN* tn, GRA_REGION* region )
00526
00527
00528
00529
00531 {
00532 if ( TN_Is_Allocatable(tn) && lrange_mgr.Get(tn) == NULL ) {
00533 if (Get_Trace(TP_SWPIPE, 4)) {
00534 fprintf(TFile, "Region_TN_Reference: TN%d - %s\n",
00535 TN_number(tn),
00536 REGISTER_name(TN_register_class(tn), TN_register(tn)));
00537 }
00538 lrange_mgr.Create_Region(tn,region);
00539 }
00540 }
00541
00543 static void
00544 Scan_Region_BB_For_Referenced_TNs( GRA_BB* gbb )
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00557 {
00558 INT i;
00559 GRA_BB_OP_FORWARD_ITER iter;
00560 GRA_REGION *region = gbb->Region();
00561
00562 lrange_mgr.Clear_One_Set();
00563
00564 if (BB_rotating_kernel(gbb->Bb())) {
00565 TN *ded_tns[ISA_REGISTER_CLASS_MAX + 1][REGISTER_MAX + 1];
00566 ISA_REGISTER_CLASS rc;
00567 FOR_ALL_ISA_REGISTER_CLASS(rc) {
00568 for (REGISTER r = 0; r <= REGISTER_MAX; r++)
00569 ded_tns[rc][r] = NULL;
00570 }
00571 BB *bb = gbb->Bb();
00572 ANNOTATION *annot = ANNOT_Get(BB_annotations(bb), ANNOT_ROTATING_KERNEL);
00573 ROTATING_KERNEL_INFO *info = ANNOT_rotating_kernel(annot);
00574
00575 INT i;
00576 for (i = 0; i < ROTATING_KERNEL_INFO_copyin(info).size(); i++) {
00577 TN *tn = ROTATING_KERNEL_INFO_copyin(info)[i];
00578 ded_tns[TN_register_class(tn)][TN_register(tn)] = tn;
00579 Region_TN_Reference(tn,region);
00580 }
00581 for (i = 0; i < ROTATING_KERNEL_INFO_copyout(info).size(); i++) {
00582 TN *tn = ROTATING_KERNEL_INFO_copyout(info)[i];
00583 ded_tns[TN_register_class(tn)][TN_register(tn)] = tn;
00584 Region_TN_Reference(tn,region);
00585 }
00586 #ifdef TARG_IA64
00587 for (i = 0; i < ROTATING_KERNEL_INFO_localdef(info).size(); i++) {
00588 TN *tn = ROTATING_KERNEL_INFO_localdef(info)[i];
00589 ded_tns[TN_register_class(tn)][TN_register(tn)] = tn;
00590 Region_TN_Reference(tn,region);
00591 }
00592 #endif
00593
00594 OP *op;
00595 FOR_ALL_BB_OPs(bb, op) {
00596 for (INT j = 0; j < OP_opnds(op); j++) {
00597 TN *tn = OP_opnd(op, j);
00598 if (TN_is_register(tn) &&
00599 !TN_is_dedicated(tn) &&
00600 REGISTER_Is_Rotating(TN_register_class(tn), TN_register(tn))) {
00601 ded_tns[TN_register_class(tn)][TN_register(tn)] = tn;
00602 Region_TN_Reference(tn,region);
00603 }
00604 }
00605 for (INT k = 0; k < OP_results(op); k++) {
00606 TN *tn = OP_result(op, k);
00607 if (TN_is_register(tn) &&
00608 !TN_is_dedicated(tn) &&
00609 REGISTER_Is_Rotating(TN_register_class(tn), TN_register(tn))) {
00610 ded_tns[TN_register_class(tn)][TN_register(tn)] = tn;
00611 Region_TN_Reference(tn,region);
00612 }
00613 }
00614 }
00615
00616 FOR_ALL_ISA_REGISTER_CLASS(rc) {
00617 #ifdef HAS_ROTATING_REGISTERS
00618 if (REGISTER_Has_Rotating_Registers(rc)) {
00619 INT size = REGISTER_bit_size(rc, REGISTER_First_Rotating_Registers(rc)) / 8;
00620 REGISTER last_reg = REGISTER_Last_Rotating_Registers(rc);
00621 if (rc == ISA_REGISTER_CLASS_integer) {
00622 last_reg = REGISTER_First_Rotating_Registers(rc) +
00623 REGISTER_Number_Stacked_Rotating(rc) - 1;
00624 }
00625 for (REGISTER r = REGISTER_First_Rotating_Registers(rc);
00626 r <= last_reg;
00627 r++) {
00628 TN *tn = ded_tns[rc][r];
00629 if (tn == NULL) {
00630 tn = Gen_Register_TN(rc, size);
00631 Set_TN_register(tn, r);
00632 }
00633 Region_TN_Reference(tn,region);
00634 }
00635 }
00636 #endif
00637
00638 }
00639 } else {
00640 for (iter.Init(gbb); ! iter.Done(); iter.Step()) {
00641 OP* op = iter.Current();
00642
00643 for ( i = OP_results(op) - 1; i >= 0; --i ) {
00644 Region_TN_Reference(OP_result(op,i),region);
00645 }
00646
00647 for ( i = OP_opnds(op) - 1; i >= 0; --i ) {
00648 if ( TN_Is_Allocatable(OP_opnd(op,i)) )
00649 Region_TN_Reference(OP_opnd(op,i),region);
00650 }
00651 }
00652 }
00653 }
00654
00655 #ifdef TARG_IA64
00657 static void
00658 Create_Global_Dedicated_TN_LRANGEs(void)
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00684 {
00685
00686 MEM_POOL_Popper mp(&MEM_local_nz_pool);
00687
00688 GTN_SET* ded_gtns = GTN_SET_Create_Empty (Last_Dedicated_TN, mp.Pool());
00689
00690
00691 for (TN_NUM i = Last_Dedicated_TN; i > 0; i--) {
00692 TN* tn = TNvec(i);
00693
00694 if (!TN_is_global_reg(tn)) continue;
00695
00696
00697
00698 REGISTER_SET alloc = REGISTER_CLASS_allocatable(TN_register_class (tn));
00699 if (!REGISTER_SET_MemberP(alloc, TN_register(tn))) continue;
00700
00701 ded_gtns = GTN_SET_Union1D (ded_gtns, tn, mp.Pool());
00702 }
00703
00704 for (BB* bb = REGION_First_BB; bb != NULL; bb = BB_next(bb)) {
00705 GRA_BB* gbb = NULL;
00706 GTN_SET* live_use = BB_live_use(bb);
00707 GTN_SET* def_reach_in = BB_defreach_in(bb);
00708
00709 for (TN* tn = GTN_SET_Intersection_Choose(ded_gtns, BB_live_in(bb));
00710 tn != GTN_SET_CHOOSE_FAILURE;
00711 tn = GTN_SET_Intersection_Choose_Next(ded_gtns, BB_live_in(bb), tn)) {
00712 if (GTN_SET_MemberP (def_reach_in, tn) &&
00713 !GTN_SET_MemberP (live_use, tn)) {
00714
00715
00716 gbb = gbb ? gbb : gbb_mgr.Get(bb);
00717 gbb->Make_Register_Used(TN_register_class(tn), TN_register(tn));
00718 }
00719 }
00720 }
00721 }
00722 #endif
00723
00725 static void
00726 Create_LRANGEs(void)
00728
00729
00730
00732 {
00733 GRA_REGION_PREV_ALLOC_ITER region_iter;
00734 GRA_REGION_GBB_ITER gbb_iter;
00735 GTN_UNIVERSE_ITER gtn_iter;
00736 ISA_REGISTER_CLASS rc;
00737
00738 GRA_Init_Trace_Memory();
00739
00740
00741
00742
00743
00744 for (region_iter.Init(); ! region_iter.Done(); region_iter.Step()) {
00745 GRA_REGION* region = region_iter.Current();
00746
00747 for (gbb_iter.Init(region); !gbb_iter.Done(); gbb_iter.Step()) {
00748 GRA_BB* gbb = gbb_iter.Current();
00749
00750
00751
00752
00753 Scan_Region_BB_For_Referenced_TNs(gbb);
00754
00755
00756
00757
00758
00759 if (GRA_loop_splitting) {
00760 gbb->Check_Loop_Border();
00761 }
00762 }
00763 }
00764
00765
00766
00767 for (gbb_iter.Init(gra_region_mgr.Complement_Region()); ! gbb_iter.Done();
00768 gbb_iter.Step()) {
00769 GRA_BB* gbb = gbb_iter.Current();
00770
00771
00772 if (GRA_loop_splitting) {
00773 gbb->Check_Loop_Border();
00774 }
00775
00776 FOR_ALL_ISA_REGISTER_CLASS( rc ) {
00777 if ( gbb->Register_Girth(rc) > 0 )
00778 gbb->Create_Local_LRANGEs(rc,gbb->Register_Girth(rc));
00779 }
00780 }
00781
00782
00783
00784 for ( GTN_UNIVERSE_ITER_Init(>n_iter);
00785 ! GTN_UNIVERSE_ITER_Done(>n_iter);
00786 GTN_UNIVERSE_ITER_Step(>n_iter)
00787 ) {
00788 TN* tn = GTN_UNIVERSE_ITER_Current(>n_iter);
00789
00790 if ( TN_Is_Allocatable(tn) && ! lrange_mgr.Get(tn) && TN_is_global_reg(tn))
00791 lrange_mgr.Create_Complement(tn);
00792 }
00793 #ifdef TARG_IA64
00794 Create_Global_Dedicated_TN_LRANGEs();
00795 #endif
00796 GRA_Trace_Memory("After Create_LRANGEs()");
00797 }
00798
00800 static void
00801 Set_Call_Flag(LRANGE* lrange, BB* bb)
00803
00804
00805
00806
00807
00808
00809
00810
00812 {
00813 if (!lrange->Spans_A_Call()) {
00814
00815
00816
00817
00818 if ((BB_freq(bb) > GRA_call_split_freq) || !GRA_choose_best_split) {
00819 lrange->Spans_A_Call_Set();
00820 lrange->Spans_Infreq_Call_Reset();
00821 } else {
00822 lrange->Spans_Infreq_Call_Set();
00823 }
00824 }
00825 }
00826
00828 static void
00829 Create_Live_BB_Sets(void)
00831
00832
00833
00835 {
00836 BB *bb;
00837 TN *tn;
00838
00839 GRA_Init_Trace_Memory();
00840
00841 #ifdef KEY
00842 GTN_SET *incoming_GTNs;
00843 GTN_SET *outgoing_GTNs;
00844 if (GRA_optimize_boundary) {
00845
00846 incoming_GTNs = GTN_SET_Create(GTN_UNIVERSE_size, &MEM_local_pool);
00847
00848 outgoing_GTNs = GTN_SET_Create(GTN_UNIVERSE_size, &MEM_local_pool);
00849 }
00850 #endif
00851
00852 for ( bb = REGION_First_BB; bb != NULL; bb = BB_next(bb) ) {
00853 GRA_BB* gbb = gbb_mgr.Get(bb);
00854
00855 #ifdef KEY
00856 if (GRA_optimize_boundary) {
00857
00858
00859
00860
00861 BS_IntersectionR(incoming_GTNs, BB_live_in(bb), BB_defreach_in(bb));
00862 BS_IntersectionR(outgoing_GTNs, BB_live_out(bb), BB_defreach_out(bb));
00863 }
00864 #endif
00865
00866 for ( tn = GTN_SET_Intersection_Choose(BB_live_in(bb),
00867 BB_defreach_in(bb));
00868 tn != GTN_SET_CHOOSE_FAILURE;
00869 tn = GTN_SET_Intersection_Choose_Next(BB_live_in(bb),
00870 BB_defreach_in(bb),
00871 tn)
00872 ) {
00873 if ( TN_Is_Allocatable(tn) ) {
00874 lrange_mgr.Get(tn)->Add_Live_BB(gbb);
00875 #ifdef KEY
00876 if (GRA_optimize_boundary) {
00877
00878
00879
00880
00881 if (GTN_SET_MemberP(outgoing_GTNs, tn))
00882 lrange_mgr.Get(tn)->Add_Internal_BB(gbb);
00883 else
00884 lrange_mgr.Get(tn)->Add_Boundary_BB(gbb);
00885 }
00886 #endif
00887 }
00888 }
00889
00890 for ( tn = GTN_SET_Intersection_Choose(BB_live_out(bb),
00891 BB_defreach_out(bb));
00892 tn != GTN_SET_CHOOSE_FAILURE;
00893 tn = GTN_SET_Intersection_Choose_Next(BB_live_out(bb),
00894 BB_defreach_out(bb),
00895 tn)
00896 ) {
00897 if ( TN_Is_Allocatable(tn) ) {
00898 LRANGE* lrange = lrange_mgr.Get(tn);
00899
00900 lrange->Add_Live_BB(gbb);
00901
00902 #ifdef KEY
00903 if (GRA_optimize_boundary) {
00904
00905
00906
00907 if (GTN_SET_MemberP(incoming_GTNs, tn))
00908 lrange->Add_Internal_BB(gbb);
00909 else
00910 lrange->Add_Boundary_BB(gbb);
00911 }
00912 #endif
00913
00914 if ( BB_call(gbb->Bb()) ) {
00915 if ( lrange->Type() == LRANGE_TYPE_COMPLEMENT
00916 && gbb->Region() == gra_region_mgr.Complement_Region()
00917 ) {
00918 Set_Call_Flag(lrange, gbb->Bb());
00919 }
00920 else if ( lrange->Type() == LRANGE_TYPE_REGION
00921 && lrange->Region() == gbb->Region()
00922 ) {
00923 Set_Call_Flag(lrange, gbb->Bb());
00924 }
00925
00926 if (gbb->Setjmp())
00927 lrange->Spans_A_Setjmp_Set();
00928 }
00929
00930 if (BB_mod_rotating_registers(gbb->Bb()))
00931 lrange->Spans_Rot_Reg_Clob_Set();
00932 else if (BB_mod_pred_rotating_registers(gbb->Bb()) &&
00933 Is_Predicate_REGISTER_CLASS(lrange->Rc()))
00934 lrange->Spans_Rot_Reg_Clob_Set();
00935
00936 #ifdef TARG_X8664
00937 if (gbb->Savexmms() && lrange->Rc() == ISA_REGISTER_CLASS_float)
00938 lrange->Spans_Savexmms_Set();
00939 if (gbb->x87_OP())
00940 lrange->Spans_x87_OP_Set();
00941 if (gbb->mmx_OP())
00942 lrange->Spans_mmx_OP_Set();
00943 #endif
00944 }
00945 }
00946 }
00947 GRA_Trace_Memory("After Create_Live_BB_Sets()");
00948 }
00949
00950
00951
00952
00953
00954
00955 LRANGE** wired_lranges[ISA_REGISTER_CLASS_MAX + 1];
00956
00958 static void
00959 Initialize_Wired_LRANGEs(void)
00961
00962
00963
00965 {
00966 ISA_REGISTER_CLASS rc;
00967
00968 FOR_ALL_ISA_REGISTER_CLASS( rc ) {
00969 LRANGE** vec =
00970 TYPE_MEM_POOL_ALLOC_N(LRANGE*,&MEM_local_nz_pool, REGISTER_MAX + 1);
00971 bzero(vec,(REGISTER_MAX + 1) * sizeof(LRANGE*));
00972 wired_lranges[rc] = vec;
00973 }
00974 }
00975
00976 #ifdef HAS_STACKED_REGISTERS
00977 #define REGISTER_IS_ALLOCATABLE(rc,reg) \
00978 (REGISTER_allocatable(rc, reg) \
00979 || (REGISTER_Is_Stacked(rc, reg) \
00980 && REGISTER_Is_Allocatable_Stacked_Register(rc,reg)))
00981 #else
00982 #define REGISTER_IS_ALLOCATABLE(rc,reg) REGISTER_allocatable(rc, reg)
00983 #endif
00984
00986 static void
00987 Wired_TN_Reference( GRA_BB* gbb, ISA_REGISTER_CLASS rc, REGISTER reg ,
00988 LRANGE_LIST **wired_locals)
00990
00991
00992
00993
00995 {
00996 if ( REGISTER_IS_ALLOCATABLE(rc, reg) ) {
00997 LRANGE* lrange = wired_lranges[rc][reg];
00998
00999 if ( lrange == NULL || lrange->Gbb() != gbb ) {
01000 wired_lranges[rc][reg] = gbb->Create_Wired_LRANGE(rc,reg);
01001 wired_locals[rc] = LRANGE_LIST_Push(wired_lranges[rc][reg],
01002 wired_locals[rc],
01003 &MEM_local_nz_pool);
01004 }
01005 }
01006
01007 }
01008
01010 static BOOL
01011 Get_Possibly_Wired_Reference( TN* tn, LRANGE** lrange )
01013
01014
01015
01016
01017
01018
01020 {
01021 if ( TN_is_dedicated(tn) ) {
01022 REGISTER reg = TN_register(tn);
01023 ISA_REGISTER_CLASS rc = TN_register_class(tn);
01024
01025 if ( ! REGISTER_IS_ALLOCATABLE(rc, reg))
01026 return FALSE;
01027
01028 *lrange = wired_lranges[TN_register_class(tn)][TN_register(tn)];
01029 return TRUE;
01030 }
01031 else if ( ! TN_Is_Allocatable(tn) )
01032 return FALSE;
01033 else {
01034 *lrange = lrange_mgr.Get(tn);
01035 return *lrange != NULL;
01036 }
01037 }
01038
01040 static BOOL
01041 Complement_TN_Reference( OP* op, TN* tn, GRA_BB* gbb, LUNIT** lunitp,
01042 LRANGE_LIST **wired_locals )
01044
01045
01046
01047
01048
01049
01050
01051
01053 {
01054 if ( TN_is_dedicated(tn) ) {
01055 Wired_TN_Reference(gbb,TN_register_class(tn),TN_register(tn),wired_locals);
01056 return FALSE;
01057 }
01058 else if ( ! TN_Is_Allocatable(tn) )
01059 return FALSE;
01060 else if ( TN_is_global_reg(tn) ) {
01061 LRANGE* lrange = lrange_mgr.Get(tn);
01062
01063 if (!(GTN_SET_Intersection_MemberP(BB_live_in(gbb->Bb()),
01064 BB_defreach_in(gbb->Bb()), tn)
01065 || GTN_SET_Intersection_MemberP(BB_live_out(gbb->Bb()),
01066 BB_defreach_out(gbb->Bb()), tn))) {
01067
01068
01069
01070
01071
01072
01073 if (!OP_dummy(op) && !HB_formation) {
01074 DevWarn("GRA given Local reference to global TN%d[PREG%d] in BB%d. "
01075 "Will rename.", TN_number(tn), TN_To_PREG(tn),BB_id(gbb->Bb()));
01076 }
01077 gbb_needs_rename = TRUE;
01078 return FALSE;
01079 }
01080 else if ( lrange->Type() != LRANGE_TYPE_COMPLEMENT )
01081 return FALSE;
01082 else if ( lrange_mgr.One_Set_MemberP(lrange) )
01083 (void) lrange->Find_LUNIT_For_GBB(gbb,lunitp);
01084 else {
01085 *lunitp = LUNIT_Create(lrange,gbb);
01086 (*lunitp)->True_Reference_Set();
01087 lrange_mgr.One_Set_Union1(lrange);
01088 }
01089 return TRUE;
01090 }
01091
01092 return FALSE;
01093 }
01094
01096 static void
01097 Complement_Copy( OP* op, GRA_BB *gbb, std::list<GRA_PREF_CAND*>& pref_list )
01099
01100
01101
01102
01103
01105 {
01106 TN* result = OP_result(op,0);
01107 TN* opnd = CGTARG_Copy_Operand_TN(op);
01108 LRANGE* result_lr = NULL;
01109 LRANGE* opnd_lr = NULL;
01110
01111 if (!GRA_preference_all) {
01112 return;
01113 }
01114
01115
01116 if (TN_number(result) == GRA_non_preference_tn_id) return;
01117
01118 BOOL res_found = Get_Possibly_Wired_Reference(result,&result_lr);
01119 BOOL op_found = Get_Possibly_Wired_Reference(opnd,&opnd_lr);
01120 if ( res_found && op_found && result_lr->Type() != opnd_lr->Type()
01121 ) {
01122 if ((result_lr->Type() == LRANGE_TYPE_REGION ||
01123 opnd_lr->Type() == LRANGE_TYPE_REGION) &&
01124 GRA_preference_glue) {
01125
01126
01127
01128
01129 result_lr->Preference_Copy(opnd_lr,gbb);
01130
01131 } else if (GRA_preference_dedicated &&
01132 (TN_is_dedicated(result) || TN_is_dedicated(opnd))) {
01133 GRA_PREF_CAND* cand = gra_pref_mgr.CAND_Create(result, opnd,
01134 &MEM_local_nz_pool);
01135 pref_list.push_front(cand);
01136 GRA_Trace_Possible_Preference_Copy(result_lr, opnd_lr, gbb);
01137 }
01138 } else {
01139
01140
01141
01142
01143
01144 if (result_lr != NULL && result_lr->Type() == LRANGE_TYPE_REGION) {
01145 lrange_mgr.Add_GBB_With_Glue_Reference(result_lr,gbb);
01146 } else if (opnd_lr != NULL &&
01147 opnd_lr->Type() == LRANGE_TYPE_REGION) {
01148 lrange_mgr.Add_GBB_With_Glue_Reference(opnd_lr,gbb);
01149 } else if (GRA_preference_globals &&
01150 result_lr != NULL &&
01151 result_lr->Type() == LRANGE_TYPE_COMPLEMENT &&
01152 opnd_lr != NULL &&
01153 opnd_lr->Type() == LRANGE_TYPE_COMPLEMENT) {
01154
01155
01156
01157 LUNIT *op_lunit;
01158 LUNIT *result_lunit;
01159 if (opnd_lr->Find_LUNIT_For_GBB(gbb, &op_lunit) &&
01160 result_lr->Find_LUNIT_For_GBB(gbb, &result_lunit)) {
01161 GRA_PREF_CAND* cand = gra_pref_mgr.CAND_Create(result, opnd,
01162 &MEM_local_nz_pool);
01163 pref_list.push_front(cand);
01164 GRA_Trace_Possible_Preference_Copy(result_lr, opnd_lr, gbb);
01165 }
01166 }
01167 }
01168 }
01169
01171 static void
01172 Avoid_RA_In_Call_Argument( OP* op )
01174
01175
01176
01177
01179 {
01180 INT i;
01181
01182 if( RA_TN == NULL )
01183 return;
01184
01185 for ( i = OP_opnds(op) - 1; i >= 0; --i ) {
01186 LRANGE *lrange = lrange_mgr.Get(OP_opnd(op,i));
01187
01188 if ( lrange != NULL
01189 && lrange->Type() == LRANGE_TYPE_COMPLEMENT
01190 && lrange->Rc() == TN_register_class(RA_TN)
01191 ) {
01192 lrange->Avoid_RA_Set();
01193 }
01194 }
01195 }
01196
01198
01199 static BOOL
01200 Region_TN( TN* tn, GRA_BB* gbb )
01202
01203
01204
01205
01207 {
01208 LRANGE* lrange = lrange_mgr.Get(tn);
01209
01210 return lrange != NULL && lrange->Type() == LRANGE_TYPE_REGION;
01211 }
01212
01214 static BOOL
01215 Region_LRANGEs_Referenced( OP* op, GRA_BB* gbb, TN** region_tn )
01217
01218
01219
01220
01222 {
01223 INT32 i;
01224
01225 for ( i = OP_opnds(op) - 1; i >= 0; --i ) {
01226 if ( Region_TN(OP_opnd(op,i),gbb) ) {
01227 *region_tn = OP_opnd(op,i);
01228 return TRUE;
01229 }
01230 }
01231
01232 for ( i = OP_results(op) - 1; i >= 0; --i ) {
01233 if ( Region_TN(OP_result(op,i),gbb) ) {
01234 *region_tn = OP_result(op,i);
01235 return TRUE;
01236 }
01237 }
01238
01239 return FALSE;
01240 }
01241
01243 static BOOL
01244 Needs_Rename( TN* tn, GRA_BB* gbb, TN_MAP map, TN** local_rename )
01246
01247
01248
01249
01250
01251
01253 {
01254 if ( ! TN_Is_Allocatable(tn) )
01255 return FALSE;
01256 else if ( ! TN_is_global_reg(tn) )
01257 return FALSE;
01258 else if (GTN_SET_Intersection_MemberP(BB_live_in(gbb->Bb()),
01259 BB_defreach_in(gbb->Bb()), tn)
01260 ) {
01261 return FALSE;
01262 }
01263 else if (GTN_SET_Intersection_MemberP(BB_live_out(gbb->Bb()),
01264 BB_defreach_out(gbb->Bb()), tn))
01265 return FALSE;
01266 else {
01267 if ( TN_MAP_Get(map,tn) != NULL ) {
01268 *local_rename = (TN*) TN_MAP_Get(map,tn);
01269 return TRUE;
01270 }
01271 else {
01272 *local_rename = Dup_TN(tn);
01273 TN_MAP_Set(map,tn,(void*) *local_rename);
01274 return TRUE;
01275 }
01276 }
01277 }
01278
01280 static void
01281 Local_Rename( GRA_BB* gbb )
01283
01284
01285
01286
01288 {
01289 INT i;
01290 GRA_BB_OP_FORWARD_ITER iter;
01291 TN_MAP map = TN_MAP_Create();
01292
01293 for (iter.Init(gbb); ! iter.Done(); iter.Step()) {
01294 OP* xop = iter.Current();
01295 TN* local_rename;
01296
01297 for ( i = OP_results(xop) - 1; i >= 0; --i ) {
01298 if ( Needs_Rename(OP_result(xop,i),gbb,map,&local_rename) )
01299 Set_OP_result(xop, i, local_rename);
01300 }
01301
01302 for ( i = OP_opnds(xop) - 1; i >= 0; --i ) {
01303 if ( Needs_Rename(OP_opnd(xop,i),gbb,map,&local_rename) )
01304 Set_OP_opnd(xop, i, local_rename);
01305 }
01306 }
01307
01308 TN_MAP_Delete(map);
01309 }
01311 static void
01312 List_Preferenced_Wired_Locals( GRA_BB *gbb, LRANGE_LIST **wired_locals )
01314
01315
01316
01317
01318
01319
01320
01321
01322
01323
01325 {
01326 LRANGE_LIST *l, *tmp;
01327 LRANGE *lrange;
01328 ISA_REGISTER_CLASS rc;
01329
01330 FOR_ALL_ISA_REGISTER_CLASS( rc ) {
01331 for ( l = wired_locals[rc]; l != NULL; l = LRANGE_LIST_rest(l) ) {
01332 lrange = LRANGE_LIST_first(l);
01333 if (!lrange->Has_Preference()) {
01334 tmp = gbb->Unpreferenced_Wired_LRANGEs(rc);
01335 tmp = LRANGE_LIST_Push(lrange, tmp, GRA_pool);
01336 gbb->Unpreferenced_Wired_LRANGEs_Set(rc, tmp);
01337 } else {
01338 gbb->Incr_Local_Lrange_Count(rc);
01339 gbb->Local_Lranges_Set(rc,
01340 gbb->Local_Lranges(rc)->BB_Local_List_Push(lrange));
01341 }
01342 }
01343 }
01344 }
01345
01347 static BOOL
01348 OP_Refs_Home(OP* op, TN* home_tn)
01350
01351
01352
01353
01355 {
01356 WN* wn = Get_WN_From_Memory_OP(op);
01357 if (wn != NULL) {
01358 if (Aliased(Alias_Manager, TN_home(home_tn), wn) == SAME_LOCATION) {
01359 return TRUE;
01360 }
01361 }
01362 return FALSE;
01363 }
01364
01366 static BOOL
01367 Store_To_Home(OP* op, TN* op_tn)
01369
01370
01371
01372
01374 {
01375 if (TN_is_gra_homeable(op_tn) && OP_store(op) &&
01376 op_tn == OP_opnd(op,TOP_Find_Operand_Use(OP_code(op), OU_storeval)) &&
01377 OP_Refs_Home(op, op_tn)) {
01378 return TRUE;
01379 }
01380 return FALSE;
01381 }
01382
01384 static BOOL
01385 Load_From_Home(OP* op, TN* op_tn)
01387
01388
01389
01390
01392 {
01393 if (TN_is_gra_homeable(op_tn) && OP_load(op) && op_tn == OP_result(op, 0) &&
01394 OP_Refs_Home(op, op_tn)) {
01395 return TRUE;
01396 }
01397 return FALSE;
01398 }
01399
01400 #ifdef TARG_IA64
01401 extern INIT_USE_ONLY_GTN *GTN_USE_ONLY;
01402 extern void Build_GTN_In_List (TN *tn,BB *bb);
01403 #endif
01404
01406 static void
01407 Scan_Complement_BB_For_Referenced_TNs( GRA_BB* gbb )
01409
01410
01411
01412
01414 {
01415 INT i, op_count;
01416 GRA_BB_OP_FORWARD_ITER iter;
01417 LUNIT* lunit;
01418 LRANGE_LIST *wired_locals[ISA_REGISTER_CLASS_MAX+1];
01419 hTN_MAP live_data;
01420 std::list<GRA_PREF_CAND*> pref_list;
01421 bzero(&wired_locals, (ISA_REGISTER_CLASS_MAX+1) * sizeof(LRANGE_LIST*));
01422
01423 MEM_POOL_Push(&MEM_local_nz_pool);
01424 live_data = hTN_MAP_Create(&MEM_local_nz_pool);
01425 gbb_needs_rename = FALSE;
01426
01427 lrange_mgr.Clear_One_Set();
01428 Initialize_Wired_LRANGEs();
01429 #ifdef TARG_IA64
01430 OP_OF_ONLY_DEF Op_Of_Only_Def(&MEM_local_nz_pool);
01431 Op_Of_Only_Def.Set_OPS_OF_ONLY_DEF(gbb);
01432 #endif
01433
01434 for (iter.Init(gbb), op_count=1; ! iter.Done(); iter.Step(), op_count++ ) {
01435 OP* xop = iter.Current();
01436
01437 for ( i = OP_opnds(xop) - 1; i >= 0; --i ) {
01438 TN *op_tn = OP_opnd(xop, i);
01439 if (! TN_is_register(op_tn))
01440 continue;
01441 GRA_PREF_LIVE* gpl = (GRA_PREF_LIVE*) hTN_MAP_Get(live_data, op_tn);
01442 if (!gpl) {
01443 gpl = gra_pref_mgr.LIVE_Create(&MEM_local_nz_pool);
01444 hTN_MAP_Set(live_data, op_tn, gpl);
01445 }
01446 if (Complement_TN_Reference(xop, op_tn, gbb, &lunit, wired_locals)) {
01447 #ifdef TARG_IA64
01448 lunit->Has_Use_Set();
01449 #endif
01450 if (!lunit->Has_Def()) {
01451 lunit->Has_Exposed_Use_Set();
01452 gpl->Exposed_Use_Set(TRUE);
01453 }
01454 if (Store_To_Home(xop, op_tn)) {
01455 lunit->Syncs_With_Home_Set();
01456 }
01457 } else if (!gpl->Num_Defs()) {
01458 gpl->Exposed_Use_Set(TRUE);
01459 }
01460 #ifdef TARG_IA64
01461 Build_GTN_In_List(op_tn,gbb->Bb());
01462 #endif
01463 }
01464
01465 for ( i = OP_results(xop) - 1; i >= 0; --i ) {
01466 TN* res_tn = OP_result(xop,i);
01467 if (! TN_is_register(res_tn))
01468 continue;
01469 GRA_PREF_LIVE* gpl = (GRA_PREF_LIVE*) hTN_MAP_Get(live_data, res_tn);
01470 if (!gpl) {
01471 gpl = gra_pref_mgr.LIVE_Create(&MEM_local_nz_pool);
01472 hTN_MAP_Set(live_data, res_tn, gpl);
01473 }
01474
01475 #ifdef TARG_IA64
01476 if (OP_cond_def(xop) && !Op_Of_Only_Def.FIND_OP(xop)) {
01477
01478 if (Complement_TN_Reference(xop, res_tn, gbb, &lunit, wired_locals)) {
01479 lunit->Has_Use_Set();
01480 if (!lunit->Has_Def()) {
01481 lunit->Has_Exposed_Use_Set();
01482 gpl->Exposed_Use_Set(TRUE);
01483 }
01484 } else if (!gpl->Num_Defs()) {
01485 gpl->Exposed_Use_Set(TRUE);
01486 }
01487 }
01488 #else
01489 if (OP_cond_def(xop)) {
01490 if (Complement_TN_Reference(xop, res_tn, gbb, &lunit, wired_locals)) {
01491 if (!lunit->Has_Def()) {
01492 lunit->Has_Exposed_Use_Set();
01493 gpl->Exposed_Use_Set(TRUE);
01494 }
01495 } else if (!gpl->Num_Defs()) {
01496 gpl->Exposed_Use_Set(TRUE);
01497 }
01498 }
01499 #endif // TARG_IA64
01500
01501 gpl->Num_Defs_Set(gpl->Num_Defs() + 1);
01502 gpl->Last_Def_Set(op_count);
01503
01504 if ( Complement_TN_Reference(xop, res_tn,gbb,&lunit, wired_locals)) {
01505 if (lunit) {
01506
01507
01508
01509
01510 lunit->Has_Def_Set();
01511 if (Load_From_Home(xop, res_tn) && !OP_cond_def(xop)) {
01512 lunit->Def_From_Home_Set();
01513 } else {
01514 lunit->Def_From_Home_Reset();
01515 lunit->Syncs_With_Home_Reset();
01516 }
01517 }
01518 }
01519 }
01520
01521 #ifdef KEY
01522
01523
01524 if (OP_code(xop) == TOP_asm) {
01525 ASM_OP_ANNOT *asm_info = (ASM_OP_ANNOT *) OP_MAP_Get(OP_Asm_Map, xop);
01526 if (asm_info) {
01527 ISA_REGISTER_CLASS cl;
01528 FOR_ALL_ISA_REGISTER_CLASS(cl) {
01529 REGISTER_SET clobbered_regs = ASM_OP_clobber_set(asm_info)[cl];
01530 for (REGISTER reg = REGISTER_SET_Choose(clobbered_regs);
01531 reg != REGISTER_UNDEFINED;
01532 reg = REGISTER_SET_Choose_Next(clobbered_regs, reg)) {
01533 Wired_TN_Reference(gbb, cl, reg, wired_locals);
01534
01535 TN *tn = Build_Dedicated_TN(cl, reg, 0);
01536 GRA_PREF_LIVE* gpl = (GRA_PREF_LIVE*)hTN_MAP_Get(live_data, tn);
01537 if (!gpl) {
01538 gpl = gra_pref_mgr.LIVE_Create(&MEM_local_nz_pool);
01539 hTN_MAP_Set(live_data, tn, gpl);
01540 }
01541 gpl->Num_Defs_Set(gpl->Num_Defs() + 1);
01542 gpl->Last_Def_Set(op_count);
01543 }
01544 }
01545 }
01546 }
01547 #endif
01548
01549 if ( CGTARG_Is_Preference_Copy(xop) )
01550 Complement_Copy(xop, gbb, pref_list);
01551 else if ( ! OP_glue(xop) ) {
01552 TN* region_tn;
01553 DevAssert(! Region_LRANGEs_Referenced(xop,gbb,®ion_tn),
01554 ("Illegal region reference to TN%d in BB%d",
01555 TN_number(region_tn), BB_id(gbb->Bb())));
01556 }
01557
01558 if ( OP_call(xop) )
01559 Avoid_RA_In_Call_Argument(xop);
01560 }
01561
01562 if ( gbb_needs_rename )
01563 Local_Rename(gbb);
01564
01565
01566
01567
01568
01569 std::list<GRA_PREF_CAND*>::iterator gpci;
01570 for (gpci = pref_list.begin(); gpci != pref_list.end(); gpci++) {
01571 GRA_PREF_CAND* gpc = *gpci;
01572 TN* tn_dest = gpc->Dest();
01573 TN* tn_src = gpc->Source();
01574 LRANGE *lr_dest;
01575 LRANGE *lr_src;
01576 LUNIT* lunit = NULL;
01577 BOOL comp_pref;
01578
01579 (void) Get_Possibly_Wired_Reference(tn_dest, &lr_dest);
01580 (void) Get_Possibly_Wired_Reference(tn_src, &lr_src);
01581
01582 if (!TN_is_dedicated(tn_dest) && !TN_is_dedicated(tn_src)) {
01583 (void) lr_dest->Find_LUNIT_For_GBB(gbb, &lunit);
01584 comp_pref = TRUE;
01585 } else {
01586 comp_pref = FALSE;
01587 }
01588
01589 GRA_PREF_LIVE* gpl_dest = (GRA_PREF_LIVE*) hTN_MAP_Get(live_data, tn_dest);
01590 GRA_PREF_LIVE* gpl_src = (GRA_PREF_LIVE*) hTN_MAP_Get(live_data, tn_src);
01591
01592 #ifdef KEY
01593
01594
01595 BOOL allow_copy = TRUE;
01596
01597
01598 if (TN_register(tn_src) != REGISTER_UNDEFINED) {
01599 TN *tn_dedicated_src = Build_Dedicated_TN(TN_register_class(tn_src),
01600 TN_register(tn_src), 0);
01601 GRA_PREF_LIVE* gpl_dedicated_src =
01602 (GRA_PREF_LIVE*) hTN_MAP_Get(live_data, tn_dedicated_src);
01603 if (gpl_dedicated_src &&
01604 gpl_dedicated_src->Last_Def() > gpl_dest->Last_Def())
01605 allow_copy = FALSE;
01606 }
01607
01608
01609
01610 if (TN_register(tn_dest) != REGISTER_UNDEFINED) {
01611 TN *tn_dedicated_dest = Build_Dedicated_TN(TN_register_class(tn_dest),
01612 TN_register(tn_dest), 0);
01613 GRA_PREF_LIVE* gpl_dedicated_dest =
01614 (GRA_PREF_LIVE*) hTN_MAP_Get(live_data, tn_dedicated_dest);
01615 if (gpl_dedicated_dest &&
01616 (gpl_dedicated_dest->Exposed_Use() ||
01617 gpl_dedicated_dest->Num_Defs() > 1))
01618 allow_copy = FALSE;
01619 }
01620 #endif
01621
01622
01623
01624
01625
01626
01627
01628 if (gpl_src->Last_Def() < gpl_dest->Last_Def() &&
01629 !gpl_dest->Exposed_Use() && gpl_dest->Num_Defs() == 1
01630 #ifdef KEY
01631 && allow_copy
01632 #endif
01633 ) {
01634
01635
01636
01637
01638 if (comp_pref) {
01639 TN *source_tn = lr_src->Tn();
01640 TN *dest_tn = lr_dest->Tn();
01641 lr_src->Add_Global_Pref(tn_dest);
01642 lr_dest->Add_Global_Pref(tn_src);
01643 lunit->Global_Pref_Set(lr_src);
01644 } else {
01645
01646
01647
01648 lr_dest->Preference_Copy(lr_src, gbb);
01649 }
01650 } else {
01651 GRA_Trace_Preference_Conflict(lr_dest, lr_src, gbb);
01652 }
01653 }
01654
01655 List_Preferenced_Wired_Locals(gbb, wired_locals);
01656
01657 MEM_POOL_Pop(&MEM_local_nz_pool);
01658 }
01659
01661 static void
01662 Create_LUNITs(void)
01664
01665
01666
01668 {
01669 GRA_REGION_GBB_ITER gbb_iter;
01670 GRA_Init_Trace_Memory();
01671
01672 MEM_POOL_Push(&MEM_local_nz_pool);
01673 Initialize_Wired_LRANGEs();
01674
01675 for (gbb_iter.Init(gra_region_mgr.Complement_Region()); ! gbb_iter.Done();
01676 gbb_iter.Step() ) {
01677 GRA_BB* gbb = gbb_iter.Current();
01678 Scan_Complement_BB_For_Referenced_TNs(gbb);
01679 }
01680 MEM_POOL_Pop(&MEM_local_nz_pool);
01681 GRA_Trace_Memory("After Create_LUNITs()");
01682 }
01683
01685 static BOOL
01686 Check_Global_Preference(LRANGE* lrange1, LRANGE* lrange2)
01688
01689
01690
01691
01692
01693
01694
01695
01697 {
01698 LRANGE_LUNIT_ITER iter;
01699
01700
01701
01702
01703 if (!lrange1->Check_Global_Pref(lrange2->Tn())) {
01704 return FALSE;
01705 }
01706
01707
01708
01709
01710
01711 for (iter.Init(lrange1); ! iter.Done(); iter.Step()) {
01712 LUNIT *lunit = iter.Current();
01713
01714 if (lunit->Has_Def() && lunit->Global_Pref() != lrange2 &&
01715 lrange2->Contains_BB(lunit->Gbb())) {
01716 LUNIT *lunit2;
01717 if (!lrange2->Find_LUNIT_For_GBB(lunit->Gbb(), &lunit2) ||
01718 lunit2->Global_Pref() != lrange1) {
01719 GRA_Trace_Global_Preference_Failure(lrange1,lrange2,lunit->Gbb());
01720 lrange1->Remove_Global_Pref(lrange2->Tn());
01721 lrange2->Remove_Global_Pref(lrange1->Tn());
01722 return FALSE;
01723 }
01724 }
01725 }
01726
01727 for (iter.Init(lrange2); ! iter.Done(); iter.Step()) {
01728 LUNIT *lunit = iter.Current();
01729
01730 if (lunit->Has_Def() && lunit->Global_Pref() != lrange1 &&
01731 lrange1->Contains_BB(lunit->Gbb())) {
01732 LUNIT *lunit1;
01733 if (!lrange1->Find_LUNIT_For_GBB(lunit->Gbb(), &lunit1) ||
01734 lunit1->Global_Pref() != lrange2) {
01735 GRA_Trace_Global_Preference_Failure(lrange1,lrange2,lunit->Gbb());
01736 lrange1->Remove_Global_Pref(lrange2->Tn());
01737 lrange2->Remove_Global_Pref(lrange1->Tn());
01738 return FALSE;
01739 }
01740 }
01741 }
01742
01743
01744
01745
01746
01747
01748 for (iter.Init(lrange1); ! iter.Done(); iter.Step()) {
01749 LUNIT *lunit = iter.Current();
01750 if (lunit->Global_Pref() == lrange2) {
01751 lrange1->Preference_Copy(lrange2, lunit->Gbb());
01752 }
01753 }
01754
01755 for (iter.Init(lrange2); ! iter.Done(); iter.Step()) {
01756 LUNIT *lunit = iter.Current();
01757 if (lunit->Global_Pref() == lrange1) {
01758 lrange1->Preference_Copy(lrange2, lunit->Gbb());
01759 }
01760 }
01761
01762 GRA_Trace_Global_Preference_Success(lrange1, lrange2);
01763 return TRUE;
01764 }
01765
01767 static void
01768 Build_Complement_Interference_Graph(void)
01770
01771
01772
01773
01774
01775
01776
01777
01778
01779
01780
01781
01782
01783
01784
01785
01786
01787
01788
01789
01790
01791
01792
01793
01794
01795
01796
01797
01798
01799
01800
01801
01802
01803
01804
01805
01806
01808 {
01809 ISA_REGISTER_CLASS rc;
01810 TN* tn;
01811 GTN_SET* interferences;
01812 GRA_REGION_RC_NL_LRANGE_ITER iter0;
01813 GRA_REGION_RC_NL_LRANGE_ITER iter1;
01814 GRA_REGION_GBB_ITER gbb_iter;
01815 GRA_REGION *region = gra_region_mgr.Complement_Region();
01816
01817
01818
01819
01820
01821 if (GRA_use_old_conflict) {
01822 FOR_ALL_ISA_REGISTER_CLASS( rc ) {
01823
01824 for (iter0.Init(region,rc); ! iter0.Done(); iter0.Step()) {
01825 LRANGE* lrange0 = iter0.Current();
01826
01827 lrange_mgr.Begin_Complement_Interference(lrange0);
01828
01829 for (iter1.Init(region,rc); ! iter1.Done(); iter1.Step()) {
01830 LRANGE* lrange1 = iter1.Current();
01831
01832 if ( lrange0->Interferes(lrange1) )
01833 lrange_mgr.Complement_Interference(lrange1);
01834 }
01835
01836 lrange_mgr.End_Complement_Interference();
01837 }
01838 }
01839 } else {
01840 MEM_POOL_Push(&MEM_local_nz_pool);
01841 interferences = GTN_SET_Create(GTN_UNIVERSE_size,&MEM_local_nz_pool);
01842 FOR_ALL_ISA_REGISTER_CLASS( rc ) {
01843
01844 for (iter0.Init(region,rc); ! iter0.Done(); iter0.Step()) {
01845 LRANGE* lrange0 = iter0.Current();
01846 LRANGE_LIVE_GBB_ITER live_gbb_iter;
01847
01848 GTN_SET_ClearD(interferences);
01849
01850 for (live_gbb_iter.Init(lrange0); ! live_gbb_iter.Done(); live_gbb_iter.Step()) {
01851 GRA_BB *live_gbb = live_gbb_iter.Current();
01852
01853 interferences = GTN_SET_UnionD(interferences,
01854 live_gbb->Needs_A_Register(),
01855 GRA_pool);
01856 }
01857
01858 lrange_mgr.Begin_Complement_Interference(lrange0);
01859
01860 for ( tn = GTN_SET_Choose(interferences);
01861 tn != GTN_SET_CHOOSE_FAILURE;
01862 tn = GTN_SET_Choose_Next(interferences,tn)
01863 ) {
01864 if ( TN_Is_Allocatable(tn) && TN_register_class(tn) == rc ) {
01865 LRANGE* ilrange = lrange_mgr.Get(tn);
01866 if ( ilrange->Type() == LRANGE_TYPE_COMPLEMENT ) {
01867 if (!Check_Global_Preference(lrange0, ilrange)) {
01868 lrange_mgr.Complement_Interference(ilrange);
01869 }
01870 }
01871 }
01872 }
01873
01874 lrange_mgr.End_Complement_Interference();
01875 }
01876 }
01877 MEM_POOL_Pop(&MEM_local_nz_pool);
01878 }
01879
01880
01881
01882
01883
01884 for (gbb_iter.Init(region); ! gbb_iter.Done(); gbb_iter.Step()) {
01885 GRA_BB* gbb = gbb_iter.Current();
01886
01887 gbb->Create_Global_Interferences();
01888 }
01889
01890 }
01891
01893 static void
01894 Add_To_Live_Set( LRANGE_SET** live_lrange_sets, GRA_REGION* region,
01895 LRANGE* lrange )
01897
01898
01899
01900
01901
01902
01903
01905 {
01906 LRANGE* lrange1;
01907 ISA_REGISTER_CLASS rc = lrange->Rc();
01908 LRANGE_SUBUNIVERSE* sub = region->Subuniverse(rc);
01909 LRANGE_SET* set = live_lrange_sets[rc];
01910
01911 if ( lrange->Region() != region )
01912 return;
01913
01914 for ( lrange1 = LRANGE_SET_ChooseS(set,sub);
01915 lrange1 != LRANGE_SET_CHOOSE_FAILURE;
01916 lrange1 = LRANGE_SET_Choose_NextS(set,lrange1,sub)
01917 ) {
01918 lrange->Region_Interference(lrange1,region);
01919 }
01920
01921 live_lrange_sets[rc] =
01922 LRANGE_SET_Union1DS(set,lrange,&MEM_local_nz_pool,sub);
01923 }
01924
01926 static void
01927 Remove_From_Live_Set( LRANGE_SET** live_lrange_sets, GRA_REGION* region,
01928 LRANGE* lrange )
01930
01931
01932
01933
01935 {
01936 ISA_REGISTER_CLASS rc = lrange->Rc();
01937 LRANGE_SUBUNIVERSE* sub = region->Subuniverse(rc);
01938 LRANGE_SET* set = live_lrange_sets[rc];
01939
01940 if ( lrange->Region() != region )
01941 return;
01942
01943 if ( ! LRANGE_SET_MemberPS(set,lrange,sub) ) {
01944
01945
01946
01947
01948
01949
01950
01951
01952
01953 DevWarn("GRA def without use "
01954 "in previously allocated region: TN%d",
01955 TN_number(lrange->Tn()));
01956 Add_To_Live_Set(live_lrange_sets,region,lrange);
01957 }
01958
01959 live_lrange_sets[rc] = LRANGE_SET_Difference1DS(set,lrange,sub);
01960 }
01961
01963 static void
01964 Make_Fine_Grained_Interferences( GRA_BB* gbb )
01966
01967
01968
01969
01971 {
01972 ISA_REGISTER_CLASS rc;
01973 GRA_BB_LIVE_OUT_LRANGE_ITER live_out_iter;
01974 GRA_BB_OP_BACKWARD_ITER op_iter;
01975 INT i;
01976 LRANGE_SET** live_lrange_sets;
01977 GRA_REGION* region = gbb->Region();
01978
01979 MEM_POOL_Push(&MEM_local_nz_pool);
01980
01981
01982
01983
01984 live_lrange_sets =
01985 TYPE_MEM_POOL_ALLOC_N(LRANGE_SET*,&MEM_local_nz_pool,
01986 ISA_REGISTER_CLASS_MAX + 1);
01987
01988 FOR_ALL_ISA_REGISTER_CLASS( rc ) {
01989 LRANGE_SUBUNIVERSE* sub = region->Subuniverse(rc);
01990 live_lrange_sets[rc] =
01991 LRANGE_SET_Create_Empty(sub->Count(), &MEM_local_nz_pool);
01992 }
01993
01994
01995
01996
01997 for (live_out_iter.Init(gbb); ! live_out_iter.Done(); live_out_iter.Step()) {
01998 LRANGE* lrange = live_out_iter.Current();
01999
02000 if ( lrange->Type() == LRANGE_TYPE_REGION
02001 && lrange->Region() == region
02002 ) {
02003 Add_To_Live_Set(live_lrange_sets,region,lrange);
02004 }
02005 }
02006
02007
02008
02009
02010
02011 for (op_iter.Init(gbb); ! op_iter.Done(); op_iter.Step()) {
02012 OP* op = op_iter.Current();
02013 BOOL remove_after = FALSE;
02014
02015 for ( i = OP_results(op) - 1; i >= 0; --i ) {
02016 if ( TN_Is_Allocatable(OP_result(op,i)) )
02017 if (OP_uniq_res(op)) {
02018 remove_after = TRUE;
02019 } else {
02020 Remove_From_Live_Set(live_lrange_sets,region,
02021 lrange_mgr.Get(OP_result(op,i)));
02022 }
02023 }
02024
02025 for ( i = OP_opnds(op) - 1; i >= 0; --i ) {
02026 if ( TN_Is_Allocatable(OP_opnd(op,i)) ) {
02027 Add_To_Live_Set(live_lrange_sets,region,lrange_mgr.Get(OP_opnd(op,i)));
02028 }
02029 }
02030
02031 if (remove_after) {
02032 for ( i = OP_results(op) - 1; i >= 0; --i ) {
02033 Remove_From_Live_Set(live_lrange_sets,region,
02034 lrange_mgr.Get(OP_result(op,i)));
02035 }
02036 }
02037 }
02038
02039 MEM_POOL_Pop(&MEM_local_nz_pool);
02040 }
02041
02042
02043 static GRA_REGION* targ_dependent_region;
02044
02045
02046
02048 static void
02049 Target_Dependent_Region_Interference( void* lrange1_void, void* lrange2_void )
02051
02052
02053
02055 {
02056 LRANGE* lrange1 = (LRANGE*) lrange1_void;
02057 LRANGE* lrange2 = (LRANGE*) lrange2_void;
02058
02059 DevAssert(lrange1->Type() == LRANGE_TYPE_REGION,("Not a region LRANGE"));
02060 DevAssert(lrange2->Type() == LRANGE_TYPE_REGION,("Not a region LRANGE"));
02061 DevAssert(lrange1->Region() == targ_dependent_region,("Wrong region"));
02062 DevAssert(lrange2->Region() == targ_dependent_region,("Wrong region"));
02063
02064 if ( lrange1->Rc() == lrange2->Rc() )
02065 lrange1->Region_Interference(lrange2,targ_dependent_region);
02066 }
02067
02069 static void
02070 Make_Target_Dependent_Region_Interferences( GRA_REGION* region )
02072
02073
02074
02075
02077 {
02078 GRA_REGION_GBB_ITER gbb_iter;
02079 GRA_BB_OP_FORWARD_ITER op_iter;
02080 INT32 first_bb_cycle;
02081
02082 targ_dependent_region = region;
02083
02084 CGTARG_Interference_Initialize(region->Cycle_Count(), region->Is_Loop(),
02085 Target_Dependent_Region_Interference);
02086
02087 first_bb_cycle = 0;
02088 for (gbb_iter.Init(region); ! gbb_iter.Done(); gbb_iter.Step()) {
02089 GRA_BB* gbb = gbb_iter.Current();
02090
02091 for (op_iter.Init(gbb); ! op_iter.Done(); op_iter.Step()) {
02092 INT i;
02093 OP* op = op_iter.Current();
02094
02095 for ( i = 0; i < OP_results(op); ++i ) {
02096 TN *rtn = OP_result(op,i);
02097 if ( TN_Is_Allocatable(rtn) )
02098 CGTARG_Result_Live_Range(lrange_mgr.Get(rtn),op,first_bb_cycle);
02099 }
02100 }
02101 first_bb_cycle += OP_scycle(BB_last_op(gbb->Bb())) + 1;
02102 }
02103
02104 first_bb_cycle = 0;
02105 for (gbb_iter.Init(region); ! gbb_iter.Done(); gbb_iter.Step()) {
02106 GRA_BB* gbb = gbb_iter.Current();
02107
02108 for (op_iter.Init(gbb); ! op_iter.Done(); op_iter.Step()) {
02109 INT i;
02110 OP* op = op_iter.Current();
02111
02112 for ( i = 0; i < OP_opnds(op); ++i ) {
02113 TN* otn = OP_opnd(op,i);
02114
02115 if ( TN_Is_Allocatable(otn) )
02116 CGTARG_Operand_Live_Range(lrange_mgr.Get(otn),i,op,first_bb_cycle);
02117 }
02118 }
02119 first_bb_cycle += OP_scycle(BB_last_op(gbb->Bb())) + 1;
02120 }
02121
02122 CGTARG_Interference_Finalize();
02123 }
02124
02126 static void
02127 Build_Region_Interference_Graph( GRA_REGION* region )
02129
02130
02131
02132
02134 {
02135 GRA_REGION_GBB_ITER gbb_iter;
02136 GRA_REGION_RC_NL_LRANGE_ITER lrange_iter;
02137 ISA_REGISTER_CLASS rc;
02138
02139
02140
02141 FOR_ALL_ISA_REGISTER_CLASS( rc ) {
02142 for (lrange_iter.Init(region,rc); ! lrange_iter.Done(); lrange_iter.Step()){
02143 LRANGE* lrange = lrange_iter.Current();
02144
02145 lrange->Initialize_Region_Inteference(region);
02146 }
02147 }
02148
02149
02150
02151 for (gbb_iter.Init(region); ! gbb_iter.Done(); gbb_iter.Step()) {
02152 GRA_BB* gbb = gbb_iter.Current();
02153
02154 Make_Fine_Grained_Interferences(gbb);
02155 }
02156
02157 if ( CGTARG_Interference_Required() )
02158 Make_Target_Dependent_Region_Interferences(region);
02159 }
02160
02162 static void
02163 Create_Interference_Graph(void)
02165
02167 {
02168 GRA_REGION_PREV_ALLOC_ITER iter;
02169
02170 GRA_Init_Trace_Memory();
02171 Build_Complement_Interference_Graph();
02172 GRA_Trace_Memory("After Build_Complement_Interference_Graph()");
02173
02174 GRA_Init_Trace_Memory();
02175 for (iter.Init(); ! iter.Done(); iter.Step()) {
02176 GRA_REGION* region = iter.Current();
02177
02178 if ( ! region->Prev_Alloc_By_GRA() )
02179 Build_Region_Interference_Graph(region);
02180 }
02181 GRA_Trace_Memory("After Build_Region_Interference_Graph()");
02182 }
02183
02184 #ifdef TARG_IA64
02185
02186
02187
02188
02189
02190
02191
02192
02193 static void
02194 Compute_GRA_Fat_Point(void) {
02195
02196 ISA_REGISTER_CLASS rc;
02197 TN* tn;
02198
02199 GRA_REGION_RC_NL_LRANGE_ITER iter0;
02200 GRA_REGION_RC_NL_LRANGE_ITER iter1;
02201 GRA_REGION_GBB_ITER gbb_iter;
02202 GRA_REGION *region = gra_region_mgr.Complement_Region();
02203 MEM_POOL_Push(&MEM_local_nz_pool);
02204
02205 typedef mempool_allocator<INT> INT_ALLOC;
02206 typedef std::vector<INT,INT_ALLOC> INT_VECTOR;
02207 INT_VECTOR fats(PU_BB_Count+2, (INT32)0,INT_ALLOC(&MEM_local_nz_pool));
02208 FOR_ALL_ISA_REGISTER_CLASS( rc ) {
02209
02210 for (iter0.Init(region,rc); ! iter0.Done(); iter0.Step()) {
02211 LRANGE* lrange0 = iter0.Current();
02212 LRANGE_LIVE_GBB_ITER live_gbb_iter;
02213
02214
02215
02216 for (live_gbb_iter.Init(lrange0); ! live_gbb_iter.Done(); live_gbb_iter.Step()) {
02217 GRA_BB *live_gbb = live_gbb_iter.Current();
02218
02219 fats[(live_gbb->Bb())->id] += 1;
02220 }
02221 }
02222 }
02223 INT32 fatest_point = 0;
02224 INT32 fat_bb_id = 0;
02225 for (INT32 i = 0;i < PU_BB_Count;i++) {
02226 if (fats[i] > fatest_point) {
02227 fatest_point = fats[i];
02228 fat_bb_id = i;
02229 }
02230 }
02231
02232 if ((gra_self_recursive)&&(fatest_point > 100)) {
02233 fat_self_recursive = TRUE;
02234 DevWarn("The fatest point %d is greater than 80 and also self recursive!\n",fatest_point);
02235 }
02236 MEM_POOL_Pop(&MEM_local_nz_pool);
02237
02238 }
02239 #endif // TARG_IA64
02240
02241 #ifdef TARG_SL //minor_reg_alloc
02242
02243
02244
02245 void
02246 Mark_Lrange_For_Minor_Thread()
02247 {
02248 ISA_REGISTER_CLASS rc;
02249 GRA_REGION_RC_NL_LRANGE_ITER iter0;
02250 GRA_REGION_GBB_ITER gbb_iter;
02251 GRA_REGION *region = gra_region_mgr.Complement_Region();
02252
02253
02254 rc = ISA_REGISTER_CLASS_integer;
02255 for (iter0.Init(region,rc); ! iter0.Done(); iter0.Step()) {
02256 LRANGE* lrange0 = iter0.Current();
02257 LRANGE_LIVE_GBB_ITER live_gbb_iter;
02258 LRANGE_LUNIT_ITER lunit_iter;
02259
02260
02261
02262 vector<INT> met_rid;
02263 for (lunit_iter.Init(lrange0); !lunit_iter.Done(); lunit_iter.Step())
02264 {
02265 LUNIT* lunit = lunit_iter.Current();
02266 GRA_BB *live_gbb = lunit->Gbb();
02267 BB* bb = live_gbb->Bb();
02268 if(BB_rid(bb) && RID_TYPE_minor(BB_rid(bb))) {
02269 if(find(met_rid.begin(), met_rid.end(), RID_id(BB_rid(bb))) == met_rid.end()) {
02270 met_rid.push_back(RID_id(BB_rid(bb)));
02271 }
02272 }
02273 }
02274 if(met_rid.size() > 1 && met_rid.size() < 3)
02275 {
02276 lrange0->Spans_Multiregions_Set();
02277 }
02278 met_rid.clear();
02279 }
02280
02281
02282 }
02283 #endif
02284
02286 void
02287 GRA_Create(void)
02289
02291 {
02292 Create_GRA_BBs_And_Regions();
02293 Create_LRANGEs();
02294 Create_Live_BB_Sets();
02295 Create_LUNITs();
02296 Create_Interference_Graph();
02297 #ifdef TARG_IA64
02298 Compute_GRA_Fat_Point();
02299 #endif
02300 #ifdef TARG_SL //minor_reg_alloc
02301 Mark_Lrange_For_Minor_Thread();
02302 #endif
02303
02304 }
02305
02306
02308 void
02309 GRA_Delete(void)
02310 {
02311 }