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 #include "bb.h"
00039 #include <stack>
00040 #include <vector>
00041 #include <list>
00042 #include "defs.h"
00043 #include "cxx_memory.h"
00044 #include "gtn_universe.h"
00045 #include "gtn_set.h"
00046 #include "region_bb_util.h"
00047 #include "profile_util.h"
00048 #include "tracing.h"
00049 #include "ipfec_defs.h"
00050
00051 #include "vt_region.h"
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 REGIONAL_CFG_NODE *Regional_Cfg_Node(BB *bb){
00062 return (REGIONAL_CFG_NODE *)BB_MAP_Get(bb_node_map,bb);
00063 }
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 REGIONAL_CFG_NODE *Regional_Cfg_Node(REGIONAL_CFG_NODE *node, REGION *rgn){
00074 REGION *home_rgn = node->Home_Region();
00075 while(home_rgn && home_rgn != rgn){
00076 node = home_rgn->Regional_Cfg_Node();
00077 home_rgn = home_rgn->Parent();
00078 }
00079 if(home_rgn)
00080 return node;
00081 else
00082 return NULL;
00083 }
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 REGION *Home_Region(BB *bb){
00094 if(!bb_node_map) return NULL;
00095 REGIONAL_CFG_NODE *node = (REGIONAL_CFG_NODE *)BB_MAP_Get(bb_node_map,bb);
00096 if(node)
00097 return node->Home_Region();
00098 else
00099 return NULL;
00100 }
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 BOOL Region_Contains_BB(REGION *rgn, BB *bb){
00111 REGION *home_rgn = Home_Region(bb);
00112 if(home_rgn == rgn) return TRUE;
00113 if(home_rgn->Is_Contained_By(rgn)) return TRUE;
00114 return FALSE;
00115 }
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 void RGN_Gen_And_Insert_Node(BB *new_bb, BB *pred_bb, BB *succ_bb,
00126 REGIONAL_CFG *regional_cfg){
00127 if(regional_cfg == NULL){
00128 REGION *pred_rgn = Home_Region(pred_bb);
00129 REGION *succ_rgn = Home_Region(succ_bb);
00130
00131
00132
00133 if(pred_rgn == succ_rgn){
00134 regional_cfg = pred_rgn->Regional_Cfg();
00135 regional_cfg->Add_Node(new_bb);
00136 }else{
00137 REGION *par_rgn = pred_rgn->Find_Common_Parent(succ_rgn);
00138 par_rgn->Regional_Cfg()->Add_Node(new_bb);
00139 }
00140 }else
00141 regional_cfg->Add_Node(new_bb);
00142 }
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 BB *RGN_Gen_And_Insert_BB(BB *pred_bb, BB *succ_bb,
00153 REGIONAL_CFG *regional_cfg,
00154 BOOL force_not_fall_through,
00155 float prob){
00156
00157
00158 Is_True(pred_bb != NULL && succ_bb != NULL,
00159 ("RGN_Gen_And_Insert_BB : pred_bb or succ_bb is NULL"));
00160
00161
00162 BB *new_bb;
00163 if(force_not_fall_through == FALSE && succ_bb == BB_next(pred_bb)){
00164
00165 new_bb = Gen_And_Insert_BB_After(pred_bb);
00166 }else{
00167 BB *last_bb = succ_bb;
00168 while(BB_next(last_bb)) last_bb = BB_next(last_bb);
00169 new_bb = Gen_And_Insert_BB_After(last_bb);
00170 }
00171
00172
00173 RGN_Gen_And_Insert_Node(new_bb, pred_bb, succ_bb, regional_cfg);
00174
00175
00176 if(prob == 0.0){
00177 BBLIST *edge = BBlist_Find_BB(BB_succs(pred_bb), succ_bb);
00178 prob = BBLIST_prob(edge);
00179 }
00180 if(force_not_fall_through == FALSE)
00181 RGN_Unlink_Pred_Succ(pred_bb, succ_bb);
00182
00183 RGN_Link_Pred_Succ_With_Prob(pred_bb, new_bb, prob);
00184 RGN_Link_Pred_Succ_With_Prob(new_bb, succ_bb, 1.0);
00185
00186 return new_bb;
00187 }
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 BB *RGN_Gen_And_Insert_BB_After(BB *point, REGIONAL_CFG *regional_cfg){
00198 if (Get_Trace(TP_A_REGION, TT_RGN_SUMMERY))
00199 fprintf(TFile, "*** beginning of RGN_Gen_And_Insert_BB_After(bb_id:%d *** \n",
00200 BB_id(point));
00201
00202 BB *new_bb = Gen_And_Insert_BB_After(point);
00203
00204 if(regional_cfg == NULL)
00205 regional_cfg = Home_Region(point)->Regional_Cfg();
00206
00207 regional_cfg->Add_Node(new_bb);
00208
00209 if (Get_Trace(TP_A_REGION, TT_RGN_SUMMERY))
00210 fprintf(TFile, "*** end of RGN_Gen_And_Insert_BB_After ***\n");
00211
00212 return new_bb;
00213 }
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223 BB *RGN_Gen_And_Insert_BB_Before(BB *point, REGIONAL_CFG *regional_cfg){
00224 if (Get_Trace(TP_A_REGION, TT_RGN_SUMMERY))
00225 fprintf(TFile, "*** beginning of RGN_Gen_And_Insert_BB_Before(bb_id:%d *** \n",
00226 BB_id(point));
00227
00228 BB *new_bb = Gen_And_Insert_BB_Before(point);
00229
00230 if(regional_cfg == NULL)
00231 regional_cfg = Home_Region(point)->Regional_Cfg();
00232
00233 regional_cfg->Add_Node(new_bb);
00234
00235 if (Get_Trace(TP_A_REGION, TT_RGN_SUMMERY))
00236 fprintf(TFile, "*** end of RGN_Gen_And_Insert_BB_Before ***\n");
00237 return new_bb;
00238 }
00239
00240 void RGN_Unlink_BB_Edges(BB *bb, REGIONAL_CFG *regional_cfg) {
00241 if (Get_Trace(TP_A_REGION, TT_RGN_SUMMERY))
00242 fprintf(TFile, "*** beginning of RGN_Unlink_BB_Edges(bb_id:%d *** \n",
00243 BB_id(bb));
00244
00245 REGION *bb_rgn = Home_Region(bb);
00246 if(regional_cfg == NULL)
00247 regional_cfg = bb_rgn->Regional_Cfg();
00248 else
00249 Is_True(bb_rgn->Regional_Cfg()==regional_cfg, ("RGN_Remove_BB_And_Edges"));
00250
00251
00252 BBLIST *pred_list=NULL, *succ_list=NULL;
00253
00254
00255 while(pred_list = BB_preds(bb)){
00256 BB *pred = BBLIST_item(pred_list);
00257 RGN_Unlink_Pred_Succ(pred, bb);
00258 }
00259
00260
00261 while (succ_list = BB_succs(bb)){
00262 BB *succ = BBLIST_item(succ_list);
00263 RGN_Unlink_Pred_Succ(bb, succ);
00264 };
00265
00266
00267
00268 REGIONAL_CFG_NODE *node = Regional_Cfg_Node(bb);
00269 REGION *root_region = node->Home_Region()->Tree()->Root();
00270
00271
00272
00273 if( regional_cfg->_node_set.size() == 1 ){
00274 REGION *region = node->Home_Region();
00275 REGION *par_rgn = region->Parent();
00276 while( par_rgn->Regional_Cfg()->_node_set.size() == 1 ) {
00277 region = par_rgn;
00278 par_rgn = region->Parent();
00279 };
00280 region->Tree()->Del_Region(region);
00281 }
00282 else {
00283 regional_cfg->Del_Node(node);
00284 }
00285
00286
00287 root_region->Regional_Cfg()->Add_Node(bb);
00288
00289 if (Get_Trace(TP_A_REGION, TT_RGN_SUMMERY))
00290 fprintf(TFile, "*** end of RGN_Unlink_BB_Edges *** \n");
00291
00292 }
00293
00294
00295
00296
00297
00298
00299
00300
00301 void RGN_Remove_BB_And_Edges(BB *bb, REGIONAL_CFG *regional_cfg){
00302 if (Get_Trace(TP_A_REGION, TT_RGN_SUMMERY))
00303 fprintf(TFile, "*** beginning of RGN_Remove_BB_And_Edges(bb_id:%d *** \n",
00304 BB_id(bb));
00305
00306 REGION *bb_rgn = Home_Region(bb);
00307 if(regional_cfg == NULL)
00308 regional_cfg = bb_rgn->Regional_Cfg();
00309 else
00310 Is_True(bb_rgn->Regional_Cfg()==regional_cfg, ("RGN_Remove_BB_And_Edges"));
00311
00312
00313 BBLIST *pred_list=NULL, *succ_list=NULL;
00314
00315
00316 while(pred_list = BB_preds(bb)){
00317 BB *pred = BBLIST_item(pred_list);
00318 RGN_Unlink_Pred_Succ(pred, bb);
00319 }
00320
00321
00322 while (succ_list = BB_succs(bb)){
00323 BB *succ = BBLIST_item(succ_list);
00324 RGN_Unlink_Pred_Succ(bb, succ);
00325 };
00326
00327
00328
00329 REGIONAL_CFG_NODE *node = Regional_Cfg_Node(bb);
00330 if(regional_cfg->_node_set.size() == 1){
00331 REGION *region = node->Home_Region();
00332 REGION *par_rgn = region->Parent();
00333 while(par_rgn->Regional_Cfg()->_node_set.size() == 1){
00334 region = par_rgn;
00335 par_rgn = region->Parent();
00336 };
00337 region->Tree()->Del_Region(region);
00338 }else
00339 regional_cfg->Del_Node(node);
00340
00341 Remove_BB(bb);
00342
00343 if (Get_Trace(TP_A_REGION, TT_RGN_SUMMERY))
00344 fprintf(TFile, "*** end of RGN_Remove_BB_And_Edges *** \n");
00345
00346 }
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360 void Add_Regional_Cfg_Edge(REGIONAL_CFG_NODE *pred, REGIONAL_CFG_NODE *succ, REGION *rgn){
00361 REGIONAL_CFG *cfg = rgn->Regional_Cfg();
00362 if(rgn->Region_Type() == LOOP){
00363 LOOP_REGION *loop = (LOOP_REGION *)rgn;
00364 if(succ != loop->Loop_Head())
00365 cfg->Add_Edge(pred,succ);
00366 else
00367 loop->Loop_Tail(pred);
00368 }else
00369 cfg->Add_Edge(pred, succ);
00370 }
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380 void RGN_Add_Regional_Cfg_Edge(BB *pred,
00381 BB *succ,
00382 REGIONAL_CFG *regional_cfg){
00383
00384 REGIONAL_CFG_NODE *pred_node = Regional_Cfg_Node(pred);
00385 REGIONAL_CFG_NODE *succ_node = Regional_Cfg_Node(succ);
00386
00387 REGION *pred_rgn = pred_node->Home_Region();
00388 REGION *succ_rgn = succ_node->Home_Region();
00389 REGION *root1 = pred_rgn->Tree()->Root(),*par_rgn;
00390 REGIONAL_CFG *cfg;
00391 if(regional_cfg == NULL)
00392 regional_cfg = pred_rgn->Find_Common_Parent(succ_rgn)->Regional_Cfg();
00393 else
00394 Is_True(pred_rgn->Find_Common_Parent(succ_rgn)->Regional_Cfg()==regional_cfg,
00395 ("RGN_Link_Pred_Succ_With_Prob"));
00396 cfg=regional_cfg;
00397 if(pred_rgn == succ_rgn) {
00398
00399 Is_True(pred_node,("BB: %d's regional_cfg_node doesn't exists.\n",pred));
00400 if(pred_node->Is_Exit())
00401 if(BB_succs_len(pred)==0 || BB_Unique_Successor(pred)==succ){
00402 REGIONAL_CFG *pred_cfg = pred_rgn->Regional_Cfg();
00403 pred_cfg->Remove_From_Exits(pred_node);
00404
00405 while (pred_rgn != root1){
00406
00407 pred_node=pred_rgn->Regional_Cfg_Node();
00408 Is_True(pred_node,("region %d's regional_cfg_node doesn't exists.\n",pred_rgn->Id()));
00409 par_rgn =pred_node->Home_Region();
00410 Is_True(par_rgn,("pred_node: %d's Home_Region doesn't exists.\n",pred_node->Id()));
00411 REGIONAL_CFG *cfg = par_rgn->Regional_Cfg();
00412
00413 BB_VECTOR exits(&(cfg->_m));
00414 if(pred_node->Is_Region())
00415 Collect_Exit_BBs(pred_node->Region_Node(), &exits);
00416 else
00417 exits.push_back(pred_node->BB_Node());
00418
00419 BOOL has_other_exit_edge = FALSE;
00420 for(BB_VECTOR_ITER bb_iter=exits.begin(); bb_iter!=exits.end(); bb_iter++){
00421 BB *exit_bb = *bb_iter;
00422 BBLIST *succ_list;
00423 if(BB_succs_len(exit_bb) == 0 && exit_bb != pred) {
00424 has_other_exit_edge= TRUE;
00425 break;
00426 }
00427 FOR_ALL_BB_SUCCS(exit_bb, succ_list) {
00428 BB *succ_bb = BBLIST_item(succ_list);
00429 if(succ_bb == succ && exit_bb == pred) continue;
00430 if(! Region_Contains_BB(par_rgn, succ_bb)){
00431 has_other_exit_edge = TRUE;
00432 break;
00433 }
00434 }
00435 if(has_other_exit_edge)
00436 break;
00437 }
00438 if(!has_other_exit_edge){
00439 cfg->Remove_From_Exits(pred_node);
00440 }
00441 pred_rgn=par_rgn;
00442 }
00443 }
00444 REGIONAL_CFG_NODE *pred_node = Regional_Cfg_Node(pred);
00445 REGION *pred_rgn = pred_node->Home_Region();
00446 if (!succ_node->Is_Entry()) {
00447 Add_Regional_Cfg_Edge(pred_node, succ_node, pred_rgn);
00448 }
00449 }
00450 else{
00451 REGION *com_par = pred_rgn->Find_Common_Parent(succ_rgn);
00452
00453 if(pred_node->Is_Exit())
00454 if(BB_succs_len(pred)==0 || BB_Unique_Successor(pred)==succ){
00455 REGIONAL_CFG *pred_cfg = pred_rgn->Regional_Cfg();
00456 pred_cfg->Remove_From_Exits(pred_node);
00457 while (pred_rgn != root1){
00458 pred_node=pred_rgn->Regional_Cfg_Node();
00459 par_rgn =pred_node->Home_Region();
00460 Is_True(par_rgn,("The pred_node %d's Home_Region doesn't exists.\n",pred_node->Id()));
00461 REGIONAL_CFG *cfg = par_rgn->Regional_Cfg();
00462
00463 BB_VECTOR exits(&(cfg->_m));
00464 if(pred_node->Is_Region())
00465 Collect_Exit_BBs(pred_node->Region_Node(), &exits);
00466 else
00467 exits.push_back(pred_node->BB_Node());
00468
00469 BOOL has_other_exit_edge = FALSE;
00470 for(BB_VECTOR_ITER bb_iter=exits.begin(); bb_iter!=exits.end(); bb_iter++){
00471 BB *exit_bb = *bb_iter;
00472 BBLIST *succ_list;
00473 if(BB_succs_len(exit_bb) == 0 && exit_bb != pred) {
00474 has_other_exit_edge= TRUE;
00475 break;
00476 }
00477 FOR_ALL_BB_SUCCS(exit_bb, succ_list) {
00478 BB *succ_bb = BBLIST_item(succ_list);
00479 if(succ_bb == succ && exit_bb == pred) continue;
00480 if(! Region_Contains_BB(par_rgn, succ_bb)){
00481 has_other_exit_edge = TRUE;
00482 break;
00483 }
00484 }
00485 if(has_other_exit_edge)
00486 break;
00487 }
00488 if(!has_other_exit_edge){
00489 cfg->Remove_From_Exits(pred_node);
00490 }
00491 pred_rgn=par_rgn;
00492 }
00493 }
00494
00495 REGIONAL_CFG_NODE *pred_node = Regional_Cfg_Node(pred);
00496 REGIONAL_CFG_NODE *succ_node = Regional_Cfg_Node(succ);
00497 REGION *pred_rgn = pred_node->Home_Region();
00498
00499 while(pred_rgn != com_par){
00500
00501 pred_rgn->Regional_Cfg()->Add_To_Exits(pred_node);
00502 pred_node = pred_rgn->Regional_Cfg_Node();
00503 pred_rgn = pred_node->Home_Region();
00504 };
00505
00506 while(succ_rgn != com_par){
00507
00508 succ_rgn->Regional_Cfg()->Add_To_Entries(succ_node);
00509 if(succ_rgn->Regional_Cfg()->Num_Of_Entries() > 1 && succ_rgn->Region_Type() == SEME)
00510 succ_rgn->Region_Type(MEME);
00511 succ_node = succ_rgn->Regional_Cfg_Node();
00512 succ_rgn = succ_node->Home_Region();
00513 };
00514 if (!succ_node->Is_Entry()) {
00515 Add_Regional_Cfg_Edge(pred_node, succ_node, com_par);
00516 }
00517 }
00518 }
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528 void RGN_Link_Pred_Succ_With_Prob(BB *pred, BB *succ, float prob,
00529 REGIONAL_CFG *regional_cfg){
00530 if (Get_Trace(TP_A_REGION, TT_RGN_UTIL_DEBUG))
00531 fprintf(TFile, "*** beginning of RGN_link_Pred_Succ_With_Prob(pred_bb_id:%d, succ_bb_id:%d) *** \n",
00532 BB_id(pred), BB_id(succ));
00533
00534
00535 Link_Pred_Succ(pred,succ);
00536 Set_Prob(pred,succ,prob);
00537
00538
00539 RGN_Add_Regional_Cfg_Edge(pred, succ, regional_cfg);
00540
00541 if (Get_Trace(TP_A_REGION, TT_RGN_UTIL_DEBUG)){
00542 fprintf(TFile, "*** end of RGN_link_Pred_Succ_With_Prob *** \n");
00543
00544 }
00545 }
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555 void Collect_Entry_BBs(REGION *rgn, BB_VECTOR *entries){
00556 NODE_VECTOR nodes(&(rgn->Regional_Cfg()->_m));
00557 nodes = rgn->Entries();
00558 for(NODE_VECTOR_ITER iter = nodes.begin(); iter!=nodes.end(); iter++){
00559 if((*iter)->Is_Region())
00560 Collect_Entry_BBs((*iter)->Region_Node(), entries);
00561 else
00562 entries->push_back((*iter)->BB_Node());
00563 }
00564 }
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574 void Collect_Exit_BBs(REGION *rgn, BB_VECTOR *exits){
00575 NODE_VECTOR nodes(&(rgn->Regional_Cfg()->_m));
00576 nodes = rgn->Exits();
00577 for(NODE_VECTOR_ITER iter = nodes.begin(); iter!=nodes.end(); iter++){
00578 if((*iter)->Is_Region())
00579 Collect_Exit_BBs((*iter)->Region_Node(), exits);
00580 else
00581 exits->push_back((*iter)->BB_Node());
00582 }
00583 }
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593 INT Edge_Counter(REGIONAL_CFG_NODE *src, REGIONAL_CFG_NODE *dest, REGIONAL_CFG *cfg){
00594
00595 BB_VECTOR exits(&(cfg->_m));
00596 if(src->Is_Region())
00597 Collect_Exit_BBs(src->Region_Node(), &exits);
00598 else
00599 exits.push_back(src->BB_Node());
00600
00601 if (Get_Trace(TP_A_REGION, TT_RGN_DETAILED)){
00602 fprintf(TFile,"exits are: ");
00603 for(BB_VECTOR_ITER iter=exits.begin(); iter!=exits.end(); iter++)
00604 fprintf(TFile,"bb_id:%d ", BB_id(*iter));
00605 fprintf(TFile,"\n");
00606 }
00607
00608 REGION *dest_rgn;
00609 BB *dest_bb;
00610 if(dest->Is_Region())
00611 dest_rgn = dest->Region_Node();
00612 else
00613 dest_bb = dest->BB_Node();
00614
00615 INT32 num = 0;
00616 for(BB_VECTOR_ITER iter=exits.begin(); iter!=exits.end(); iter++){
00617 BBLIST *succ_list;
00618 FOR_ALL_BB_SUCCS(*iter, succ_list) {
00619 BB *succ_bb = BBLIST_item(succ_list);
00620 if(dest->Is_Region()){
00621 REGION *succ_rgn = Home_Region(succ_bb);
00622 if(succ_rgn==dest_rgn || succ_rgn->Is_Contained_By(dest_rgn))
00623 num++;
00624 }else
00625 if(succ_bb == dest_bb)
00626 num++;
00627 }
00628 }
00629
00630 return num++;
00631 }
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643 void Del_Regional_Cfg_Edge(REGIONAL_CFG_NODE *pred, REGIONAL_CFG_NODE *succ, REGION *rgn){
00644 Is_True(pred->Home_Region()==succ->Home_Region() && pred->Home_Region()==rgn,
00645 ("pred_node_id:%d and succ_node_id:%d should in rgn_id:%d",
00646 pred->Id(), succ->Id(), rgn->Id()));
00647
00648 REGIONAL_CFG *cfg = rgn->Regional_Cfg();
00649 if(rgn->Region_Type()==LOOP){
00650 LOOP_REGION *loop = (LOOP_REGION *)rgn;
00651 if(succ == loop->Loop_Head())
00652 return;
00653 }
00654 REGIONAL_CFG_EDGE *edge = cfg->Find_Edge(pred, succ);
00655
00656 if(edge == NULL){
00657 DevWarn("can not find the edge between regional_cfg_node %d and %d.\n",pred->Id(),succ->Id());
00658 return;
00659 }
00660
00661 INT32 counter = Edge_Counter(pred,succ,cfg);
00662 if(counter > 1)
00663 return;
00664 else
00665 cfg->Del_Edge(edge);
00666 }
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677 void RGN_Del_Regional_Cfg_Edge(BB *pred,
00678 BB *succ,
00679 REGIONAL_CFG *regional_cfg){
00680 REGIONAL_CFG_NODE *pred_node = Regional_Cfg_Node(pred);
00681 Is_True(pred_node, ("pred_bb_id:%d has no corresponding regional cfg node",
00682 BB_id(pred)));
00683 REGIONAL_CFG_NODE *succ_node = Regional_Cfg_Node(succ);
00684 Is_True(pred_node, ("succ_bb_id:%d has no corresponding regional cfg node",
00685 BB_id(succ)));
00686
00687 REGION *pred_rgn = pred_node->Home_Region();
00688 REGION *succ_rgn = succ_node->Home_Region();
00689 REGION *root1 = pred_rgn->Tree()->Root();
00690 INT32 succ_num=1;
00691 if(regional_cfg == NULL)
00692 regional_cfg = pred_rgn->Find_Common_Parent(succ_rgn)->Regional_Cfg();
00693 else
00694 Is_True(pred_rgn->Find_Common_Parent(succ_rgn)->Regional_Cfg()==regional_cfg,
00695 ("RGN_Link_Pred_Succ_With_Prob"));
00696 REGIONAL_CFG *cfg = regional_cfg;
00697 if (Get_Trace(TP_A_REGION, TT_RGN_DETAILED)){
00698 if(!pred_node->Is_Region() && !succ_node->Is_Region())
00699 fprintf(TFile, "pred_bb id: %d succ_bb id: %d ",
00700 BB_id(pred_node->BB_Node()), BB_id(succ_node->BB_Node()));
00701 fprintf(TFile, "pred_rgn id: %d succ_rgn id: %d \n", pred_rgn->Id(), succ_rgn->Id());
00702 }
00703
00704 if(pred_rgn == succ_rgn){
00705 Del_Regional_Cfg_Edge(pred_node, succ_node, pred_rgn);
00706 if(BB_succs_len(pred)==1){
00707 while (pred_rgn != root1){
00708 cfg = pred_rgn->Regional_Cfg();
00709 cfg->Add_To_Exits(pred_node);
00710 pred_node = pred_rgn->Regional_Cfg_Node();
00711 pred_rgn = pred_node->Home_Region();
00712 }
00713 cfg = pred_rgn->Regional_Cfg();
00714 cfg->Add_To_Exits(pred_node);
00715 }
00716 }else{
00717 REGION *com_par = pred_rgn->Find_Common_Parent(succ_rgn);
00718
00719
00720
00721
00722
00723
00724
00725 Del_Regional_Cfg_Edge(Regional_Cfg_Node(pred_node,com_par),
00726 Regional_Cfg_Node(succ_node,com_par),
00727 com_par);
00728
00729 while(pred_rgn != com_par){
00730
00731 REGIONAL_CFG *pred_cfg = pred_rgn->Regional_Cfg();
00732
00733 if (Get_Trace(TP_A_REGION, TT_RGN_DETAILED))
00734 pred_node->Print(TFile);
00735 Is_True(pred_node->Is_Exit(),
00736 ("RGN_Del_Regional_Cfg_Edge(pred_bb_id:%d, succ_bb_id:%d)::"
00737 "pred_node Id:%d should be a exit node of region %d",
00738 BB_id(pred), BB_id(succ), pred_node->Id(), pred_rgn->Id()));
00739
00740 BB_VECTOR exits(&(regional_cfg->_m));
00741 if(pred_node->Is_Region())
00742 Collect_Exit_BBs(pred_node->Region_Node(), &exits);
00743 else
00744 exits.push_back(pred_node->BB_Node());
00745
00746 BOOL has_other_exit_edge = FALSE;
00747 for(BB_VECTOR_ITER bb_iter=exits.begin(); bb_iter!=exits.end(); bb_iter++){
00748 BB *exit_bb = *bb_iter;
00749 BBLIST *succ_list;
00750 if(BB_succs_len(exit_bb) == 0 && exit_bb != pred) {
00751 has_other_exit_edge= TRUE;
00752 break;
00753 }
00754
00755 FOR_ALL_BB_SUCCS(exit_bb, succ_list) {
00756 BB *succ_bb = BBLIST_item(succ_list);
00757 if(succ_bb == succ && exit_bb == pred) continue;
00758 if(! Region_Contains_BB(pred_rgn, succ_bb)){
00759 has_other_exit_edge = TRUE;
00760 break;
00761 }
00762 }
00763 if(has_other_exit_edge)
00764 break;
00765 }
00766
00767 if(!has_other_exit_edge){
00768 pred_cfg->Remove_From_Exits(pred_node);
00769 }
00770 pred_node = pred_rgn->Regional_Cfg_Node();
00771 pred_rgn = pred_node->Home_Region();
00772 };
00773
00774 pred_node = Regional_Cfg_Node(pred);
00775 pred_rgn = pred_node->Home_Region();
00776 if(BB_succs_len(pred)==1){
00777 while (pred_rgn != root1){
00778 cfg = pred_rgn->Regional_Cfg();
00779 cfg->Add_To_Exits(pred_node);
00780 pred_node = pred_rgn->Regional_Cfg_Node();
00781 pred_rgn = pred_node->Home_Region();
00782 }
00783 cfg = pred_rgn->Regional_Cfg();
00784 cfg->Add_To_Exits(pred_node);
00785 }
00786 while(succ_rgn != com_par){
00787
00788 REGIONAL_CFG *succ_cfg = succ_rgn->Regional_Cfg();
00789 if (Get_Trace(TP_A_REGION, TT_RGN_DETAILED))
00790 succ_node->Print(TFile);
00791 Is_True(succ_node->Is_Entry(),("succ_node should be a entry node"));
00792 BBLIST *pred_list;
00793 BOOL has_other_entry_edge = FALSE;;
00794 FOR_ALL_BB_PREDS(succ, pred_list) {
00795 BB *pred_bb = BBLIST_item(pred_list);
00796 if(pred_bb == pred) continue;
00797 if(! Region_Contains_BB(succ_rgn, pred_bb)){
00798 has_other_entry_edge = TRUE;
00799 break;
00800 }
00801 }
00802 if(!has_other_entry_edge)
00803 succ_cfg->Remove_From_Entries(succ_node);
00804 succ_node = succ_rgn->Regional_Cfg_Node();
00805 succ_rgn = succ_node->Home_Region();
00806 };
00807 }
00808 }
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818 void RGN_Unlink_Pred_Succ(BB *pred, BB *succ, REGIONAL_CFG *regional_cfg){
00819 if (Get_Trace(TP_A_REGION, TT_RGN_UTIL_DEBUG))
00820 fprintf(TFile, "*** beginning of RGN_Unlink_Pred_Succ(pred_bb_id:%d, succ_bb_id:%d) *** \n",
00821 BB_id(pred), BB_id(succ));
00822
00823
00824 RGN_Del_Regional_Cfg_Edge(pred, succ, regional_cfg);
00825
00826
00827 Unlink_Pred_Succ(pred,succ);
00828
00829 if (Get_Trace(TP_A_REGION, TT_RGN_UTIL_DEBUG)){
00830 fprintf(TFile, "*** end of RGN_Unlink_Pred_Succ *** \n");
00831
00832 }
00833 }
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843 GTN_SET *Region_Def_Reach_In(REGION *rgn, MEM_POOL *pool){
00844 BB_VECTOR entries(pool);
00845 Collect_Entry_BBs(rgn, &entries);
00846 GTN_SET *def_reach_in = NULL;
00847 for(BB_VECTOR_ITER iter=entries.begin(); iter!=entries.end(); iter++){
00848 if(def_reach_in == NULL)
00849 def_reach_in = BB_defreach_in( *iter );
00850 else
00851 def_reach_in = GTN_SET_Union(def_reach_in, BB_defreach_in(*iter), pool);
00852 }
00853 return def_reach_in;
00854 }
00855
00856
00857
00858
00859
00860
00861
00862 BB *RGN_Divide_BB(BB *bb, OP *point, BOOL force)
00863 {
00864 Is_True( OP_bb(point) == bb, ("Divide_BB: op is not in bb!"));
00865
00866
00867
00868 if( point == BB_last_op(bb) && ! force ) return NULL;
00869
00870 BB* bottom_bb = RGN_Gen_And_Insert_BB_After(bb);
00871 if (BB_exit(bb)) {
00872 BB_Transfer_Exitinfo(bb, bottom_bb);
00873 Exit_BB_Head = BB_LIST_Delete(bb, Exit_BB_Head);
00874 Exit_BB_Head = BB_LIST_Push(bottom_bb, Exit_BB_Head, &MEM_pu_pool);
00875 }
00876 if (BB_call(bb)) {
00877 BB_Transfer_Callinfo(bb, bottom_bb);
00878 }
00879 if (BB_asm(bb)) {
00880 BB_Transfer_Asminfo (bb, bottom_bb);
00881 }
00882
00883 BBLIST* nxt;
00884 BBLIST* succ;
00885 for(succ = BB_succs(bb); succ; succ = nxt) {
00886 BB* bb_succ = BBLIST_item(succ);
00887 nxt = BBLIST_next(succ);
00888 RGN_Link_Pred_Succ_With_Prob(bottom_bb, bb_succ, BBLIST_prob(succ));
00889 RGN_Unlink_Pred_Succ(bb, bb_succ);
00890 }
00891
00892 for(OP *op = OP_next(point); op; ) {
00893 OP *tmp = op;
00894 op = OP_next(op);
00895 BB_Move_Op_To_End(bottom_bb, bb, tmp);
00896 }
00897
00898 RGN_Link_Pred_Succ_With_Prob(bb, bottom_bb, 1.0);
00899 return bottom_bb;
00900 }
00901