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 #ifndef GRA_LRANGE_INCLUDED
00047 #define GRA_LRANGE_INCLUDED
00048 #ifndef GRA_LRANGE_RCS_ID
00049 #define GRA_LRANGE_RCS_ID
00050 #ifdef _KEEP_RCS_ID
00051 static char *gra_lrange_rcs_id = "$Source: /scratch/mee/2.4-65/kpro64-pending/be/cg/gra_mon/SCCS/s.gra_lrange.h $ $Revision: 1.16 $";
00052 #endif
00053 #endif
00054
00055 #include <limits.h>
00056 #include "defs.h"
00057 #include "mempool.h"
00058 #include "errors.h"
00059 #include "tn.h"
00060 #include "tn_map.h"
00061 #include "bb.h"
00062 #include "bb_set.h"
00063 #include "register.h"
00064
00065 #include "gra_bb.h"
00066 #include "gra_pref.h"
00067 #include "gra_bb_list.h"
00068
00069 class INTERFERE_DEREF;
00070 typedef INTERFERE_DEREF *INTERFERE;
00071 class LRANGE_SET_SUBUNIVERSE;
00072 class LRANGE_SUBUNIVERSE;
00073 class GRA_REGION;
00074 #ifdef KEY
00075 class LRANGE_BOUNDARY_BB;
00076 #endif
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 typedef enum {
00099 LRANGE_TYPE_COMPLEMENT = 0,
00100 LRANGE_TYPE_REGION = 1,
00101 LRANGE_TYPE_LOCAL = 2
00102 } LRANGE_TYPE;
00103
00104 enum LR_FLAG {
00105 LRANGE_FLAGS_listed = 0x1,
00106
00107
00108
00109
00110 LRANGE_FLAGS_allocated = 0x2,
00111
00112 LRANGE_FLAGS_has_wired_register = 0x4,
00113
00114 LRANGE_FLAGS_region_invariant = 0x8,
00115
00116
00117
00118
00119
00120 LRANGE_FLAGS_spans_a_call = 0x10,
00121
00122 LRANGE_FLAGS_avoid_ra = 0x20,
00123
00124 LRANGE_FLAGS_must_allocate = 0x40,
00125
00126
00127
00128
00129
00130
00131
00132
00133 LRANGE_FLAGS_spilled = 0x80,
00134 LRANGE_FLAGS_split_listed = 0x100,
00135
00136
00137 LRANGE_FLAGS_spans_infreq_call = 0x200,
00138
00139
00140
00141
00142 LRANGE_FLAGS_spans_rot_reg_clob = 0x400,
00143
00144
00145 LRANGE_FLAGS_spans_a_setjmp = 0x800,
00146 LRANGE_FLAGS_tn_is_save_reg = 0x1000,
00147 LRANGE_FLAGS_cannot_split = 0x2000,
00148 LRANGE_FLAGS_no_appearance = 0x4000,
00149 #ifdef TARG_X8664
00150 LRANGE_FLAGS_spans_savexmms = 0x8000,
00151 LRANGE_FLAGS_spans_x87_OP = 0x10000,
00152 LRANGE_FLAGS_spans_mmx_OP = 0x20000,
00153 #elif defined(TARG_SL) //minor_reg_alloc
00154
00155
00156
00157
00158 LRANGE_FLAGS_spans_multiregions = 0x8000,
00159 #endif
00160 };
00161
00162
00163
00164 class LRANGE {
00165 friend class LRANGE_MGR;
00166 friend class LRANGE_GLUE_REF_GBB_ITER;
00167 friend class LRANGE_CLIST;
00168 friend class LRANGE_CLIST_ITER;
00169 friend class LRANGE_LOCAL_LIST_ITER;
00170 friend class LRANGE_SPLIT_LIST_ITER;
00171 friend class LRANGE_LIVE_GBB_ITER;
00172 friend class LRANGE_BB_LOCAL_LIST_ITER;
00173 friend class LRANGE_LUNIT_ITER;
00174 private:
00175 INT32 id;
00176 INT32 neighbors_left;
00177 INT32 priority_queue_index;
00178
00179
00180
00181 LRANGE* clist_next;
00182 float priority;
00183 INT32 mark;
00184 GRA_PREF* pref;
00185 float pref_priority;
00186
00187
00188 ISA_REGISTER_CLASS rc:8;
00189 mREGISTER reg;
00190 mREGISTER orig_reg;
00191
00192 LRANGE_TYPE type:8;
00193 LR_FLAG flags:24;
00194 union {
00195 struct lrange_complement_specific {
00196 TN* tn;
00197 INTERFERE neighbors;
00198 LUNIT* first_lunit;
00199 BB_SET* live_bb_set;
00200
00201
00202
00203
00204 GTN_SET* global_pref_set;
00205
00206
00207
00208 TN* original_tn;
00209
00210 LRANGE* next_split_list_lrange;
00211 #ifdef KEY
00212 BB_SET* internal_bb_set;
00213
00214
00215 LRANGE_BOUNDARY_BB* boundary_bbs;
00216 #endif
00217 } c;
00218 struct lrange_region_specific {
00219 TN* tn;
00220 INTERFERE neighbors;
00221 GRA_REGION* region;
00222 GRA_BB_LIST* complement_bbs;
00223 } r;
00224 struct lrange_local_specific {
00225 GRA_BB *gbb;
00226 LRANGE *next_bb_local_lrange;
00227 } l;
00228 } u;
00229 public:
00230 LRANGE(void) {}
00231 ~LRANGE(void) {}
00232
00233
00234 TN* Original_TN(void) { DevAssert(type == LRANGE_TYPE_COMPLEMENT,
00235 ("_Original_TN of a non-complement LRANGE"));
00236 return u.c.original_tn; }
00237 TN* Tn(void) { DevAssert(!(type == LRANGE_TYPE_LOCAL),
00238 ("No TN for local LRANGEs."));
00239 return u.c.tn; }
00240 INTERFERE Neighbors(void) { return u.c.neighbors; }
00241 INT32 Neighbors_Left(void) { return neighbors_left; }
00242 INT32 Neighbors_Left_Increment(void) { return ++neighbors_left; }
00243 INT32 Neighbors_Left_Decrement(void) { return --neighbors_left; }
00244 float Priority(void) { return priority; }
00245 void Priority_Set(float p) { priority = p; }
00246 ISA_REGISTER_CLASS Rc(void) { return rc; }
00247 REGISTER Reg(void) {DevAssert(Allocated() || Has_Wired_Register(),
00248 ("LRANGE::Register called for unallocated non-wired LRANGE"));
00249 return reg; }
00250 LRANGE_TYPE Type(void) { return type; }
00251 INT32 Id(void) { return id; }
00252 void Id_Set(INT32 i) { id = i; }
00253 BB_SET* Live_BB_Set(void) { return u.c.live_bb_set; }
00254 void Clear_Live_BBs(void) { BB_SET_ClearD(u.c.live_bb_set); }
00255 GTN_SET* Global_Pref_Set(void){ return u.c.global_pref_set; }
00256 void Clear_Global_Pref_Set(void) { BB_SET_ClearD(u.c.global_pref_set); }
00257 void First_Lunit_Reset(void) { u.c.first_lunit = NULL; }
00258 GRA_PREF *Pref(void) { return pref; }
00259 GRA_BB *Gbb(void) { return u.l.gbb; }
00260 GRA_REGION *Region(void) { return u.r.region; }
00261 float Pref_Priority(void) { return pref_priority; }
00262 REGISTER Orig_Reg(void) { return orig_reg; }
00263 INT32 Priority_Queue_Index(void) { return priority_queue_index; }
00264 void Priority_Queue_Index_Set(INT32 index) { priority_queue_index = index; }
00265 #ifdef KEY
00266 BB_SET* Internal_BB_Set(void) { return u.c.internal_bb_set; }
00267 void Clear_Internal_BBs(void) { BB_SET_ClearD(u.c.internal_bb_set); }
00268
00269 LRANGE_BOUNDARY_BB *Boundary_BBs(void) { return u.c.boundary_bbs; }
00270 void *Set_Boundary_BBs(LRANGE_BOUNDARY_BB *x) { u.c.boundary_bbs = x; }
00271 LRANGE_BOUNDARY_BB* Get_Boundary_Bb(BB *target);
00272 LRANGE_BOUNDARY_BB* Remove_Boundary_Bb(BB *target);
00273 #endif
00274
00275
00276 BOOL Listed(void) { return flags & LRANGE_FLAGS_listed; }
00277 void Listed_Set(void) { flags = (LR_FLAG)(flags|LRANGE_FLAGS_listed);}
00278 BOOL Allocated(void) { return flags & LRANGE_FLAGS_allocated; }
00279 void Allocated_Reset(void) { flags = (LR_FLAG)(flags&~LRANGE_FLAGS_allocated); }
00280
00281 BOOL Spans_A_Call(void) { return flags & LRANGE_FLAGS_spans_a_call; }
00282 void Spans_A_Call_Set(void) { flags = (LR_FLAG)(flags|LRANGE_FLAGS_spans_a_call); }
00283 void Spans_A_Call_Reset(void) { flags = (LR_FLAG)(flags&~LRANGE_FLAGS_spans_a_call); }
00284 BOOL Spans_Infreq_Call(void) { return flags & LRANGE_FLAGS_spans_infreq_call; }
00285 void Spans_Infreq_Call_Set(void) { flags = (LR_FLAG)(flags|LRANGE_FLAGS_spans_infreq_call); }
00286 void Spans_Infreq_Call_Reset(void){ flags = (LR_FLAG)(flags&~LRANGE_FLAGS_spans_infreq_call);}
00287 BOOL Split_Listed(void) { return flags & LRANGE_FLAGS_split_listed; }
00288 void Split_Listed_Set(void) { flags = (LR_FLAG)(flags|LRANGE_FLAGS_split_listed); }
00289 BOOL Spans_Rot_Reg_Clob(void) { return flags & LRANGE_FLAGS_spans_rot_reg_clob; }
00290 void Spans_Rot_Reg_Clob_Set(void) { flags = (LR_FLAG)(flags|LRANGE_FLAGS_spans_rot_reg_clob); }
00291 void Spans_Rot_Reg_Clob_Reset(void) { flags = (LR_FLAG)(flags&~LRANGE_FLAGS_spans_rot_reg_clob); }
00292 BOOL Spans_A_Setjmp(void) { return flags & LRANGE_FLAGS_spans_a_setjmp; }
00293 void Spans_A_Setjmp_Set(void) { flags = (LR_FLAG)(flags|LRANGE_FLAGS_spans_a_setjmp); }
00294 void Spans_A_Setjmp_Reset(void) { flags = (LR_FLAG)(flags&~LRANGE_FLAGS_spans_a_setjmp); }
00295 BOOL Avoid_RA(void) { return flags & LRANGE_FLAGS_avoid_ra; }
00296 void Avoid_RA_Set(void) { flags = (LR_FLAG)(flags|LRANGE_FLAGS_avoid_ra); }
00297 BOOL Spilled(void) { return flags & LRANGE_FLAGS_spilled; }
00298 void Spilled_Set(void) { flags = (LR_FLAG)(flags|LRANGE_FLAGS_spilled); }
00299 BOOL Must_Allocate(void) { return flags & LRANGE_FLAGS_must_allocate; }
00300 void Must_Allocate_Set(void) { flags = (LR_FLAG)(flags|LRANGE_FLAGS_must_allocate); }
00301 BOOL Has_Wired_Register(void) { return flags & LRANGE_FLAGS_has_wired_register; }
00302 BOOL Region_Invariant(void) { return flags & LRANGE_FLAGS_region_invariant; }
00303 BOOL Tn_Is_Save_Reg(void) { return flags & LRANGE_FLAGS_tn_is_save_reg; }
00304 void Tn_Is_Save_Reg_Set(void) { flags = (LR_FLAG)(flags|LRANGE_FLAGS_tn_is_save_reg); }
00305 BOOL Cannot_Split(void) { return flags & LRANGE_FLAGS_cannot_split; }
00306 void Cannot_Split_Set(void) { flags = (LR_FLAG)(flags|LRANGE_FLAGS_cannot_split); }
00307 BOOL No_Appearance(void) { return flags & LRANGE_FLAGS_no_appearance; }
00308 void No_Appearance_Set(void) { flags = (LR_FLAG)(flags|LRANGE_FLAGS_no_appearance); }
00309 #ifdef TARG_X8664
00310 BOOL Spans_Savexmms(void) { return flags & LRANGE_FLAGS_spans_savexmms; }
00311 void Spans_Savexmms_Set(void) { flags = (LR_FLAG)(flags|LRANGE_FLAGS_spans_savexmms); }
00312 BOOL Spans_x87_OP(void) { return flags & LRANGE_FLAGS_spans_x87_OP; }
00313 void Spans_x87_OP_Set(void) { flags = (LR_FLAG)(flags|LRANGE_FLAGS_spans_x87_OP); }
00314 void Spans_x87_OP_Reset(void) { flags = (LR_FLAG)(flags&~LRANGE_FLAGS_spans_x87_OP); }
00315 BOOL Spans_mmx_OP(void) { return flags & LRANGE_FLAGS_spans_mmx_OP; }
00316 void Spans_mmx_OP_Set(void) { flags = (LR_FLAG)(flags|LRANGE_FLAGS_spans_mmx_OP); }
00317 void Spans_mmx_OP_Reset(void) { flags = (LR_FLAG)(flags&~LRANGE_FLAGS_spans_mmx_OP); }
00318 #endif
00319
00320
00321 #ifdef TARG_SL //minor_reg_alloc
00322 BOOL Spans_Multiregions(void) { return flags & LRANGE_FLAGS_spans_multiregions; }
00323 void Spans_Multiregions_Set(void) { flags = (LR_FLAG)(flags|LRANGE_FLAGS_spans_multiregions); }
00324 #endif
00325
00326 void Wire_Register(REGISTER r){ flags = (LR_FLAG)(flags|LRANGE_FLAGS_has_wired_register);
00327 reg = r; }
00328
00329 void Preallocated_Region_Invariant(REGISTER r) {
00330 flags = (LR_FLAG)(flags|LRANGE_FLAGS_region_invariant);
00331 flags = (LR_FLAG)(flags|LRANGE_FLAGS_allocated);
00332 reg = r; }
00333
00334
00335
00336
00337
00338
00339
00340 BOOL Has_Preference(void) { return pref != NULL; }
00341 void Neighbors_Left_Initialize(void) { neighbors_left = Neighbor_Count(); }
00342
00343
00344
00345
00346
00347 LRANGE *BB_Local_List_Push(LRANGE *new_elt)
00348 { new_elt->u.l.next_bb_local_lrange = this;
00349 return new_elt; }
00350 LRANGE *Split_List_Push(LRANGE *new_elt)
00351 { new_elt->u.c.next_split_list_lrange = this;
00352 return new_elt; }
00353
00354
00355
00356
00357 INT32 Candidate_Reg_Count(void);
00358 void Add_Live_BB(GRA_BB *gbb);
00359 void Remove_Live_BB(GRA_BB *gbb);
00360 BOOL Contains_BB(GRA_BB *gbb);
00361 void Add_Global_Pref(TN *tn);
00362 void Remove_Global_Pref(TN *tn);
00363 BOOL Check_Global_Pref(TN *tn);
00364 void Initialize_Region_Inteference(GRA_REGION* region);
00365 void Add_LUNIT( LUNIT* lunit );
00366 void Add_Lunit( LUNIT* lunit );
00367 REGISTER_SET Allowed_Registers(GRA_REGION* region);
00368 #ifdef KEY
00369 REGISTER_SET Reclaimable_Registers(GRA_REGION* region);
00370 #endif
00371 BOOL Interferes( LRANGE* lr1 );
00372 void Region_Interference( LRANGE* lrange1,
00373 GRA_REGION* region );
00374 void Remove_Neighbor(LRANGE* neighbor, GRA_REGION* region );
00375 void Allocate_Register( REGISTER reg, BOOL reclaim = FALSE );
00376 INT32 Neighbor_Count(void);
00377 void Calculate_Priority(void);
00378 BOOL Find_LUNIT_For_GBB( const GRA_BB* gbb, LUNIT** lunitp );
00379 void Preference_Copy(LRANGE* lrange1, GRA_BB* gbb );
00380 void Recompute_Preference(void);
00381 char* Format( char* buff );
00382 #ifdef KEY
00383 void Add_Internal_BB(GRA_BB *gbb);
00384 void Remove_Internal_BB(GRA_BB *gbb);
00385 BOOL Contains_Internal_BB(GRA_BB *gbb);
00386 void Add_Boundary_BB(GRA_BB *gbb);
00387 void Boundary_BBs_Push(LRANGE_BOUNDARY_BB *x);
00388 void Update_Boundary_BBs(void);
00389 #endif
00390 };
00391
00392 #ifdef TARG_IA64
00393
00394 struct BUFFERED_LRANGE {
00395 LRANGE *lrange;
00396 INT abi_property;
00397 ISA_REGISTER_CLASS reg_class;
00398 INT lunits_number;
00399 float density;
00400 BUFFERED_LRANGE *next,*prev;
00401 };
00402 #endif
00403
00404
00405 class LRANGE_MGR {
00406 INT32 one_set_counter;
00407 LRANGE* interference_creation_lrange;
00408 TN_MAP tn_map;
00409
00410 public:
00411 LRANGE_MGR(void) {}
00412 ~LRANGE_MGR(void) {}
00413
00414
00415 void Clear_One_Set(void) { ++one_set_counter; }
00416 BOOL One_Set_MemberP(const LRANGE *lrange)
00417 { return lrange->mark == one_set_counter; }
00418 void One_Set_Union1(LRANGE *lrange) { lrange->mark = one_set_counter; }
00419 void One_Set_Difference1(LRANGE *lrange) { lrange->mark = one_set_counter-1; }
00420
00421
00422
00423
00424
00425
00426 void Add_GBB_With_Glue_Reference(LRANGE *lrange, GRA_BB *gbb)
00427 { lrange->u.r.complement_bbs = GRA_BB_LIST_Push(gbb,
00428 lrange->u.r.complement_bbs, GRA_pool);}
00429
00430
00431
00432
00433
00434 LRANGE* Get( const TN* tn )
00435 { return TN_is_register(tn) ? (LRANGE*) TN_MAP_Get(tn_map,tn) : NULL; }
00436
00437
00438
00439
00440 void Initialize(void);
00441 void Finalize(void);
00442 LRANGE* Create( LRANGE_TYPE type, ISA_REGISTER_CLASS rc, size_t size );
00443 LRANGE* Create_Complement( TN* tn );
00444 LRANGE* Create_Local( GRA_BB* gbb, ISA_REGISTER_CLASS cl );
00445 LRANGE* Create_Region( TN* tn, GRA_REGION* region );
00446 LRANGE* Create_Duplicate( LRANGE* lrange );
00447 void Begin_Complement_Interference(LRANGE *lrange);
00448 void Complement_Interference( LRANGE* neighbor );
00449 void End_Complement_Interference( void );
00450 };
00451
00452
00453
00454
00455 class LRANGE_GLUE_REF_GBB_ITER {
00456 GRA_BB_LIST *rest;
00457 public:
00458 LRANGE_GLUE_REF_GBB_ITER(void) {}
00459 ~LRANGE_GLUE_REF_GBB_ITER(void) {}
00460
00461 void Init(LRANGE *lrange) { rest = lrange->u.r.complement_bbs; }
00462 BOOL Done(void) { return rest == NULL; }
00463 GRA_BB *Current(void) { return GRA_BB_LIST_first(rest); }
00464 void Step(void) { rest = GRA_BB_LIST_rest(rest); }
00465 };
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481 class LRANGE_CLIST {
00482 friend class LRANGE_CLIST_ITER;
00483 LRANGE *first;
00484 LRANGE *last;
00485 public:
00486 LRANGE_CLIST(void) {}
00487 ~LRANGE_CLIST(void) {}
00488
00489 void Initialize(void) { first = last = NULL; }
00490
00491 void Push(LRANGE *lrange) { lrange->clist_next = first;
00492 first = lrange;
00493 if (last == NULL) last = lrange; }
00494
00495
00496 void Append(LRANGE_CLIST *clist1);
00497 void Print_Clist(void);
00498 };
00499
00500
00501 class LRANGE_CLIST_ITER {
00502 LRANGE_CLIST *clist;
00503 LRANGE *prev;
00504 LRANGE sentinal;
00505 public:
00506 LRANGE_CLIST_ITER(void) {}
00507 ~LRANGE_CLIST_ITER(void) {}
00508
00509 void Init(LRANGE_CLIST *cl) { clist = cl;
00510 prev = &sentinal;
00511 sentinal.clist_next = cl->first; }
00512 BOOL Done(void) { return prev->clist_next == NULL; }
00513 LRANGE *Current(void) { return prev->clist_next; }
00514 void Step(void) { prev = prev->clist_next; }
00515 void Init_Following(LRANGE_CLIST_ITER *iter1) { *this = *iter1;
00516 if (!Done()) Step(); }
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526 void Replace_Current(LRANGE *lrange);
00527 void Splice(LRANGE *lrange);
00528 #ifdef KEY
00529 void Push(LRANGE *lrange);
00530
00531 #endif
00532 };
00533
00534
00535 class LRANGE_BB_LOCAL_LIST_ITER {
00536 LRANGE *current;
00537 public:
00538 LRANGE_BB_LOCAL_LIST_ITER(void) {}
00539 ~LRANGE_BB_LOCAL_LIST_ITER(void) {}
00540
00541 void Init(LRANGE *head) { current = head; }
00542 BOOL Done(void) { return current == NULL; }
00543 LRANGE *Current(void) { return current; }
00544 void Step(void) { current = current->u.l.next_bb_local_lrange; }
00545 };
00546
00547
00548
00549 class LRANGE_SPLIT_LIST_ITER {
00550 LRANGE *current;
00551 public:
00552 LRANGE_SPLIT_LIST_ITER(void) {}
00553 ~LRANGE_SPLIT_LIST_ITER(void) {}
00554
00555 void Init(LRANGE *head) { current = head; }
00556 BOOL Done(void) { return current == NULL; }
00557 LRANGE *Current(void) { return current; }
00558 void Step(void) { current =current->u.c.next_split_list_lrange;}
00559 };
00560
00561
00562 class LRANGE_LUNIT_ITER {
00563 LUNIT *current;
00564 LUNIT *next;
00565 public:
00566 LRANGE_LUNIT_ITER(void) {}
00567 ~LRANGE_LUNIT_ITER(void) {}
00568
00569 void Init(LRANGE *lrange) {
00570 Is_True(lrange->Type() == LRANGE_TYPE_COMPLEMENT,
00571 ("Iterating over the LUNITs of a non-COMPLEMENT type"));
00572 current = lrange->u.c.first_lunit;
00573 if (current != NULL)
00574 next = current->lrange_list_next;
00575 }
00576 BOOL Done(void) { return current == NULL; }
00577 LUNIT* Current(void) { return current; }
00578 void Step(void) { current = next;
00579 if (next != NULL)
00580 next = next->lrange_list_next; }
00581 };
00582
00583
00584 class LRANGE_LIVE_GBB_ITER {
00585 BB_SET *set;
00586 BB *current;
00587 public:
00588 LRANGE_LIVE_GBB_ITER(void) {}
00589 ~LRANGE_LIVE_GBB_ITER(void) {}
00590
00591 void Init(LRANGE *lrange) {
00592 Is_True(lrange->Type() == LRANGE_TYPE_COMPLEMENT,
00593 ("Iterating over the live_gbbs of a non-complement LRANGE"));
00594 set = lrange->u.c.live_bb_set;
00595 current = BB_SET_Choose(set);
00596 }
00597 BOOL Done(void) { return current == BB_SET_CHOOSE_FAILURE; }
00598 GRA_BB *Current(void);
00599 void Step(void) { current = BB_SET_Choose_Next(set, current); }
00600 };
00601
00602 #ifdef KEY
00603 class LRANGE_BOUNDARY_BB {
00604 LRANGE_BOUNDARY_BB* next;
00605 LRANGE* lrange;
00606 GRA_BB* gbb;
00607 mUINT16 start_index;
00608 mUINT16 end_index;
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627 public:
00628 LRANGE_BOUNDARY_BB(void) { start_index = end_index = 0; }
00629 ~LRANGE_BOUNDARY_BB(void) {}
00630
00631 LRANGE *Lrange(void) { return lrange; }
00632 void Lrange_Set(LRANGE *lr) { lrange = lr; }
00633 GRA_BB *Gbb(void) { return gbb; }
00634
00635 void Init(GRA_BB *gbb, LRANGE *lrange);
00636 LRANGE_BOUNDARY_BB* Next() { return next; }
00637 void Next_Set(LRANGE_BOUNDARY_BB *x) { next = x; }
00638 BOOL Interfere(LRANGE_BOUNDARY_BB *boundary_bb1);
00639 BOOL Interfere(BOOL other_live_in, BOOL other_live_out,
00640 mUINT16 other_start_index, mUINT16 other_end_index);
00641 BOOL Interfere(GRA_BB *gbb, ISA_REGISTER_CLASS rc, REGISTER reg);
00642 mUINT16 Start_Index(void) { return start_index; }
00643 mUINT16 End_Index(void) { return end_index; }
00644
00645 BOOL Is_Live_In(void);
00646 BOOL Is_Live_Out(void);
00647 };
00648 #endif
00649
00650
00651 extern INT32 LRANGE_INT( LRANGE* lr );
00652 extern LRANGE* INT_LRANGE( INT32 i );
00653 extern LRANGE* INT_LRANGE_Sub(INT i, LRANGE_SET_SUBUNIVERSE* subuniverse);
00654 inline INT32
00655 LRANGE_Universe_ID_S( LRANGE* lrange, LRANGE_SET_SUBUNIVERSE* sub ) {
00656 return lrange->Id(); }
00657
00658 extern LRANGE_MGR lrange_mgr;
00659
00660 #ifdef KEY
00661 extern REGISTER_SET Global_Preferenced_Regs(LRANGE* lrange, GRA_BB* gbb);
00662 #endif
00663 #endif