00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef LEGOREGION_H
00024 #include "region.H"
00025 #include "flag.H"
00026 #endif
00027
00028
00029
00030 legoRegion::legoRegion (enum regionTypes rType, unsigned id)
00031 : legoPSet<void *>()
00032 {
00033
00034 regionId = id;
00035 regionType = rType;
00036 inEdgesPtr = NULL;
00037 outEdgesPtr = NULL;
00038 flagPtr = NULL;
00039 entryOpsPtr = NULL;
00040 exitOpsPtr = NULL;
00041 regionAttrListPtr = NULL;
00042 weight = 0;
00043 parentPtr = NULL;
00044 parents = children = NULL;
00045 dominators = NULL;
00046 allListPtr = NULL;
00047 markfield = (long long)0;
00048 nestingLevel = -1;
00049 }
00050
00051 legoRegion::legoRegion () : legoPSet<void *>()
00052 {
00053
00054 regionId = 0;
00055 regionType = RT_BB;
00056 inEdgesPtr = NULL;
00057 outEdgesPtr = NULL;
00058 flagPtr = NULL;
00059 entryOpsPtr = NULL;
00060 exitOpsPtr = NULL;
00061 regionAttrListPtr = NULL;
00062 weight = 0;
00063 parentPtr = NULL;
00064 parents = children = NULL;
00065 dominators = NULL;
00066 allListPtr = NULL;
00067 markfield = (long long)0;
00068 nestingLevel = -1;
00069 }
00070
00071 legoRegion::legoRegion (const legoRegion &orig) :
00072 legoPSet<void *> ((legoPSet<void *>) orig)
00073 {
00074
00075 regionId = orig.regionId;
00076 regionType = orig.regionType;
00077
00078 if (orig.inEdgesPtr != NULL)
00079 inEdgesPtr = new edgeList (*(orig.inEdgesPtr));
00080 else inEdgesPtr = NULL;
00081
00082 if (orig.outEdgesPtr != NULL)
00083 outEdgesPtr = new edgeList (*(orig.outEdgesPtr));
00084 else outEdgesPtr = NULL;
00085
00086 if (orig.flagPtr != NULL)
00087 flagPtr = new flags (*(orig.flagPtr));
00088 else flagPtr = NULL;
00089
00090 if (orig.entryOpsPtr != NULL)
00091 entryOpsPtr = new opList (*(orig.entryOpsPtr));
00092 else entryOpsPtr = NULL;
00093
00094 if (orig.exitOpsPtr != NULL)
00095 exitOpsPtr = new opList (*(orig.exitOpsPtr));
00096 else exitOpsPtr = NULL;
00097
00098 if (orig.regionAttrListPtr != NULL)
00099 regionAttrListPtr = new attrList (*(orig.regionAttrListPtr));
00100 else regionAttrListPtr = NULL;
00101
00102 weight = orig.weight;
00103 parentPtr = orig.parentPtr;
00104 parents = NULL;
00105 children = NULL;
00106 dominators = NULL;
00107 allListPtr = orig.allListPtr;
00108 markfield = orig.markfield;
00109 nestingLevel = orig.nestingLevel;
00110 DAG = NULL;
00111
00112 if (parentPtr != NULL)
00113 parentPtr->AddItem (this);
00114 }
00115
00116 legoRegion::~legoRegion()
00117 {
00118 regionList *rl;
00119 legoRegion *r, *rp;
00120
00121 Mark (RM_KISSOFDEATH);
00122 delete flagPtr;
00123 delete entryOpsPtr;
00124 delete exitOpsPtr;
00125 delete regionAttrListPtr;
00126
00127
00128
00129
00130
00131
00132 for (r = this; r->regionType != RT_PROC; r = r->parentPtr)
00133 if (r->regionType == RT_MODULE) break;
00134 if (!(r->IsMarked (RM_KISSOFDEATH)))
00135 {
00136
00137 for (rl = GetParents(); rl != NULL; rl = rl->GetNextListPtr())
00138 {
00139 r = rl->GetRegionPtr();
00140 if (r != NULL && r != this)
00141 {
00142 delete r->children;
00143 r->children = NULL;
00144 }
00145 for (rp = r->parentPtr; rp->regionType != RT_PROC;
00146 rp = rp->parentPtr)
00147 {
00148 delete rp->children;
00149 rp->children = NULL;
00150 }
00151 }
00152 delete parents;
00153
00154 for (rl = GetChildren(); rl != NULL; rl = rl->GetNextListPtr())
00155 {
00156 r = rl->GetRegionPtr();
00157 if (r != NULL && r != this)
00158 {
00159 delete r->parents;
00160 r->parents = NULL;
00161 }
00162 for (rp = r->parentPtr; rp->regionType != RT_PROC;
00163 rp = rp->parentPtr)
00164 {
00165 delete rp->parents;
00166 rp->parents = NULL;
00167 }
00168 }
00169 delete children;
00170 }
00171 else
00172 {
00173 delete parents;
00174 delete children;
00175 }
00176 delete dominators;
00177 delete inEdgesPtr;
00178 delete outEdgesPtr;
00179
00180
00181
00182 }
00183
00184
00185
00186
00187
00188
00189 void
00190 legoRegion::RefreshAll (void)
00191 {
00192 if (!(IS_BLOCK(regionType)))
00193 for (unsigned i = 0; i < GetCount(); i++)
00194 ((legoRegion *) GetItem (i))->RefreshAll();
00195
00196 RefreshOpsAndEdges();
00197 return;
00198 }
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209 static const char * const regionNames[] = {
00210 "proc", "bb", "hb", "sb", "loop", "loopbody", "trace",
00211 "module", "tree", ""
00212 };
00213 char *RegionMap(int rType)
00214 {
00215 char *regionName;
00216
00217 regionName = const_cast<char *>(regionNames[rType]);
00218 return regionName;
00219 }
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230 legoOp *legoRegion::FindOpId(int currOpId)
00231 {
00232 legoOp *returnOpPtr = NULL;
00233 legoOp *firstOpPtr = NULL;
00234 legoRegion *nextRegionPtr = NULL;
00235 switch (this->regionType) {
00236 case RT_PROC:
00237 nextRegionPtr = (legoRegion *)GetItem(0);
00238 if ( nextRegionPtr == NULL) { return returnOpPtr; }
00239 while ( (nextRegionPtr->regionType == RT_PROC) ||
00240 (nextRegionPtr->regionType == RT_LOOPBODY) ) {
00241
00242 nextRegionPtr = (legoRegion *)nextRegionPtr->GetItem(0);
00243 }
00244 firstOpPtr = (legoOp *)nextRegionPtr->GetItem(0);
00245 break;
00246 case RT_BB:
00247 firstOpPtr = (legoOp *)GetItem(0);
00248 break;
00249 case RT_HB:
00250 firstOpPtr = (legoOp *)GetItem(0);
00251 break;
00252 case RT_SB:
00253 firstOpPtr = (legoOp *)GetItem(0);
00254 break;
00255 case RT_LOOP:
00256 firstOpPtr = (legoOp *)GetItem(0);
00257 break;
00258 case RT_LOOPBODY:
00259 nextRegionPtr = (legoRegion *)GetItem(0);
00260 if ( nextRegionPtr == NULL) { return returnOpPtr; }
00261 while ( (nextRegionPtr->regionType == RT_PROC) ||
00262 (nextRegionPtr->regionType == RT_LOOPBODY) ) {
00263
00264 nextRegionPtr = (legoRegion *)nextRegionPtr->GetItem(0);
00265 }
00266 firstOpPtr = (legoOp *)nextRegionPtr->GetItem(0);
00267 break;
00268 default:
00269 return returnOpPtr;
00270 break;
00271 }
00272 returnOpPtr = firstOpPtr;
00273 while ( currOpId != returnOpPtr->GetOpId() ) {
00274
00275
00276 returnOpPtr = returnOpPtr->GetListOpPtr();
00277 if (returnOpPtr == NULL) { return returnOpPtr; }
00278 }
00279 return returnOpPtr;
00280 }
00281
00282
00283
00284 regionList *
00285 legoRegion::GetParents (void)
00286 {
00287 edgeList *inedgelist, *scan;
00288 opEdges *inedge;
00289 legoOp *prevop;
00290 legoRegion *prevopparent;
00291 regionList *head = NULL, *current;
00292
00293 if (parents != NULL)
00294 return parents;
00295
00296
00297 inedgelist = GetInEdgesPtr();
00298 if (inedgelist != NULL)
00299 {
00300 for (scan = inedgelist, inedge = scan->GetEdgePtr();
00301 inedge != NULL;
00302 inedge = scan->GetEdgePtr())
00303 {
00304 prevop = inedge->GetFromOpPtr();
00305 if (prevop != NULL)
00306 {
00307 prevopparent = (legoRegion *) prevop->GetParentBlockPtr();
00308 while (prevopparent->GetRegionType() != RT_MODULE)
00309 {
00310 if ((prevopparent->GetRegionType() == regionType) ||
00311 (IS_BLOCK(prevopparent->GetRegionType()) &&
00312 IS_BLOCK(regionType)))
00313 {
00314 current = new regionList (prevopparent);
00315
00316 if (head != NULL)
00317 head->Concatenate (current);
00318 else
00319 head = current;
00320 break;
00321 }
00322 prevopparent = prevopparent->GetParentPtr();
00323 }
00324 }
00325
00326
00327 scan = scan->GetNextListPtr();
00328 if (scan == NULL)
00329 break;
00330 }
00331 }
00332
00333 parents = head;
00334 return head;
00335 }
00336
00337 void legoRegion::SetParents (regionList *p)
00338 {
00339 delete parents;
00340 parents = p;
00341 }
00342
00343 regionList *
00344 legoRegion::GetChildren (void)
00345 {
00346 edgeList *outedgelist, *scan;
00347 opEdges *outedge;
00348 legoOp *nextop;
00349 legoRegion *nextopparent;
00350 regionList *head = NULL, *current;
00351
00352 if (children != NULL)
00353 return children;
00354
00355
00356 outedgelist = GetOutEdgesPtr();
00357 if (outedgelist != NULL)
00358 {
00359 for (scan = outedgelist, outedge = scan->GetEdgePtr();
00360 outedge != NULL;
00361 outedge = scan->GetEdgePtr())
00362 {
00363 nextop = outedge->GetToOpPtr();
00364 if (nextop != NULL)
00365 {
00366 nextopparent = (legoRegion *) nextop->GetParentBlockPtr();
00367 while (nextopparent->GetRegionType() != RT_MODULE)
00368 {
00369 if ((nextopparent->GetRegionType() == regionType) ||
00370 (IS_BLOCK(nextopparent->GetRegionType()) &&
00371 IS_BLOCK(regionType)))
00372 {
00373 current = new regionList (nextopparent);
00374
00375 if (head != NULL)
00376 head->Concatenate (current);
00377 else
00378 head = current;
00379 break;
00380 }
00381 nextopparent = nextopparent->GetParentPtr();
00382 }
00383 }
00384
00385
00386 scan = scan->GetNextListPtr();
00387 if (scan == NULL)
00388 break;
00389 }
00390 }
00391
00392 children = head;
00393 return head;
00394 }
00395
00396 void legoRegion::SetChildren (regionList *c)
00397 {
00398 delete children;
00399 children = c;
00400 }
00401
00402
00403
00404
00405
00406
00407
00408
00409 int
00410 legoRegion::IsContainedIn (legoRegion *r)
00411 {
00412 legoRegion *parent;
00413
00414 for (parent = this; parent != NULL; parent = parent->GetParentPtr())
00415 {
00416 if (parent == r)
00417 return 1;
00418 }
00419
00420 return 0;
00421 }
00422
00423
00424
00425
00426
00427
00428
00429
00430 int
00431 legoRegion::Contains (legoRegion *r)
00432 {
00433 return (r->IsContainedIn (this));
00434 }
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445 legoRegion *
00446 legoRegion::FindMaxRegionId (void)
00447 {
00448 int i;
00449 legoRegion *block, *maxblock = NULL, *candblock;
00450
00451 for (i = 0; i < GetCount(); i++)
00452 {
00453 block = (legoRegion *) GetItem(i);
00454 if (!(IS_BLOCK(block->GetRegionType())))
00455 candblock = block->FindMaxRegionId();
00456 else
00457 candblock = block;
00458 if ((maxblock == NULL) ||
00459 (candblock->GetRegionId() > maxblock->GetRegionId()))
00460 maxblock = candblock;
00461 }
00462
00463
00464 if (this->GetRegionType() != RT_PROC &&
00465 this->GetRegionType() != RT_MODULE &&
00466 this->GetRegionId() > maxblock->GetRegionId())
00467 maxblock = this;
00468
00469 return maxblock;
00470 }
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481 void
00482 regionList::Concatenate (class regionList *newhead)
00483 {
00484 class regionList *oldhead, *oldtail, *r, *o, *dead;
00485
00486 for (oldhead = oldtail = this; oldtail->GetNextListPtr() != NULL;
00487 oldtail = oldtail->GetNextListPtr()) ;
00488
00489 r = newhead;
00490 while (r != NULL)
00491 {
00492
00493 for (o = oldhead; o != NULL; o = o->GetNextListPtr())
00494 {
00495 if (o->GetRegionPtr() == r->GetRegionPtr())
00496 break;
00497 }
00498
00499 if (o == NULL)
00500 {
00501 oldtail->Append (r);
00502 oldtail = r;
00503 r = r->GetNextListPtr();
00504 oldtail->SetNextListPtr (NULL);
00505 }
00506 else
00507 {
00508 dead = r;
00509 r = r->GetNextListPtr();
00510 dead->SetNextListPtr (NULL);
00511 delete dead;
00512 }
00513 }
00514
00515 oldtail->SetNextListPtr (NULL);
00516 return;
00517
00518 }
00519
00520
00521
00522
00523
00524
00525
00526
00527 regionList *
00528 regionList::Intersect (class regionList *newhead)
00529 {
00530 regionList *oldhead, *oldtail, *r, *o, *dead;
00531 regionList *intersection = NULL, *itail;
00532
00533 for (oldhead = oldtail = this; oldtail->GetNextListPtr() != NULL;
00534 oldtail = oldtail->GetNextListPtr()) ;
00535
00536 for (o = oldhead; o != NULL; o = o->GetNextListPtr())
00537 {
00538
00539 for (r = newhead; r != NULL; r = r->GetNextListPtr())
00540 {
00541 if (o->GetRegionPtr() == r->GetRegionPtr())
00542 break;
00543 }
00544
00545 if (r != NULL)
00546 {
00547 if (intersection != NULL)
00548 {
00549 itail->SetNextListPtr (new regionList);
00550 itail = itail->GetNextListPtr();
00551 }
00552 else
00553 intersection = itail = new regionList;
00554 itail->SetRegionPtr (o->GetRegionPtr());
00555 }
00556
00557 }
00558
00559 return intersection;
00560
00561 }
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607 void legoRegion::OpKiller (void)
00608 {
00609 unsigned i;
00610 int count;
00611 void *item;
00612
00613
00614 count = GetCount();
00615
00616 if (IsOwner())
00617 for (i = 0; i < count; i++)
00618 {
00619 item = GetItem(i);
00620 delete (legoOp *) item;
00621 }
00622 Data.Empty();
00623
00624 }
00625
00626 void legoRegion::RegionKiller (void)
00627 {
00628 unsigned i;
00629 int count;
00630 void *item;
00631
00632
00633 count = GetCount();
00634
00635 if (IsOwner())
00636 for (i = 0; i < count; i++)
00637 {
00638 item = GetItem(i);
00639 delete (legoRegion *) item;
00640 }
00641 Data.Empty();
00642
00643 }
00644
00645
00646
00647
00648
00649