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
00063 #ifndef GRA_BB_INCLUDED
00064 #define GRA_BB_INCLUDED
00065
00066 #ifndef GRA_BB_RCS_ID
00067 #define GRA_BB_RCS_ID
00068 #ifdef _KEEP_RCS_ID
00069 static char *gra_bb_rcs_id = "$Source: /scratch/mee/2.4-65/kpro64-pending/be/cg/gra_mon/SCCS/s.gra_bb.h $ $Revision: 1.13 $";
00070 #endif
00071 #endif
00072
00073 #include "defs.h"
00074 #include "cgir.h"
00075 #include "bb.h"
00076 #include "register.h"
00077 #include "bb_map.h"
00078 #include "bb_set.h"
00079 #include "gra.h"
00080 #include "gra_lunit.h"
00081 #include "gra_lrange.h"
00082 #include "gra_lrange_vset.h"
00083 #include "lrange_list.h"
00084 #include "lrange_set.h"
00085 #include "tn_map.h"
00086 #include "gtn_universe.h"
00087 #include "gtn_set.h"
00088 #include "tn_set.h"
00089 #include "gra_loop.h"
00090 #include "gra_lrange_subuniverse.h"
00091
00092 class INTERFERE_DEREF;
00093 typedef INTERFERE_DEREF* INTERFERE;
00094
00095 enum GBB_FLAG {
00096 GRA_BB_FLAGS_clear_value = 0x0,
00097 GRA_BB_FLAGS_loop_prolog = 0x1,
00098 GRA_BB_FLAGS_loop_epilog = 0x2,
00099 GRA_BB_FLAGS_region_prolog = 0x4,
00100 GRA_BB_FLAGS_region_epilog = 0x8,
00101 GRA_BB_FLAGS_setjmp = 0x10,
00102 #ifdef TARG_X8664
00103 GRA_BB_FLAGS_savexmms = 0x20,
00104 GRA_BB_FLAGS_x87_OP = 0x40,
00105 GRA_BB_FLAGS_mmx_OP = 0x80,
00106 #endif
00107 };
00108
00109 class GRA_BB {
00110 friend class GBB_MGR;
00111 friend class GRA_BB_SPLIT_LIST_ITER;
00112 friend class GRA_BB_LIVE_OUT_LRANGE_ITER;
00113 friend class GRA_BB_RC_LUNIT_ITER;
00114 friend class GRA_BB_LOCAL_LRANGE_ITER;
00115 private:
00116 BB* bb;
00117 GRA_REGION* region;
00118 LRANGE* local_lranges[ISA_REGISTER_CLASS_MAX+1];
00119
00120
00121 LUNIT* lunits[ISA_REGISTER_CLASS_MAX+1];
00122
00123
00124 INTERFERE global_lranges[ISA_REGISTER_CLASS_MAX+1];
00125
00126 REGISTER_SET registers_used[ISA_REGISTER_CLASS_MAX+1];
00127
00128 REGISTER_SET glue_registers_used[ISA_REGISTER_CLASS_MAX+1];
00129
00130
00131 #ifdef KEY
00132 REGISTER_SET registers_referenced[ISA_REGISTER_CLASS_MAX+1];
00133
00134 #endif
00135 GRA_BB* region_next;
00136
00137 INT32 split_mark;
00138
00139
00140
00141 LUNIT* split_lunit;
00142 GRA_BB* split_list_next;
00143 float split_priority;
00144
00145 float split_spill_cost;
00146
00147 INT split_entry_count;
00148
00149 INT split_exit_count;
00150
00151 INT split_succ_border_count;
00152
00153 INT split_lunit_count;
00154 LRANGE_SET* spill_above[ISA_REGISTER_CLASS_MAX+1];
00155
00156 LRANGE_SET* restore_below[ISA_REGISTER_CLASS_MAX+1];
00157
00158 LRANGE_LIST* unpreferenced_wired_lranges[ISA_REGISTER_CLASS_MAX+1];
00159
00160
00161
00162
00163
00164
00165 union {
00166
00167 INT32 i32;
00168 struct {
00169 mBOOL in_alloc_lrange;
00170 mBOOL queued;
00171 mBOOL has_load;
00172 mBOOL has_store;
00173 } mb;
00174 } split_boolean_properties;
00175 INT32 one_set_mark;
00176 GTN_SET* needs_a_register;
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186 mINT8 local_lrange_count[ISA_REGISTER_CLASS_MAX+1];
00187
00188 GRA_LOOP* loop;
00189 UINT8 flags;
00190 #ifdef KEY
00191
00192 mUINT16 OPs_count;
00193 REGISTER_SET usage_live_in[ISA_REGISTER_CLASS_MAX+1];
00194 REGISTER_SET usage_live_out[ISA_REGISTER_CLASS_MAX+1];
00195 mUINT16 usage_start_index[ISA_REGISTER_CLASS_MAX+1][REGISTER_MAX+1];
00196 mUINT16 usage_end_index[ISA_REGISTER_CLASS_MAX+1][REGISTER_MAX+1];
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241 LRANGE* lrange_owner[ISA_REGISTER_CLASS_MAX+1][REGISTER_MAX+1];
00242
00243
00244
00245
00246 #endif
00247
00248 public:
00249 GRA_BB(void) {}
00250 ~GRA_BB(void) {}
00251
00252
00253 BB* Bb(void) { return bb; }
00254 GRA_REGION* Region(void) { return region; }
00255 LRANGE *Local_Lranges(ISA_REGISTER_CLASS rc) { return local_lranges[rc]; }
00256 void Local_Lranges_Set(ISA_REGISTER_CLASS rc, LRANGE *lr)
00257 { local_lranges[rc] = lr; }
00258 INT32 Local_Lrange_Count(ISA_REGISTER_CLASS rc)
00259 { return local_lrange_count[rc]; }
00260 void Incr_Local_Lrange_Count(ISA_REGISTER_CLASS rc)
00261 { ++local_lrange_count[rc]; }
00262 INTERFERE Global_Lranges(ISA_REGISTER_CLASS rc) { return global_lranges[rc]; }
00263 GRA_BB* Region_Next(void) { return region_next; }
00264 void Region_Next_Set(GRA_BB *next) { region_next = next; }
00265 float Split_Priority(void) { return split_priority; }
00266 void Split_Priority_Set(float p) { split_priority = p; }
00267 INT Split_Entry_Count(void) { return split_entry_count; }
00268 void Split_Entry_Count_Set(INT c) { split_entry_count = c; }
00269 float Split_Spill_Cost(void) { return split_spill_cost; }
00270 void Split_Spill_Cost_Set(float c) { split_spill_cost = c; }
00271 INT Split_Exit_Count(void) { return split_exit_count; }
00272 void Split_Exit_Count_Set(INT c) { split_exit_count = c; }
00273 INT Split_Succ_Border_Count(void) { return split_succ_border_count; }
00274 void Split_Succ_Border_Count_Set(INT c) { split_succ_border_count = c; }
00275 INT Split_Lunit_Count(void) { return split_lunit_count; }
00276 void Split_Lunit_Count_Set(INT c) { split_lunit_count = c; }
00277 GTN_SET *Needs_A_Register(void) { return needs_a_register; }
00278 void Needs_A_Register_Set(GTN_SET *s) { needs_a_register = s; }
00279 LRANGE_SET* Restore_Below(ISA_REGISTER_CLASS rc) { return restore_below[rc]; }
00280 LRANGE_SET* Spill_Above(ISA_REGISTER_CLASS rc) { return spill_above[rc]; }
00281 LRANGE_LIST* Unpreferenced_Wired_LRANGEs( ISA_REGISTER_CLASS rc ) {
00282 return unpreferenced_wired_lranges[rc]; }
00283 LRANGE_LIST* Unpreferenced_Wired_LRANGEs_Set(ISA_REGISTER_CLASS rc,
00284 LRANGE_LIST *l) {
00285 return unpreferenced_wired_lranges[rc] = l;}
00286 GRA_LOOP* Loop(void) { return loop; }
00287 void Loop_Set(GRA_LOOP *l) { loop = l; }
00288 REGISTER_SET Glue_Registers_Used(ISA_REGISTER_CLASS rc) {
00289 return glue_registers_used[rc]; }
00290 void Make_Glue_Register_Used(ISA_REGISTER_CLASS rc, REGISTER reg ) {
00291 glue_registers_used[rc] =
00292 REGISTER_SET_Union1(glue_registers_used[rc],reg);}
00293
00294 void Clear_Flags(void) { flags = GRA_BB_FLAGS_clear_value; }
00295
00296 BOOL Loop_Prolog(void) { return flags & GRA_BB_FLAGS_loop_prolog; }
00297 void Loop_Prolog_Set(void) { flags |= (UINT) GRA_BB_FLAGS_loop_prolog; }
00298 BOOL Loop_Epilog(void) { return flags & GRA_BB_FLAGS_loop_epilog; }
00299 void Loop_Epilog_Set(void) { flags |= (UINT) GRA_BB_FLAGS_loop_epilog; }
00300 BOOL Region_Prolog(void) { return flags & GRA_BB_FLAGS_region_prolog; }
00301 void Region_Prolog_Set(void) { flags |= (UINT) GRA_BB_FLAGS_region_prolog; }
00302 BOOL Region_Epilog(void) { return flags & GRA_BB_FLAGS_region_epilog; }
00303 void Region_Epilog_Set(void) { flags |= (UINT) GRA_BB_FLAGS_region_epilog; }
00304 BOOL Setjmp(void) { return flags & GRA_BB_FLAGS_setjmp; }
00305 void Setjmp_Set(void) { flags |= (UINT) GRA_BB_FLAGS_setjmp; }
00306 #ifdef TARG_X8664
00307 BOOL Savexmms(void) { return flags & GRA_BB_FLAGS_savexmms; }
00308 void Savexmms_Set(void) { flags |= (UINT) GRA_BB_FLAGS_savexmms; }
00309 BOOL x87_OP(void) { return flags & GRA_BB_FLAGS_x87_OP; }
00310 void x87_OP_Set(void) { flags |= (UINT) GRA_BB_FLAGS_x87_OP; }
00311 BOOL mmx_OP(void) { return flags & GRA_BB_FLAGS_mmx_OP; }
00312 void mmx_OP_Set(void) { flags |= (UINT) GRA_BB_FLAGS_mmx_OP; }
00313 #endif
00314 #ifdef KEY
00315
00316 BOOL Clobbers_Reg_Class(ISA_REGISTER_CLASS rc) {
00317 #ifdef TARG_X8664
00318 return ((rc == ISA_REGISTER_CLASS_x87 && mmx_OP()) ||
00319 (rc == ISA_REGISTER_CLASS_mmx && x87_OP()));
00320 #else
00321 return FALSE;
00322 #endif
00323 }
00324 mUINT16 OPs_Count(void) { return OPs_count; }
00325 mUINT16 Usage_Start_Index(ISA_REGISTER_CLASS rc, REGISTER reg)
00326 { return usage_start_index[rc][reg]; }
00327 void Usage_Start_Index_Set(ISA_REGISTER_CLASS rc, REGISTER reg, mUINT16 index)
00328 { usage_start_index[rc][reg] = index; }
00329 mUINT16 Usage_End_Index(ISA_REGISTER_CLASS rc, REGISTER reg)
00330 { return usage_end_index[rc][reg]; }
00331 void Usage_End_Index_Set(ISA_REGISTER_CLASS rc, REGISTER reg, mUINT16 index)
00332 { usage_end_index[rc][reg] = index; }
00333 BOOL Is_Usage_Live_In(ISA_REGISTER_CLASS rc, REGISTER reg)
00334 { return REGISTER_SET_MemberP(usage_live_in[rc], reg); }
00335 void Usage_Live_In_Set(ISA_REGISTER_CLASS rc, REGISTER reg)
00336 { usage_live_in[rc] = REGISTER_SET_Union1(usage_live_in[rc], reg); }
00337 void Usage_Live_In_Clear(ISA_REGISTER_CLASS rc, REGISTER reg)
00338 { usage_live_in[rc] = REGISTER_SET_Difference1(usage_live_in[rc], reg);}
00339 BOOL Is_Usage_Live_Out( ISA_REGISTER_CLASS rc, REGISTER reg)
00340 { return REGISTER_SET_MemberP(usage_live_out[rc], reg); }
00341 void Usage_Live_Out_Set(ISA_REGISTER_CLASS rc, REGISTER reg)
00342 { usage_live_out[rc] = REGISTER_SET_Union1(usage_live_out[rc], reg); }
00343 void Usage_Live_Out_Clear(ISA_REGISTER_CLASS rc, REGISTER reg)
00344 {usage_live_out[rc] = REGISTER_SET_Difference1(usage_live_out[rc],reg);}
00345
00346 void Set_LRANGE_Owner(ISA_REGISTER_CLASS rc, REGISTER reg, LRANGE *lrange)
00347 { lrange_owner[rc][reg] = lrange; }
00348 LRANGE *Get_LRANGE_Owner(ISA_REGISTER_CLASS rc, REGISTER reg)
00349 { return lrange_owner[rc][reg]; }
00350 #endif
00351
00352
00353 GRA_BB* Split_List_Push( GRA_BB* new_elt ) { new_elt->split_list_next = this;
00354 return new_elt; }
00355
00356
00357
00358 float Freq(void) { if (OPT_Space)
00359 return BB_freq(bb) + GRA_spill_count_factor;
00360 else return BB_freq(bb); }
00361
00362
00363
00364
00365
00366 BOOL Is_Live_Out_LRANGE( LRANGE* lrange ) {
00367 return GTN_SET_MemberP(BB_live_out(bb),lrange->Tn()); }
00368
00369 BOOL Is_Live_In_LRANGE( LRANGE* lrange ) {
00370 return GTN_SET_MemberP(BB_live_in(bb),lrange->Tn()); }
00371
00372
00373
00374 INT Register_Girth( ISA_REGISTER_CLASS rc );
00375 void Create_Local_LRANGEs(ISA_REGISTER_CLASS cl, INT32 coun);
00376 LRANGE* Create_Wired_LRANGE(ISA_REGISTER_CLASS cl, REGISTER reg);
00377 void Create_Global_Interferences(void);
00378 void Rename_TN_References( TN* orig_tn, TN* new_tn);
00379 void Add_Live_Out_LRANGE( LRANGE* lrange );
00380 void Add_Live_In_LRANGE( LRANGE* lrange );
00381 void Remove_Live_In_LRANGE( LRANGE* lrange );
00382 void Remove_Live_Out_LRANGE( LRANGE* lrange );
00383 INT32 Global_Live_Lrange_Count( ISA_REGISTER_CLASS rc);
00384 void Replace_Global_Interference( LRANGE* old_lr, LRANGE* new_lr );
00385 BOOL Has_Multiple_Predecessors(void);
00386 BOOL Region_Is_Complement(void);
00387 void Add_LUNIT(LUNIT *lunit);
00388 void Make_Register_Used(ISA_REGISTER_CLASS rc, REGISTER reg,
00389 LRANGE* lrange = NULL, BOOL reclaim = FALSE);
00390 REGISTER_SET Registers_Used(ISA_REGISTER_CLASS rc);
00391 #ifdef KEY
00392 void Make_Register_Referenced(ISA_REGISTER_CLASS rc, REGISTER reg,
00393 LRANGE* lrange = NULL);
00394 REGISTER_SET Registers_Referenced(ISA_REGISTER_CLASS rc);
00395 #endif
00396 BOOL Spill_Above_Check(LRANGE *lrange);
00397 void Spill_Above_Set(LRANGE *lrange);
00398 void Spill_Above_Reset(LRANGE *lrange);
00399 BOOL Restore_Below_Check(LRANGE *lrange);
00400 void Restore_Below_Set(LRANGE *lrange);
00401 void Restore_Below_Reset(LRANGE *lrange);
00402 BOOL Is_Region_Block(BOOL swp_too);
00403 BOOL Is_Region_Entry_Block(void);
00404 void Check_Loop_Border(void);
00405 };
00406
00407
00408
00409 class GBB_MGR {
00410 INT32 one_set_counter;
00411 INT32 split_mark_counter;
00412 INT32 alloc_count;
00413 INT32 wired_local_count;
00414 BB_MAP map;
00415 BB_SET *blocks_with_calls;
00416 BB_SET *blocks_with_rot_reg_clob;
00417 #ifdef TARG_X8664
00418 BB_SET *blocks_with_x87_OP;
00419 BB_SET *blocks_with_mmx_OP;
00420 #endif
00421
00422 public:
00423 GBB_MGR(void) {};
00424 ~GBB_MGR(void) {};
00425
00426
00427 BB_SET *Blocks_With_Calls(void) { return blocks_with_calls; }
00428 BB_SET *Blocks_With_Rot_Reg_Clob(void){ return blocks_with_rot_reg_clob; }
00429 #ifdef TARG_X8664
00430 BB_SET *Blocks_With_x87_OP(void) { return blocks_with_x87_OP; }
00431 BB_SET *Blocks_With_mmx_OP(void) { return blocks_with_mmx_OP; }
00432 #endif
00433 void Incr_Wired_Local_Count(void) { ++wired_local_count; }
00434 INT Alloc_Count(void) { return alloc_count; }
00435
00436
00437 GRA_BB* Get( BB* bb ) { return (GRA_BB*) BB_MAP_Get(map,bb); }
00438
00439 void Clear_One_Set( void ) { ++one_set_counter; }
00440 BOOL One_Set_MemberP(GRA_BB *gbb){return gbb->one_set_mark== one_set_counter;}
00441 void One_Set_Union1(GRA_BB *gbb) { gbb->one_set_mark = one_set_counter; }
00442 void One_Set_Difference1(GRA_BB *gbb) {gbb->one_set_mark = one_set_counter-1;}
00443
00444
00445
00446
00447
00448 void Possibly_Clear_Split_Properties(GRA_BB *gbb) {
00449
00450
00451 if ( gbb->split_mark != split_mark_counter ) {
00452 gbb->split_mark = split_mark_counter;
00453 gbb->split_boolean_properties.i32 = 0;
00454 gbb->split_lunit = NULL;
00455 }
00456 }
00457 void Begin_Split(void) { ++split_mark_counter; }
00458
00459 BOOL Split_In_Alloc_LRANGE(GRA_BB *gbb) {
00460 return gbb->split_mark == split_mark_counter &&
00461 gbb->split_boolean_properties.mb.in_alloc_lrange; }
00462
00463
00464 void Split_In_Alloc_LRANGE_Set(GRA_BB *gbb) {
00465 Possibly_Clear_Split_Properties(gbb);
00466 gbb->split_boolean_properties.mb.in_alloc_lrange = TRUE; }
00467 void Split_In_Alloc_LRANGE_Clear(GRA_BB *gbb) {
00468 Possibly_Clear_Split_Properties(gbb);
00469 gbb->split_boolean_properties.mb.in_alloc_lrange = FALSE; }
00470 BOOL Split_Queued(GRA_BB *gbb) {
00471 return gbb->split_mark == split_mark_counter &&
00472 gbb->split_boolean_properties.mb.queued; }
00473
00474 void Split_Queued_Set(GRA_BB *gbb) {
00475 Possibly_Clear_Split_Properties(gbb);
00476 gbb->split_boolean_properties.mb.queued = TRUE; }
00477 BOOL Split_Has_Load(GRA_BB *gbb) {
00478 return gbb->split_mark == split_mark_counter &&
00479 gbb->split_boolean_properties.mb.has_load; }
00480
00481
00482
00483 void Split_Has_Load_Set(GRA_BB *gbb) {
00484 Possibly_Clear_Split_Properties(gbb);
00485 gbb->split_boolean_properties.mb.has_load = TRUE; }
00486 BOOL Split_Has_Store(GRA_BB *gbb) {
00487 return gbb->split_mark == split_mark_counter &&
00488 gbb->split_boolean_properties.mb.has_store; }
00489
00490
00491
00492 void Split_Has_Store_Set(GRA_BB *gbb) {
00493 Possibly_Clear_Split_Properties(gbb);
00494 gbb->split_boolean_properties.mb.has_store = TRUE; }
00495 LUNIT* Split_LUNIT(GRA_BB *gbb) {
00496 if ( gbb->split_mark != split_mark_counter )
00497 return NULL;
00498 else return gbb->split_lunit; }
00499
00500
00501
00502 void Split_LUNIT_Set(GRA_BB *gbb, LUNIT* lunit ) {
00503 Possibly_Clear_Split_Properties(gbb);
00504 gbb->split_lunit = lunit; }
00505
00506
00507
00508 void Initialize(void);
00509 void Finalize(void);
00510 GRA_BB* Create(BB *bb, GRA_REGION* region);
00511 };
00512
00513 extern GBB_MGR gbb_mgr;
00514 #ifdef TARG_X8664
00515 extern OP *gra_savexmms_op;
00516 #endif
00517
00518
00519 class GRA_BB_SPLIT_LIST_ITER {
00520 GRA_BB* current;
00521 public:
00522 GRA_BB_SPLIT_LIST_ITER(void) {}
00523 ~GRA_BB_SPLIT_LIST_ITER(void) {}
00524
00525 void Init(GRA_BB *gbb) { current = gbb; }
00526 BOOL Done(void) { return current == NULL; }
00527 GRA_BB *Current(void) { return current; }
00528 void Step(void) { current = current->split_list_next; }
00529 };
00530
00531
00532 class GRA_BB_OP_FORWARD_ITER {
00533 OP* current;
00534 public:
00535 GRA_BB_OP_FORWARD_ITER(void) {}
00536 ~GRA_BB_OP_FORWARD_ITER(void) {}
00537
00538 void Init(GRA_BB *gbb) { current = BB_first_op(gbb->Bb()); }
00539 BOOL Done(void) { return current == NULL; }
00540 OP *Current(void) { return current; }
00541 void Step(void) { current = OP_next(current); }
00542 };
00543
00544
00545 class GRA_BB_OP_BACKWARD_ITER {
00546 OP* current;
00547 public:
00548 GRA_BB_OP_BACKWARD_ITER(void) {}
00549 ~GRA_BB_OP_BACKWARD_ITER(void) {}
00550
00551 void Init(GRA_BB *gbb) { current = BB_last_op(gbb->Bb()); }
00552 BOOL Done(void) { return current == NULL; }
00553 OP *Current(void) { return current; }
00554 void Step(void) { current = OP_prev(current); }
00555 };
00556
00557
00558
00559 class GRA_BB_FLOW_NEIGHBOR_ITER {
00560 BBLIST* bblist;
00561 public:
00562 GRA_BB_FLOW_NEIGHBOR_ITER(void) {}
00563 ~GRA_BB_FLOW_NEIGHBOR_ITER(void) {}
00564
00565 void Succs_Init(GRA_BB *gbb) { bblist = BB_succs(gbb->Bb()); }
00566 void Preds_Init(GRA_BB *gbb) { bblist = BB_preds(gbb->Bb()); }
00567 BOOL Done(void) { return bblist == NULL; }
00568 GRA_BB *Current(void) { return gbb_mgr.Get(BBLIST_item(bblist)); }
00569 void Step(void) { bblist = BBLIST_next(bblist); }
00570 };
00571
00572
00573 class GRA_BB_RC_LUNIT_ITER: public LUNIT_BB_LIST_ITER {
00574 public:
00575 void Init(GRA_BB *gbb, ISA_REGISTER_CLASS rc) {
00576 LUNIT_BB_LIST_ITER::Init(gbb->lunits[rc]); }
00577 };
00578
00579
00580 class GRA_BB_LOCAL_LRANGE_ITER: public LRANGE_BB_LOCAL_LIST_ITER {
00581
00582
00583 public:
00584 void Init(GRA_BB *gbb, ISA_REGISTER_CLASS rc) {
00585 LRANGE_BB_LOCAL_LIST_ITER::Init(gbb->local_lranges[rc]);}
00586 };
00587
00588
00589 class GRA_BB_LIVE_OUT_LRANGE_ITER {
00590 TN* current_tn;
00591 BB* bb;
00592 public:
00593 GRA_BB_LIVE_OUT_LRANGE_ITER(void) {}
00594 ~GRA_BB_LIVE_OUT_LRANGE_ITER(void) {}
00595
00596 void Init(GRA_BB *gbb) {
00597 bb = gbb->bb;
00598 current_tn = GTN_SET_Intersection_Choose(BB_live_out(gbb->bb),
00599 BB_defreach_out(gbb->bb));
00600 while (current_tn != TN_SET_CHOOSE_FAILURE &&
00601 lrange_mgr.Get(current_tn) == NULL) {
00602 current_tn = GTN_SET_Intersection_Choose_Next(BB_live_out(gbb->bb),
00603 BB_defreach_out(gbb->bb), current_tn);
00604 }
00605 }
00606 BOOL Done(void) { return current_tn == TN_SET_CHOOSE_FAILURE; }
00607 LRANGE *Current(void) { return lrange_mgr.Get(current_tn); }
00608 void Step(void) {
00609 do {
00610 current_tn = GTN_SET_Intersection_Choose_Next(BB_live_out(bb),
00611 BB_defreach_out(bb), current_tn);
00612 }
00613 while (current_tn != TN_SET_CHOOSE_FAILURE &&
00614 lrange_mgr.Get(current_tn) == NULL );
00615 }
00616 };
00617
00618 #endif