00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <string.h>
00011 #include <iostream.h>
00012 #include <stl.h>
00013
00014
00015 #include <lego.H>
00016 #include <legoUtil.H>
00017
00018
00019 #include "yula_not_mine_live.h"
00020
00021 char *get_string_out_of_op(legoOprd *);
00022
00023
00024
00025 #ifdef _LIVE_VAR_DEBUG_
00026 #define derr(s) cerr << s
00027 #else
00028 #define derr(s)
00029 #endif
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 inline void LiveVar_nm::CreateReadHashKey (int X, int Y, int Z)
00042 {
00043 sprintf( ReadHashKey, "%d-", (X) );
00044 sprintf( ReadHashPart1, "%d-", (Y) );
00045 sprintf( ReadHashPart2, "%d", (Z) );
00046 ReadHashKey = strcat(ReadHashKey,ReadHashPart1);
00047 ReadHashKey = strcat(ReadHashKey,ReadHashPart2);
00048 }
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 inline void LiveVar_nm::CreateReadHashKey (int X, int W, int Y, int Z)
00062 {
00063 sprintf( ReadHashKey, "%d/", (X) );
00064 sprintf( ReadHashPart1, "%d-", (W) );
00065 sprintf( ReadHashPart2, "%d-", (Y) );
00066 sprintf( ReadHashPart3, "%d", (Z) );
00067 ReadHashKey = strcat(ReadHashKey,ReadHashPart1);
00068 ReadHashKey = strcat(ReadHashKey,ReadHashPart2);
00069 ReadHashKey = strcat(ReadHashKey,ReadHashPart3);
00070 }
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 inline void LiveVar_nm::CreateWriteHashKey (int X, int Y, int Z)
00083 {
00084 WriteHashKey = new char[ HASH_KEY_SIZE ];
00085 WriteHashPart1 = new char[ HASH_PART_SIZE ];
00086 WriteHashPart2 = new char[ HASH_PART_SIZE ];
00087 sprintf( WriteHashKey, "%d-", (X) );
00088 sprintf( WriteHashPart1, "%d-", (Y) );
00089 sprintf( WriteHashPart2, "%d", (Z) );
00090 WriteHashKey=strcat(WriteHashKey,WriteHashPart1 );
00091 WriteHashKey=strcat(WriteHashKey,WriteHashPart2 );
00092 delete[] WriteHashPart1; delete[] WriteHashPart2;
00093 }
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 inline void LiveVar_nm::CreateWriteHashKey (int X, int W, int Y, int Z)
00107 {
00108 WriteHashKey = new char[ HASH_KEY_SIZE ];
00109 WriteHashPart1 = new char[ HASH_PART_SIZE ];
00110 WriteHashPart2 = new char[ HASH_PART_SIZE ];
00111 WriteHashPart3 = new char[ HASH_PART_SIZE ];
00112 sprintf( WriteHashKey, "%d/", (X) );
00113 sprintf( WriteHashPart1, "%d-", (W) );
00114 sprintf( WriteHashPart2, "%d-", (Y) );
00115 sprintf( WriteHashPart3, "%d", (Z) );
00116 WriteHashKey=strcat(WriteHashKey,WriteHashPart1 );
00117 WriteHashKey=strcat(WriteHashKey,WriteHashPart2 );
00118 WriteHashKey=strcat(WriteHashKey,WriteHashPart3 );
00119 delete[] WriteHashPart1; delete[] WriteHashPart2;
00120 delete[] WriteHashPart3;
00121 }
00122
00123 static int subblock;
00124
00125
00126
00127
00128
00129
00130
00131
00132 void LiveVar_nm::BB_defs( legoOp *OpPtr, int BBId )
00133 {
00134 legoOprd *OprdPtr, *WalkOprdPtr;
00135 legoOp *WalkOpPtr;
00136 SetInfo Info;
00137 SetInfoTable::iterator LookUpIter, EndPtr;
00138
00139 int RegNum, RegFileType, OprdType, IsBB, NonDef;
00140
00141
00142 derr( ">> BB_defs: Op " << OpPtr->GetOpId() << "\n" );
00143
00144
00145
00146 OprdPtr = OpPtr->GetDestOprdPtr();
00147 while (OprdPtr != NULL)
00148 {
00149
00150
00151 OprdType = OprdPtr->GetOprdType();
00152 if ( OprdType == OT_REG || OprdType == OT_MACRO &&
00153 OprdPtr->GetValid())
00154 {
00155 RegNum = OprdPtr->GetOprdRegNum();
00156 RegFileType = OprdPtr->GetOprdFileType();
00157 if ( OprdType == OT_MACRO ) RegFileType = -1;
00158
00159 derr( " Dest Reg: # " << RegNum << ", type: " << RegFileType
00160 << "\n" );
00161
00162
00163
00164 NonDef = 0;
00165 for ( WalkOpPtr = OpPtr->GetPrevLink(); WalkOpPtr != NULL &&
00166 WalkOpPtr->GetOutListPtr() == NULL;
00167 WalkOpPtr = WalkOpPtr->GetPrevLink() )
00168 {
00169 for ( WalkOprdPtr = WalkOpPtr->GetSrcOprdPtr();
00170 WalkOprdPtr != NULL;
00171 WalkOprdPtr = WalkOprdPtr->GetNextOprdPtr() )
00172 {
00173 if ( WalkOprdPtr->GetOprdType() != OprdType ) continue;
00174 if ( WalkOprdPtr->GetOprdRegNum() != RegNum ) continue;
00175 if ( OprdType != OT_MACRO &&
00176 WalkOprdPtr->GetOprdFileType() != RegFileType )
00177 continue;
00178
00179
00180 derr( " Found prior use at op " << WalkOpPtr->GetOpId()
00181 << "\n" );
00182 NonDef = 1;
00183 break;
00184 }
00185 if ( NonDef ) break;
00186 }
00187
00188
00189
00190
00191 if ( !NonDef )
00192 {
00193
00194 IsBB = (((legoRegion *) OpPtr->GetParentBlockPtr())->
00195 GetRegionType() == RT_BB);
00196 if (IsBB)
00197 CreateReadHashKey( BBId, RegNum, RegFileType );
00198 else
00199 CreateReadHashKey( BBId, subblock, RegNum, RegFileType );
00200
00201 LookUpIter = Table.find( ReadHashKey );
00202 EndPtr = Table.end();
00203 if ( LookUpIter == EndPtr )
00204 {
00205 if (IsBB)
00206 CreateWriteHashKey( BBId, RegNum, RegFileType );
00207 else
00208 CreateWriteHashKey( BBId, subblock, RegNum, RegFileType );
00209
00210 Info.Use = FALSE;
00211 Info.Def = TRUE;
00212 Info.LiveIn = FALSE;
00213 Info.LiveOut = FALSE;
00214 Info.Oprd = OprdPtr;
00215 Table[ WriteHashKey ] = Info;
00216 derr( " ** Add to def set\n");
00217 }
00218 else
00219 {
00220 (*LookUpIter).second.Def = TRUE;
00221 derr( " ** Mod to def set\n");
00222 }
00223 }
00224 }
00225
00226
00227
00228 if (OpPtr->GetOpcode() == BRL &&
00229 FindReturnMacro (OpPtr) != OprdPtr &&
00230 OprdPtr->GetNextOprdPtr() == NULL)
00231 OprdPtr = FindReturnMacro (OpPtr);
00232 else
00233 OprdPtr = OprdPtr->GetNextOprdPtr();
00234
00235 }
00236
00237 derr( "<< BB_defs\n" );
00238 }
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248 void LiveVar_nm::BB_uses( legoOp *OpPtr, int BBId )
00249 {
00250 legoOprd *OprdPtr, *WalkOprdPtr;
00251 legoOp *WalkOpPtr;
00252 SetInfo Info;
00253 SetInfoTable::iterator LookUpIter, EndPtr;
00254
00255 int RegNum, RegFileType, OprdType, IsBB, NonUse;
00256
00257
00258 derr( ">> BB_uses: Op " << OpPtr->GetOpId() << "\n" );
00259
00260 for (OprdPtr = OpPtr->GetSrcOprdPtr(); OprdPtr != NULL;
00261 OprdPtr = OprdPtr->GetNextOprdPtr() )
00262 {
00263 if (!(OprdPtr->GetValid())) continue;
00264
00265 OprdType = OprdPtr->GetOprdType();
00266 if ( OprdType == OT_REG || OprdType == OT_MACRO )
00267 {
00268 RegNum = OprdPtr->GetOprdRegNum();
00269 RegFileType = OprdPtr->GetOprdFileType();
00270 if ( OprdType == OT_MACRO ) RegFileType = -1;
00271 derr( " Src Register: # " << RegNum << ", type: "
00272 << RegFileType << "\n" );
00273
00274
00275
00276 NonUse = 0;
00277 for ( WalkOpPtr = OpPtr->GetPrevLink(); WalkOpPtr != NULL &&
00278 WalkOpPtr->GetOutListPtr() == NULL;
00279 WalkOpPtr = WalkOpPtr->GetPrevLink() )
00280 {
00281
00282 for ( WalkOprdPtr = WalkOpPtr->GetDestOprdPtr();
00283 WalkOprdPtr != NULL;
00284 WalkOprdPtr = WalkOprdPtr->GetNextOprdPtr() )
00285 {
00286 if ( WalkOprdPtr->GetOprdType() != OprdType ) continue;
00287 if ( WalkOprdPtr->GetOprdRegNum() != RegNum ) continue;
00288 if ( OprdType != OT_MACRO &&
00289 WalkOprdPtr->GetOprdFileType() != RegFileType )
00290 continue;
00291
00292
00293 derr( " Found prior def at op " << WalkOpPtr->GetOpId()
00294 << "\n" );
00295 NonUse = 1;
00296 break;
00297 }
00298
00299 if ( !NonUse && WalkOpPtr->GetOpcode() == BRL &&
00300 OprdType == OT_MACRO )
00301 {
00302 WalkOprdPtr = FindReturnMacro( WalkOpPtr );
00303 if ( WalkOprdPtr != NULL &&
00304 WalkOprdPtr->GetOprdRegNum() == RegNum )
00305 {
00306
00307 derr( " Found prior def at op " << WalkOpPtr->GetOpId()
00308 << "\n" );
00309 NonUse = 1;
00310 }
00311 }
00312
00313 if ( NonUse ) break;
00314 }
00315 if ( NonUse ) continue;
00316
00317
00318 IsBB = (((legoRegion *) OpPtr->GetParentBlockPtr())->GetRegionType()
00319 == RT_BB);
00320 if (IsBB)
00321 CreateReadHashKey( BBId, RegNum, RegFileType );
00322 else
00323 CreateReadHashKey( BBId, subblock, RegNum, RegFileType );
00324
00325 LookUpIter = Table.find( ReadHashKey );
00326 EndPtr = Table.end();
00327 if ( LookUpIter == EndPtr )
00328 {
00329 if (IsBB)
00330 CreateWriteHashKey( BBId, RegNum, RegFileType );
00331 else
00332 CreateWriteHashKey( BBId, subblock, RegNum, RegFileType );
00333
00334 Info.Use = TRUE;
00335 Info.Def = FALSE;
00336 Info.LiveIn = FALSE;
00337 Info.LiveOut = FALSE;
00338 Info.Oprd = OprdPtr;
00339 Table[ WriteHashKey ] = Info;
00340 derr( " ** Add to use set\n");
00341 }
00342 else
00343 {
00344 (*LookUpIter).second.Use = TRUE;
00345 derr( " ** Mod to use set\n");
00346 }
00347 }
00348 }
00349
00350 derr( "<< BB_uses\n" );
00351 }
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412 static void copy_operand( legoOprd *Src, legoOprd *Target )
00413 {
00414 Target->SetOprdType( Src->GetOprdType() );
00415 Target->SetValid( Src->GetValid() );
00416 Target->SetOprdRegType( Src->GetOprdRegType() );
00417 Target->SetOprdRegNum( Src->GetOprdRegNum() );
00418 Target->SetOprdDataType( Src->GetOprdDataType() );
00419 Target->SetOprdFileType( Src->GetOprdFileType() );
00420 Target->SetOprdRegStyle( Src->GetOprdRegStyle() );
00421 Target->SetIntValue( Src->GetOprdIntValue() );
00422 }
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432 static void add_to_existing_attr( attrs *Attr, legoOprd *NewOprd )
00433 {
00434 legoOprd *OprdPtr, *ShadowPtr;
00435 #ifdef _LIVE_VAR_DEBUG_
00436 int RegNum, RegFileType;
00437 #endif
00438
00439
00440 derr( ">> add_to_existing_attr\t" << get_string_out_of_op(NewOprd) << " \n" );
00441
00442
00443
00444
00445
00446 for ( OprdPtr = ShadowPtr = Attr->GetAttrOprdPtr(); OprdPtr != NULL;
00447 ShadowPtr = OprdPtr, OprdPtr = OprdPtr->GetNextOprdPtr() )
00448 {
00449 if ( OprdPtr->GetOprdType() == NewOprd->GetOprdType() &&
00450 OprdPtr->GetOprdRegNum() == NewOprd->GetOprdRegNum() &&
00451 OprdPtr->GetOprdFileType() == NewOprd->GetOprdFileType() )
00452 {
00453
00454
00455
00456 return;
00457 }
00458 }
00459
00460
00461
00462 if ( OprdPtr != NULL ) derr( " ** OprdPtr not NULL!! **\n" );
00463
00464 #ifdef _LIVE_VAR_DEBUG_
00465 RegFileType = NewOprd->GetOprdFileType();
00466 if ( NewOprd->GetOprdType() == OT_MACRO )
00467 RegFileType = -1;
00468 cerr << " Oprd to be added: RegFile " << RegFileType << ", RegNum "
00469 << NewOprd->GetOprdRegNum() << "\n";
00470
00471 RegFileType = ShadowPtr->GetOprdFileType();
00472 if ( ShadowPtr->GetOprdType() == OT_MACRO )
00473 RegFileType = -1;
00474 cerr << " ShadowPtr values: RegFile " << RegFileType << ", RegNum "
00475 << ShadowPtr->GetOprdRegNum() << "\n";
00476 #endif
00477
00478 OprdPtr = ShadowPtr->AddOprd();
00479
00480
00481 copy_operand( NewOprd, OprdPtr );
00482
00483 #ifdef _LIVE_VAR_DEBUG_
00484 RegFileType = OprdPtr->GetOprdFileType();
00485 if ( OprdPtr->GetOprdType() == OT_MACRO )
00486 RegFileType = -1;
00487 cerr << " Newly created Oprd values: RegFile "
00488 << RegFileType << ", RegNum " << OprdPtr->GetOprdRegNum() << "\n";
00489 #endif
00490
00491
00492
00493
00494 derr( "<< add_to_existing_attr\n" );
00495 return;
00496 }
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506 static void create_new_attr( opEdges *Edge, legoOprd *Oprd, legoProc *Proc )
00507 {
00508 legoOprd *NewOprd = new legoOprd();
00509
00510 derr( ">> create_new_attr" << get_string_out_of_op(Oprd) << "\n" );
00511
00512 #ifdef _LIVE_VAR_DEBUG_
00513 attrs* Attr;
00514 int RegFileType;
00515
00516 RegFileType = Oprd->GetOprdFileType();
00517 if ( Oprd->GetOprdType() == OT_MACRO )
00518 RegFileType = -1;
00519 cerr << " Oprd to be added: RegFile " << RegFileType << ", RegNum "
00520 << Oprd->GetOprdRegNum() << "\n";
00521 #endif
00522
00523
00524 copy_operand( Oprd, NewOprd );
00525
00526
00527 AddLiveAttribute( NewOprd, Edge, Proc );
00528
00529 #ifdef _LIVE_VAR_DEBUG_
00530
00531 #endif
00532
00533 derr( "<< create_new_attr\n" );
00534 return;
00535 }
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548 void LiveVar_nm::BB_live_out( legoProc *ProcPtr, legoRegion *RegionPtr )
00549 {
00550 regionList *ChildrenList;
00551 legoRegion *ChildRegionPtr;
00552 legoOp *ExitOp;
00553 opEdges *ControlEdge;
00554 SetInfo Info;
00555 SetInfoTable::iterator LookUpIter, LookUpIterLoop, EndPtr;
00556 attrs *Attr;
00557
00558 int i, BBId = RegionPtr->GetRegionId(), ChildBBId, DoingNextSubBlock,SkipIt;
00559 char temp, *tempstr;
00560 legoOprd *NewOprd;
00561
00562
00563 derr(">> BB_live_out: iteration #" << IterCount << ", BBId " << BBId << " subblock " << subblock << "\n");
00564
00565
00566 if ( RegionPtr->GetRegionType() == RT_BB )
00567 ExitOp = RegionPtr->GetExitOpsPtr()->GetOpPtr();
00568 else if ( IS_BLOCK(RegionPtr->GetRegionType()) ){
00569 for ( i = 0, ExitOp = RegionPtr->GetEntryOpsPtr()->GetOpPtr();i < subblock; ExitOp = ExitOp->GetNextLink() ){
00570 if ( ExitOp->GetOutListPtr() != NULL ) i++;
00571 if ( i == subblock ) break;
00572 }
00573 }
00574 else{
00575 LegoNonFatal ("LiveVar_nm::BB_live_out", "Passed non-block.");
00576 return;
00577 }
00578 derr(">> Exit op is op " << ExitOp->GetOpId() << "\n");
00579
00580
00581
00582
00583
00584 DoingNextSubBlock = 0;
00585
00586 ChildrenList = (regionList *) RegionPtr->GetChildren();
00587
00588
00589
00590
00591 if (ChildrenList != NULL) ChildRegionPtr = (legoRegion *) ChildrenList->GetRegionPtr();
00592 else{
00593 if ( RegionPtr->GetRegionType() != RT_BB ){
00594 ChildRegionPtr = RegionPtr;
00595 DoingNextSubBlock = 1;
00596 }
00597
00598 else ChildRegionPtr = NULL;
00599 }
00600
00601 while (ChildRegionPtr != NULL){
00602
00603
00604 ChildBBId = ChildRegionPtr->GetRegionId();
00605 derr(" >> BBId " << ChildBBId << " being processed (as subblock? " << DoingNextSubBlock << ")\n" );
00606
00607
00608
00609
00610
00611 SkipIt = 0;
00612 if ( !DoingNextSubBlock ){
00613 ControlEdge = FindControlEdge (ExitOp, ChildRegionPtr->GetEntryOpsPtr()->GetOpPtr(), 1);
00614 if ( ControlEdge == NULL ){
00615
00616 if ( subblock == 0 )
00617 LegoNonFatal ("liveness", "Can't find control edge from op %d "
00618 "to region %d.", ExitOp->GetOpId(),
00619 ChildRegionPtr->GetRegionId());
00620 SkipIt = 1;
00621 }
00622 }
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644 if ( !DoingNextSubBlock ) {
00645 sprintf( LBHashKey, "%d-", ChildBBId );
00646 sprintf( UBHashKey, "%d0", ChildBBId );
00647 }
00648 else {
00649
00650
00651 sprintf( LBHashKey, "%d/%d-", BBId, subblock+1);
00652 sprintf( UBHashKey, "%d/%d0", BBId, subblock+1);
00653 }
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688 for( LookUpIterLoop = Table.lower_bound(LBHashKey);
00689 ((LookUpIterLoop != (Table.lower_bound(UBHashKey))) &&
00690 (LookUpIterLoop != Table.end())) &&
00691 !SkipIt;
00692 LookUpIterLoop++)
00693 {
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713 if ((*LookUpIterLoop).second.LiveIn){
00714
00715
00716 SetInfoTable::iterator TmpIter = LookUpIterLoop;
00717
00718
00719
00720 ReadHashKey = (*LookUpIterLoop).first;
00721 ReadHashKey = strchr(ReadHashKey, '-');
00722 if ( subblock == 0 )
00723 sprintf( ReadHashPart1, "%d", BBId );
00724 else
00725 sprintf( ReadHashPart1, "%d/%d", BBId, subblock );
00726 ReadHashKey = strcat(ReadHashPart1,ReadHashKey);
00727
00728
00729
00730 LookUpIter = Table.find( ReadHashKey );
00731 EndPtr = Table.end();
00732 if ( LookUpIter == EndPtr || (*LookUpIter).second.LiveOut != TRUE ){
00733
00734 derr( " Live-out (" << ReadHashKey << ") from region "
00735 << RegionPtr->GetRegionId() << " to region "
00736 << ChildRegionPtr->GetRegionId() << "\n" );
00737
00738
00739 if ( LookUpIter == EndPtr )
00740 {
00741 WriteHashKey = new char[HASH_KEY_SIZE];
00742 strcpy(WriteHashKey, ReadHashKey);
00743 Info.Use = FALSE;
00744 Info.Def = FALSE;
00745 Info.LiveIn = FALSE;
00746 Info.LiveOut = TRUE;
00747 Info.Oprd = (*TmpIter).second.Oprd;
00748 Table[ WriteHashKey ] = Info;
00749 derr(" Table entry added\n");
00750 }
00751 else
00752 {
00753 (*LookUpIter).second.LiveOut = TRUE;
00754 derr(" HashKey " << ReadHashKey << " updated for LiveOut\n");
00755 }
00756
00757
00758 }
00759
00760
00761
00762 NewOprd = (*TmpIter).second.Oprd;
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778 if ( !DoingNextSubBlock ){
00779 Attr = FindLiveAttribute( ControlEdge );
00780 if ( Attr != NULL )
00781 add_to_existing_attr( Attr, NewOprd );
00782 else
00783 create_new_attr( ControlEdge, NewOprd, ProcPtr );
00784 derr( " Edge " << ControlEdge->GetEdgeId() <<
00785 " updated\n" );
00786 }
00787
00788
00789
00790
00791
00792
00793 }
00794 }
00795
00796
00797
00798 if ( ChildrenList != NULL ) ChildrenList = ChildrenList->GetNextListPtr();
00799
00800
00801 if ( ChildrenList != NULL ) ChildRegionPtr = (legoRegion *) ChildrenList->GetRegionPtr();
00802
00803 else{
00804 if ( !DoingNextSubBlock && RegionPtr->GetRegionType() != RT_BB ){
00805 ChildRegionPtr = RegionPtr;
00806 DoingNextSubBlock = 1;
00807 }
00808
00809 else ChildRegionPtr = NULL;
00810 }
00811
00812 }
00813
00814 derr("<< BB_live_out\n" );
00815 return;
00816 }
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827 void LiveVar_nm::BB_live_in( legoProc *ProcPtr, legoRegion *RegionPtr )
00828 {
00829 SetInfoTable::iterator LookUpIter;
00830 int BBId = RegionPtr->GetRegionId();
00831 bool Out_Not_Def, old_LiveIn;
00832
00833 derr(">> BB_live_in: iteration #" << IterCount << ", BBId " << BBId << " subblock " << subblock << "\n");
00834
00835
00836 if ( subblock == 0 ) {
00837 sprintf( LBHashKey, "%d-", BBId );
00838 sprintf( UBHashKey, "%d0", BBId );
00839 }
00840 else {
00841 sprintf( LBHashKey, "%d/%d-", BBId, subblock );
00842 sprintf( UBHashKey, "%d/%d-", BBId, subblock + 1 );
00843 }
00844
00845
00846 for( LookUpIter = Table.lower_bound(LBHashKey);
00847
00848 ((LookUpIter != Table.lower_bound(UBHashKey)) &&
00849 (LookUpIter != Table.end()));
00850 LookUpIter++){
00851
00852
00853
00854 if( ((*LookUpIter).second.LiveOut == TRUE) && ((*LookUpIter).second.Def == FALSE) )
00855 Out_Not_Def = TRUE;
00856 else Out_Not_Def = FALSE;
00857
00858
00859 old_LiveIn = (*LookUpIter).second.LiveIn;
00860 (*LookUpIter).second.LiveIn = ((*LookUpIter).second.Use || Out_Not_Def);
00861 if ((*LookUpIter).second.LiveIn != old_LiveIn){
00862 ChangeBit = TRUE;
00863 derr(" HashKey " << (*LookUpIter).first << " updated for LiveIn\n");
00864 }
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874 }
00875
00876 derr("<< BB_live_in\n" );
00877 return;
00878 }
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892 void LiveVar_nm::Process ( legoRegion *RegionPtr, legoProc *ProcPtr )
00893 {
00894 int BBId, RegionCount, NumSubRegions;
00895
00896 if(IS_BLOCK (RegionPtr->GetRegionType())){
00897 BBId = RegionPtr->GetRegionId();
00898 derr( "BB with BBId: " << BBId << "\n");
00899
00900
00901
00902 NumSubRegions = 0;
00903 if(RegionPtr->GetRegionType() != RT_BB){
00904 legoOp *op;
00905
00906 for(op= RegionPtr->GetEntryOpsPtr()->GetOpPtr();op!=NULL;op=op->GetNextLink())
00907 if(op->GetOutListPtr()) NumSubRegions++;
00908 derr(">> Contains " << NumSubRegions << " subblocks.\n");
00909 }
00910
00911
00912 if(RegionPtr->GetRegionType()==RT_BB){
00913 subblock = 0;
00914 BB_live_out( ProcPtr, RegionPtr );
00915 BB_live_in( ProcPtr, RegionPtr );
00916 }
00917 else for(subblock = NumSubRegions; subblock>0;subblock--){
00918
00919 BB_live_out( ProcPtr, RegionPtr );
00920 BB_live_in( ProcPtr, RegionPtr );
00921 }
00922 }
00923 else{
00924 RegionCount = RegionPtr->GetCount();
00925 for (int i=0;i<RegionCount;i++)
00926 Process ( (legoRegion *) RegionPtr->GetItem ( i ), ProcPtr );
00927 }
00928
00929 return;
00930 }
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944 void LiveVar_nm::analyze( legoRegion *RegionPtr, legoProc *ProcPtr )
00945 {
00946 legoRegion *SubRegionPtr;
00947 legoOp *OpPtr;
00948 #ifdef _LIVE_VAR_DEBUG_
00949 SetInfoTable::iterator LookUpIter;
00950 #endif
00951
00952 int j, k, RegionCount, OpCount, BBId;
00953
00954
00955 if ( RegionPtr->GetRegionType() == RT_PROC )
00956 {
00957
00958
00959 Table = SetInfoTable();
00960 ReadHashKey = new char[ HASH_KEY_SIZE ];
00961 ReadHashPart1 = new char[ HASH_PART_SIZE ];
00962 ReadHashPart2 = new char[ HASH_PART_SIZE ];
00963 ReadHashPart3 = new char[ HASH_PART_SIZE ];
00964 LBHashKey = new char[ HASH_KEY_SIZE ];
00965 UBHashKey = new char[ HASH_KEY_SIZE ];
00966 delete EdgeInfo;
00967 }
00968
00969 RegionCount = RegionPtr->GetCount();
00970 if ( RegionPtr == (legoRegion *) ProcPtr )
00971 derr( RegionCount << " Region(s) in Proc " << ProcPtr->GetProcName()
00972 << "\n");
00973
00974
00975 for ( j = 0; j < RegionCount; j++)
00976 {
00977 SubRegionPtr = (legoRegion *) RegionPtr->GetItem( j );
00978
00979
00980 if ( IS_BLOCK (SubRegionPtr->GetRegionType()) )
00981 {
00982 BBId = SubRegionPtr->GetRegionId();
00983 derr( "BB number " << (j + 1) << ", BBId: " << BBId << "\n");
00984
00985 OpCount = SubRegionPtr->GetCount();
00986 derr( OpCount << " Op(s) in BB number " << (j + 1) << "\n");
00987 subblock = 1;
00988
00989
00990 for ( k = 0; k < OpCount; k++)
00991 {
00992 OpPtr = (legoOp *) SubRegionPtr->GetItem( k );
00993 derr( "Op number " << (k + 1) << ", OpId: " << OpPtr->GetOpId()
00994 << "\n");
00995 BB_uses(OpPtr, BBId);
00996 BB_defs(OpPtr, BBId);
00997
00998
00999 if (OpPtr->GetOutListPtr() != NULL){
01000
01001 subblock++;
01002 }
01003 }
01004 }
01005 else
01006 {
01007
01008
01009 analyze ( SubRegionPtr, ProcPtr );
01010 }
01011 }
01012
01013 if ( RegionPtr != (legoRegion *) ProcPtr)
01014 return;
01015 derr( "** Defs/uses complete **\n" );
01016
01017
01018 ChangeBit = TRUE;
01019 IterCount = 1;
01020 while (ChangeBit == TRUE)
01021 {
01022 ChangeBit = FALSE;
01023 for ( j = 0; j < RegionCount; j++)
01024 {
01025 SubRegionPtr = (legoRegion *) RegionPtr->GetItem( j );
01026 Process ( SubRegionPtr, ProcPtr );
01027 }
01028 IterCount++;
01029 }
01030
01031
01032 #ifdef _LIVE_VAR_DEBUG_
01033 for( LookUpIter = Table.begin();LookUpIter != Table.end();LookUpIter++ ) {
01034 derr( "Key : " );
01035 cerr.width(12);
01036 derr( (*LookUpIter).first );
01037 derr( " -- Def: " << (*LookUpIter).second.Def << ", Use: "
01038 << (*LookUpIter).second.Use << ", LiveIn: "
01039 << (*LookUpIter).second.LiveIn << ", LiveOut: "
01040 << (*LookUpIter).second.LiveOut << "\n" );
01041 }
01042 #endif
01043 if ( CreateTable )
01044 CollectEdgeInfo ( ProcPtr );
01045
01046 delete [] ReadHashKey;
01047 delete [] ReadHashPart1;
01048 delete [] ReadHashPart2;
01049 delete [] ReadHashPart3;
01050
01051
01052
01053
01054 delete [] LBHashKey;
01055 delete [] UBHashKey;
01056 Table.erase( Table.begin(), Table.end() );
01057 Table.~map();
01058
01059 return;
01060 }
01061
01062
01063
01064
01065
01066
01067
01068 void LiveVar_nm::analyze( legoModule *modulePtr )
01069 {
01070 legoProc *ProcPtr;
01071 int i, ProcCount;
01072
01073 ProcCount = modulePtr->GetCount();
01074 derr( ProcCount << " Proc(s) in legoModule\n");
01075
01076 for ( i = 0; i < ProcCount; i++ )
01077 analyze( ( legoProc *) modulePtr->GetItem( i ),
01078 ( legoProc *) modulePtr->GetItem( i ));
01079 }
01080
01081
01082 void LiveVar_nm::deleteedgeinfo ( int edgeid )
01083 {
01084 if ( EdgeInfo == NULL ) return;
01085 if ( edgeid != 0 ) {
01086
01087
01088 EdgeInfo->Delete ( edgeid );
01089 return;
01090 }
01091
01092
01093
01094
01095
01096 EdgeInfo->DeleteAll();
01097 return;
01098 }
01099
01100
01101
01102
01103
01104
01105
01106
01107 void LiveVar_nm::CollectEdgeInfo ( legoProc *ProcPtr )
01108 {
01109 opEdges *edge;
01110 attrs *liveattr;
01111
01112 legoOprd *oprd;
01113
01114 if ( !CreateTable ) return;
01115
01116 if ( EdgeInfo == NULL )
01117 EdgeInfo = new legoHash <int, legoOprd *, legoHash_lt_int>;
01118 else
01119 deleteedgeinfo (0);
01120
01121 for ( edge = ProcPtr->GetEdgeDictionary(); edge != NULL;
01122 edge = edge->GetNextOpEdgePtr() ) {
01123 liveattr = FindLiveAttribute (edge);
01124 if ( liveattr == NULL ) continue;
01125
01126
01127
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139
01140 oprd = liveattr->GetAttrOprdPtr();
01141
01142 if ( oprd != NULL )
01143 EdgeInfo->Set ( edge->GetEdgeId(), oprd );
01144 }
01145
01146 return;
01147 }
01148
01149
01150
01151
01152
01153
01154
01155
01156
01157
01158
01159
01160 legoHash <int, legoOprd *, legoHash_lt_int> *
01161 LiveVariables_not_mine (legoProc *proc, int maketable = 0)
01162 {
01163 legoHash <int, legoOprd *, legoHash_lt_int> *LiveInfo;
01164 LiveVar_nm *live = new LiveVar_nm;
01165 if (maketable) live->SetCreateTable (TRUE);
01166 else live->SetCreateTable (FALSE);
01167
01168 live->analyze (proc, proc);
01169
01170 LiveInfo = live->GetEdgeInfo();
01171 live->SetEdgeInfo ( NULL );
01172 delete live;
01173 return LiveInfo;
01174 }
01175
01176
01177
01178