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
This commit is contained in:
Ruchira Sasanka
2001-10-12 17:47:23 +00:00
parent 598641b4ca
commit c1daae895d
4 changed files with 152 additions and 58 deletions

View File

@ -41,20 +41,17 @@ void BBLiveVar::calcDefUseSets()
// iterate over MI operands to find defs // iterate over MI operands to find defs
for( MachineInstr::val_op_const_iterator OpI(MInst); !OpI.done() ; ++OpI) { 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
addDef( *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;
}
} }
// 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 ); bool IsPhi = ( MInst->getOpCode() == PHI );
@ -66,14 +63,7 @@ void BBLiveVar::calcDefUseSets()
continue; // don't process labels continue; // don't process labels
if(! OpI.isDef() ) { // add to Defs only if this operand is a use if(! OpI.isDef() ) { // add to Defs only if this operand is a use
addUse( 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;
}
if( IsPhi ) { // for a phi node if( IsPhi ) { // for a phi node
// put args into the PhiArgMap (Val -> BB) // put args into the PhiArgMap (Val -> BB)
@ -96,15 +86,56 @@ void BBLiveVar::calcDefUseSets()
cout<<endl; 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 } // 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 bool BBLiveVar::applyTransferFunc() // calculates the InSet in terms of OutSet
{ {

View File

@ -66,6 +66,22 @@ void MethodLiveVarInfo::constructBBs()
if(DEBUG_LV) if(DEBUG_LV)
LVBB->printAllSets(); 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 );
}
} }

View File

@ -41,20 +41,17 @@ void BBLiveVar::calcDefUseSets()
// iterate over MI operands to find defs // iterate over MI operands to find defs
for( MachineInstr::val_op_const_iterator OpI(MInst); !OpI.done() ; ++OpI) { 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
addDef( *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;
}
} }
// 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 ); bool IsPhi = ( MInst->getOpCode() == PHI );
@ -66,14 +63,7 @@ void BBLiveVar::calcDefUseSets()
continue; // don't process labels continue; // don't process labels
if(! OpI.isDef() ) { // add to Defs only if this operand is a use if(! OpI.isDef() ) { // add to Defs only if this operand is a use
addUse( 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;
}
if( IsPhi ) { // for a phi node if( IsPhi ) { // for a phi node
// put args into the PhiArgMap (Val -> BB) // put args into the PhiArgMap (Val -> BB)
@ -96,15 +86,56 @@ void BBLiveVar::calcDefUseSets()
cout<<endl; 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 } // 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 bool BBLiveVar::applyTransferFunc() // calculates the InSet in terms of OutSet
{ {

View File

@ -66,6 +66,22 @@ void MethodLiveVarInfo::constructBBs()
if(DEBUG_LV) if(DEBUG_LV)
LVBB->printAllSets(); 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 );
}
} }