aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Analysis
diff options
context:
space:
mode:
authorRuchira Sasanka <sasanka@students.uiuc.edu>2001-10-12 17:47:23 +0000
committerRuchira Sasanka <sasanka@students.uiuc.edu>2001-10-12 17:47:23 +0000
commitc1daae895d278c0be7af25e1029ece8f2a3fa30c (patch)
treef0f8dc1cea530e97542fdd342301db0f2b956346 /lib/Analysis
parent598641b4ca4bd311308009a82e0432f916f3d00b (diff)
downloadexternal_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.cpp89
-rw-r--r--lib/Analysis/LiveVar/FunctionLiveVarInfo.cpp16
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 );
+
+ }
+
+
}