00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <string.h>
00016 #include <iostream.h>
00017 #include <stl.h>
00018 #include "lego.H"
00019 #include "legoUtil.H"
00020
00021 #include "live.H"
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::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::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::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::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
00133
00134
00135
00136
00137
00138
00139
00140
00141 void LiveVar::BB_defs( legoOp *OpPtr, int BBId )
00142 {
00143 legoOprd *OprdPtr, *WalkOprdPtr;
00144 legoOp *WalkOpPtr;
00145 SetInfo Info;
00146 SetInfoTable::iterator LookUpIter, EndPtr;
00147
00148 int RegNum, RegFileType, OprdType, IsBB, NonDef;
00149
00150
00151 derr( ">> BB_defs: Op " << OpPtr->GetOpId() << "\n" );
00152
00153 if(OpPtr->GetPredOprdPtr() != NULL &&
00154 OpPtr->GetPredOprdPtr()->GetOprdType() == OT_REG &&
00155 OpPtr->GetPredOprdPtr()->GetOprdFileType() == FT_PR &&
00156 OpPtr->GetPredOprdPtr()->GetOprdRegNum() != 0)
00157 return;
00158 OprdPtr = OpPtr->GetDestOprdPtr();
00159 while (OprdPtr != NULL)
00160 {
00161
00162
00163 OprdType = OprdPtr->GetOprdType();
00164 if ( OprdType == OT_REG || OprdType == OT_MACRO &&
00165 OprdPtr->GetValid())
00166 {
00167 RegNum = OprdPtr->GetOprdRegNum();
00168 RegFileType = OprdPtr->GetOprdFileType();
00169 if ( OprdType == OT_MACRO ) RegFileType = -1;
00170
00171 derr( " Dest Reg: # " << RegNum << ", type: " << RegFileType
00172 << "\n" );
00173
00174
00175
00176 NonDef = 0;
00177 for ( WalkOpPtr = OpPtr->GetPrevLink(); WalkOpPtr != NULL &&
00178 WalkOpPtr->GetOutListPtr() == NULL;
00179 WalkOpPtr = WalkOpPtr->GetPrevLink() )
00180 {
00181 for ( WalkOprdPtr = WalkOpPtr->GetSrcOprdPtr();
00182 WalkOprdPtr != NULL;
00183 WalkOprdPtr = WalkOprdPtr->GetNextOprdPtr() )
00184 {
00185 if ( WalkOprdPtr->GetOprdType() != OprdType ) continue;
00186 if ( WalkOprdPtr->GetOprdRegNum() != RegNum ) continue;
00187 if ( OprdType != OT_MACRO &&
00188 WalkOprdPtr->GetOprdFileType() != RegFileType )
00189 continue;
00190
00191
00192 derr( " Found prior use at op " << WalkOpPtr->GetOpId()
00193 << "\n" );
00194 NonDef = 1;
00195 break;
00196 }
00197 if ( NonDef ) break;
00198 }
00199
00200
00201 if ((NonDef == 0) && (OprdPtr->GetOprdFileType() == FT_PR)) {
00202 for ( WalkOpPtr = OpPtr->GetPrevLink(); WalkOpPtr != NULL &&
00203 WalkOpPtr->GetOutListPtr() == NULL;
00204 WalkOpPtr = WalkOpPtr->GetPrevLink() )
00205 {
00206 for ( WalkOprdPtr = WalkOpPtr->GetPredOprdPtr();
00207 WalkOprdPtr != NULL;
00208 WalkOprdPtr = WalkOprdPtr->GetNextOprdPtr() )
00209 {
00210 if ( WalkOprdPtr->GetOprdType() != OprdType ) continue;
00211 if ( WalkOprdPtr->GetOprdRegNum() != RegNum ) continue;
00212 if ( OprdType != OT_MACRO &&
00213 WalkOprdPtr->GetOprdFileType() != RegFileType )
00214 continue;
00215
00216
00217 derr( " Found prior use at op " << WalkOpPtr->GetOpId()
00218 << "\n" );
00219 NonDef = 1;
00220 break;
00221 }
00222 if ( NonDef ) break;
00223 }
00224 }
00225
00226
00227
00228
00229 if ( !NonDef )
00230 {
00231
00232 IsBB = (((legoRegion *) OpPtr->GetParentBlockPtr())->
00233 GetRegionType() == RT_BB);
00234 if (IsBB)
00235 CreateReadHashKey( BBId, RegNum, RegFileType );
00236 else
00237 CreateReadHashKey( BBId, subblock, RegNum, RegFileType );
00238
00239 LookUpIter = Table.find( ReadHashKey );
00240 EndPtr = Table.end();
00241 if ( LookUpIter == EndPtr )
00242 {
00243 if (IsBB)
00244 CreateWriteHashKey( BBId, RegNum, RegFileType );
00245 else
00246 CreateWriteHashKey( BBId, subblock, RegNum, RegFileType );
00247
00248 Info.Use = FALSE;
00249 Info.Def = TRUE;
00250 Info.LiveIn = FALSE;
00251 Info.LiveOut = FALSE;
00252 Info.Oprd = OprdPtr;
00253 Table[ WriteHashKey ] = Info;
00254 derr( " ** Add to def set\n");
00255 }
00256 else
00257 {
00258 (*LookUpIter).second.Def = TRUE;
00259 derr( " ** Mod to def set\n");
00260 }
00261 }
00262 }
00263
00264
00265
00266 if (OpPtr->IsBRLOp() &&
00267 FindReturnMacro (OpPtr) != OprdPtr &&
00268 OprdPtr->GetNextOprdPtr() == NULL)
00269 OprdPtr = FindReturnMacro (OpPtr);
00270 else
00271 OprdPtr = OprdPtr->GetNextOprdPtr();
00272
00273 }
00274
00275 derr( "<< BB_defs\n" );
00276 }
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286 void LiveVar::BB_uses( legoOp *OpPtr, int BBId )
00287 {
00288 legoOprd *OprdPtr, *WalkOprdPtr;
00289 legoOp *WalkOpPtr;
00290 SetInfo Info;
00291 SetInfoTable::iterator LookUpIter, EndPtr;
00292 attrs *a;
00293
00294 int RegNum, RegFileType, OprdType, IsBB, NonUse;
00295
00296
00297 derr( ">> BB_uses: Op " << OpPtr->GetOpId() << "\n" );
00298
00299 for (OprdPtr = OpPtr->GetSrcOprdPtr(); OprdPtr != NULL;
00300 OprdPtr = OprdPtr->GetNextOprdPtr() )
00301 {
00302 if (!(OprdPtr->GetValid())) continue;
00303
00304 OprdType = OprdPtr->GetOprdType();
00305 if ( OprdType == OT_REG || OprdType == OT_MACRO )
00306 {
00307 RegNum = OprdPtr->GetOprdRegNum();
00308 RegFileType = OprdPtr->GetOprdFileType();
00309 if ( OprdType == OT_MACRO ) RegFileType = -1;
00310 derr( " Src Register: # " << RegNum << ", type: "
00311 << RegFileType << "\n" );
00312
00313
00314
00315 NonUse = 0;
00316 for ( WalkOpPtr = OpPtr->GetPrevLink(); WalkOpPtr != NULL &&
00317 WalkOpPtr->GetOutListPtr() == NULL;
00318 WalkOpPtr = WalkOpPtr->GetPrevLink() )
00319 {
00320
00321 for ( WalkOprdPtr = WalkOpPtr->GetDestOprdPtr();
00322 WalkOprdPtr != NULL;
00323 WalkOprdPtr = WalkOprdPtr->GetNextOprdPtr() )
00324 {
00325 if ( WalkOprdPtr->GetOprdType() != OprdType ) continue;
00326 if ( WalkOprdPtr->GetOprdRegNum() != RegNum ) continue;
00327 if ( OprdType != OT_MACRO &&
00328 WalkOprdPtr->GetOprdFileType() != RegFileType )
00329 continue;
00330
00331
00332
00333
00334
00335
00336
00337 if(WalkOpPtr->GetPredOprdPtr() != NULL &&
00338 WalkOpPtr->GetPredOprdPtr()->GetOprdType() == OT_REG &&
00339 WalkOpPtr->GetPredOprdPtr()->GetOprdFileType() == FT_PR &&
00340 WalkOpPtr->GetPredOprdPtr()->GetOprdRegNum() != 0)
00341 continue;
00342
00343
00344
00345 derr( " Found prior def at op " << WalkOpPtr->GetOpId()
00346 << "\n" );
00347 NonUse = 1;
00348 break;
00349 }
00350
00351 if ( !NonUse && WalkOpPtr->IsBRLOp() &&
00352 OprdType == OT_MACRO )
00353 {
00354 WalkOprdPtr = FindReturnMacro( WalkOpPtr );
00355 if ( WalkOprdPtr != NULL &&
00356 WalkOprdPtr->GetOprdRegNum() == RegNum )
00357 {
00358
00359 derr( " Found prior def at op " << WalkOpPtr->GetOpId()
00360 << "\n" );
00361 NonUse = 1;
00362 }
00363 }
00364
00365 if ( NonUse ) break;
00366 }
00367 if ( NonUse ) continue;
00368
00369
00370 IsBB = (((legoRegion *) OpPtr->GetParentBlockPtr())->GetRegionType()
00371 == RT_BB);
00372 if (IsBB)
00373 CreateReadHashKey( BBId, RegNum, RegFileType );
00374 else
00375 CreateReadHashKey( BBId, subblock, RegNum, RegFileType );
00376
00377 LookUpIter = Table.find( ReadHashKey );
00378 EndPtr = Table.end();
00379 if ( LookUpIter == EndPtr )
00380 {
00381 if (IsBB)
00382 CreateWriteHashKey( BBId, RegNum, RegFileType );
00383 else
00384 CreateWriteHashKey( BBId, subblock, RegNum, RegFileType );
00385
00386 Info.Use = TRUE;
00387 Info.Def = FALSE;
00388 Info.LiveIn = FALSE;
00389 Info.LiveOut = FALSE;
00390 Info.Oprd = OprdPtr;
00391 Table[ WriteHashKey ] = Info;
00392 derr( " ** Add to use set\n");
00393 }
00394 else
00395 {
00396 (*LookUpIter).second.Use = TRUE;
00397 derr( " ** Mod to use set\n");
00398 }
00399 }
00400 }
00401
00402
00403 for (OprdPtr = OpPtr->GetPredOprdPtr(); OprdPtr != NULL;
00404 OprdPtr = OprdPtr->GetNextOprdPtr() )
00405 {
00406 if (!(OprdPtr->GetValid())) continue;
00407
00408 OprdType = OprdPtr->GetOprdType();
00409 if ( OprdType == OT_REG || OprdType == OT_MACRO )
00410 {
00411 RegNum = OprdPtr->GetOprdRegNum();
00412 RegFileType = OprdPtr->GetOprdFileType();
00413 if ( OprdType == OT_MACRO ) RegFileType = -1;
00414 derr( " Src Register: # " << RegNum << ", type: "
00415 << RegFileType << "\n" );
00416
00417
00418
00419 NonUse = 0;
00420 for ( WalkOpPtr = OpPtr->GetPrevLink(); WalkOpPtr != NULL &&
00421 WalkOpPtr->GetOutListPtr() == NULL;
00422 WalkOpPtr = WalkOpPtr->GetPrevLink() )
00423 {
00424
00425 for ( WalkOprdPtr = WalkOpPtr->GetDestOprdPtr();
00426 WalkOprdPtr != NULL;
00427 WalkOprdPtr = WalkOprdPtr->GetNextOprdPtr() )
00428 {
00429 if ( WalkOprdPtr->GetOprdType() != OprdType ) continue;
00430 if ( WalkOprdPtr->GetOprdRegNum() != RegNum ) continue;
00431 if ( OprdType != OT_MACRO &&
00432 WalkOprdPtr->GetOprdFileType() != RegFileType )
00433 continue;
00434
00435
00436 derr( " Found prior def at op " << WalkOpPtr->GetOpId()
00437 << "\n" );
00438 NonUse = 1;
00439 break;
00440 }
00441
00442 if ( NonUse ) break;
00443 }
00444 if ( NonUse ) continue;
00445
00446
00447 IsBB = (((legoRegion *) OpPtr->GetParentBlockPtr())->GetRegionType()
00448 == RT_BB);
00449 if (IsBB)
00450 CreateReadHashKey( BBId, RegNum, RegFileType );
00451 else
00452 CreateReadHashKey( BBId, subblock, RegNum, RegFileType );
00453
00454 LookUpIter = Table.find( ReadHashKey );
00455 EndPtr = Table.end();
00456 if ( LookUpIter == EndPtr )
00457 {
00458 if (IsBB)
00459 CreateWriteHashKey( BBId, RegNum, RegFileType );
00460 else
00461 CreateWriteHashKey( BBId, subblock, RegNum, RegFileType );
00462
00463 Info.Use = TRUE;
00464 Info.Def = FALSE;
00465 Info.LiveIn = FALSE;
00466 Info.LiveOut = FALSE;
00467 Info.Oprd = OprdPtr;
00468 Table[ WriteHashKey ] = Info;
00469 derr( " ** Add to use set\n");
00470 }
00471 else
00472 {
00473 (*LookUpIter).second.Use = TRUE;
00474 derr( " ** Mod to use set\n");
00475 }
00476 }
00477 }
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579 if (OpPtr->IsBRLOp())
00580 {
00581 int StartOpReg;
00582 int EndOpReg;
00583 if(OpPtr->GetOpcodePtr() != NULL)
00584 {
00585
00586
00587
00588
00589 legoProc * proc;
00590 legoRegion * reg_t = ((legoBB *)
00591 OpPtr->GetParentBlockPtr())->GetParentPtr();
00592 if(reg_t->GetRegionType() == RT_PROC)
00593 proc = (legoProc *)reg_t;
00594 else
00595 {
00596 reg_t = reg_t->GetParentPtr();
00597 proc = (legoProc *) reg_t;
00598 }
00599 assert(reg_t->GetRegionType() == RT_PROC);
00600
00601
00602 if(proc == NULL)
00603 {
00604 LegoNonFatal ("LiveVar->BBuses", "This parent Proc is NULL\n");
00605 exit (-1);
00606 }
00607
00608 StartOpReg = FindFirstOutGoingReg(proc);
00609 EndOpReg = FindLastOutGoingReg(proc);
00610 }
00611 else
00612 {
00613 StartOpReg = INT_P1;
00614 EndOpReg = DBL_P2;
00615 }
00616 for (int regid = StartOpReg; regid <= EndOpReg; regid++) {
00617
00618
00619 if(OpPtr->GetOpcodePtr() != NULL)
00620 {
00621 OprdType = OT_REG;
00622 RegFileType = FT_GPR;
00623 }
00624 else
00625 {
00626 OprdType = OT_MACRO;
00627
00628 RegFileType = -1;
00629 }
00630
00631 RegNum = regid;
00632
00633 derr( " Src Register: # " << RegNum << ", type: "
00634 << RegFileType << "\n" );
00635
00636
00637
00638 NonUse = 0;
00639 for ( WalkOpPtr = OpPtr->GetPrevLink(); WalkOpPtr != NULL &&
00640 WalkOpPtr->GetOutListPtr() == NULL;
00641 WalkOpPtr = WalkOpPtr->GetPrevLink() )
00642 {
00643
00644 for ( WalkOprdPtr = WalkOpPtr->GetDestOprdPtr();
00645 WalkOprdPtr != NULL;
00646 WalkOprdPtr = WalkOprdPtr->GetNextOprdPtr() )
00647 {
00648 if ( WalkOprdPtr->GetOprdType() != OprdType ) continue;
00649 if ( WalkOprdPtr->GetOprdRegNum() != RegNum ) continue;
00650 if ( OprdType != OT_MACRO &&
00651 WalkOprdPtr->GetOprdFileType() != RegFileType )
00652 continue;
00653
00654
00655 derr( " Found prior def at op " << WalkOpPtr->GetOpId()
00656 << "\n" );
00657 NonUse = 1;
00658 break;
00659 }
00660
00661 if ( !NonUse && WalkOpPtr->IsBRLOp() &&
00662 OprdType == OT_MACRO )
00663 {
00664 WalkOprdPtr = FindReturnMacro( WalkOpPtr );
00665 if ( WalkOprdPtr != NULL &&
00666 WalkOprdPtr->GetOprdRegNum() == RegNum )
00667 {
00668
00669 derr( " Found prior def at op " << WalkOpPtr->GetOpId()
00670 << "\n" );
00671 NonUse = 1;
00672 }
00673 }
00674
00675 if ( NonUse ) break;
00676 }
00677 if ( NonUse ) continue;
00678
00679
00680 IsBB = (((legoRegion *) OpPtr->GetParentBlockPtr())->GetRegionType()
00681 == RT_BB);
00682 if (IsBB)
00683 CreateReadHashKey( BBId, RegNum, RegFileType );
00684 else
00685 CreateReadHashKey( BBId, subblock, RegNum, RegFileType );
00686
00687 LookUpIter = Table.find( ReadHashKey );
00688 EndPtr = Table.end();
00689 if ( LookUpIter == EndPtr )
00690 {
00691 if (IsBB)
00692 CreateWriteHashKey( BBId, RegNum, RegFileType );
00693 else
00694 CreateWriteHashKey( BBId, subblock, RegNum, RegFileType );
00695
00696 Info.Use = TRUE;
00697 Info.Def = FALSE;
00698 Info.LiveIn = FALSE;
00699 Info.LiveOut = FALSE;
00700
00701
00702 OprdPtr = new legoOprd();
00703 if(OpPtr->GetOpcodePtr() != NULL)
00704 {
00705 OprdPtr->SetOprdType(OT_REG);
00706 OprdPtr->SetOprdFileType(FT_GPR);
00707 OprdPtr->SetValid(1);
00708 OprdPtr->SetOprdRegType(RT_R);
00709 OprdPtr->SetOprdDataType(DT_I);
00710 OprdPtr->SetOprdRegStyle(RS_STATIC);
00711
00712 }
00713 else
00714 OprdPtr->SetOprdType(OT_MACRO);
00715 OprdPtr->SetOprdRegNum(regid);
00716 Info.Oprd = OprdPtr;
00717 Table[ WriteHashKey ] = Info;
00718 derr( " ** Add to use set\n");
00719 }
00720 else
00721 {
00722 (*LookUpIter).second.Use = TRUE;
00723 derr( " ** Mod to use set\n");
00724 }
00725 }
00726 }
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830 if ( OpPtr->IsRETOp()) {
00831 int StartOpReg;
00832 int EndOpReg;
00833 if(OpPtr->GetOpcodePtr() != NULL)
00834 {
00835 OprdType = OT_REG;
00836 RegFileType = FT_GPR;
00837 StartOpReg = 8;
00838 EndOpReg = 11;
00839 }
00840 else
00841 {
00842 OprdType = OT_MACRO;
00843 RegFileType = -1;
00844 StartOpReg = INT_RET;
00845 EndOpReg = DBL_RET;
00846 }
00847 for (RegNum = StartOpReg; RegNum <= EndOpReg; RegNum++) {
00848
00849 derr( " Src Register: # " << RegNum << ", type: "
00850 << RegFileType << "\n" );
00851
00852
00853
00854 NonUse = 0;
00855 for ( WalkOpPtr = OpPtr->GetPrevLink(); WalkOpPtr != NULL &&
00856 WalkOpPtr->GetOutListPtr() == NULL;
00857 WalkOpPtr = WalkOpPtr->GetPrevLink() )
00858 {
00859
00860 for ( WalkOprdPtr = WalkOpPtr->GetDestOprdPtr();
00861 WalkOprdPtr != NULL;
00862 WalkOprdPtr = WalkOprdPtr->GetNextOprdPtr() )
00863 {
00864 if ( WalkOprdPtr->GetOprdType() != OprdType ) continue;
00865 if ( WalkOprdPtr->GetOprdRegNum() != RegNum ) continue;
00866 if ( OprdType != OT_MACRO &&
00867 WalkOprdPtr->GetOprdFileType() != RegFileType )
00868 continue;
00869
00870
00871 derr( " Found prior def at op " << WalkOpPtr->GetOpId()
00872 << "\n" );
00873
00874
00875 if(OpPtr->GetOpcodePtr() == NULL)
00876 NonUse = 1;
00877 break;
00878 }
00879
00880 if ( !NonUse && WalkOpPtr->IsBRLOp() &&
00881 OprdType == OT_MACRO )
00882 {
00883 WalkOprdPtr = FindReturnMacro( WalkOpPtr );
00884 if ( WalkOprdPtr != NULL &&
00885 WalkOprdPtr->GetOprdRegNum() == RegNum )
00886 {
00887
00888 derr( " Found prior def at op " << WalkOpPtr->GetOpId()
00889 << "\n" );
00890 NonUse = 1;
00891 }
00892 }
00893
00894 if ( NonUse ) break;
00895 }
00896 if ( !NonUse ) {
00897
00898
00899 IsBB = (((legoRegion *) OpPtr->GetParentBlockPtr())->GetRegionType()
00900 == RT_BB);
00901 if (IsBB)
00902 CreateReadHashKey( BBId, RegNum, RegFileType );
00903 else
00904 CreateReadHashKey( BBId, subblock, RegNum, RegFileType );
00905
00906 LookUpIter = Table.find( ReadHashKey );
00907 EndPtr = Table.end();
00908 if ( LookUpIter == EndPtr )
00909 {
00910 if (IsBB)
00911 CreateWriteHashKey( BBId, RegNum, RegFileType );
00912 else
00913 CreateWriteHashKey( BBId, subblock, RegNum, RegFileType );
00914
00915 Info.Use = TRUE;
00916 Info.Def = FALSE;
00917 Info.LiveIn = FALSE;
00918 Info.LiveOut = FALSE;
00919
00920
00921 OprdPtr = new legoOprd();
00922 if(OpPtr->GetOpcodePtr() != NULL)
00923 {
00924 OprdPtr->SetOprdType(OT_REG);
00925 OprdPtr->SetOprdFileType(FT_GPR);
00926 OprdPtr->SetValid(1);
00927 OprdPtr->SetOprdRegType(RT_R);
00928 OprdPtr->SetOprdDataType(DT_I);
00929 OprdPtr->SetOprdRegStyle(RS_STATIC);
00930
00931 }
00932 else
00933 OprdPtr->SetOprdType(OT_MACRO);
00934 OprdPtr->SetOprdRegNum(RegNum);
00935 Info.Oprd = OprdPtr;
00936 Table[ WriteHashKey ] = Info;
00937 derr( " ** Add to use set\n");
00938 }
00939 else
00940 {
00941 (*LookUpIter).second.Use = TRUE;
00942 derr( " ** Mod to use set\n");
00943 }
00944 }
00945 }
00946
00947
00948 legoOprd *btr;
00949 btr = OpPtr->GetSrcOprdPtr();
00950 if(btr->GetOprdFileType() == FT_BTR &&
00951 btr->GetOprdRegNum() == 0) {
00952 OprdType = OT_REG;
00953 RegFileType = FT_BTR;
00954 RegNum = 0;
00955 derr( " Src Register: # " << RegNum << ", type: "
00956 << RegFileType << "\n" );
00957
00958
00959
00960 for ( WalkOpPtr = OpPtr->GetPrevLink(); WalkOpPtr != NULL &&
00961 WalkOpPtr->GetOutListPtr() == NULL;
00962 WalkOpPtr = WalkOpPtr->GetPrevLink() )
00963 {
00964
00965 for ( WalkOprdPtr = WalkOpPtr->GetDestOprdPtr();
00966 WalkOprdPtr != NULL;
00967 WalkOprdPtr = WalkOprdPtr->GetNextOprdPtr() )
00968 {
00969 if ( WalkOprdPtr->GetOprdType() != OprdType ) continue;
00970 if ( WalkOprdPtr->GetOprdRegNum() != RegNum ) continue;
00971 if ( WalkOprdPtr->GetOprdFileType() != RegFileType )
00972 continue;
00973
00974
00975 derr( " Found prior def at op " << WalkOpPtr->GetOpId()
00976 << "\n" );
00977 NonUse = 1;
00978 break;
00979 }
00980 if(NonUse)
00981 break;
00982 }
00983 if ( !NonUse ) {
00984
00985
00986 IsBB = (((legoRegion *) OpPtr->GetParentBlockPtr())->GetRegionType()
00987 == RT_BB);
00988 if (IsBB)
00989 CreateReadHashKey( BBId, RegNum, RegFileType );
00990 else
00991 CreateReadHashKey( BBId, subblock, RegNum, RegFileType );
00992
00993 LookUpIter = Table.find( ReadHashKey );
00994 EndPtr = Table.end();
00995 if ( LookUpIter == EndPtr )
00996 {
00997 if (IsBB)
00998 CreateWriteHashKey( BBId, RegNum, RegFileType );
00999 else
01000 CreateWriteHashKey( BBId, subblock, RegNum, RegFileType );
01001
01002 Info.Use = TRUE;
01003 Info.Def = FALSE;
01004 Info.LiveIn = FALSE;
01005 Info.LiveOut = FALSE;
01006
01007
01008 OprdPtr = new legoOprd();
01009 if(OpPtr->GetOpcodePtr() != NULL)
01010 {
01011 OprdPtr->SetOprdType(OT_REG);
01012 OprdPtr->SetOprdFileType(FT_BTR);
01013 OprdPtr->SetValid(1);
01014 OprdPtr->SetOprdRegType(RT_R);
01015 OprdPtr->SetOprdDataType(DT_I);
01016 OprdPtr->SetOprdRegStyle(RS_STATIC);
01017 }
01018 else
01019 OprdPtr->SetOprdType(OT_MACRO);
01020 OprdPtr->SetOprdRegNum(RegNum);
01021 Info.Oprd = OprdPtr;
01022 Table[ WriteHashKey ] = Info;
01023 derr( " ** Add to use set\n");
01024 }
01025 else
01026 {
01027 (*LookUpIter).second.Use = TRUE;
01028 derr( " ** Mod to use set\n");
01029 }
01030 }
01031 }
01032 }
01033
01034 derr( "<< BB_uses\n" );
01035 }
01036
01037
01038
01039
01040
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096 static void copy_operand( legoOprd *Src, legoOprd *Target )
01097 {
01098 if(Src->GetOprdType() != OT_REG)
01099 {
01100 assert(0);
01101
01102 }
01103 Target->SetOprdType( Src->GetOprdType() );
01104 Target->SetValid( Src->GetValid() );
01105 Target->SetOprdRegType( Src->GetOprdRegType() );
01106 Target->SetOprdRegNum( Src->GetOprdRegNum() );
01107 Target->SetOprdDataType( Src->GetOprdDataType() );
01108 Target->SetOprdFileType( Src->GetOprdFileType() );
01109 Target->SetOprdRegStyle( Src->GetOprdRegStyle() );
01110 Target->SetIntValue( Src->GetOprdIntValue() );
01111 }
01112
01113
01114
01115
01116
01117
01118
01119
01120
01121 static void add_to_existing_attr( attrs *Attr, legoOprd *NewOprd )
01122 {
01123 legoOprd *OprdPtr, *ShadowPtr;
01124 #ifdef _LIVE_VAR_DEBUG_
01125 int RegNum, RegFileType;
01126 #endif
01127
01128
01129 derr( ">> add_to_existing_attr\n" );
01130
01131
01132
01133
01134
01135 for ( OprdPtr = ShadowPtr = Attr->GetAttrOprdPtr(); OprdPtr != NULL;
01136 ShadowPtr = OprdPtr, OprdPtr = OprdPtr->GetNextOprdPtr() )
01137 {
01138 if ( OprdPtr->GetOprdType() == NewOprd->GetOprdType() &&
01139 OprdPtr->GetOprdRegNum() == NewOprd->GetOprdRegNum() &&
01140 OprdPtr->GetOprdFileType() == NewOprd->GetOprdFileType() )
01141 {
01142 derr( " already present in attribute\n" );
01143 return;
01144 }
01145 }
01146
01147
01148
01149 if ( OprdPtr != NULL ) derr( " ** OprdPtr not NULL!! **\n" );
01150
01151 #ifdef _LIVE_VAR_DEBUG_
01152 RegFileType = NewOprd->GetOprdFileType();
01153 if ( NewOprd->GetOprdType() == OT_MACRO )
01154 RegFileType = -1;
01155 cerr << " Oprd to be added: RegFile " << RegFileType << ", RegNum "
01156 << NewOprd->GetOprdRegNum() << "\n";
01157
01158 RegFileType = ShadowPtr->GetOprdFileType();
01159 if ( ShadowPtr->GetOprdType() == OT_MACRO )
01160 RegFileType = -1;
01161 cerr << " ShadowPtr values: RegFile " << RegFileType << ", RegNum "
01162 << ShadowPtr->GetOprdRegNum() << "\n";
01163 #endif
01164
01165 OprdPtr = ShadowPtr->AddOprd();
01166
01167
01168 copy_operand( NewOprd, OprdPtr );
01169
01170 #ifdef _LIVE_VAR_DEBUG_
01171 RegFileType = OprdPtr->GetOprdFileType();
01172 if ( OprdPtr->GetOprdType() == OT_MACRO )
01173 RegFileType = -1;
01174 cerr << " Newly created Oprd values: RegFile "
01175 << RegFileType << ", RegNum " << OprdPtr->GetOprdRegNum() << "\n";
01176 #endif
01177
01178
01179
01180
01181 derr( "<< add_to_existing_attr\n" );
01182 return;
01183 }
01184
01185
01186
01187
01188
01189
01190
01191
01192
01193 static void create_new_attr( opEdges *Edge, legoOprd *Oprd, legoProc *Proc )
01194 {
01195 legoOprd *NewOprd = new legoOprd();
01196
01197 derr( ">> create_new_attr\n" );
01198
01199 #ifdef _LIVE_VAR_DEBUG_
01200 attrs* Attr;
01201 int RegFileType;
01202
01203 RegFileType = Oprd->GetOprdFileType();
01204 if ( Oprd->GetOprdType() == OT_MACRO )
01205 RegFileType = -1;
01206 cerr << " Oprd to be added: RegFile " << RegFileType << ", RegNum "
01207 << Oprd->GetOprdRegNum() << "\n";
01208 #endif
01209
01210
01211 copy_operand( Oprd, NewOprd );
01212
01213
01214 AddLiveAttribute( NewOprd, Edge, Proc );
01215
01216 #ifdef _LIVE_VAR_DEBUG_
01217
01218 #endif
01219
01220 derr( "<< create_new_attr\n" );
01221 return;
01222 }
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233
01234
01235 void LiveVar::BB_live_out( legoProc *ProcPtr, legoRegion *RegionPtr )
01236 {
01237 regionList *ChildrenList;
01238 legoRegion *ChildRegionPtr;
01239 legoOp *ExitOp;
01240 opList *ExitOps;
01241 opEdges *ControlEdge;
01242 SetInfo Info;
01243 SetInfoTable::iterator LookUpIter, LookUpIterLoop, EndPtr;
01244 attrs *Attr;
01245
01246 int i, BBId = RegionPtr->GetRegionId(), ChildBBId, DoingNextSubBlock,
01247 SkipIt;
01248 char temp, *tempstr;
01249 legoOprd *NewOprd;
01250
01251
01252 derr(">> BB_live_out: iteration #" << IterCount << ", BBId " << BBId << " subblock " << subblock << "\n");
01253
01254
01255
01256
01257
01258 if (RegionPtr->GetCount() == 0)
01259 return;
01260
01261
01262
01263 DoingNextSubBlock = 0;
01264
01265 ChildrenList = (regionList *) RegionPtr->GetChildren();
01266
01267
01268
01269
01270 if (ChildrenList != NULL)
01271 ChildRegionPtr = (legoRegion *) ChildrenList->GetRegionPtr();
01272 else
01273 {
01274 if ( RegionPtr->GetRegionType() != RT_BB )
01275 {
01276 ChildRegionPtr = RegionPtr;
01277 DoingNextSubBlock = 1;
01278 }
01279
01280 else ChildRegionPtr = NULL;
01281 }
01282
01283 while (ChildRegionPtr != NULL)
01284 {
01285
01286
01287 ChildBBId = ChildRegionPtr->GetRegionId();
01288 derr(" >> BBId " << ChildBBId << " being processed\n" );
01289
01290
01291
01292
01293
01294 SkipIt = 0;
01295 if ( !DoingNextSubBlock )
01296 {
01297
01298 if ( RegionPtr->GetRegionType() == RT_BB ) {
01299
01300
01301
01302
01303 for (ExitOps = RegionPtr->GetExitOpsPtr();
01304 ExitOps != NULL;
01305 ExitOps = ExitOps->GetNextListPtr()) {
01306 ExitOp = ExitOps->GetOpPtr();
01307 ControlEdge = FindControlEdge (ExitOp, ChildRegionPtr->
01308 GetEntryOpsPtr()->GetOpPtr(), 1);
01309 if (ControlEdge != NULL) {
01310 break;
01311 }
01312 }
01313 }
01314 else if ( IS_BLOCK(RegionPtr->GetRegionType()) )
01315 {
01316 for ( i = 0, ExitOp = RegionPtr->GetEntryOpsPtr()->GetOpPtr();
01317 i < subblock; ExitOp = ExitOp->GetNextLink() )
01318 {
01319 if ( ExitOp->GetOutListPtr() != NULL ) i++;
01320 if ( i == subblock ) break;
01321 }
01322 ControlEdge = FindControlEdge (ExitOp, ChildRegionPtr->
01323 GetEntryOpsPtr()->GetOpPtr(), 1);
01324 }
01325 else
01326 {
01327 LegoNonFatal ("LiveVar::BB_live_out", "Passed non-block.");
01328 return;
01329 }
01330 derr(">> Exit op is op " << ExitOp->GetOpId() << "\n");
01331
01332 if ( ControlEdge == NULL )
01333 {
01334 if ( subblock == 0 )
01335 LegoNonFatal ("liveness", "Can't find control edge from op %d "
01336 "to region %d.", ExitOp->GetOpId(),
01337 ChildRegionPtr->GetRegionId());
01338 SkipIt = 1;
01339 }
01340 }
01341
01342
01343
01344
01345
01346 if ( !DoingNextSubBlock ) {
01347 sprintf( LBHashKey, "%d-", ChildBBId );
01348 sprintf( UBHashKey, "%d0", ChildBBId );
01349 }
01350 else {
01351 sprintf( LBHashKey, "%d/%d-", BBId, subblock + 1 );
01352 sprintf( UBHashKey, "%d/%d-", BBId, subblock + 2 );
01353 }
01354
01355
01356
01357 for( LookUpIterLoop = Table.lower_bound(LBHashKey);
01358 ((LookUpIterLoop != (Table.lower_bound(UBHashKey))) &&
01359 (LookUpIterLoop != Table.end())) &&
01360 !SkipIt;
01361 LookUpIterLoop++)
01362 {
01363
01364
01365
01366
01367
01368
01369
01370
01371
01372
01373
01374 if ((*LookUpIterLoop).second.LiveIn)
01375 {
01376
01377 SetInfoTable::iterator TmpIter = LookUpIterLoop;
01378
01379
01380
01381 ReadHashKey = (*LookUpIterLoop).first;
01382 ReadHashKey = strchr(ReadHashKey, '-');
01383 if ( subblock == 0 )
01384 sprintf( ReadHashPart1, "%d", BBId );
01385 else
01386 sprintf( ReadHashPart1, "%d/%d", BBId, subblock );
01387 ReadHashKey = strcat(ReadHashPart1,ReadHashKey);
01388
01389 LookUpIter = Table.find( ReadHashKey );
01390 EndPtr = Table.end();
01391 if ( LookUpIter == EndPtr ||
01392 (*LookUpIter).second.LiveOut != TRUE )
01393 {
01394
01395 derr( " Live-out (" << ReadHashKey << ") from region "
01396 << RegionPtr->GetRegionId() << " to region "
01397 << ChildRegionPtr->GetRegionId() << "\n" );
01398
01399
01400 if ( LookUpIter == EndPtr )
01401 {
01402 WriteHashKey = new char[HASH_KEY_SIZE];
01403 strcpy(WriteHashKey, ReadHashKey);
01404 Info.Use = FALSE;
01405 Info.Def = FALSE;
01406 Info.LiveIn = FALSE;
01407 Info.LiveOut = TRUE;
01408 Info.Oprd = (*TmpIter).second.Oprd;
01409 Table[ WriteHashKey ] = Info;
01410 derr(" Table entry added\n");
01411 }
01412 else
01413 {
01414 (*LookUpIter).second.LiveOut = TRUE;
01415 derr(" HashKey " << ReadHashKey <<
01416 " updated for LiveOut\n");
01417 }
01418
01419
01420 }
01421
01422
01423 NewOprd = (*TmpIter).second.Oprd;
01424
01425
01426
01427
01428
01429
01430
01431
01432
01433
01434
01435
01436
01437 if ( !DoingNextSubBlock )
01438 {
01439 Attr = FindLiveAttribute( ControlEdge );
01440 if ( Attr != NULL )
01441 add_to_existing_attr( Attr, NewOprd );
01442 else
01443 create_new_attr( ControlEdge, NewOprd, ProcPtr );
01444 derr( " Edge " << ControlEdge->GetEdgeId() <<
01445 " updated\n" );
01446 }
01447 }
01448 }
01449
01450
01451
01452 if ( ChildrenList != NULL )
01453 ChildrenList = ChildrenList->GetNextListPtr();
01454
01455
01456 if ( ChildrenList != NULL )
01457 ChildRegionPtr = (legoRegion *) ChildrenList->GetRegionPtr();
01458
01459 else
01460 {
01461 if ( !DoingNextSubBlock && RegionPtr->GetRegionType() != RT_BB )
01462 {
01463 ChildRegionPtr = RegionPtr;
01464 DoingNextSubBlock = 1;
01465 }
01466
01467 else ChildRegionPtr = NULL;
01468 }
01469 }
01470
01471 derr("<< BB_live_out\n" );
01472 return;
01473 }
01474
01475
01476
01477
01478
01479
01480
01481
01482
01483
01484 void LiveVar::BB_live_in( legoProc *ProcPtr, legoRegion *RegionPtr )
01485 {
01486 SetInfoTable::iterator LookUpIter;
01487 int BBId = RegionPtr->GetRegionId();
01488 bool Out_Not_Def, old_LiveIn;
01489
01490 derr(">> BB_live_in: iteration #" << IterCount << ", BBId " << BBId << " subblock " << subblock << "\n");
01491
01492
01493
01494
01495
01496 if (RegionPtr->GetCount() == 0)
01497 return;
01498
01499
01500 if ( subblock == 0 ) {
01501 sprintf( LBHashKey, "%d-", BBId );
01502 sprintf( UBHashKey, "%d0", BBId );
01503 }
01504 else {
01505 sprintf( LBHashKey, "%d/%d-", BBId, subblock );
01506 sprintf( UBHashKey, "%d/%d-", BBId, subblock + 1 );
01507 }
01508
01509
01510 for( LookUpIter = Table.lower_bound(LBHashKey);
01511
01512 ((LookUpIter != Table.lower_bound(UBHashKey)) &&
01513 (LookUpIter != Table.end()));
01514 LookUpIter++)
01515 {
01516
01517
01518 if( ((*LookUpIter).second.LiveOut == TRUE) &&
01519 ((*LookUpIter).second.Def == FALSE) )
01520 Out_Not_Def = TRUE;
01521 else Out_Not_Def = FALSE;
01522
01523
01524 old_LiveIn = (*LookUpIter).second.LiveIn;
01525 (*LookUpIter).second.LiveIn =
01526 ((*LookUpIter).second.Use || Out_Not_Def);
01527 if ((*LookUpIter).second.LiveIn != old_LiveIn)
01528 {
01529 ChangeBit = TRUE;
01530 derr(" HashKey " << (*LookUpIter).first <<
01531 " updated for LiveIn\n");
01532 }
01533
01534
01535
01536
01537
01538
01539
01540
01541
01542 }
01543
01544 derr("<< BB_live_in\n" );
01545 return;
01546 }
01547
01548
01549
01550
01551
01552
01553
01554
01555
01556
01557
01558
01559
01560 void LiveVar::Process ( legoRegion *RegionPtr, legoProc *ProcPtr )
01561 {
01562 int BBId, RegionCount, NumSubRegions;
01563
01564 if ( IS_BLOCK (RegionPtr->GetRegionType()) )
01565 {
01566 BBId = RegionPtr->GetRegionId();
01567
01568
01569
01570
01571 NumSubRegions = 0;
01572 if ( RegionPtr->GetRegionType() != RT_BB )
01573 {
01574 legoOp *op;
01575
01576 for ( op = RegionPtr->GetEntryOpsPtr()->GetOpPtr(); op != NULL;
01577 op = op->GetNextLink() ) {
01578 if ( op->GetOutListPtr() != NULL) NumSubRegions++;
01579 }
01580 derr(">> Contains " << NumSubRegions << " subblocks.\n");
01581 }
01582
01583
01584
01585 if ( RegionPtr->GetRegionType() == RT_BB )
01586 {
01587 subblock = 0;
01588 BB_live_out( ProcPtr, RegionPtr );
01589 BB_live_in( ProcPtr, RegionPtr );
01590 }
01591 else for (subblock = NumSubRegions; subblock > 0; subblock--)
01592 {
01593 BB_live_out( ProcPtr, RegionPtr );
01594 BB_live_in( ProcPtr, RegionPtr );
01595 }
01596 }
01597 else
01598 {
01599 RegionCount = RegionPtr->GetCount();
01600
01601
01602 for ( int i = (RegionCount - 1); i >= 0; i--)
01603
01604 Process ( (legoRegion *) RegionPtr->GetItem ( i ), ProcPtr );
01605 }
01606
01607 return;
01608 }
01609
01610
01611
01612
01613
01614
01615
01616
01617
01618
01619
01620
01621
01622 void LiveVar::analyze( legoRegion *RegionPtr, legoProc *ProcPtr )
01623 {
01624 legoRegion *SubRegionPtr;
01625 legoOp *OpPtr;
01626 SetInfoTable::iterator LookUpIter;
01627
01628 int j, k, RegionCount, OpCount, BBId;
01629
01630
01631 if ( RegionPtr->GetRegionType() == RT_PROC )
01632 {
01633
01634
01635 Table = SetInfoTable();
01636 ReadHashKey = new char[ HASH_KEY_SIZE ];
01637 ReadHashPart1 = new char[ HASH_PART_SIZE ];
01638 ReadHashPart2 = new char[ HASH_PART_SIZE ];
01639 ReadHashPart3 = new char[ HASH_PART_SIZE ];
01640 LBHashKey = new char[ HASH_KEY_SIZE ];
01641 UBHashKey = new char[ HASH_KEY_SIZE ];
01642 delete EdgeInfo;
01643 }
01644
01645 RegionCount = RegionPtr->GetCount();
01646 if ( RegionPtr == (legoRegion *) ProcPtr )
01647 derr( RegionCount << " Region(s) in Proc " << ProcPtr->GetProcName()
01648 << "\n");
01649
01650
01651 for ( j = 0; j < RegionCount; j++)
01652 {
01653 SubRegionPtr = (legoRegion *) RegionPtr->GetItem( j );
01654
01655
01656 if ( IS_BLOCK (SubRegionPtr->GetRegionType()) )
01657 {
01658 BBId = SubRegionPtr->GetRegionId();
01659 derr( "BB number " << (j + 1) << ", BBId: " << BBId << "\n");
01660
01661 OpCount = SubRegionPtr->GetCount();
01662 derr( OpCount << " Op(s) in BB number " << (j + 1) << "\n");
01663 subblock = 1;
01664
01665
01666 for ( k = 0; k < OpCount; k++)
01667 {
01668 OpPtr = (legoOp *) SubRegionPtr->GetItem( k );
01669 derr( "Op number " << (k + 1) << ", OpId: " << OpPtr->GetOpId()
01670 << "\n");
01671 BB_uses(OpPtr, BBId);
01672 BB_defs(OpPtr, BBId);
01673
01674 if (OpPtr->GetOutListPtr() != NULL) subblock++;
01675 }
01676 }
01677 else
01678 {
01679
01680 analyze ( SubRegionPtr, ProcPtr );
01681 }
01682 }
01683
01684 if ( RegionPtr != (legoRegion *) ProcPtr)
01685 return;
01686 derr( "** Defs/uses complete **\n" );
01687
01688
01689 ChangeBit = TRUE;
01690 IterCount = 1;
01691 while (ChangeBit == TRUE)
01692 {
01693 ChangeBit = FALSE;
01694
01695
01696 for ( j = (RegionCount - 1); j >= 0; j--)
01697 {
01698 SubRegionPtr = (legoRegion *) RegionPtr->GetItem( j );
01699 Process ( SubRegionPtr, ProcPtr );
01700 }
01701 derr ("Iteration number " << IterCount << "\n");
01702 IterCount++;
01703 }
01704
01705
01706 #ifdef _LIVE_VAR_DEBUG_
01707 for( LookUpIter = Table.begin();LookUpIter != Table.end();LookUpIter++ ) {
01708 derr( "Key : " );
01709 cerr.width(12);
01710 derr( (*LookUpIter).first );
01711 derr( " -- Def: " << (*LookUpIter).second.Def << ", Use: "
01712 << (*LookUpIter).second.Use << ", LiveIn: "
01713 << (*LookUpIter).second.LiveIn << ", LiveOut: "
01714 << (*LookUpIter).second.LiveOut << "\n" );
01715 }
01716 #endif
01717 if ( CreateTable )
01718 CollectEdgeInfo ( ProcPtr );
01719
01720 delete [] ReadHashKey;
01721 delete [] ReadHashPart1;
01722 delete [] ReadHashPart2;
01723 delete [] ReadHashPart3;
01724
01725
01726
01727
01728 delete [] LBHashKey;
01729 delete [] UBHashKey;
01730
01731
01732 for( LookUpIter = Table.begin();LookUpIter != Table.end();LookUpIter++ ) {
01733 delete ((*LookUpIter).first);
01734 }
01735 Table.erase( Table.begin(), Table.end() );
01736
01737 return;
01738 }
01739
01740
01741
01742
01743
01744
01745
01746 void LiveVar::analyze( legoModule *modulePtr )
01747 {
01748 legoProc *ProcPtr;
01749 int i, ProcCount;
01750
01751 ProcCount = modulePtr->GetCount();
01752 derr( ProcCount << " Proc(s) in legoModule\n");
01753
01754 for ( i = 0; i < ProcCount; i++ )
01755 analyze( ( legoProc *) modulePtr->GetItem( i ),
01756 ( legoProc *) modulePtr->GetItem( i ));
01757 }
01758
01759
01760 void LiveVar::deleteedgeinfo ( int edgeid )
01761 {
01762 if ( EdgeInfo == NULL ) return;
01763 if ( edgeid != 0 ) {
01764
01765
01766 EdgeInfo->Delete ( edgeid );
01767 return;
01768 }
01769
01770
01771
01772
01773
01774 EdgeInfo->DeleteAll();
01775 return;
01776 }
01777
01778
01779
01780
01781
01782
01783
01784
01785 void LiveVar::CollectEdgeInfo ( legoProc *ProcPtr )
01786 {
01787 opEdges *edge;
01788 attrs *liveattr;
01789
01790 legoOprd *oprd;
01791
01792 if ( !CreateTable ) return;
01793
01794 if ( EdgeInfo == NULL )
01795 EdgeInfo = new legoHash <int, legoOprd *, legoHash_lt_int>;
01796 else
01797 deleteedgeinfo (0);
01798
01799 for ( edge = ProcPtr->GetEdgeDictionary(); edge != NULL;
01800 edge = edge->GetNextOpEdgePtr() ) {
01801 liveattr = FindLiveAttribute (edge);
01802 if ( liveattr == NULL ) continue;
01803
01804
01805
01806
01807
01808
01809
01810
01811
01812
01813
01814
01815
01816
01817
01818 oprd = liveattr->GetAttrOprdPtr();
01819
01820 if ( oprd != NULL )
01821 EdgeInfo->Set ( edge->GetEdgeId(), oprd );
01822 }
01823
01824 return;
01825 }
01826
01827
01828
01829
01830
01831
01832
01833
01834
01835
01836
01837
01838 legoHash <int, legoOprd *, legoHash_lt_int> *
01839 LiveVariables (legoProc *proc, int maketable = 0)
01840 {
01841 legoHash <int, legoOprd *, legoHash_lt_int> *LiveInfo;
01842 LiveVar *live = new LiveVar;
01843 if (maketable) live->SetCreateTable (TRUE);
01844 else live->SetCreateTable (FALSE);
01845
01846 live->analyze (proc, proc);
01847
01848 LiveInfo = live->GetEdgeInfo();
01849 live->SetEdgeInfo ( NULL );
01850 delete live;
01851 return LiveInfo;
01852 }
01853
01854
01855
01856