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