diff options
author | Ruchira Sasanka <sasanka@students.uiuc.edu> | 2001-10-12 17:47:23 +0000 |
---|---|---|
committer | Ruchira Sasanka <sasanka@students.uiuc.edu> | 2001-10-12 17:47:23 +0000 |
commit | c1daae895d278c0be7af25e1029ece8f2a3fa30c (patch) | |
tree | f0f8dc1cea530e97542fdd342301db0f2b956346 /lib/Analysis | |
parent | 598641b4ca4bd311308009a82e0432f916f3d00b (diff) | |
download | external_llvm-c1daae895d278c0be7af25e1029ece8f2a3fa30c.zip external_llvm-c1daae895d278c0be7af25e1029ece8f2a3fa30c.tar.gz external_llvm-c1daae895d278c0be7af25e1029ece8f2a3fa30c.tar.bz2 |
added support for implict operands in machine instruction
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@728 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis')
-rw-r--r-- | lib/Analysis/LiveVar/BBLiveVar.cpp | 89 | ||||
-rw-r--r-- | lib/Analysis/LiveVar/FunctionLiveVarInfo.cpp | 16 |
2 files changed, 76 insertions, 29 deletions
diff --git a/lib/Analysis/LiveVar/BBLiveVar.cpp b/lib/Analysis/LiveVar/BBLiveVar.cpp index 80fde4e..638e000 100644 --- a/lib/Analysis/LiveVar/BBLiveVar.cpp +++ b/lib/Analysis/LiveVar/BBLiveVar.cpp @@ -41,20 +41,17 @@ void BBLiveVar::calcDefUseSets() // iterate over MI operands to find defs for( MachineInstr::val_op_const_iterator OpI(MInst); !OpI.done() ; ++OpI) { - const Value *Op = *OpI; - - if( OpI.isDef() ) { // add to Defs only if this operand is a def - - 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; - } - } + if( OpI.isDef() ) // add to Defs only if this operand is a def + addDef( *OpI ); } + // do for implicit operands as well + for( unsigned i=0; i < MInst->getNumImplicitRefs(); ++i) { + if( MInst->implicitRefIsDefined(i) ) + addDef( MInst->getImplicitRef(i) ); + } + + bool IsPhi = ( MInst->getOpCode() == PHI ); @@ -65,29 +62,22 @@ void BBLiveVar::calcDefUseSets() 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(! OpI.isDef() ) { // add to Defs only if this operand is a use + addUse( Op ); if( IsPhi ) { // for a phi node - // put args into the PhiArgMap (Val -> BB) - + // put args into the PhiArgMap (Val -> BB) + const Value * ArgVal = Op; ++OpI; // increment to point to BB of value const Value * BBVal = *OpI; - - + + assert( (BBVal)->getValueType() == Value::BasicBlockVal ); PhiArgMap[ ArgVal ] = (const BasicBlock *) (BBVal); assert( PhiArgMap[ ArgVal ] ); - + if( DEBUG_LV > 1) { // debug msg of level 2 cout << " - phi operand "; printValue( ArgVal ); @@ -96,15 +86,56 @@ void BBLiveVar::calcDefUseSets() cout<<endl; } - } + } // if( IsPhi ) + + } // if a use + + } // for all operands + + // do for implicit operands as well + for( unsigned i=0; i < MInst->getNumImplicitRefs(); ++i) { - } - } + assert( !IsPhi && "Phi cannot have implicit opeands"); + const Value *Op = MInst->getImplicitRef(i); + + if ( ((Op)->getType())->isLabelType() ) + continue; // don't process labels + if( ! MInst->implicitRefIsDefined(i) ) + addUse( Op ); + } } // for all machine instructions } +// To add an operand wichi is a def + +void BBLiveVar::addDef(const Value *Op) +{ + 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; + } +} + +// To add an operand which is a use + +void BBLiveVar::addUse(const Value *Op) +{ + 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; + } + +} + + bool BBLiveVar::applyTransferFunc() // calculates the InSet in terms of OutSet { diff --git a/lib/Analysis/LiveVar/FunctionLiveVarInfo.cpp b/lib/Analysis/LiveVar/FunctionLiveVarInfo.cpp index b9fd0ff..40ebf1e 100644 --- a/lib/Analysis/LiveVar/FunctionLiveVarInfo.cpp +++ b/lib/Analysis/LiveVar/FunctionLiveVarInfo.cpp @@ -66,6 +66,22 @@ void MethodLiveVarInfo::constructBBs() if(DEBUG_LV) LVBB->printAllSets(); } + + // Since the PO iterator does not discover unreachable blocks, + // go over the random iterator and init those blocks as well. + // However, LV info is not correct for those blocks (they are not + // analyzed) + + Method::const_iterator BBRI = Meth->begin(); // random iterator for BBs + + for( ; BBRI != Meth->end(); ++BBRI, ++POId) { + + if( ! BB2BBLVMap[ *BBRI ] ) + BB2BBLVMap[ *BBRI ] = new BBLiveVar( *BBRI, POId ); + + } + + } |