00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #include "interval_processor.h"
00041 #include "scc_finder.h"
00042 #include "tracing.h"
00043 #include "ipfec_defs.h"
00044
00045
00046
00047
00048
00049
00050
00051
00052 void
00053 INTERVAL_PROCESSOR::Find_Cycles(void) {
00054 NODE_VECTOR_ITER iter;
00055
00056 REGIONAL_CFG *cfg = _root->Regional_Cfg();
00057 INT32 next_dfn = 0;
00058 INT_VECTOR dfn(cfg->_seq_num+2, (INT32)0,INT_ALLOC(&_m));
00059 BS *visited = BS_Create_Empty(cfg->_seq_num+2, &_m);
00060
00061 for (TOPOLOGICAL_REGIONAL_CFG_ITER iter(cfg);iter != 0;++iter) {
00062 REGIONAL_CFG_NODE *node = *iter;
00063 Is_True(node != NULL,("The node is NULL in Find Cycles"));
00064 if (node->First_Pred() == NULL) {
00065 Detect_Cycle(node,dfn,visited,next_dfn);
00066 }
00067 }
00068 }
00069
00070
00071
00072
00073
00074
00075
00076
00077 void
00078 INTERVAL_PROCESSOR::Detect_Cycle(REGIONAL_CFG_NODE *node,INT_VECTOR dfn,BS *visited,INT32 next_dfn) {
00079 REGIONAL_CFG_EDGE *e = NULL;
00080
00081 dfn[node->Id()] = ++next_dfn;
00082
00083 for (CFG_SUCC_NODE_ITER iter(node);iter != 0;++iter) {
00084 REGIONAL_CFG_NODE *succ = *iter;
00085 Is_True(succ != NULL,("The succ node is NULL in Detect Cycle."));
00086
00087 if (!BS_MemberP(visited,node->Id())) {
00088
00089 if (dfn[succ->Id()] == 0) {
00090 Detect_Cycle(succ,dfn,visited,next_dfn);
00091 }
00092 else if (dfn[succ->Id()] <= dfn[node->Id()]) {
00093 e = node->Find_Succ_Edge(succ);
00094 Is_True(e != NULL,("The edge is NULL in Detect Cycle."));
00095
00096 _cycles.push_back(e);
00097 }
00098 }
00099 }
00100
00101 BS_Union1D(visited,node->Id(),&_m);
00102 }
00103
00104
00105
00106
00107
00108
00109
00110
00111 void
00112 INTERVAL_PROCESSOR::Compute_Dominators(void) {
00113 BS *dom_init = NULL;
00114 BS *temp = NULL;
00115
00116 REGIONAL_CFG *cfg = _root->Regional_Cfg();
00117 NODE_VECTOR node_set = cfg->Node_Set();
00118
00119 temp = BS_Create(2+cfg->_seq_num, &_m);
00120 _dom_init = BS_Create_Empty(2+cfg->_seq_num, &_m);
00121
00122 for (NODE_VECTOR_ITER iter = node_set.begin();
00123 iter != node_set.end(); iter++) {
00124 REGIONAL_CFG_NODE *node = *iter;
00125 Is_True(node != NULL,("The node is NULL in Compute Dominators."));
00126
00127 BS_Union1D(_dom_init,node->Id() , &_m);
00128 }
00129
00130 Init_Dom_Set(cfg);
00131
00132 BOOL changed = TRUE;
00133
00134 while (changed) {
00135 changed = FALSE;
00136
00137 for (NODE_VECTOR_ITER top_iter = node_set.begin();
00138 top_iter != node_set.end();top_iter++) {
00139 REGIONAL_CFG_NODE *node = *top_iter;
00140 Is_True(node != NULL,("The node is NULL in Compute Dominators."));
00141
00142 BS *node_dom_set;
00143 BS *src;
00144 node_dom_set = _bs_vector[node->Id()];
00145 src = node_dom_set;
00146
00147 for (CFG_PRED_NODE_ITER iter(node);iter != 0;++iter) {
00148 REGIONAL_CFG_NODE *pred = *iter;
00149 BS_IntersectionR(temp, src, _bs_vector[pred->Id()]);
00150 src = temp;
00151 }
00152
00153 BS_Union1D(src, node->Id(), &_m);
00154
00155 if ( ! BS_EqualP(src, node_dom_set) ) {
00156 BS_CopyD(node_dom_set, src, NULL);
00157 changed = TRUE;
00158 }
00159 }
00160 }
00161 }
00162
00163
00164
00165
00166
00167
00168
00169
00170 void
00171 INTERVAL_PROCESSOR::Init_Dom_Set(REGIONAL_CFG *cfg) {
00172 NODE_ALLOC temp_alloc(&_m);
00173 NODE_VECTOR node_set(temp_alloc);
00174 node_set = cfg->Node_Set();
00175
00176 for (NODE_VECTOR_ITER iter = node_set.begin();
00177 iter != node_set.end();iter++) {
00178 REGIONAL_CFG_NODE *node = *iter;
00179 Is_True(node != NULL,("Node is NULL in Init Dom Set."));
00180
00181 if ((node->First_Pred())==NULL) {
00182 Set_Node_Dom_Set(node, BS_Create_Empty(2+cfg->_seq_num, &_m));
00183 BS_Union1D(_bs_vector[node->Id()], node->Id(), &_m);
00184 } else {
00185 Set_Node_Dom_Set(node, BS_Copy(_dom_init, &_m));
00186 }
00187 }
00188 }
00189
00190
00191
00192
00193
00194
00195
00196
00197 void
00198 INTERVAL_PROCESSOR::Set_Node_Dom_Set(REGIONAL_CFG_NODE *node,BS *bs) {
00199 _bs_vector[node->Id()] = bs;
00200 }
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214 void
00215 INTERVAL_PROCESSOR::Collect_Backedges(void) {
00216
00217 for (EDGE_VECTOR_ITER iter = _cycles.begin();iter != _cycles.end();iter++) {
00218
00219 REGIONAL_CFG_EDGE *e = *iter;
00220 REGIONAL_CFG_NODE *src = e->Src();
00221 REGIONAL_CFG_NODE *dest = e->Dest();
00222 BS *bs = _bs_vector[src->Id()];
00223
00224 if (BS_MemberP(bs,dest->Id())) {
00225 _backedges.push_back(e);
00226 }
00227 else {
00228
00229 _impedges.push_back(e);
00230
00231
00232
00233
00234
00235
00236
00237
00238 }
00239 }
00240 }
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252 void
00253 INTERVAL_PROCESSOR::Collect_Improper_Nodes(void){
00254 for (EDGE_VECTOR_ITER iter = _impedges.begin();iter != _impedges.end();iter++) {
00255 REGIONAL_CFG_EDGE *e = *iter;
00256 REGIONAL_CFG_NODE *src = e->Src();
00257 REGIONAL_CFG_NODE *dest = e->Dest();
00258
00259
00260 if (Find_In_Vector(src,_improper_node) == _improper_node.end()) {
00261 _improper_node.push_back(src);
00262 }
00263 if (Find_In_Vector(dest,_improper_node) == _improper_node.end()){
00264 _improper_node.push_back(dest);
00265 }
00266 }
00267 }
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287 void
00288 INTERVAL_PROCESSOR::Construct_Loops(void) {
00289 NODE_ALLOC temp_alloc(&_m);
00290 NODE_VECTOR temp_vector(temp_alloc);
00291 NODE_STACK node_stack(temp_vector);
00292 NODE_VECTOR node_set(temp_alloc);
00293 NODE_VECTOR loop_nodes(temp_alloc);
00294 EDGE_ALLOC edge_temp_alloc(&_m);
00295 EDGE_LIST edge_temp_list(edge_temp_alloc);
00296
00297 REGIONAL_CFG_EDGE *backedge = NULL;
00298 REGION_TREE *tree = _root->Tree();
00299 REGIONAL_CFG *cfg = _root->Regional_Cfg();
00300
00301 node_set = cfg->Node_Set();
00302
00303
00304 for (PREORDER_REGIONAL_CFG_ITER iter(cfg);iter != 0;++iter) {
00305 REGIONAL_CFG_NODE* node = *iter;
00306 node_stack.push(node);
00307 }
00308
00309 while (!node_stack.empty()) {
00310
00311 REGIONAL_CFG_NODE *top = node_stack.top();
00312 node_stack.pop();
00313 EDGE_QUEUE tar_edges(edge_temp_list);
00314 tar_edges = Is_Backedge_Target(top);
00315
00316 while (!tar_edges.empty()) {
00317 BOOL improper = FALSE;
00318 REGIONAL_CFG_EDGE *e = tar_edges.front();
00319 tar_edges.pop();
00320
00321 REGION *r = (e->Dest())->Home_Region();
00322 Is_True(r != NULL,("The home region of edge e is NULL."));
00323
00324 REGIONAL_CFG *cfg = r->Regional_Cfg();
00325 Is_True(cfg != NULL,("The cfg of region r is NULL."));
00326
00327 NODE_VECTOR loop_nodes(temp_alloc);
00328 loop_nodes = Detect_Loop_Scope(e);
00329 Is_True(!loop_nodes.empty(),("The loop nodes found is empty."));
00330
00331 LOOP_REGION *loop = tree->Add_Loop_Region(r,e,loop_nodes);
00332
00333 if (improper) {
00334 _imp_region.push_back(loop);
00335 }
00336
00337 REGIONAL_CFG_NODE *r_node = loop->Regional_Cfg_Node();
00338
00339
00340
00341
00342
00343
00344 for (NODE_VECTOR_ITER node_iter = loop_nodes.begin();
00345 node_iter != loop_nodes.end();node_iter++) {
00346 REGIONAL_CFG_NODE *loop_node = *node_iter;
00347 Is_True(loop_node != NULL,("Loop node is NULL in Construct Loops."));
00348
00349 EDGE_VECTOR edges(edge_temp_alloc);
00350 edges = Is_Backedge_Source(loop_node);
00351
00352
00353
00354
00355
00356 if (!edges.empty()) {
00357
00358 for (EDGE_VECTOR_ITER src_iter = edges.begin();
00359 src_iter != edges.end();src_iter++) {
00360 REGIONAL_CFG_EDGE *edge = *src_iter;
00361
00362 if (edge->Dest() != loop->Loop_Head()) {
00363
00364
00365
00366
00367
00368 REGIONAL_CFG_EDGE *new_edge = cfg->Find_Edge(r_node,edge->Dest());
00369
00370 for (EDGE_VECTOR_ITER edge_iter = _backedges.begin();edge_iter != _backedges.end();edge_iter++) {
00371
00372 if (*edge_iter == edge) {
00373 _backedges.erase(edge_iter);
00374 break;
00375 }
00376 }
00377
00378 _backedges.push_back(new_edge);
00379 }
00380 }
00381 }
00382 }
00383
00384
00385
00386
00387 EDGE_QUEUE temp;
00388
00389 while (!tar_edges.empty()) {
00390 REGIONAL_CFG_EDGE *front = tar_edges.front();
00391 tar_edges.pop();
00392
00393 if (Find_In_Vector(front->Src(),loop_nodes) == loop_nodes.end()) {
00394 REGIONAL_CFG_EDGE *new_edge = cfg->Find_Edge(front->Src(),r_node);
00395
00396 if (new_edge != NULL) {
00397 front = new_edge;
00398 }
00399 }
00400
00401 temp.push(front);
00402 }
00403
00404 tar_edges = temp;
00405
00406
00407
00408
00409
00410
00411 for (EDGE_VECTOR_ITER edge_iter = _impedges.begin();edge_iter != _impedges.end();edge_iter++) {
00412 REGIONAL_CFG_EDGE* e = *edge_iter;
00413 if(Find_In_Vector(e->Src(), loop_nodes) !=loop_nodes.end()){
00414 if(Find_In_Vector(e->Dest(), loop_nodes) ==loop_nodes.end()){
00415 REGIONAL_CFG_EDGE *new_edge = cfg->Find_Edge(r_node, e->Dest());
00416 if(new_edge != NULL){
00417 _impedges.erase(edge_iter);
00418 _impedges.push_back(new_edge);
00419 }
00420 }
00421 }else if(Find_In_Vector(e->Dest(), loop_nodes) !=loop_nodes.end()){
00422 REGIONAL_CFG_EDGE *new_edge = cfg->Find_Edge(e->Src(), r_node);
00423 if(new_edge != NULL){
00424 _impedges.erase(edge_iter);
00425 _impedges.push_back(new_edge);
00426 }
00427 }
00428 }
00429
00430 loop_nodes.clear();
00431
00432 }
00433 }
00434 }
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446 EDGE_VECTOR
00447 INTERVAL_PROCESSOR::Is_Backedge_Source(REGIONAL_CFG_NODE *node) {
00448 EDGE_ALLOC edge_temp_alloc(&_m);
00449 EDGE_VECTOR edges(edge_temp_alloc);
00450
00451 for (EDGE_VECTOR_ITER iter = _backedges.begin();
00452 iter != _backedges.end();iter++) {
00453 REGIONAL_CFG_EDGE *e = *iter;
00454
00455 if (e->Src() == node) {
00456 edges.push_back(e);
00457 }
00458 }
00459
00460 return edges;
00461 }
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479 EDGE_QUEUE
00480 INTERVAL_PROCESSOR::Is_Backedge_Target(REGIONAL_CFG_NODE *node) {
00481 EDGE_ALLOC edge_temp_alloc(&_m);
00482 EDGE_LIST edge_temp_list(edge_temp_alloc);
00483 EDGE_QUEUE edges(edge_temp_list);
00484 EDGE_VECTOR temp(edge_temp_alloc);
00485
00486 for (EDGE_VECTOR_ITER iter = _backedges.begin();
00487 iter != _backedges.end();iter++) {
00488 REGIONAL_CFG_EDGE *e = *iter;
00489
00490 if (e->Dest() == node) {
00491 edges.push(e);
00492 temp.push_back(e);
00493 }
00494 }
00495
00496 for (EDGE_VECTOR_ITER iter = temp.begin();iter != temp.end();iter++ ) {
00497
00498 for (EDGE_VECTOR_ITER backedge_iter = _backedges.begin();
00499 backedge_iter != _backedges.end();backedge_iter++) {
00500
00501 if ((*backedge_iter) == (*iter)) {
00502 _backedges.erase(backedge_iter);
00503
00504 break;
00505 }
00506 }
00507 }
00508
00509 return edges;
00510 }
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521 NODE_VECTOR
00522 INTERVAL_PROCESSOR::Detect_Loop_Scope(REGIONAL_CFG_EDGE *e) {
00523 NODE_ALLOC temp_alloc(&_m);
00524 NODE_VECTOR temp_vector(temp_alloc);
00525 NODE_STACK node_stack(temp_vector);
00526 BS *bs;
00527
00528 REGION *r = (e->Dest())->Home_Region();
00529 REGIONAL_CFG *cfg = r->Regional_Cfg();
00530 INT32 seq_num = cfg->Seq_Num();
00531 bs = BS_Create_Empty(2+seq_num, &_m);
00532 REGIONAL_CFG_NODE *loop_head = e->Dest();
00533 REGIONAL_CFG_NODE *loop_tail = e->Src();
00534
00535 BS_Union1D(bs,loop_head->Id() , &_m);
00536 BS_Union1D(bs,loop_tail->Id() , &_m);
00537
00538 if (!(loop_head == loop_tail)) {
00539 node_stack.push(loop_tail);
00540
00541 while (!node_stack.empty()) {
00542 REGIONAL_CFG_NODE *node = node_stack.top();
00543
00544 node_stack.pop();
00545
00546 for (CFG_PRED_NODE_ITER iter(node);iter != 0; ++iter) {
00547 REGIONAL_CFG_NODE *pred = *iter;
00548
00549 if (!BS_MemberP(bs,pred->Id())) {
00550 BS_Union1D(bs,pred->Id() , &_m);
00551 node_stack.push(pred);
00552 }
00553 }
00554 }
00555 }
00556
00557 NODE_VECTOR node_set(temp_alloc);
00558 node_set = cfg->Node_Set();
00559 NODE_VECTOR nodes(temp_alloc);
00560
00561 for (NODE_VECTOR_ITER iter = node_set.begin();
00562 iter != node_set.end();iter++) {
00563 REGIONAL_CFG_NODE *node = *iter;
00564
00565 if (BS_MemberP(bs,node->Id())) {
00566 nodes.push_back(node);
00567 }
00568 }
00569
00570 return nodes;
00571 }
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581 void
00582 INTERVAL_PROCESSOR::Process(void) {
00583
00584
00585 if (Get_Trace(TP_A_REGION, TT_RGN_SUMMERY)) {
00586 fprintf(TFile,"Begin find cycles.\n");
00587 }
00588
00589 Find_Cycles();
00590
00591 if (Get_Trace(TP_A_REGION, TT_RGN_SUMMERY)) {
00592 fprintf(TFile,"Finish find cycles.\n");
00593 }
00594
00595 if (Get_Trace(TP_A_REGION, TT_RGN_DETAILED)) {
00596 fprintf(TFile,"Cycles found,the cycles are:\n");
00597
00598 for (EDGE_VECTOR_ITER iter = _cycles.begin();
00599 iter != _cycles.end();iter++) {
00600 REGIONAL_CFG_EDGE *e = *iter;
00601
00602 fprintf(TFile,"Cycle's source :%d ",BB_id((e->Src())->BB_Node()));
00603 fprintf(TFile,"Cycle's target :%d \n",BB_id((e->Dest())->BB_Node()));
00604 }
00605 }
00606
00607 if (Get_Trace(TP_A_REGION, TT_RGN_DEBUG)) {
00608 fprintf(TFile,"Begin compute dominator.\n");
00609 }
00610
00611 Compute_Dominators();
00612
00613 if (Get_Trace(TP_A_REGION, TT_RGN_SUMMERY)) {
00614 fprintf(TFile,"Finish compute dominators.\n");
00615 }
00616
00617 if (Get_Trace(TP_A_REGION, TT_RGN_DETAILED)) {
00618 fprintf(TFile,"Dominator information:\n");
00619 Print_Dominators(_root->Regional_Cfg(),TFile);
00620 }
00621
00622 if (Get_Trace(TP_A_REGION, TT_RGN_SUMMERY)) {
00623 fprintf(TFile,"Begin collect backedges.\n");
00624 }
00625
00626 Collect_Backedges();
00627
00628 if (Get_Trace(TP_A_REGION, TT_RGN_SUMMERY)) {
00629 fprintf(TFile,"Finish collect backedges.\n");
00630 }
00631
00632 if (Get_Trace(TP_A_REGION, TT_RGN_DETAILED)) {
00633 fprintf(TFile,"The backedges are:\n");
00634
00635 for (EDGE_VECTOR_ITER iter = _backedges.begin();
00636 iter != _backedges.end();iter++) {
00637 REGIONAL_CFG_EDGE *e = *iter;
00638
00639 fprintf(TFile,"Cycle's source :%d ",BB_id((e->Src())->BB_Node()));
00640 fprintf(TFile,"Cycle's target :%d \n",BB_id((e->Dest())->BB_Node()));
00641 }
00642 }
00643
00644 Construct_Loops();
00645
00646 if (Get_Trace(TP_A_REGION, TT_RGN_SUMMERY)) {
00647 fprintf(TFile,"Finish construct loops from backedges.\n Begin find sccs.\n");
00648 }
00649
00650
00651 Collect_Improper_Nodes();
00652
00653 if (Get_Trace(TP_A_REGION, TT_RGN_SUMMERY)) {
00654 fprintf(TFile,"Finish collect Improper Nodes.\n");
00655 }
00656
00657 if (Get_Trace(TP_A_REGION, TT_RGN_DETAILED)) {
00658 fprintf(TFile,"The improper nodes are:\n");
00659
00660 for (NODE_VECTOR_ITER iter = _improper_node.begin();
00661 iter != _improper_node.end();iter++) {
00662 REGIONAL_CFG_NODE *n = *iter;
00663
00664 fprintf(TFile,"Node's BB Id :%d \n",BB_id(n->BB_Node()));
00665 }
00666 }
00667
00668 if (!_improper_node.empty()) {
00669 SCC_FINDER *finder = CXX_NEW(SCC_FINDER(),&_m);
00670 REGION_TREE *tree = _root->Tree();
00671 REGION *r = NULL;
00672 REGIONAL_CFG *cfg = NULL;
00673 for (NODE_VECTOR_ITER iter = _improper_node.begin();
00674 iter != _improper_node.end();iter++ ) {
00675 REGIONAL_CFG_NODE *node = *iter;
00676 r = node->Home_Region();
00677 Is_True(r != NULL,("Region is null in find improper region!"));
00678 if (r->Region_Type() == IMPROPER)
00679 continue;
00680 cfg = r->Regional_Cfg();
00681 Is_True(cfg != NULL,("Regional CFG is null in find improper region!"));
00682 finder->Find_Scc(cfg);
00683 SCC_VECTOR scc_set = finder->Scc_Set();
00684
00685 if (!scc_set.empty()) {
00686 for (SCC_VECTOR_ITER set_iter = scc_set.begin();
00687 set_iter != scc_set.end();++set_iter) {
00688 NODE_VECTOR nodes = *set_iter;
00689
00690 if (nodes.size() > 1) {
00691 tree->Add_Improper_Region(r,nodes);
00692 }
00693 }
00694 }
00695 }
00696 }
00697
00698 if (Get_Trace(TP_A_REGION, TT_RGN_DEBUG)) {
00699 fprintf(TFile,"Finished finding sccs.\n");
00700 }
00701
00702 }
00703
00704
00705
00706
00707
00708
00709
00710
00711 void
00712 INTERVAL_PROCESSOR::Print_Cycle(FILE *f) {
00713 EDGE_VECTOR_ITER iter;
00714
00715 for (iter = _cycles.begin();iter != _cycles.end();iter++) {
00716 REGIONAL_CFG_EDGE *e = *iter;
00717 e->Print(f);
00718 }
00719 }
00720
00721
00722
00723
00724
00725
00726
00727
00728 void
00729 INTERVAL_PROCESSOR::Print_Dominators(REGIONAL_CFG *cfg, FILE *f) {
00730 NODE_ALLOC temp_alloc(&_m);
00731 NODE_VECTOR node_set(temp_alloc);
00732 node_set = cfg->Node_Set();
00733
00734 for (NODE_VECTOR_ITER iter = node_set.begin();
00735 iter != node_set.end();iter++) {
00736 REGIONAL_CFG_NODE *node = *iter;
00737
00738 fprintf(f,"The Regional cfg node id is :%d\n",node->Id());
00739 fprintf(f,"Its dominators are:\n");
00740
00741 BS *bs = _bs_vector[node->Id()];
00742
00743 for (NODE_VECTOR_ITER iterr = node_set.begin();
00744 iterr != node_set.end();iterr++) {
00745 REGIONAL_CFG_NODE *n = *iterr;
00746
00747 if (BS_MemberP(bs,n->Id())) {
00748 fprintf(f,"Dominator:%d\n",n->Id());
00749 }
00750 }
00751 }
00752
00753 }
00754
00755
00756
00757
00758
00759
00760
00761
00762 void
00763 INTERVAL_PROCESSOR::Print_Loops(REGIONAL_CFG *cfg, FILE *f) {
00764 NODE_ALLOC temp_alloc(&_m);
00765 NODE_VECTOR node_set(temp_alloc);
00766 node_set = cfg->Node_Set();
00767
00768 Collect_Backedges();
00769 fprintf(f,"The backedges are:\n");
00770
00771 for (EDGE_VECTOR_ITER iter = _backedges.begin();
00772 iter != _backedges.end();iter++) {
00773 REGIONAL_CFG_EDGE *e = *iter;
00774 e->Print(f);
00775 }
00776
00777 for (EDGE_VECTOR_ITER iter = _backedges.begin();
00778 iter != _backedges.end();iter++) {
00779 REGIONAL_CFG_EDGE *e = *iter;
00780 BOOL improper = FALSE;
00781 NODE_VECTOR nodes = Detect_Loop_Scope(e);
00782
00783 fprintf(f, "Loop scope are:\n");
00784
00785 for (NODE_VECTOR_ITER iter = nodes.begin();iter != nodes.end();iter++) {
00786 REGIONAL_CFG_NODE *node = *iter;
00787 fprintf(f,"Node in loop:%d\n",node->Id());
00788 }
00789 }
00790 }