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 #ifndef region_INCLUDED
00031 #define region_INCLUDED
00032
00033 #include "bb.h"
00034 #include "hb_tail_duplication.h"
00035 #include <stack>
00036 #include <vector>
00037 #include <list>
00038 #include <queue>
00039 #if (__GNUC__ ==3)
00040 using std::vector;
00041 using std::list;
00042 using std::stack;
00043 using std::queue;
00044 #endif // __GNUC__ == 3
00045
00046 #include "defs.h"
00047 #include "cxx_memory.h"
00048 #include "timing.h"
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 extern BB_MAP bb_node_map;
00065 class SCHEDULER;
00066 class REGION;
00067 class REGIONAL_CFG_NODE;
00068 class REGIONAL_CFG_EDGE;
00069 class TOPOLOGICAL_REGIONAL_CFG_ITER;
00070 class INNERMOST_REGION_FIRST_ITER;
00071 class INTERVAL_PROCESSOR;
00072 class SCC_FINDER;
00073
00074
00075
00076
00077 struct GLOBAL_CYCLE {
00078 BB *src;
00079 BB *dest;
00080 };
00081
00082
00083
00084
00085 struct RGN_SIZE {
00086 INT32 max_bb_num;
00087 INT32 max_op_num;
00088 };
00089
00090
00091
00092 struct RGN_FORM_PAR {
00093 float exit_prob;
00094 float dup_ratio;
00095 INT32 max_dup_num;
00096 RGN_SIZE size;
00097 };
00098
00099
00100
00101
00102 template <class POINT> struct EDGE_PROF;
00103 template <class POINT>
00104 struct EDGE_PROF {
00105 POINT src;
00106 POINT dest;
00107 float freq;
00108 float prob;
00109 };
00110
00111
00112
00113
00114 typedef EDGE_PROF<REGIONAL_CFG_NODE *> NODE_PROF;
00115 typedef mempool_allocator<NODE_PROF> PROF_ALLOC;
00116 typedef std::vector<NODE_PROF,PROF_ALLOC> NODE_PROF_VECTOR;
00117 typedef NODE_PROF_VECTOR::iterator NODE_PROF_VECTOR_ITER;
00118
00119
00120
00121
00122 typedef mempool_allocator<GLOBAL_CYCLE> GLOBAL_CYCLE_ALLOC;
00123 typedef std::vector<GLOBAL_CYCLE,GLOBAL_CYCLE_ALLOC> GLOBAL_CYCLE_VECTOR;
00124 typedef GLOBAL_CYCLE_VECTOR::iterator GLOBAL_CYCLE_VECTOR_ITER;
00125
00126 extern GLOBAL_CYCLE_VECTOR global_cycles;
00127
00128 typedef mempool_allocator<INT> INT_ALLOC;
00129 typedef std::vector<INT,INT_ALLOC> INT_VECTOR;
00130 typedef mempool_allocator<REGIONAL_CFG_NODE*> NODE_ALLOC;
00131 typedef std::vector<REGIONAL_CFG_NODE*,NODE_ALLOC> NODE_VECTOR;
00132
00133 typedef mempool_allocator<REGION*> REGION_ALLOC;
00134 typedef std::vector<REGION*,REGION_ALLOC> REGION_VECTOR;
00135 typedef REGION_VECTOR::iterator REGION_VECTOR_ITER;
00136 typedef REGION_VECTOR::const_iterator RGN_VECTOR_CONST_ITER;
00137
00138 typedef mempool_allocator<BB*> BB_ALLOC;
00139 typedef std::vector<BB*,BB_ALLOC> BB_VECTOR;
00140 typedef BB_VECTOR::iterator BB_VECTOR_ITER;
00141 typedef BB_VECTOR::const_iterator BB_VECTOR_CONST_ITER;
00142 typedef mempool_allocator<REGIONAL_CFG_EDGE*> EDGE_ALLOC;
00143 typedef std::vector<REGIONAL_CFG_EDGE*,EDGE_ALLOC> EDGE_VECTOR;
00144 typedef EDGE_VECTOR::iterator EDGE_VECTOR_ITER;
00145 typedef NODE_VECTOR::iterator NODE_VECTOR_ITER;
00146 typedef std::stack<REGIONAL_CFG_NODE*,NODE_VECTOR> NODE_STACK;
00147 typedef std::stack<REGIONAL_CFG_EDGE*,EDGE_VECTOR> EDGE_STACK;
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159 enum REGION_TYPE {
00160 UNKNOWN = 0x00,
00161 ROOT = 0x01,
00162 MEME = 0x02,
00163 SEME = 0x04,
00164 IMPROPER = 0x08,
00165 LOOP = 0x10
00166
00167 };
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 enum REGION_ATTRIBUTE {
00184 NONE = 0x00,
00185 NO_FURTHER_OPTIMIZATION = 0x01,
00186 RIGID = 0x02,
00187 PERSISTENT_BOUNDARY = 0x04,
00188 NO_OPTIMIZAION_ACROSS_BOUNDARY = 0x08
00189 };
00190
00191 extern BB *Copy_BB_For_Tail_Duplication(HB *hb,BB *old_bb);
00192
00193
00194
00195
00196
00197 void Create_BB_Node_Map(void);
00198 void Delete_BB_Node_Map(void);
00199
00200
00201
00202
00203
00204 NODE_VECTOR_ITER Find_In_Vector(REGIONAL_CFG_NODE *node,
00205 NODE_VECTOR& nodes);
00206 inline BB_VECTOR_ITER Find_In_BB_Vector(BB *bb,BB_VECTOR& bbs);
00207
00208 inline void Print_Node_Vector(NODE_VECTOR nodes);
00209 inline void Print_Ops_In_BB(BB *bb);
00210 inline void Print_BB_Vector(BB_VECTOR bbs);
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227 struct TEMP_RGN {
00228 NODE_VECTOR nodes;
00229 REGIONAL_CFG_NODE *main_entry;
00230 REGIONAL_CFG_NODE *main_exit;
00231 REGIONAL_CFG_NODE *seed;
00232 INT32 bb_num;
00233 INT32 op_num;
00234 INT32 dup_bb_num;
00235 INT32 dup_op_num;
00236 float seed_freq;
00237 float exit_prob;
00238 };
00239
00240 void Initialize_Temp_Rgn(TEMP_RGN& temp_rgn,MEM_POOL _m);
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252 class REGIONAL_CFG_EDGE {
00253
00254 friend class REGIONAL_CFG_NODE;
00255 friend class REGIONAL_CFG;
00256 friend class SCHEDULER;
00257
00258 private:
00259 REGIONAL_CFG_EDGE *_next_succ;
00260 REGIONAL_CFG_EDGE *_next_pred;
00261 REGIONAL_CFG_NODE *_src;
00262 REGIONAL_CFG_NODE *_dest;
00263
00264 float _freq;
00265 float _prob;
00266
00267 void Next_Succ(REGIONAL_CFG_EDGE *e) { _next_succ = e; }
00268 void Next_Pred(REGIONAL_CFG_EDGE *e) { _next_pred = e; }
00269
00270 float Freq(void) { return _freq; }
00271 void Freq(float freq) { _freq = freq; }
00272
00273 void Prob(float prob) { _prob = prob; }
00274
00275 public:
00276
00277 float Prob(void) const { return _prob; }
00278
00279 REGIONAL_CFG_EDGE(REGIONAL_CFG_NODE *v, REGIONAL_CFG_NODE *w) {
00280 _src = v;
00281 _dest = w;
00282 _prob = 0;
00283 _freq = 0;
00284 _next_succ = 0;
00285 _next_pred = 0;
00286 }
00287
00288 ~REGIONAL_CFG_EDGE() {}
00289
00290 REGIONAL_CFG_EDGE *Next_Succ(void) { return _next_succ; };
00291 REGIONAL_CFG_EDGE *Next_Pred(void) { return _next_pred; };
00292 REGIONAL_CFG_NODE *Src(void) { return _src; };
00293 REGIONAL_CFG_NODE *Dest(void) { return _dest; };
00294
00295 void Print(FILE *f = stderr);
00296 };
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310 class REGIONAL_CFG_NODE {
00311
00312 friend class REGIONAL_CFG;
00313 friend class SCHEDULER;
00314 friend BB *RGN_Divide_BB(BB *bb, OP *point);
00315 private:
00316 union source_node {
00317 REGION *r;
00318 BB *bb;
00319 } _node;
00320
00321 INT32 _id;
00322 INT32 _n_succ;
00323 INT32 _n_pred;
00324
00325 BOOL _is_region;
00326 BOOL _is_exit;
00327 BOOL _is_entry;
00328
00329 REGIONAL_CFG_EDGE *_first_succ;
00330 REGIONAL_CFG_EDGE *_first_pred;
00331 REGION *_home_r;
00332 float _freq;
00333
00334 void Connect_Succ_Edge(REGIONAL_CFG_EDGE *e) {
00335 ++_n_succ;
00336 e->Next_Succ(_first_succ);
00337 _first_succ = e;
00338 }
00339
00340 void Connect_Pred_Edge(REGIONAL_CFG_EDGE *e) {
00341 ++_n_pred;
00342 e->Next_Pred(_first_pred);
00343 _first_pred = e;
00344 }
00345
00346 void Disconnect_Succ_Edge(REGIONAL_CFG_EDGE *e) {
00347 REGIONAL_CFG_EDGE *t;
00348
00349 if (_first_succ == e) {
00350 _first_succ = _first_succ->Next_Succ();
00351 --_n_succ;
00352 return;
00353 }
00354
00355 for (t = _first_succ; (t != 0)&&(t->Next_Succ() != e);
00356 t = t->Next_Succ());
00357
00358 if (t != 0) {
00359 t->Next_Succ(e->Next_Succ());
00360 --_n_succ;
00361 }
00362 }
00363
00364 void Disconnect_Pred_Edge(REGIONAL_CFG_EDGE *e) {
00365 REGIONAL_CFG_EDGE *t;
00366
00367 if (_first_pred == e) {
00368 _first_pred = _first_pred->Next_Pred();
00369 --_n_pred;
00370 return;
00371 }
00372
00373 for (t = _first_pred; (t != 0)&&(t->Next_Pred() != e);
00374 t = t->Next_Pred());
00375
00376 if (t != 0) {
00377 t->Next_Pred(e->Next_Pred());
00378 --_n_pred;
00379 }
00380 }
00381
00382 void Freq(float freq) { _freq = freq; }
00383
00384 void Is_Entry(BOOL is) { _is_entry = is; }
00385 void Is_Exit(BOOL is) { _is_exit = is; }
00386 void Set_Is_Entry(BOOL is) { _is_entry = is; }
00387 void Set_Is_Exit(BOOL is) { _is_exit = is; }
00388 public:
00389
00390 REGIONAL_CFG_NODE(BB *bb) {
00391 _node.bb = bb;
00392 _n_succ = _n_pred = 0;
00393 _first_succ = _first_pred = NULL;
00394 _is_exit = _is_entry = FALSE;
00395 _is_region = FALSE;
00396 _home_r = NULL;
00397 }
00398
00399 REGIONAL_CFG_NODE(REGION *r) {
00400 _node.r = r;
00401 _n_succ = _n_pred = 0;
00402 _first_succ = _first_pred = NULL;
00403 _is_exit = _is_entry = FALSE;
00404 _is_region = TRUE;
00405 _home_r = NULL;
00406 }
00407
00408 ~REGIONAL_CFG_NODE() {}
00409
00410 REGION *Region_Node(void) {
00411 Is_True((_is_region == TRUE), ("REGIONAL_CFG_NODE::Node is not a region"));
00412
00413 return _node.r;
00414 }
00415
00416 BB *BB_Node(void) {
00417
00418 Is_True((_is_region == FALSE), ("REGIONAL_CFG_NODE::Node %d is not a bb",_id));
00419
00420 return _node.bb;
00421 }
00422
00423 REGIONAL_CFG_EDGE *Find_Succ_Edge(REGIONAL_CFG_NODE *node) {
00424 REGIONAL_CFG_EDGE *e;
00425
00426 for (e =_first_succ; (e->Dest() != node)&&(e != 0);
00427 e = e->Next_Succ());
00428
00429 return e;
00430 }
00431
00432 REGIONAL_CFG_EDGE *Find_Pred_Edge(REGIONAL_CFG_NODE *node) {
00433 REGIONAL_CFG_EDGE *e;
00434
00435 for (e =_first_pred; (e->Src() != node)&&(e != 0);
00436 e = e->Next_Pred());
00437
00438 return e;
00439 }
00440
00441
00442
00443
00444 REGIONAL_CFG_NODE *Unique_Succ(void) {
00445 if (_n_succ == 1) {
00446 return _first_succ->Dest();
00447 }
00448
00449 return NULL;
00450 }
00451
00452
00453
00454
00455 REGIONAL_CFG_NODE *Unique_Pred(void) {
00456 if (_n_pred == 1) {
00457 return _first_pred->Src();
00458 }
00459
00460 return NULL;
00461 }
00462
00463
00464
00465 INT32 Succ_Num(void) const { return _n_succ; }
00466 INT32 Pred_Num(void) const { return _n_pred; }
00467
00468
00469
00470 INT32 Id(void) const { return _id; }
00471
00472 REGIONAL_CFG_EDGE *First_Succ(void) const { return _first_succ; }
00473 REGIONAL_CFG_EDGE *First_Pred(void) const { return _first_pred; }
00474 BOOL Is_Region(void) const { return _is_region; }
00475
00476
00477
00478 REGION *Home_Region(void) const { return _home_r; }
00479
00480
00481
00482 BOOL Is_Entry(void) const { return _is_entry; }
00483 BOOL Is_Exit(void) const { return _is_exit; }
00484 void Id(INT32 id) { _id = id; }
00485 float Freq(void) { return _freq; }
00486
00487 void Print(FILE *f = stderr);
00488 BOOL Is_Loop_Head(void);
00489 BOOL Is_Loop_Tail(void);
00490
00491 };
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505 class REGIONAL_CFG_MEM {
00506
00507 protected:
00508 MEM_POOL _m;
00509
00510 REGIONAL_CFG_MEM() {
00511 MEM_POOL_Initialize( &_m, "REGIONAL_CFG_MEM", true );
00512 MEM_POOL_Push( &_m );
00513 }
00514
00515 ~REGIONAL_CFG_MEM() {
00516 MEM_POOL_Pop( &_m );
00517 MEM_POOL_Delete(&_m );
00518 }
00519 };
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533 class REGIONAL_CFG : public REGIONAL_CFG_MEM{
00534
00535 friend class TOPOLOGICAL_REGIONAL_CFG_ITER;
00536 friend class PREORDER_REGIONAL_CFG_ITER;
00537
00538 friend class REGION;
00539 friend class REGION_TREE;
00540 friend class INTERVAL_PROCESSOR;
00541 friend class SCC_FINDER;
00542 friend class REVERSE_TOPO_REGIONAL_CFG_ITER;
00543 friend class SEQ_REGIONAL_CFG_ITER;
00544 friend class REGION_LOOP_UPDATE;
00545
00546 friend class SCHEDULER;
00547 friend class CG_VALUE_INSTRUMENT_WALKER;
00548
00549
00550
00551 friend void RGN_Gen_And_Insert_Node(BB *new_bb,BB *pred_bb, BB *succ_bb,
00552 REGIONAL_CFG *regional_cfg);
00553 friend BB *RGN_Gen_And_Insert_BB_After(BB *point,REGIONAL_CFG *regional_cfg);
00554 friend BB *RGN_Gen_And_Insert_BB_Before(BB *point, REGIONAL_CFG *regional_cfg);
00555 friend void RGN_Remove_BB_And_Edges(BB *bb, REGIONAL_CFG *regional_cfg);
00556 friend void Add_Regional_Cfg_Edge(REGIONAL_CFG_NODE *pred, REGIONAL_CFG_NODE *succ, REGION *rgn);
00557 friend void Del_Regional_Cfg_Edge(REGIONAL_CFG_NODE *pred, REGIONAL_CFG_NODE *succ, REGION *rgn);
00558 friend void RGN_Link_Pred_Succ_With_Prob(BB *pred, BB *succ, float prob,
00559 REGIONAL_CFG *regional_cfg);
00560 friend void RGN_Unlink_Pred_Succ(BB *pred, BB *succ, REGIONAL_CFG *regional_cfg);
00561 friend void RGN_Add_Regional_Cfg_Edge(BB *pred,BB *succ,REGIONAL_CFG *cfg);
00562 friend void RGN_Del_Regional_Cfg_Edge(BB *pred,BB *succ,REGIONAL_CFG *cfg);
00563 friend void Collect_Entry_BBs(REGION *rgn, BB_VECTOR *entries);
00564 friend void Collect_Exit_BBs(REGION *rgn, BB_VECTOR *exits);
00565 friend BB *RGN_Divide_BB(BB *bb, OP *point);
00566
00567
00568
00569 friend void Verify_Cfg(REGIONAL_CFG *cfg);
00570 friend void Verify_SEME_Region(REGION *r);
00571 friend void Verify_Node(REGIONAL_CFG_NODE *node,REGION *rgn);
00572 friend INT Edge_Counter(REGIONAL_CFG_NODE *src,REGIONAL_CFG_NODE *dest,REGIONAL_CFG *cfg);
00573
00574 private:
00575 NODE_VECTOR _exits;
00576 NODE_VECTOR _entries;
00577
00578
00579
00580 NODE_VECTOR _node_set;
00581
00582
00583
00584
00585 INT32 _seq_num;
00586
00587 REGION *_r;
00588 BOOL _exits_entries_valid;
00589
00590
00591
00592
00593 BOOL _freq_valid;
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603 void Insert(REGIONAL_CFG_NODE *node) {
00604 _node_set.push_back(node);
00605 _seq_num++;
00606 node->Id(_seq_num);
00607 node->_home_r = _r;
00608 }
00609
00610
00611
00612
00613
00614
00615
00616
00617 void Erase(REGIONAL_CFG_NODE *node) {
00618 NODE_VECTOR_ITER iter;
00619
00620 for (iter = _node_set.begin(); iter != _node_set.end(); iter++) {
00621
00622 if (*iter == node) {
00623 _node_set.erase(iter);
00624
00625 break;
00626 }
00627 }
00628
00629 node->_home_r = NULL;
00630 }
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640 REGIONAL_CFG_NODE *Add_Node(REGION *r);
00641
00642 REGIONAL_CFG_NODE *Add_Node(BB *bb);
00643
00644 void Del_Node(REGIONAL_CFG_NODE *v);
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654 REGIONAL_CFG_EDGE *Add_Edge(REGIONAL_CFG_NODE *v, REGIONAL_CFG_NODE *w) {
00655
00656 for (REGIONAL_CFG_EDGE *succ = v->_first_succ;succ != NULL;succ = succ->_next_succ) {
00657 if ((succ->Dest()) == w) {
00658 return succ;
00659 }
00660 }
00661
00662 REGIONAL_CFG_EDGE *e = CXX_NEW(REGIONAL_CFG_EDGE(v, w),&_m);
00663 v->Connect_Succ_Edge(e);
00664 w->Connect_Pred_Edge(e);
00665
00666 _freq_valid = FALSE;
00667
00668 return e;
00669 }
00670
00671
00672
00673
00674
00675
00676
00677
00678 void Del_Edge(REGIONAL_CFG_EDGE *e) {
00679 e->Src()->Disconnect_Succ_Edge(e);
00680 e->Dest()->Disconnect_Pred_Edge(e);
00681 CXX_DELETE(e,&_m);
00682
00683
00684
00685 _freq_valid = FALSE;
00686 }
00687
00688
00689
00690
00691 void Find_MEME_Nodes(TEMP_RGN& meme_rgn,RGN_SIZE size,
00692 NODE_VECTOR bad_nodes);
00693
00694
00695
00696
00697 void Find_SEME_Nodes(TEMP_RGN& seme_rgn,RGN_FORM_PAR par,
00698 NODE_VECTOR bad_nodes);
00699
00700
00701
00702
00703 float Compute_Completion_Prob(NODE_VECTOR meme_nodes,
00704 REGIONAL_CFG_NODE *exit,
00705 REGIONAL_CFG_NODE *main_entry);
00706
00707
00708
00709
00710 void Compute_Scope_Based_On_Main_Exit(NODE_VECTOR& temp_seme,
00711 NODE_VECTOR meme_nodes,REGIONAL_CFG_NODE *exit);
00712
00713
00714
00715
00716 float Compute_Duplicate_Ratio(NODE_VECTOR nodes,
00717 NODE_VECTOR& duplicated,
00718 INT32 max_bb_num,INT32 max_dup_num);
00719
00720
00721
00722
00723 void Tail_Duplicate(NODE_VECTOR& nodes,
00724 REGIONAL_CFG_NODE *main_entry,
00725 INT32& dup_bb_num,INT32& dup_op_num,BOOL re_shrink);
00726
00727
00728
00729
00730 void Compute_Edges_Freq(void);
00731
00732
00733
00734
00735 void Compute_Side_Entries(NODE_VECTOR& side_entries,
00736 NODE_VECTOR meme_nodes,REGIONAL_CFG_NODE *main_entry);
00737
00738
00739
00740
00741 REGIONAL_CFG_NODE *Find_Seed(NODE_VECTOR bad_nodes);
00742
00743
00744
00745
00746 float Compute_Nodes_Weight(NODE_VECTOR nodes);
00747
00748
00749
00750
00751 INT32 Do_Selective_Add(NODE_VECTOR& nodes,
00752 NODE_VECTOR duplicate,NODE_VECTOR& leaf_nodes,
00753 REGIONAL_CFG_NODE *main_exit,
00754 REGIONAL_CFG_NODE *main_entry,
00755 INT32 op_num,RGN_FORM_PAR par);
00756
00757
00758
00759 BOOL Do_Selective_Cut(NODE_VECTOR& nodes,
00760 REGIONAL_CFG_NODE *main_entry,
00761 REGIONAL_CFG_NODE *main_exit,
00762 RGN_FORM_PAR par);
00763
00764
00765
00766
00767 void Compute_Exits(NODE_VECTOR nodes,NODE_VECTOR& exits);
00768
00769
00770
00771
00772 void Compute_Nodes_To_Be_Duplicated(NODE_VECTOR& dup,
00773 NODE_VECTOR nodes,REGIONAL_CFG_NODE *main_entry);
00774
00775
00776
00777
00778 INT32 Compute_Num_Of_Ops(NODE_VECTOR nodes,BOOL is_dup);
00779
00780
00781
00782
00783 void Compute_BBs_In_Region_Node(BB_VECTOR& bbs,REGIONAL_CFG_NODE *node);
00784
00785
00786
00787
00788 void Find_BBs_From_Nodes(BB_VECTOR& bbs,NODE_VECTOR nodes);
00789
00790
00791
00792
00793 void Compute_BBs_Need_Duplicate(BB_VECTOR& need_duplicate,
00794 BS *unduplicated,NODE_VECTOR dup);
00795
00796
00797
00798
00799
00800
00801
00802
00803 void Duplicate(BB_VECTOR bbs, BB* side_entrance,
00804 BB *entry,BB_MAP duplicate,BB_MAP rev_duplicate,
00805 BB** last,BB_VECTOR& duplicate_bbs,BB_VECTOR& br_bbs);
00806
00807
00808
00809
00810 void Fixup_Arcs(BB_VECTOR& bbs,BB *old_bb,BB *new_bb,
00811 BB *entry,BB_MAP duplicate,BB **fall_thru,
00812 BB_VECTOR& duplicate_bbs,BB_VECTOR& br_bbs);
00813
00814
00815
00816
00817
00818 void Update_BB_Prof_Info(BB_VECTOR bbs,BB_VECTOR dup,
00819 BB_MAP duplicate,BB_MAP rev_duplicate,
00820 BB_VECTOR br_bbs,BB *main_entry);
00821
00822
00823
00824
00825 void Compute_Node_Prof_Info(NODE_VECTOR nodes,NODE_VECTOR dup,
00826 REGIONAL_CFG_NODE *main_entry,
00827 NODE_PROF_VECTOR& node_profs);
00828
00829 void Add_BBS_And_Edges(BB_VECTOR bbs,
00830 NODE_VECTOR *new_nodes = NULL);
00831
00832 REGIONAL_CFG_EDGE *Select_Freq_Succ(REGIONAL_CFG_NODE *node,
00833 NODE_VECTOR nodes);
00834
00835 REGIONAL_CFG_EDGE *Select_Freq_Pred(REGIONAL_CFG_NODE *node, NODE_VECTOR nodes,NODE_VECTOR bad_nodes);
00836
00837 REGIONAL_CFG_NODE *Select_Freq_Connected_Node(NODE_VECTOR nodes, REGIONAL_CFG_NODE *last_node);
00838
00839 BOOL Succ_Suit(REGIONAL_CFG_EDGE *edge,float seed_prob, float T,float Ts);
00840
00841 BOOL Pred_Suit(REGIONAL_CFG_EDGE *edge,float seed_prob,
00842 float T,float Ts);
00843
00844 BOOL Is_Unwanted_Node(REGIONAL_CFG_NODE *node);
00845 BOOL BB_Not_Suit_Duplicate(BB *bb);
00846 void Add_To_Exits(REGIONAL_CFG_NODE *node);
00847 void Add_To_Entries(REGIONAL_CFG_NODE *node);
00848 void Remove_From_Exits(REGIONAL_CFG_NODE *node);
00849 void Remove_From_Entries(REGIONAL_CFG_NODE *node);
00850
00851 INT Num_Of_Entries(void) { return _entries.size(); }
00852 INT Num_Of_Exits(void) { return _exits.size(); }
00853
00854 BOOL ARN_Is_Log_If(BB *bb);
00855 public:
00856 REGIONAL_CFG():
00857 _node_set(NODE_ALLOC(&_m)),
00858 _exits(NODE_ALLOC(&_m)),
00859 _entries(NODE_ALLOC(&_m)) {
00860 _seq_num = 0;
00861 _freq_valid = FALSE; }
00862
00863 ~REGIONAL_CFG() {}
00864
00865 float Edge_Freq(REGIONAL_CFG_EDGE *edge) {
00866 if (_freq_valid) {
00867
00868 return edge->Freq();
00869 } else {
00870 Compute_Edges_Freq();
00871 _freq_valid = TRUE;
00872
00873 return edge->Freq();
00874 }
00875 }
00876
00877 float Edge_Prob(REGIONAL_CFG_EDGE *edge) {
00878 if (_freq_valid) {
00879 return edge->Prob();
00880 } else {
00881 Compute_Edges_Freq();
00882 _freq_valid = TRUE;
00883
00884 return edge->Prob();
00885 }
00886 }
00887
00888 float Node_Freq(REGIONAL_CFG_NODE *node) {
00889 if (_freq_valid) {
00890 return node->Freq();
00891 } else {
00892 Compute_Edges_Freq();
00893 _freq_valid = TRUE;
00894
00895 return node->Freq();
00896 }
00897 }
00898
00899 REGIONAL_CFG_EDGE *Find_Edge(REGIONAL_CFG_NODE *v,REGIONAL_CFG_NODE *w);
00900
00901 NODE_VECTOR Node_Set(void) { return _node_set; }
00902 INT32 Seq_Num(void) { return _seq_num; }
00903
00904 void Print(FILE *f = stderr);
00905 };
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921 class CFG_SUCC_NODE_ITER {
00922
00923 private:
00924 REGIONAL_CFG_EDGE *_cur;
00925
00926 public:
00927 CFG_SUCC_NODE_ITER(REGIONAL_CFG_NODE *v) {
00928 _cur = v->First_Succ();
00929 }
00930
00931 ~CFG_SUCC_NODE_ITER() {}
00932
00933 CFG_SUCC_NODE_ITER &operator ++(void) {
00934 _cur = _cur->Next_Succ();
00935 return *this;
00936 }
00937
00938 REGIONAL_CFG_NODE *operator *(void) {
00939 return _cur->Dest();
00940 }
00941
00942 friend BOOL operator ==(const CFG_SUCC_NODE_ITER& x,
00943 const CFG_SUCC_NODE_ITER& y) {
00944 return x._cur == y._cur;
00945 }
00946
00947 BOOL operator !=(INT){
00948 return _cur!=0;
00949 }
00950 };
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966 class CFG_PRED_NODE_ITER {
00967
00968 private:
00969 REGIONAL_CFG_EDGE *_cur;
00970
00971 public:
00972 CFG_PRED_NODE_ITER(REGIONAL_CFG_NODE *v) {
00973 _cur = v->First_Pred();
00974 }
00975
00976 ~CFG_PRED_NODE_ITER() {}
00977
00978 CFG_PRED_NODE_ITER &operator ++(void) {
00979 _cur = _cur->Next_Pred();
00980 return *this;
00981 }
00982
00983 REGIONAL_CFG_NODE *operator *(void) {
00984 return _cur->Src();
00985 }
00986
00987 friend BOOL operator ==(const CFG_PRED_NODE_ITER& x,
00988 const CFG_PRED_NODE_ITER& y) {
00989 return x._cur == y._cur;
00990 }
00991
00992 BOOL operator !=(INT) {
00993 return _cur!=0;
00994 }
00995 };
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009
01010
01011 class CFG_PRED_EDGE_ITER {
01012
01013 private:
01014 REGIONAL_CFG_EDGE *_cur;
01015
01016 public:
01017 CFG_PRED_EDGE_ITER(REGIONAL_CFG_NODE *v) {
01018 _cur = v->First_Pred();
01019 }
01020
01021 ~CFG_PRED_EDGE_ITER() {}
01022
01023 CFG_PRED_EDGE_ITER &operator ++(void) {
01024 _cur = _cur->Next_Pred();
01025 return *this;
01026 }
01027
01028 REGIONAL_CFG_EDGE *operator *(void) {
01029 return _cur;
01030 }
01031
01032 friend BOOL operator ==(const CFG_PRED_EDGE_ITER& x,
01033 const CFG_PRED_EDGE_ITER& y) {
01034 return x._cur == y._cur;
01035 }
01036
01037 BOOL operator !=(INT) {
01038 return _cur != 0;
01039 }
01040 };
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056 class CFG_SUCC_EDGE_ITER {
01057
01058 private:
01059 REGIONAL_CFG_EDGE *_cur;
01060
01061 public:
01062 CFG_SUCC_EDGE_ITER(REGIONAL_CFG_NODE *v) {
01063 _cur = v->First_Succ();
01064 }
01065
01066 ~CFG_SUCC_EDGE_ITER() {}
01067
01068 CFG_SUCC_EDGE_ITER &operator ++(void) {
01069 _cur = _cur->Next_Succ();
01070 return *this;
01071 }
01072
01073 REGIONAL_CFG_EDGE *operator *(void) {
01074 return _cur;
01075 }
01076
01077 friend BOOL operator ==(const CFG_SUCC_EDGE_ITER& x,
01078 const CFG_SUCC_EDGE_ITER& y) {
01079 return x._cur == y._cur;
01080 }
01081
01082 BOOL operator !=(INT) {
01083 return _cur != 0;
01084 }
01085 };
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100
01101
01102
01103
01104 class TOPOLOGICAL_REGIONAL_CFG_ITER_MEM {
01105
01106 protected:
01107 MEM_POOL _m;
01108
01109 TOPOLOGICAL_REGIONAL_CFG_ITER_MEM() {
01110 MEM_POOL_Initialize( &_m, "TOPOLOGICAL_REGIONAL_CFG_ITER_MEM", true );
01111 MEM_POOL_Push( &_m );
01112 }
01113
01114 ~TOPOLOGICAL_REGIONAL_CFG_ITER_MEM() {
01115 MEM_POOL_Pop( &_m );
01116 MEM_POOL_Delete(&_m );
01117 }
01118 };
01119
01120 class TOPOLOGICAL_REGIONAL_CFG_ITER : public TOPOLOGICAL_REGIONAL_CFG_ITER_MEM {
01121
01122 typedef std::list< REGIONAL_CFG_NODE *,NODE_ALLOC > NODE_LIST;
01123 typedef std::queue< REGIONAL_CFG_NODE *,NODE_LIST > NODE_QUEUE;
01124
01125 private:
01126 BS* _visited_s;
01127 NODE_QUEUE _candi_s;
01128 REGIONAL_CFG_NODE *_cur;
01129
01130
01131 BOOL Visited(REGIONAL_CFG_NODE *node) {
01132 return BS_MemberP(_visited_s,node->Id());
01133 }
01134
01135 void Set_Visited(REGIONAL_CFG_NODE *node) {
01136 if (node) {
01137 BS_Union1D(_visited_s,node->Id(),&_m);
01138 } else {
01139 DevWarn("The CFG is empty!");
01140 }
01141 }
01142
01143 void Set_Cur(REGIONAL_CFG *cfg);
01144
01145 public:
01146 TOPOLOGICAL_REGIONAL_CFG_ITER(REGIONAL_CFG *cfg):
01147 _candi_s(NODE_LIST(NODE_ALLOC(&_m))){
01148 _visited_s = BS_Create_Empty(cfg->_seq_num+2, &_m);
01149 Set_Cur(cfg);
01150 }
01151
01152 ~TOPOLOGICAL_REGIONAL_CFG_ITER() {}
01153
01154
01155 TOPOLOGICAL_REGIONAL_CFG_ITER &operator ++(void);
01156 BOOL operator!=(INT) { return _cur != NULL;}
01157 REGIONAL_CFG_NODE *operator *(void) { return _cur; }
01158
01159 };
01160
01161
01162
01163
01164
01165
01166
01167
01168
01169
01170
01171
01172
01173
01174
01175
01176
01177
01178 class REVERSE_TOPO_REGIONAL_CFG_ITER {
01179
01180 typedef std::list<REGIONAL_CFG_NODE *,NODE_ALLOC> NODE_LIST;
01181 typedef std::queue<REGIONAL_CFG_NODE *,NODE_LIST> NODE_QUEUE;
01182
01183 private:
01184 NODE_VECTOR _visited_s;
01185 NODE_QUEUE _candi_s;
01186 REGIONAL_CFG_NODE *_cur;
01187
01188 BOOL Visited(REGIONAL_CFG_NODE *node) {
01189 NODE_VECTOR_ITER iter;
01190
01191 for (iter = _visited_s.begin(); iter != _visited_s.end(); iter++) {
01192 if (*iter == node) return TRUE;
01193 }
01194
01195 return FALSE;
01196 }
01197
01198 void Set_Visited(REGIONAL_CFG_NODE *node) {
01199 _visited_s.push_back(node);
01200 }
01201
01202 void Set_Cur(REGIONAL_CFG *cfg);
01203
01204 public:
01205 REVERSE_TOPO_REGIONAL_CFG_ITER(REGIONAL_CFG *cfg):
01206 _visited_s(NODE_ALLOC(&(cfg->_m))),
01207 _candi_s(NODE_LIST(NODE_ALLOC(&(cfg->_m)))) {
01208 Set_Cur(cfg);
01209 }
01210
01211 ~REVERSE_TOPO_REGIONAL_CFG_ITER() {}
01212
01213
01214 REVERSE_TOPO_REGIONAL_CFG_ITER &operator ++(void);
01215 BOOL operator!=(INT) { return _cur != NULL;}
01216 REGIONAL_CFG_NODE *operator *(void) { return _cur; }
01217
01218 };
01219
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233
01234
01235
01236 class PREORDER_REGIONAL_CFG_ITER {
01237
01238 typedef std::list<REGIONAL_CFG_NODE *,NODE_ALLOC> NODE_LIST;
01239 typedef std::queue<REGIONAL_CFG_NODE *,NODE_LIST> NODE_QUEUE;
01240
01241 private:
01242 NODE_VECTOR _visited_s;
01243 NODE_QUEUE _candi_s;
01244 REGIONAL_CFG_NODE *_cur;
01245
01246 BOOL Visited(REGIONAL_CFG_NODE *node) {
01247 NODE_VECTOR_ITER iter;
01248
01249 for (iter = _visited_s.begin(); iter != _visited_s.end(); iter++) {
01250 if (*iter == node) return TRUE;
01251 }
01252
01253 return FALSE;
01254 }
01255
01256 void Set_Visited(REGIONAL_CFG_NODE *node) {
01257 _visited_s.push_back(node);
01258 }
01259 void Set_Cur(REGIONAL_CFG *cfg);
01260
01261 public:
01262 PREORDER_REGIONAL_CFG_ITER(REGIONAL_CFG *cfg):
01263 _visited_s(NODE_ALLOC(&(cfg->_m))),
01264 _candi_s(NODE_LIST(NODE_ALLOC(&(cfg->_m)))){
01265 Set_Cur(cfg);
01266 }
01267
01268 ~PREORDER_REGIONAL_CFG_ITER() {}
01269
01270
01271 PREORDER_REGIONAL_CFG_ITER &operator ++(void);
01272 BOOL operator!=(INT) { return _cur != NULL;}
01273 REGIONAL_CFG_NODE *operator *(void) { return _cur; }
01274
01275 };
01276
01277
01278
01279
01280
01281
01282
01283
01284
01285
01286
01287
01288
01289
01290
01291 class SEQ_REGIONAL_CFG_ITER {
01292 private:
01293 NODE_VECTOR *_nodes;
01294 NODE_VECTOR_ITER _cur;
01295
01296 public:
01297 SEQ_REGIONAL_CFG_ITER(REGIONAL_CFG *cfg){
01298 _nodes = &(cfg->_node_set);
01299 _cur = _nodes->begin();
01300 }
01301
01302 ~SEQ_REGIONAL_CFG_ITER() {}
01303
01304
01305 SEQ_REGIONAL_CFG_ITER &operator ++(void) { _cur++;}
01306 BOOL operator!=(INT) { return _cur != _nodes->end();}
01307 REGIONAL_CFG_NODE *operator *(void) { return *_cur; }
01308
01309 };
01310
01311
01312
01313
01314
01315
01316
01317
01318
01319
01320
01321
01322
01323
01324
01325
01326
01327
01328
01329
01330 class REGION_TREE;
01331 class REGION {
01332
01333 friend class REGION_TREE;
01334 friend class REGION_LOOP_UPDATE;
01335 friend class SCHEDULER;
01336
01337 private:
01338 BB *Edge_Splitting(BB *from_bb, BB *to_bb);
01339
01340 protected:
01341 REGIONAL_CFG _cfg;
01342
01343
01344
01345 REGION *_first_kid;
01346 REGION *_parent;
01347 REGION *_next_sibling;
01348 REGION *_prev_sibling;
01349 REGION_TREE *_tree;
01350
01351 INT32 _level;
01352 INT32 _n_kids;
01353 INT32 _id;
01354 REGION_TYPE _type;
01355 INT16 _attribute;
01356
01357 REGIONAL_CFG_NODE *_node;
01358
01359 void Attribute(REGION_ATTRIBUTE attr,BOOL set=1) {
01360 if (set) {
01361 _attribute |= attr;
01362 } else {
01363 _attribute &= ~attr;
01364 }
01365 }
01366
01367 public:
01368 REGION()
01369 {
01370
01371 _first_kid = _parent = NULL;
01372 _level = _n_kids = 0;
01373 _prev_sibling = _next_sibling = NULL;
01374 _node = NULL;
01375 _tree = NULL;
01376 _id = 0;
01377 _type = UNKNOWN;
01378 _cfg._r = this;
01379 }
01380
01381 REGION(REGIONAL_CFG *cfg);
01382 ~REGION() {}
01383
01384 REGION_TYPE Region_Type() { return _type; }
01385 void Region_Type(REGION_TYPE type) { _type = type; }
01386
01387
01388
01389 REGIONAL_CFG *Regional_Cfg(void) { return &_cfg; }
01390
01391 REGION *First_Kid(void) { return _first_kid; }
01392 REGION *Next_Sibling(void) { return _next_sibling; }
01393 REGION *Prev_Sibling(void) { return _prev_sibling; }
01394 REGION *Parent(void) { return _parent; }
01395 REGION_TREE *Tree(void) { return _tree; }
01396 INT32 N_Kids(void) { return _n_kids; }
01397 INT32 Level(void) { return _level; }
01398 INT32 Id(void) { return _id; }
01399 INT16 Attribute(void) { return _attribute; }
01400 void Id(INT32 id) { _id = id; }
01401
01402 NODE_VECTOR Exits(void) { return _cfg._exits; }
01403 NODE_VECTOR Entries(void) { return _cfg._entries; }
01404
01405 BOOL Is_Rigid(void) { return _attribute&RIGID; }
01406 BOOL Is_No_Further_Opt(void) { return _attribute&NO_FURTHER_OPTIMIZATION; }
01407 BOOL Is_Persist_Bound(void) { return _attribute&PERSISTENT_BOUNDARY; }
01408 BOOL Is_No_Opt_Across(void) { return _attribute&NO_OPTIMIZAION_ACROSS_BOUNDARY; }
01409
01410 REGIONAL_CFG_NODE *Regional_Cfg_Node(void) { return _node; }
01411 void Regional_Cfg_Node(REGIONAL_CFG_NODE *node) {
01412 _node = node;
01413 }
01414
01415
01416
01417
01418
01419
01420
01421
01422
01423 void Add_Kid(REGION *r) {
01424 ++_n_kids;
01425 r->_next_sibling = _first_kid;
01426
01427 if (_first_kid != NULL) {
01428 _first_kid->_prev_sibling = r;
01429 _first_kid = r;
01430 } else {
01431 _first_kid = r;
01432 r->_prev_sibling = NULL;
01433 }
01434
01435 r->_parent = this;
01436 }
01437
01438
01439
01440
01441
01442
01443
01444
01445
01446 void Del_Kid(REGION *r) {
01447 REGION *t;
01448
01449 if (_first_kid == r) {
01450 _first_kid = _first_kid->_next_sibling;
01451 if (_first_kid != NULL) {
01452 _first_kid->_prev_sibling = NULL;
01453 }
01454 r->_parent = NULL;
01455 --_n_kids;
01456 return;
01457 }
01458
01459 for (t = _first_kid; ((t->_next_sibling != r)&&(t != NULL));
01460 t = t->_next_sibling);
01461
01462 if (t != NULL) {
01463 t->_next_sibling = r->_next_sibling;
01464 r->_prev_sibling = t->_prev_sibling;
01465 r->_parent = NULL;
01466 --_n_kids;
01467 }
01468 }
01469
01470
01471
01472
01473
01474
01475
01476
01477
01478 REGION *Find_Common_Parent(REGION *r);
01479
01480
01481
01482
01483
01484
01485
01486
01487 BOOL Is_Contained_By(REGION *r);
01488
01489
01490
01491
01492
01493
01494
01495 BOOL Is_Kid_Region_Of(REGION *r);
01496
01497
01498
01499
01500
01501
01502
01503 BOOL Is_Parent_Region_Of(REGION *r);
01504
01505
01506
01507
01508
01509
01510
01511
01512 void Edge_Splitting(void);
01513
01514 void Print(FILE *f = stderr);
01515 };
01516
01517
01518
01519
01520
01521
01522
01523
01524
01525
01526
01527
01528
01529
01530
01531
01532 class MEME_REGION:public REGION {
01533 friend class REGION_TREE;
01534
01535 public:
01536 MEME_REGION() { _type = MEME; }
01537 MEME_REGION(REGIONAL_CFG *cfg);
01538 ~MEME_REGION() {}
01539 };
01540
01541
01542
01543
01544
01545
01546
01547
01548
01549
01550
01551
01552
01553
01554
01555
01556 class SEME_REGION:public MEME_REGION {
01557 private:
01558 REGIONAL_CFG_NODE *_main_exit;
01559
01560 public:
01561 SEME_REGION() { _type = SEME; };
01562 SEME_REGION(REGIONAL_CFG *cfg);
01563 ~SEME_REGION() {};
01564
01565 };
01566
01567
01568
01569
01570
01571
01572
01573
01574
01575
01576
01577
01578
01579
01580
01581
01582
01583
01584
01585
01586 class LOOP_REGION:public SEME_REGION {
01587
01588 private:
01589 INT32 _nest_level;
01590
01591 REGIONAL_CFG_NODE *_loop_head;
01592 REGIONAL_CFG_NODE *_loop_tail;
01593 public:
01594
01595 INT32 Nest_Level(void) {
01596 return _nest_level;
01597 }
01598
01599 LOOP_REGION(void) {
01600 _loop_head = NULL;
01601 _loop_tail = NULL;
01602 _nest_level = 0;
01603 _type = LOOP;
01604
01605 }
01606
01607 LOOP_REGION(REGIONAL_CFG *cfg);
01608
01609 ~LOOP_REGION() {}
01610
01611 REGIONAL_CFG_NODE *Loop_Head(void) { return _loop_head; }
01612 REGIONAL_CFG_NODE *Loop_Tail(void) { return _loop_tail; }
01613
01614 void Loop_Head(REGIONAL_CFG_NODE *head) { _loop_head = head; }
01615 void Loop_Tail(REGIONAL_CFG_NODE *tail) { _loop_tail = tail; }
01616 };
01617
01618
01619
01620
01621
01622
01623
01624
01625
01626
01627
01628
01629
01630
01631
01632
01633 class IMPROPER_REGION:public MEME_REGION {
01634 public:
01635 IMPROPER_REGION() { _type = IMPROPER; }
01636 ~IMPROPER_REGION() {}
01637 };
01638
01639
01640
01641
01642
01643
01644
01645
01646
01647
01648
01649
01650
01651
01652
01653
01654 class REGION_TREE_MEM {
01655
01656 protected:
01657 MEM_POOL _m;
01658
01659 REGION_TREE_MEM() {
01660 MEM_POOL_Initialize(&_m, "REGION_TREE_MEM", true);
01661 MEM_POOL_Push(&_m);
01662 }
01663
01664 ~REGION_TREE_MEM() {
01665 MEM_POOL_Pop(&_m);
01666 MEM_POOL_Delete(&_m);
01667 }
01668 };
01669
01670
01671
01672
01673
01674
01675
01676
01677
01678
01679
01680
01681
01682
01683
01684
01685
01686
01687
01688 class REGION_TREE :public REGION_TREE_MEM {
01689
01690 friend class INNERMOST_REGION_FIRST_ITER;
01691 friend class INTERVAL_PROCESSOR;
01692 friend class REGION_LOOP_UPDATE;
01693 friend class REGIONAL_CFG;
01694
01695 friend void Verify_Region_Tree(REGION_TREE *tree,BB *first_bb);
01696 friend void RGN_Remove_BB_And_Edges(BB *bb, REGIONAL_CFG *regional_cfg);
01697 typedef mempool_allocator<REGION*> REGION_ALLOC;
01698
01699 private:
01700 REGION *_root;
01701 REGION_VECTOR _region_set;
01702
01703
01704 INT32 _seq_num;
01705
01706 REGION_VECTOR_ITER Find(REGION *r) {
01707 REGION_VECTOR_ITER iter;
01708 for (iter = _region_set.begin(); iter != _region_set.end(); iter++) {
01709 if (*iter == r) return iter;
01710 }
01711 }
01712
01713
01714
01715
01716
01717
01718
01719
01720
01721 void Insert(REGION *r) {
01722 _seq_num++;
01723 r->Id(_seq_num);
01724 _region_set.push_back(r);
01725 r->_tree = this;
01726 }
01727
01728
01729
01730
01731
01732
01733
01734 void Erase(REGION *r) {
01735 REGION_VECTOR_ITER iter;
01736
01737 for (iter = _region_set.begin(); iter != _region_set.end(); iter++) {
01738 if (*iter == r) {
01739 _region_set.erase(iter);
01740
01741 break;
01742 }
01743 }
01744
01745 r->_tree = NULL;
01746 }
01747
01748
01749
01750
01751
01752
01753
01754
01755
01756 REGION *Add_Region(void);
01757
01758
01759
01760
01761
01762
01763
01764
01765
01766 void Del_Region(REGION *r);
01767
01768
01769
01770
01771
01772
01773
01774
01775
01776 INT32 Build_Regional_Cfg(BB *);
01777
01778
01779
01780
01781 void Shrink (REGION *parent,REGION *kid,NODE_VECTOR nodes);
01782
01783 void Process_Intervals(REGION *r);
01784
01785 public:
01786
01787 REGION_TREE(BB *firstbb);
01788 ~REGION_TREE();
01789
01790
01791
01792
01793
01794
01795
01796
01797
01798 LOOP_REGION *Add_Loop_Region(void);
01799
01800 LOOP_REGION *Add_Loop_Region(REGION *parent,REGIONAL_CFG_EDGE *backedge, NODE_VECTOR node_set);
01801
01802 IMPROPER_REGION *Add_Improper_Region(REGION *parent,NODE_VECTOR node_set);
01803
01804 MEME_REGION *Add_MEME_Region(REGION *parent,NODE_VECTOR node_set);
01805
01806 SEME_REGION *Add_SEME_Region(REGION *parent,NODE_VECTOR node_set);
01807
01808
01809
01810
01811
01812
01813
01814 void Decompose_Region_To_SEME(REGION* r,RGN_FORM_PAR par);
01815
01816
01817
01818
01819
01820
01821 void Decomposition();
01822
01823 void Decompose_Region_To_MEME(REGION* r,RGN_SIZE size);
01824 void Set_Loop_Head_Tail(void);
01825 void Statistic(void);
01826
01827 REGION *Root(void) { return _root; }
01828 REGION_VECTOR Region_Set(void) { return _region_set;}
01829 INT32 Seq_Num(void) { return _seq_num; }
01830 void Print(FILE *f = stderr);
01831 };
01832
01833
01834
01835
01836
01837
01838
01839
01840
01841
01842
01843
01844
01845
01846
01847
01848 class REGION_KID_ITER {
01849
01850 private:
01851 REGION *_cur;
01852
01853 public:
01854 REGION_KID_ITER(REGION *r) {
01855 _cur = r->First_Kid();
01856 }
01857
01858 ~REGION_KID_ITER() {}
01859
01860 REGION_KID_ITER &operator ++(void) {
01861 _cur = _cur->Next_Sibling();
01862 return *this;
01863 }
01864
01865 REGION *operator *(void) {
01866 return _cur;
01867 }
01868
01869 friend BOOL operator ==(const REGION_KID_ITER& x,const REGION_KID_ITER& y) {
01870 return x._cur == y._cur;
01871 }
01872
01873 BOOL operator !=(INT) {
01874 return _cur!=0;
01875 }
01876 };
01877
01878
01879
01880
01881
01882
01883
01884
01885
01886
01887
01888
01889
01890
01891
01892 class INNERMOST_REGION_FIRST_ITER {
01893
01894 private:
01895 REGION *_root;
01896 REGION *_cur;
01897
01898 void Set_Cur(REGION *root);
01899
01900 public:
01901 INNERMOST_REGION_FIRST_ITER(REGION_TREE *tree){
01902 _root = tree->_root;
01903 Set_Cur(_root);
01904 }
01905
01906 INNERMOST_REGION_FIRST_ITER(REGION *root){
01907 _root = root;
01908 Set_Cur(_root);
01909 }
01910
01911 ~INNERMOST_REGION_FIRST_ITER() {}
01912
01913
01914 INNERMOST_REGION_FIRST_ITER &operator ++(void);
01915 REGION *operator *(void) { return _cur;}
01916 BOOL operator !=(INT) {return _cur != NULL;}
01917
01918 };
01919
01920 extern REGION_TREE* REGION_Form_Region_Tree (void);
01921 extern REGION_TREE* REGION_Get_Region_Tree (void);
01922 extern BOOL Is_Abnormal_Loop (REGION* region);
01923
01924 #endif