LV code on machine instructions
authorRuchira Sasanka <sasanka@students.uiuc.edu>
Mon, 20 Aug 2001 21:12:49 +0000 (21:12 +0000)
committerRuchira Sasanka <sasanka@students.uiuc.edu>
Mon, 20 Aug 2001 21:12:49 +0000 (21:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@360 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/LiveVar/BBLiveVar.cpp
lib/Analysis/LiveVar/FunctionLiveVarInfo.cpp
lib/Analysis/LiveVar/LiveVarSet.cpp
lib/Analysis/LiveVar/ValueSet.cpp
lib/Target/SparcV9/LiveVar/BBLiveVar.cpp
lib/Target/SparcV9/LiveVar/FunctionLiveVarInfo.cpp
lib/Target/SparcV9/LiveVar/LiveVarSet.cpp
lib/Target/SparcV9/LiveVar/ValueSet.cpp

index aeb7f9184c55d139ddbbb2369d8b2eec01eaeef2..6d925c4a7e08800769a0b73e558cb83bbdd06c7a 100644 (file)
 #include "llvm/Analysis/LiveVar/BBLiveVar.h"
+#include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
+#include "llvm/CodeGen/MachineInstr.h"
+#include "llvm/CodeGen/Sparc.h"
 
 
 /********************* Implementation **************************************/
 
-BBLiveVar::BBLiveVar( const BasicBlock* baseBB, unsigned int RdfoId) 
-                      : DefSet(),  InSet(), OutSet(), PhiArgMap() {  
+BBLiveVar::BBLiveVar( const BasicBlock *const  baseBB, unsigned int RdfoId) 
+                      : BaseBB(baseBB), DefSet(),  InSet(), 
+                       OutSet(), PhiArgMap() {  
     BaseBB = baseBB;   
     InSetChanged = OutSetChanged = false;
     POId = RdfoId;
 }
 
+// caluculates def and use sets for each BB
+// There are two passes over operands of a machine instruction. This is
+// because, we can have instructions like V = V + 1, since we no longer
+// assume single definition.
 
-
-void BBLiveVar::calcDefUseSets()  // caluculates def and use sets for each BB
+void BBLiveVar::calcDefUseSets()  
 {
-                                                // instructions in basic block 
-  const BasicBlock::InstListType&  InstListInBB = BaseBB->getInstList();   
+  // get the iterator for machine instructions
+  const MachineCodeForBasicBlock& MIVec = BaseBB->getMachineInstrVec();
+  MachineCodeForBasicBlock::const_reverse_iterator 
+    MInstIterator = MIVec.rbegin();
+
+  // iterate over all the machine instructions in BB
+  for( ; MInstIterator != MIVec.rend(); ++MInstIterator) {  
 
-  BasicBlock::InstListType::const_reverse_iterator 
-    InstIterator = InstListInBB.rbegin();  // get the iterator for instructions
+    const MachineInstr * MInst  = *MInstIterator;  // MInst is the machine inst
+    assert(MInst);
+    
+    if( DEBUG_LV > 1) {                            // debug msg
+      cout << " *Iterating over machine instr ";
+      MInst->dump();
+      cout << endl;
+    }
 
-                                     // iterate over all the instructions in BB
-  for( ; InstIterator != InstListInBB.rend(); InstIterator++) {  
+    // iterate over  MI operands to find defs
+    for( MachineInstr::val_op_const_iterator OpI(MInst); !OpI.done() ; ++OpI) {
 
-    const Instruction * Inst  = *InstIterator;     // Inst is the current instr
-    assert(Inst);
+      const Value *Op = *OpI;
 
-    if( Inst->isDefinition() ) {  // add to Defs only if this instr is a def
+      if( OpI.isDef() ) {     // add to Defs only if this operand is a def
   
-      DefSet.add( Inst );   // nstruction is a def - so add to def set
-      InSet.remove( Inst);  // this definition kills any uses
-      InSetChanged = true; 
-      //cout << " adding inst to def "; printValue( Inst ); cout << endl;
+       DefSet.add( Op );     // operand is a def - so add to def set
+       InSet.remove( Op);    // this definition kills any uses
+       InSetChanged = true; 
+
+       if( DEBUG_LV > 1) {   
+         cout << "  +Def: "; printValue( Op ); cout << endl;
+       }
+      }
     }
 
-    Instruction::op_const_iterator 
-      OpI = Inst->op_begin();                // get iterator for operands
+    bool IsPhi = ( MInst->getOpCode() == PHI );
+
+    // iterate over  MI operands to find uses
+    for(MachineInstr::val_op_const_iterator OpI(MInst); !OpI.done() ;  ++OpI) {
+      const Value *Op = *OpI;
+
+      if ( ((Op)->getType())->isLabelType() )    
+       continue;             // don't process labels
+
+      if(! OpI.isDef() ) {    // add to Defs only if this operand is a use
+
+       InSet.add( Op );      // An operand is a use - so add to use set
+       OutSet.remove( Op );  // remove if there is a def below this use
+       InSetChanged = true; 
+
+       if( DEBUG_LV > 1) {   // debug msg of level 2
+         cout << "   Use: "; printValue( Op ); cout << endl;
+       }
+
+       if( IsPhi ) {         // for a phi node
+                              // put args into the PhiArgMap (Val -> BB)
 
-    bool IsPhi=( Inst->getOpcode() == Instruction::PHINode );  // Is this a phi
+         const Value * ArgVal = Op;
+         ++OpI;              // increment to point to BB of value
+         const Value * BBVal = *OpI; 
 
-    for(int OpNum=0 ; OpI != Inst->op_end() ; OpI++) { // iterate over operands
 
-      if ( ((*OpI)->getType())->isLabelType() ) 
-       continue;                                      // don't process labels 
+         assert( (BBVal)->getValueType() == Value::BasicBlockVal );
+         
+         PhiArgMap[ ArgVal ] = (const BasicBlock *) (BBVal); 
+         assert( PhiArgMap[ ArgVal ] );
 
-      InSet.add( *OpI );      // An operand is a use - so add to use set
-      OutSet.remove( *OpI );  // remove if there is a definition below this use
+         if( DEBUG_LV > 1) {   // debug msg of level 2
+           cout << "   - phi operand "; 
+           printValue( ArgVal ); 
+           cout  << " came from BB "; 
+           printValue( PhiArgMap[ ArgVal ]); 
+           cout<<endl;
+         }
+
+       }
 
-      if( IsPhi ) {           // for a phi node
-                              // put args into the PhiArgMap
-       PhiArgMap[ *OpI ] = ((PHINode *) Inst )->getIncomingBlock( OpNum++ ); 
-       assert( PhiArgMap[ *OpI ] );
-       //cout << " Phi operand "; printValue( *OpI ); 
-       //cout  << " came from BB "; printValue(PhiArgMap[*OpI]); cout<<endl;
       }
+    } 
 
-      InSetChanged = true; 
-      //cout << " adding operand to use "; printValue( *OpI ); cout << endl;
-    }
-    
-  }
+  } // for all machine instructions
 } 
        
 
 
 bool BBLiveVar::applyTransferFunc() // calculates the InSet in terms of OutSet 
 {
@@ -71,18 +112,18 @@ bool BBLiveVar::applyTransferFunc() // calculates the InSet in terms of OutSet
   // IMPORTANT: caller should check whether the OutSet changed 
   //           (else no point in calling)
 
-  LiveVarSet OutMinusDef;                      // set to hold (Out[B] - Def[B])
+  LiveVarSet OutMinusDef;     // set to hold (Out[B] - Def[B])
   OutMinusDef.setDifference( &OutSet, &DefSet);
   InSetChanged = InSet.setUnion( &OutMinusDef );
  
-  OutSetChanged = false;    // no change to OutSet since transfer func applied
+  OutSetChanged = false;      // no change to OutSet since transf func applied
 
   return InSetChanged;
 }
 
 
 
-                        // calculates Out set using In sets of the predecessors
+// calculates Out set using In sets of the predecessors
 bool BBLiveVar::setPropagate( LiveVarSet *const OutSet, 
                              const LiveVarSet *const InSet, 
                              const BasicBlock *const PredBB) {
@@ -92,11 +133,12 @@ bool BBLiveVar::setPropagate( LiveVarSet *const OutSet,
   bool changed = false;
   const BasicBlock *PredBBOfPhiArg;
 
-                                               // for all all elements in InSet
+  // for all all elements in InSet
   for( InIt = InSet->begin() ; InIt != InSet->end(); InIt++) {  
     PredBBOfPhiArg =  PhiArgMap[ *InIt ];
 
-                        // if this var is not a phi arg or it came from this BB
+    // if this var is not a phi arg OR 
+    // it's a phi arg and the var went down from this BB
     if( !PredBBOfPhiArg || PredBBOfPhiArg == PredBB) {  
       result = OutSet->insert( *InIt );               // insert to this set
       if( result.second == true) changed = true;
@@ -108,7 +150,8 @@ bool BBLiveVar::setPropagate( LiveVarSet *const OutSet,
 
 
 
-                                // propogates in set to OutSets of PREDECESSORs
+// propogates in set to OutSets of PREDECESSORs
+
 bool BBLiveVar::applyFlowFunc(BBToBBLiveVarMapType LVMap) 
 {
 
@@ -122,17 +165,19 @@ bool BBLiveVar::applyFlowFunc(BBToBBLiveVarMapType LVMap)
   cfg::pred_const_iterator PredBBI = cfg::pred_begin(BaseBB);
 
   for( ; PredBBI != cfg::pred_end(BaseBB) ; PredBBI++) {
-    assert( *PredBBI );                 // assert that the predecessor is valid
+    assert( *PredBBI );       // assert that the predecessor is valid
     BBLiveVar  *PredLVBB = LVMap[*PredBBI];
 
-                                                               // do set union
+                              // do set union
     if(  setPropagate( &(PredLVBB->OutSet), &InSet, *PredBBI ) == true) {  
       PredLVBB->OutSetChanged = true;
 
-      if( PredLVBB->getPOId() <= POId) // if the predec POId is lower than mine
+      // if the predec POId is lower than mine
+      if( PredLVBB->getPOId() <= POId) 
        needAnotherIt = true;   
     }
-  } // for
+
+  }  // for
 
   return needAnotherIt;
 
@@ -140,19 +185,21 @@ bool BBLiveVar::applyFlowFunc(BBToBBLiveVarMapType LVMap)
 
 
 
-
-
 /* ----------------- Methods For Debugging (Printing) ----------------- */
 
 void BBLiveVar::printAllSets() const
 {
-  cout << "Defs: ";   DefSet.printSet();  cout << endl;
-  cout << "In: ";   InSet.printSet();  cout << endl;
-  cout << "Out: ";   OutSet.printSet();  cout << endl;
+  cout << "  Defs: ";   DefSet.printSet();  cout << endl;
+  cout << "  In: ";   InSet.printSet();  cout << endl;
+  cout << "  Out: ";   OutSet.printSet();  cout << endl;
 }
 
 void BBLiveVar::printInOutSets() const
 {
-  cout << "In: ";   InSet.printSet();  cout << endl;
-  cout << "Out: ";   OutSet.printSet();  cout << endl;
+  cout << "  In: ";   InSet.printSet();  cout << endl;
+  cout << "  Out: ";   OutSet.printSet();  cout << endl;
 }
+
+
+
+
index b4126b00293d6a5c82a1a18560ecaf4e5a896437..91c2498e9750c46cee02264642fcefc6d54ecf9c 100644 (file)
@@ -1,35 +1,38 @@
-/* Title:   ValueSet.h
+/* Title:   MethodLiveVarInfo.cpp
    Author:  Ruchira Sasanka
    Date:    Jun 30, 01
    Purpose: 
 
-   This is the interface for live variable info of a method that is required by 
-   any other part of the compiler.
+   This is the interface for live variable info of a method that is required 
+   by any other part of the compiler.
 
 */
 
 
 #include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
-
+#include "llvm/CodeGen/MachineInstr.h"
 
 
 
 /************************** Constructor/Destructor ***************************/
 
 
-MethodLiveVarInfo::MethodLiveVarInfo(Method *const MethPtr) :  BB2BBLVMap()  
-{
-  Meth = MethPtr;  // init BB2BBLVMap and records Method for future use
+MethodLiveVarInfo::MethodLiveVarInfo(const Method *const M) : Meth(M),  
+                                                             BB2BBLVMap()
+{ 
+  assert(! M->isExternal() );           // cannot be a prototype decleration
+  HasAnalyzed = false;                  // still we haven't called analyze()
 }
 
 
 
 MethodLiveVarInfo:: ~MethodLiveVarInfo()
 {
-  BBToBBLiveVarMapType::iterator HMI = BB2BBLVMap.begin();   // hash map iterator
+  // hash map iterator
+  BBToBBLiveVarMapType::iterator HMI = BB2BBLVMap.begin(); 
 
   for( ; HMI != BB2BBLVMap.end() ; HMI ++ ) {  
-    if( (*HMI).first )                    // delete all LiveVarSets in BB2BBLVMap
+    if( (*HMI).first )                  // delete all LiveVarSets in BB2BBLVMap
       delete (*HMI).second;
    }
 }
@@ -39,38 +42,40 @@ MethodLiveVarInfo:: ~MethodLiveVarInfo()
 
 
 
-                                // constructs BBLiveVars and init Def and In sets
+// constructs BBLiveVars and init Def and In sets
 void MethodLiveVarInfo::constructBBs()   
 {
-  unsigned int POId = 0;   // Reverse Depth-first Order ID
+  unsigned int POId = 0;                // Reverse Depth-first Order ID
 
   cfg::po_const_iterator BBI = cfg::po_begin(Meth);
 
   for(  ; BBI != cfg::po_end(Meth) ; ++BBI, ++POId) 
   { 
 
-    if(DEBUG_LV) cout << "-- For BB " << (*BBI)->getName() << ":" << endl ;
+    if(DEBUG_LV) cout << " For BB " << (*BBI)->getName() << ":" << endl ;
 
-    const BasicBlock *BB = *BBI;      // get the current BB 
-    BBLiveVar * LVBB = new BBLiveVar( BB, POId );  // create a new BBLiveVar
+    const BasicBlock *BB = *BBI;        // get the current BB 
+                                        // create a new BBLiveVar
+    BBLiveVar * LVBB = new BBLiveVar( BB, POId );  
     
-    BB2BBLVMap[ BB ] = LVBB;  // insert the pair to Map
+    BB2BBLVMap[ BB ] = LVBB;            // insert the pair to Map
     
-    LVBB->calcDefUseSets();  // calculates the def and in set
+    LVBB->calcDefUseSets();             // calculates the def and in set
 
-    if(DEBUG_LV) LVBB->printAllSets();
-    //cout << "InSetChanged: " << LVBB->isInSetChanged() << endl; 
+    if(DEBUG_LV) 
+      LVBB->printAllSets();
   }
-
 }
 
-                                             // do one backward pass over the CFG
+
+
+// do one backward pass over the CFG
 bool MethodLiveVarInfo::doSingleBackwardPass()  
 {
   bool ResultFlow, NeedAnotherIteration = false;
 
-  if(DEBUG_LV) cout << endl <<  "------- After Backward Pass --------" << endl;
+  if(DEBUG_LV) 
+    cout << endl <<  " After Backward Pass ..." << endl;
 
   cfg::po_const_iterator BBI = cfg::po_begin(Meth);
 
@@ -80,102 +85,131 @@ bool MethodLiveVarInfo::doSingleBackwardPass()
     BBLiveVar* LVBB = BB2BBLVMap[*BBI];
     assert( LVBB );
 
-    if(DEBUG_LV) cout << "-- For BB " << (*BBI)->getName() << ":"  << endl;
+    if(DEBUG_LV) cout << " For BB " << (*BBI)->getName() << ":"  << endl;
     // cout << " (POId=" << LVBB->getPOId() << ")" << endl ;
 
     ResultFlow = false;
 
     if( LVBB->isOutSetChanged() ) 
-      LVBB->applyTransferFunc();   // apply the Transfer Func to calc the InSet
-    if( LVBB->isInSetChanged() )  
-      ResultFlow = LVBB->applyFlowFunc( BB2BBLVMap ); // to calc Outsets of preds
+      LVBB->applyTransferFunc();        // apply the Tran Func to calc InSet
+
+    if( LVBB->isInSetChanged() )        // to calc Outsets of preds
+      ResultFlow = LVBB->applyFlowFunc(BB2BBLVMap); 
 
     if(DEBUG_LV) LVBB->printInOutSets();
-    //cout << "InChanged = " << LVBB->isInSetChanged() 
-    //cout << "   UpdatedBBwithLowerPOId = " << ResultFlow  << endl;
+
 
     if( ResultFlow ) NeedAnotherIteration = true;
 
   }
 
-  return NeedAnotherIteration; // true if we need to reiterate over the CFG
+  // true if we need to reiterate over the CFG
+  return NeedAnotherIteration;         
 }
 
 
 
 
 
-void MethodLiveVarInfo::analyze()          // performs live var anal for a method
+// performs live var anal for a method
+void MethodLiveVarInfo::analyze()        
 {
-  //cout << "In analyze . . ." << cout;
 
-  constructBBs();          // create and initialize all the BBLiveVars of the CFG
+  if( DEBUG_LV) cout << "Analysing live variables ..." << endl;
+
+  // create and initialize all the BBLiveVars of the CFG
+  constructBBs();        
 
   bool NeedAnotherIteration = false;
-  do {
-    NeedAnotherIteration = doSingleBackwardPass( );   // do one  pass over  CFG
-  } while (NeedAnotherIteration );      // repeat until we need more iterations
+  do {                                // do one  pass over  CFG
+    NeedAnotherIteration = doSingleBackwardPass( );   
+  } while (NeedAnotherIteration );    // repeat until we need more iterations
+
+  
+  HasAnalyzed  = true;                // finished analysing
+
+  if( DEBUG_LV) cout << "Live Variable Analysis complete!" << endl;
 }
 
 
 
 
-/* This function will give the LiveVar info for any instruction in a method. It 
-   should be called after a call to analyze().
+/* Thsese functions will give the LiveVar info for any machine instruction in
+   a method. It should be called after a call to analyze().
 
-   This function calucluates live var info for all the instructions in a BB, 
-   when LVInfo for one inst is requested. Hence, this function is useful when 
-   live var info is required for many (or all) instructions in a basic block
-   Also, the arguments to this method does not require specific iterators
+   Thsese functions calucluates live var info for all the machine instrs in a 
+   BB when LVInfo for one inst is requested. Hence, this function is useful 
+   when live var info is required for many (or all) instructions in a basic 
+   block. Also, the arguments to this method does not require specific 
+   iterators.
 */
 
 
 const LiveVarSet * 
-MethodLiveVarInfo::getLiveVarSetBeforeInst(const Instruction *const Inst) 
+MethodLiveVarInfo::getLiveVarSetBeforeMInst(const MachineInstr *const MInst,
+                                           const BasicBlock *const CurBB) 
 {
-                                   // get the BB corresponding to the instruction
-  const BasicBlock *const CurBB = Inst->getParent();  
+  const LiveVarSet *LVSet = MInst2LVSetBI[MInst];
 
-  const LiveVarSet *LVSet = Inst2LVSetMap[Inst];
-
-  if( LVSet  ) return LVSet;                     // if found, just return the set
+  if( LVSet  ) return LVSet;              // if found, just return the set
+  else { 
+    calcLiveVarSetsForBB( CurBB );        // else, calc for all instrs in BB
+    assert( MInst2LVSetBI[ MInst ] );
+    return  MInst2LVSetBI[ MInst ];
+  }
+}
 
-  const BasicBlock::InstListType&  InstListInBB = CurBB->getInstList();         
-  BasicBlock::InstListType::const_reverse_iterator 
-    InstItEnd= InstListInBB.rend() - 1;    // InstItEnd is set to the first instr
 
-                                                  // LVSet of first instr = InSet
-  Inst2LVSetMap[*InstItEnd] = getInSetOfBB( CurBB );  
+const LiveVarSet * 
+MethodLiveVarInfo::getLiveVarSetAfterMInst(const MachineInstr *const MInst,
+                                           const BasicBlock *const CurBB) 
+{
+  const LiveVarSet *LVSet = MInst2LVSetAI[MInst];
 
-                  // if the first instruction is requested, just return the InSet
-  if( Inst == *InstItEnd) return  Inst2LVSetMap[Inst];      
+  if( LVSet  ) return LVSet;              // if found, just return the set
+  else { 
+    calcLiveVarSetsForBB( CurBB );        // else, calc for all instrs in BB
+    assert( MInst2LVSetAI[ MInst ] );
+    return  MInst2LVSetAI[ MInst ];
+  }
+}
 
-                 // else calculate for all other instruction in the BB
 
-  BasicBlock::InstListType::const_reverse_iterator 
-    InstIt= InstListInBB.rbegin();  // get the iterator for instructions in BB
+void MethodLiveVarInfo::calcLiveVarSetsForBB(const BasicBlock *const BB)
+{
+  const MachineCodeForBasicBlock& MIVec = BB->getMachineInstrVec();
+  MachineCodeForBasicBlock::const_reverse_iterator 
+    MInstIterator = MIVec.rbegin();
 
   LiveVarSet *CurSet = new LiveVarSet();
-  CurSet->setUnion( getOutSetOfBB( CurBB ));   // LVSet now contains the OutSet
+  const LiveVarSet *SetAI = getOutSetOfBB(BB); // init SetAI with OutSet
+  CurSet->setUnion(SetAI);                     // CurSet now contains OutSet
 
-    // calculate LVSet for all instructions in the basic block (except the first)
-  for( ; InstIt != InstItEnd ;  InstIt++) {    
+  // iterate over all the machine instructions in BB
+  for( ; MInstIterator != MIVec.rend(); MInstIterator++) {  
 
-    CurSet->applyTranferFuncForInst( *InstIt );  // apply the transfer Func
-    LiveVarSet *NewSet = new LiveVarSet();       // create a new set and
-    NewSet->setUnion( CurSet );                  // copy the set after T/F to it 
-    Inst2LVSetMap[*InstIt] = NewSet;             // record that in the map
-  }
+    // MInst is cur machine inst
+    const MachineInstr * MInst  = *MInstIterator;  
+
+    MInst2LVSetAI[MInst] = SetAI;              // record in After Inst map
+    
+    CurSet->applyTranferFuncForMInst( MInst ); // apply the transfer Func
+    LiveVarSet *NewSet = new LiveVarSet();     // create a new set and
+    NewSet->setUnion( CurSet );                // copy the set after T/F to it
+    MInst2LVSetBI[MInst] = NewSet;             // record in Before Inst map
 
-  return Inst2LVSetMap[Inst];
+    // SetAI will be used in the next iteration
+    SetAI = NewSet;                 
+  }
+  
 }
 
 
 
-/*
-NOTES: delete all the LVBBs allocated by adding a destructor to the BB2BBLVMap???
-            use the dfo_iterator in the doSingleBackwardPass  
-*/
+
+
+
 
 
 
index c89381754947caab65842db8a1c36e3ca30ece83..07dc1286014026940332791ba088e6c8c32cb6cf 100644 (file)
@@ -1,9 +1,42 @@
 #include "llvm/Analysis/LiveVar/LiveVarSet.h"
+#include "llvm/CodeGen/MachineInstr.h"
 
 
-// This function applies an instruction to a live var set (accepts OutSet) and
-//  makes necessary changes to it (produces InSet)
+// This function applies a machine instr to a live var set (accepts OutSet) and
+// makes necessary changes to it (produces InSet). Note that two for loops are
+// used to first kill all defs and then to add all uses. This is because there
+// can be instructions like Val = Val + 1 since we allow multipe defs to a 
+// machine instruction operand.
 
+
+void LiveVarSet::applyTranferFuncForMInst(const MachineInstr *const MInst)
+{
+
+  for( MachineInstr::val_op_const_iterator OpI(MInst); !OpI.done() ; OpI++) {
+
+    if( OpI.isDef() ) {     // kill only if this operand is a def
+         remove(*OpI);        // this definition kills any uses
+    }
+
+  }
+
+  for( MachineInstr::val_op_const_iterator OpI(MInst); !OpI.done() ; OpI++) {
+
+    if ( ((*OpI)->getType())->isLabelType()) continue; // don't process labels
+
+    if( ! OpI.isDef() ) {     // add only if this operand is a use
+       add( *OpI );            // An operand is a use - so add to use set
+    }
+  }
+}
+
+  
+
+
+
+
+
+#if 0
 void LiveVarSet::applyTranferFuncForInst(const Instruction *const Inst) 
 {
 
@@ -18,3 +51,4 @@ void LiveVarSet::applyTranferFuncForInst(const Instruction *const Inst)
   }
 
 }
+#endif
index 680ad83428e6aced47e82d8d5ce08b198f0c6cf6..8cfe6fb289ea723e2aeb8b4a890db16b85296147 100644 (file)
@@ -5,11 +5,13 @@
 
 void printValue( const Value *const v)  // func to print a Value 
 {
-  if( (*v).hasName() ) cout << v << "(" << ((*v).getName()) << ") ";
-  //if( (*v).hasName() ) cout <<  ((*v).getName()) << " ";
-  else if (v->getValueType() == Value::ConstantVal) // if const
+  
+  if( (*v).hasName() ) 
+    cout << v << "(" << ((*v).getName()) << ") ";
+  else if (v->getValueType() == Value::ConstantVal)         // if const
     cout << v << "(" << ((ConstPoolVal *) v)->getStrValue() << ") ";
-  else  cout << v  << " ";
+  else
+      cout << v  << " ";
 }
 
 
@@ -18,15 +20,15 @@ void printValue( const Value *const v)  // func to print a Value
 
 ValueSet:: ValueSet() : hash_set<const Value *,  hashFuncValue> () { }
 
-                                                 // for performing two set unions
+                                             // for performing two set unions
 bool ValueSet::setUnion( const ValueSet *const set1) {   
   const_iterator set1it;
   pair<iterator, bool> result;
   bool changed = false;
 
   for( set1it = set1->begin() ; set1it != set1->end(); set1it++) {  
-                                                  // for all all elements in set1
-    result = insert( *set1it );                   // insert to this set
+                                             // for all all elements in set1
+    result = insert( *set1it );              // insert to this set
       if( result.second == true) changed = true;
   }
 
@@ -34,7 +36,7 @@ bool ValueSet::setUnion( const ValueSet *const set1) {
 }
 
 
-                                              // for performing set difference
+                                             // for performing set difference
 void ValueSet::setDifference( const ValueSet *const set1, 
                              const ValueSet *const set2) { 
 
@@ -48,7 +50,7 @@ void ValueSet::setDifference( const ValueSet *const set1,
 }
 
 
-                                         // for performing set subtraction
+                                        // for performing set subtraction
 void ValueSet::setSubtract( const ValueSet *const set1) { 
   const_iterator set1it;
   for( set1it = set1->begin() ; set1it != set1->end(); set1it++)  
@@ -59,7 +61,7 @@ void ValueSet::setSubtract( const ValueSet *const set1) {
 
 
 
-void ValueSet::printSet()  const {   // for printing a live variable set
+void ValueSet::printSet()  const {     // for printing a live variable set
       const_iterator it;
       for( it = begin() ; it != end(); it++) 
        printValue( *it );
index aeb7f9184c55d139ddbbb2369d8b2eec01eaeef2..6d925c4a7e08800769a0b73e558cb83bbdd06c7a 100644 (file)
 #include "llvm/Analysis/LiveVar/BBLiveVar.h"
+#include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
+#include "llvm/CodeGen/MachineInstr.h"
+#include "llvm/CodeGen/Sparc.h"
 
 
 /********************* Implementation **************************************/
 
-BBLiveVar::BBLiveVar( const BasicBlock* baseBB, unsigned int RdfoId) 
-                      : DefSet(),  InSet(), OutSet(), PhiArgMap() {  
+BBLiveVar::BBLiveVar( const BasicBlock *const  baseBB, unsigned int RdfoId) 
+                      : BaseBB(baseBB), DefSet(),  InSet(), 
+                       OutSet(), PhiArgMap() {  
     BaseBB = baseBB;   
     InSetChanged = OutSetChanged = false;
     POId = RdfoId;
 }
 
+// caluculates def and use sets for each BB
+// There are two passes over operands of a machine instruction. This is
+// because, we can have instructions like V = V + 1, since we no longer
+// assume single definition.
 
-
-void BBLiveVar::calcDefUseSets()  // caluculates def and use sets for each BB
+void BBLiveVar::calcDefUseSets()  
 {
-                                                // instructions in basic block 
-  const BasicBlock::InstListType&  InstListInBB = BaseBB->getInstList();   
+  // get the iterator for machine instructions
+  const MachineCodeForBasicBlock& MIVec = BaseBB->getMachineInstrVec();
+  MachineCodeForBasicBlock::const_reverse_iterator 
+    MInstIterator = MIVec.rbegin();
+
+  // iterate over all the machine instructions in BB
+  for( ; MInstIterator != MIVec.rend(); ++MInstIterator) {  
 
-  BasicBlock::InstListType::const_reverse_iterator 
-    InstIterator = InstListInBB.rbegin();  // get the iterator for instructions
+    const MachineInstr * MInst  = *MInstIterator;  // MInst is the machine inst
+    assert(MInst);
+    
+    if( DEBUG_LV > 1) {                            // debug msg
+      cout << " *Iterating over machine instr ";
+      MInst->dump();
+      cout << endl;
+    }
 
-                                     // iterate over all the instructions in BB
-  for( ; InstIterator != InstListInBB.rend(); InstIterator++) {  
+    // iterate over  MI operands to find defs
+    for( MachineInstr::val_op_const_iterator OpI(MInst); !OpI.done() ; ++OpI) {
 
-    const Instruction * Inst  = *InstIterator;     // Inst is the current instr
-    assert(Inst);
+      const Value *Op = *OpI;
 
-    if( Inst->isDefinition() ) {  // add to Defs only if this instr is a def
+      if( OpI.isDef() ) {     // add to Defs only if this operand is a def
   
-      DefSet.add( Inst );   // nstruction is a def - so add to def set
-      InSet.remove( Inst);  // this definition kills any uses
-      InSetChanged = true; 
-      //cout << " adding inst to def "; printValue( Inst ); cout << endl;
+       DefSet.add( Op );     // operand is a def - so add to def set
+       InSet.remove( Op);    // this definition kills any uses
+       InSetChanged = true; 
+
+       if( DEBUG_LV > 1) {   
+         cout << "  +Def: "; printValue( Op ); cout << endl;
+       }
+      }
     }
 
-    Instruction::op_const_iterator 
-      OpI = Inst->op_begin();                // get iterator for operands
+    bool IsPhi = ( MInst->getOpCode() == PHI );
+
+    // iterate over  MI operands to find uses
+    for(MachineInstr::val_op_const_iterator OpI(MInst); !OpI.done() ;  ++OpI) {
+      const Value *Op = *OpI;
+
+      if ( ((Op)->getType())->isLabelType() )    
+       continue;             // don't process labels
+
+      if(! OpI.isDef() ) {    // add to Defs only if this operand is a use
+
+       InSet.add( Op );      // An operand is a use - so add to use set
+       OutSet.remove( Op );  // remove if there is a def below this use
+       InSetChanged = true; 
+
+       if( DEBUG_LV > 1) {   // debug msg of level 2
+         cout << "   Use: "; printValue( Op ); cout << endl;
+       }
+
+       if( IsPhi ) {         // for a phi node
+                              // put args into the PhiArgMap (Val -> BB)
 
-    bool IsPhi=( Inst->getOpcode() == Instruction::PHINode );  // Is this a phi
+         const Value * ArgVal = Op;
+         ++OpI;              // increment to point to BB of value
+         const Value * BBVal = *OpI; 
 
-    for(int OpNum=0 ; OpI != Inst->op_end() ; OpI++) { // iterate over operands
 
-      if ( ((*OpI)->getType())->isLabelType() ) 
-       continue;                                      // don't process labels 
+         assert( (BBVal)->getValueType() == Value::BasicBlockVal );
+         
+         PhiArgMap[ ArgVal ] = (const BasicBlock *) (BBVal); 
+         assert( PhiArgMap[ ArgVal ] );
 
-      InSet.add( *OpI );      // An operand is a use - so add to use set
-      OutSet.remove( *OpI );  // remove if there is a definition below this use
+         if( DEBUG_LV > 1) {   // debug msg of level 2
+           cout << "   - phi operand "; 
+           printValue( ArgVal ); 
+           cout  << " came from BB "; 
+           printValue( PhiArgMap[ ArgVal ]); 
+           cout<<endl;
+         }
+
+       }
 
-      if( IsPhi ) {           // for a phi node
-                              // put args into the PhiArgMap
-       PhiArgMap[ *OpI ] = ((PHINode *) Inst )->getIncomingBlock( OpNum++ ); 
-       assert( PhiArgMap[ *OpI ] );
-       //cout << " Phi operand "; printValue( *OpI ); 
-       //cout  << " came from BB "; printValue(PhiArgMap[*OpI]); cout<<endl;
       }
+    } 
 
-      InSetChanged = true; 
-      //cout << " adding operand to use "; printValue( *OpI ); cout << endl;
-    }
-    
-  }
+  } // for all machine instructions
 } 
        
 
 
 bool BBLiveVar::applyTransferFunc() // calculates the InSet in terms of OutSet 
 {
@@ -71,18 +112,18 @@ bool BBLiveVar::applyTransferFunc() // calculates the InSet in terms of OutSet
   // IMPORTANT: caller should check whether the OutSet changed 
   //           (else no point in calling)
 
-  LiveVarSet OutMinusDef;                      // set to hold (Out[B] - Def[B])
+  LiveVarSet OutMinusDef;     // set to hold (Out[B] - Def[B])
   OutMinusDef.setDifference( &OutSet, &DefSet);
   InSetChanged = InSet.setUnion( &OutMinusDef );
  
-  OutSetChanged = false;    // no change to OutSet since transfer func applied
+  OutSetChanged = false;      // no change to OutSet since transf func applied
 
   return InSetChanged;
 }
 
 
 
-                        // calculates Out set using In sets of the predecessors
+// calculates Out set using In sets of the predecessors
 bool BBLiveVar::setPropagate( LiveVarSet *const OutSet, 
                              const LiveVarSet *const InSet, 
                              const BasicBlock *const PredBB) {
@@ -92,11 +133,12 @@ bool BBLiveVar::setPropagate( LiveVarSet *const OutSet,
   bool changed = false;
   const BasicBlock *PredBBOfPhiArg;
 
-                                               // for all all elements in InSet
+  // for all all elements in InSet
   for( InIt = InSet->begin() ; InIt != InSet->end(); InIt++) {  
     PredBBOfPhiArg =  PhiArgMap[ *InIt ];
 
-                        // if this var is not a phi arg or it came from this BB
+    // if this var is not a phi arg OR 
+    // it's a phi arg and the var went down from this BB
     if( !PredBBOfPhiArg || PredBBOfPhiArg == PredBB) {  
       result = OutSet->insert( *InIt );               // insert to this set
       if( result.second == true) changed = true;
@@ -108,7 +150,8 @@ bool BBLiveVar::setPropagate( LiveVarSet *const OutSet,
 
 
 
-                                // propogates in set to OutSets of PREDECESSORs
+// propogates in set to OutSets of PREDECESSORs
+
 bool BBLiveVar::applyFlowFunc(BBToBBLiveVarMapType LVMap) 
 {
 
@@ -122,17 +165,19 @@ bool BBLiveVar::applyFlowFunc(BBToBBLiveVarMapType LVMap)
   cfg::pred_const_iterator PredBBI = cfg::pred_begin(BaseBB);
 
   for( ; PredBBI != cfg::pred_end(BaseBB) ; PredBBI++) {
-    assert( *PredBBI );                 // assert that the predecessor is valid
+    assert( *PredBBI );       // assert that the predecessor is valid
     BBLiveVar  *PredLVBB = LVMap[*PredBBI];
 
-                                                               // do set union
+                              // do set union
     if(  setPropagate( &(PredLVBB->OutSet), &InSet, *PredBBI ) == true) {  
       PredLVBB->OutSetChanged = true;
 
-      if( PredLVBB->getPOId() <= POId) // if the predec POId is lower than mine
+      // if the predec POId is lower than mine
+      if( PredLVBB->getPOId() <= POId) 
        needAnotherIt = true;   
     }
-  } // for
+
+  }  // for
 
   return needAnotherIt;
 
@@ -140,19 +185,21 @@ bool BBLiveVar::applyFlowFunc(BBToBBLiveVarMapType LVMap)
 
 
 
-
-
 /* ----------------- Methods For Debugging (Printing) ----------------- */
 
 void BBLiveVar::printAllSets() const
 {
-  cout << "Defs: ";   DefSet.printSet();  cout << endl;
-  cout << "In: ";   InSet.printSet();  cout << endl;
-  cout << "Out: ";   OutSet.printSet();  cout << endl;
+  cout << "  Defs: ";   DefSet.printSet();  cout << endl;
+  cout << "  In: ";   InSet.printSet();  cout << endl;
+  cout << "  Out: ";   OutSet.printSet();  cout << endl;
 }
 
 void BBLiveVar::printInOutSets() const
 {
-  cout << "In: ";   InSet.printSet();  cout << endl;
-  cout << "Out: ";   OutSet.printSet();  cout << endl;
+  cout << "  In: ";   InSet.printSet();  cout << endl;
+  cout << "  Out: ";   OutSet.printSet();  cout << endl;
 }
+
+
+
+
index b4126b00293d6a5c82a1a18560ecaf4e5a896437..91c2498e9750c46cee02264642fcefc6d54ecf9c 100644 (file)
@@ -1,35 +1,38 @@
-/* Title:   ValueSet.h
+/* Title:   MethodLiveVarInfo.cpp
    Author:  Ruchira Sasanka
    Date:    Jun 30, 01
    Purpose: 
 
-   This is the interface for live variable info of a method that is required by 
-   any other part of the compiler.
+   This is the interface for live variable info of a method that is required 
+   by any other part of the compiler.
 
 */
 
 
 #include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
-
+#include "llvm/CodeGen/MachineInstr.h"
 
 
 
 /************************** Constructor/Destructor ***************************/
 
 
-MethodLiveVarInfo::MethodLiveVarInfo(Method *const MethPtr) :  BB2BBLVMap()  
-{
-  Meth = MethPtr;  // init BB2BBLVMap and records Method for future use
+MethodLiveVarInfo::MethodLiveVarInfo(const Method *const M) : Meth(M),  
+                                                             BB2BBLVMap()
+{ 
+  assert(! M->isExternal() );           // cannot be a prototype decleration
+  HasAnalyzed = false;                  // still we haven't called analyze()
 }
 
 
 
 MethodLiveVarInfo:: ~MethodLiveVarInfo()
 {
-  BBToBBLiveVarMapType::iterator HMI = BB2BBLVMap.begin();   // hash map iterator
+  // hash map iterator
+  BBToBBLiveVarMapType::iterator HMI = BB2BBLVMap.begin(); 
 
   for( ; HMI != BB2BBLVMap.end() ; HMI ++ ) {  
-    if( (*HMI).first )                    // delete all LiveVarSets in BB2BBLVMap
+    if( (*HMI).first )                  // delete all LiveVarSets in BB2BBLVMap
       delete (*HMI).second;
    }
 }
@@ -39,38 +42,40 @@ MethodLiveVarInfo:: ~MethodLiveVarInfo()
 
 
 
-                                // constructs BBLiveVars and init Def and In sets
+// constructs BBLiveVars and init Def and In sets
 void MethodLiveVarInfo::constructBBs()   
 {
-  unsigned int POId = 0;   // Reverse Depth-first Order ID
+  unsigned int POId = 0;                // Reverse Depth-first Order ID
 
   cfg::po_const_iterator BBI = cfg::po_begin(Meth);
 
   for(  ; BBI != cfg::po_end(Meth) ; ++BBI, ++POId) 
   { 
 
-    if(DEBUG_LV) cout << "-- For BB " << (*BBI)->getName() << ":" << endl ;
+    if(DEBUG_LV) cout << " For BB " << (*BBI)->getName() << ":" << endl ;
 
-    const BasicBlock *BB = *BBI;      // get the current BB 
-    BBLiveVar * LVBB = new BBLiveVar( BB, POId );  // create a new BBLiveVar
+    const BasicBlock *BB = *BBI;        // get the current BB 
+                                        // create a new BBLiveVar
+    BBLiveVar * LVBB = new BBLiveVar( BB, POId );  
     
-    BB2BBLVMap[ BB ] = LVBB;  // insert the pair to Map
+    BB2BBLVMap[ BB ] = LVBB;            // insert the pair to Map
     
-    LVBB->calcDefUseSets();  // calculates the def and in set
+    LVBB->calcDefUseSets();             // calculates the def and in set
 
-    if(DEBUG_LV) LVBB->printAllSets();
-    //cout << "InSetChanged: " << LVBB->isInSetChanged() << endl; 
+    if(DEBUG_LV) 
+      LVBB->printAllSets();
   }
-
 }
 
-                                             // do one backward pass over the CFG
+
+
+// do one backward pass over the CFG
 bool MethodLiveVarInfo::doSingleBackwardPass()  
 {
   bool ResultFlow, NeedAnotherIteration = false;
 
-  if(DEBUG_LV) cout << endl <<  "------- After Backward Pass --------" << endl;
+  if(DEBUG_LV) 
+    cout << endl <<  " After Backward Pass ..." << endl;
 
   cfg::po_const_iterator BBI = cfg::po_begin(Meth);
 
@@ -80,102 +85,131 @@ bool MethodLiveVarInfo::doSingleBackwardPass()
     BBLiveVar* LVBB = BB2BBLVMap[*BBI];
     assert( LVBB );
 
-    if(DEBUG_LV) cout << "-- For BB " << (*BBI)->getName() << ":"  << endl;
+    if(DEBUG_LV) cout << " For BB " << (*BBI)->getName() << ":"  << endl;
     // cout << " (POId=" << LVBB->getPOId() << ")" << endl ;
 
     ResultFlow = false;
 
     if( LVBB->isOutSetChanged() ) 
-      LVBB->applyTransferFunc();   // apply the Transfer Func to calc the InSet
-    if( LVBB->isInSetChanged() )  
-      ResultFlow = LVBB->applyFlowFunc( BB2BBLVMap ); // to calc Outsets of preds
+      LVBB->applyTransferFunc();        // apply the Tran Func to calc InSet
+
+    if( LVBB->isInSetChanged() )        // to calc Outsets of preds
+      ResultFlow = LVBB->applyFlowFunc(BB2BBLVMap); 
 
     if(DEBUG_LV) LVBB->printInOutSets();
-    //cout << "InChanged = " << LVBB->isInSetChanged() 
-    //cout << "   UpdatedBBwithLowerPOId = " << ResultFlow  << endl;
+
 
     if( ResultFlow ) NeedAnotherIteration = true;
 
   }
 
-  return NeedAnotherIteration; // true if we need to reiterate over the CFG
+  // true if we need to reiterate over the CFG
+  return NeedAnotherIteration;         
 }
 
 
 
 
 
-void MethodLiveVarInfo::analyze()          // performs live var anal for a method
+// performs live var anal for a method
+void MethodLiveVarInfo::analyze()        
 {
-  //cout << "In analyze . . ." << cout;
 
-  constructBBs();          // create and initialize all the BBLiveVars of the CFG
+  if( DEBUG_LV) cout << "Analysing live variables ..." << endl;
+
+  // create and initialize all the BBLiveVars of the CFG
+  constructBBs();        
 
   bool NeedAnotherIteration = false;
-  do {
-    NeedAnotherIteration = doSingleBackwardPass( );   // do one  pass over  CFG
-  } while (NeedAnotherIteration );      // repeat until we need more iterations
+  do {                                // do one  pass over  CFG
+    NeedAnotherIteration = doSingleBackwardPass( );   
+  } while (NeedAnotherIteration );    // repeat until we need more iterations
+
+  
+  HasAnalyzed  = true;                // finished analysing
+
+  if( DEBUG_LV) cout << "Live Variable Analysis complete!" << endl;
 }
 
 
 
 
-/* This function will give the LiveVar info for any instruction in a method. It 
-   should be called after a call to analyze().
+/* Thsese functions will give the LiveVar info for any machine instruction in
+   a method. It should be called after a call to analyze().
 
-   This function calucluates live var info for all the instructions in a BB, 
-   when LVInfo for one inst is requested. Hence, this function is useful when 
-   live var info is required for many (or all) instructions in a basic block
-   Also, the arguments to this method does not require specific iterators
+   Thsese functions calucluates live var info for all the machine instrs in a 
+   BB when LVInfo for one inst is requested. Hence, this function is useful 
+   when live var info is required for many (or all) instructions in a basic 
+   block. Also, the arguments to this method does not require specific 
+   iterators.
 */
 
 
 const LiveVarSet * 
-MethodLiveVarInfo::getLiveVarSetBeforeInst(const Instruction *const Inst) 
+MethodLiveVarInfo::getLiveVarSetBeforeMInst(const MachineInstr *const MInst,
+                                           const BasicBlock *const CurBB) 
 {
-                                   // get the BB corresponding to the instruction
-  const BasicBlock *const CurBB = Inst->getParent();  
+  const LiveVarSet *LVSet = MInst2LVSetBI[MInst];
 
-  const LiveVarSet *LVSet = Inst2LVSetMap[Inst];
-
-  if( LVSet  ) return LVSet;                     // if found, just return the set
+  if( LVSet  ) return LVSet;              // if found, just return the set
+  else { 
+    calcLiveVarSetsForBB( CurBB );        // else, calc for all instrs in BB
+    assert( MInst2LVSetBI[ MInst ] );
+    return  MInst2LVSetBI[ MInst ];
+  }
+}
 
-  const BasicBlock::InstListType&  InstListInBB = CurBB->getInstList();         
-  BasicBlock::InstListType::const_reverse_iterator 
-    InstItEnd= InstListInBB.rend() - 1;    // InstItEnd is set to the first instr
 
-                                                  // LVSet of first instr = InSet
-  Inst2LVSetMap[*InstItEnd] = getInSetOfBB( CurBB );  
+const LiveVarSet * 
+MethodLiveVarInfo::getLiveVarSetAfterMInst(const MachineInstr *const MInst,
+                                           const BasicBlock *const CurBB) 
+{
+  const LiveVarSet *LVSet = MInst2LVSetAI[MInst];
 
-                  // if the first instruction is requested, just return the InSet
-  if( Inst == *InstItEnd) return  Inst2LVSetMap[Inst];      
+  if( LVSet  ) return LVSet;              // if found, just return the set
+  else { 
+    calcLiveVarSetsForBB( CurBB );        // else, calc for all instrs in BB
+    assert( MInst2LVSetAI[ MInst ] );
+    return  MInst2LVSetAI[ MInst ];
+  }
+}
 
-                 // else calculate for all other instruction in the BB
 
-  BasicBlock::InstListType::const_reverse_iterator 
-    InstIt= InstListInBB.rbegin();  // get the iterator for instructions in BB
+void MethodLiveVarInfo::calcLiveVarSetsForBB(const BasicBlock *const BB)
+{
+  const MachineCodeForBasicBlock& MIVec = BB->getMachineInstrVec();
+  MachineCodeForBasicBlock::const_reverse_iterator 
+    MInstIterator = MIVec.rbegin();
 
   LiveVarSet *CurSet = new LiveVarSet();
-  CurSet->setUnion( getOutSetOfBB( CurBB ));   // LVSet now contains the OutSet
+  const LiveVarSet *SetAI = getOutSetOfBB(BB); // init SetAI with OutSet
+  CurSet->setUnion(SetAI);                     // CurSet now contains OutSet
 
-    // calculate LVSet for all instructions in the basic block (except the first)
-  for( ; InstIt != InstItEnd ;  InstIt++) {    
+  // iterate over all the machine instructions in BB
+  for( ; MInstIterator != MIVec.rend(); MInstIterator++) {  
 
-    CurSet->applyTranferFuncForInst( *InstIt );  // apply the transfer Func
-    LiveVarSet *NewSet = new LiveVarSet();       // create a new set and
-    NewSet->setUnion( CurSet );                  // copy the set after T/F to it 
-    Inst2LVSetMap[*InstIt] = NewSet;             // record that in the map
-  }
+    // MInst is cur machine inst
+    const MachineInstr * MInst  = *MInstIterator;  
+
+    MInst2LVSetAI[MInst] = SetAI;              // record in After Inst map
+    
+    CurSet->applyTranferFuncForMInst( MInst ); // apply the transfer Func
+    LiveVarSet *NewSet = new LiveVarSet();     // create a new set and
+    NewSet->setUnion( CurSet );                // copy the set after T/F to it
+    MInst2LVSetBI[MInst] = NewSet;             // record in Before Inst map
 
-  return Inst2LVSetMap[Inst];
+    // SetAI will be used in the next iteration
+    SetAI = NewSet;                 
+  }
+  
 }
 
 
 
-/*
-NOTES: delete all the LVBBs allocated by adding a destructor to the BB2BBLVMap???
-            use the dfo_iterator in the doSingleBackwardPass  
-*/
+
+
+
 
 
 
index c89381754947caab65842db8a1c36e3ca30ece83..07dc1286014026940332791ba088e6c8c32cb6cf 100644 (file)
@@ -1,9 +1,42 @@
 #include "llvm/Analysis/LiveVar/LiveVarSet.h"
+#include "llvm/CodeGen/MachineInstr.h"
 
 
-// This function applies an instruction to a live var set (accepts OutSet) and
-//  makes necessary changes to it (produces InSet)
+// This function applies a machine instr to a live var set (accepts OutSet) and
+// makes necessary changes to it (produces InSet). Note that two for loops are
+// used to first kill all defs and then to add all uses. This is because there
+// can be instructions like Val = Val + 1 since we allow multipe defs to a 
+// machine instruction operand.
 
+
+void LiveVarSet::applyTranferFuncForMInst(const MachineInstr *const MInst)
+{
+
+  for( MachineInstr::val_op_const_iterator OpI(MInst); !OpI.done() ; OpI++) {
+
+    if( OpI.isDef() ) {     // kill only if this operand is a def
+         remove(*OpI);        // this definition kills any uses
+    }
+
+  }
+
+  for( MachineInstr::val_op_const_iterator OpI(MInst); !OpI.done() ; OpI++) {
+
+    if ( ((*OpI)->getType())->isLabelType()) continue; // don't process labels
+
+    if( ! OpI.isDef() ) {     // add only if this operand is a use
+       add( *OpI );            // An operand is a use - so add to use set
+    }
+  }
+}
+
+  
+
+
+
+
+
+#if 0
 void LiveVarSet::applyTranferFuncForInst(const Instruction *const Inst) 
 {
 
@@ -18,3 +51,4 @@ void LiveVarSet::applyTranferFuncForInst(const Instruction *const Inst)
   }
 
 }
+#endif
index 680ad83428e6aced47e82d8d5ce08b198f0c6cf6..8cfe6fb289ea723e2aeb8b4a890db16b85296147 100644 (file)
@@ -5,11 +5,13 @@
 
 void printValue( const Value *const v)  // func to print a Value 
 {
-  if( (*v).hasName() ) cout << v << "(" << ((*v).getName()) << ") ";
-  //if( (*v).hasName() ) cout <<  ((*v).getName()) << " ";
-  else if (v->getValueType() == Value::ConstantVal) // if const
+  
+  if( (*v).hasName() ) 
+    cout << v << "(" << ((*v).getName()) << ") ";
+  else if (v->getValueType() == Value::ConstantVal)         // if const
     cout << v << "(" << ((ConstPoolVal *) v)->getStrValue() << ") ";
-  else  cout << v  << " ";
+  else
+      cout << v  << " ";
 }
 
 
@@ -18,15 +20,15 @@ void printValue( const Value *const v)  // func to print a Value
 
 ValueSet:: ValueSet() : hash_set<const Value *,  hashFuncValue> () { }
 
-                                                 // for performing two set unions
+                                             // for performing two set unions
 bool ValueSet::setUnion( const ValueSet *const set1) {   
   const_iterator set1it;
   pair<iterator, bool> result;
   bool changed = false;
 
   for( set1it = set1->begin() ; set1it != set1->end(); set1it++) {  
-                                                  // for all all elements in set1
-    result = insert( *set1it );                   // insert to this set
+                                             // for all all elements in set1
+    result = insert( *set1it );              // insert to this set
       if( result.second == true) changed = true;
   }
 
@@ -34,7 +36,7 @@ bool ValueSet::setUnion( const ValueSet *const set1) {
 }
 
 
-                                              // for performing set difference
+                                             // for performing set difference
 void ValueSet::setDifference( const ValueSet *const set1, 
                              const ValueSet *const set2) { 
 
@@ -48,7 +50,7 @@ void ValueSet::setDifference( const ValueSet *const set1,
 }
 
 
-                                         // for performing set subtraction
+                                        // for performing set subtraction
 void ValueSet::setSubtract( const ValueSet *const set1) { 
   const_iterator set1it;
   for( set1it = set1->begin() ; set1it != set1->end(); set1it++)  
@@ -59,7 +61,7 @@ void ValueSet::setSubtract( const ValueSet *const set1) {
 
 
 
-void ValueSet::printSet()  const {   // for printing a live variable set
+void ValueSet::printSet()  const {     // for printing a live variable set
       const_iterator it;
       for( it = begin() ; it != end(); it++) 
        printValue( *it );