aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/SparcV9/LiveVar/BBLiveVar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Target/SparcV9/LiveVar/BBLiveVar.cpp')
-rw-r--r--lib/Target/SparcV9/LiveVar/BBLiveVar.cpp155
1 files changed, 101 insertions, 54 deletions
diff --git a/lib/Target/SparcV9/LiveVar/BBLiveVar.cpp b/lib/Target/SparcV9/LiveVar/BBLiveVar.cpp
index aeb7f91..6d925c4 100644
--- a/lib/Target/SparcV9/LiveVar/BBLiveVar.cpp
+++ b/lib/Target/SparcV9/LiveVar/BBLiveVar.cpp
@@ -1,69 +1,110 @@
#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;
}
+
+
+
+