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 | 04009efe4819d2f3ceae420e330198e8a7620cfe (patch) | |
| tree | a6e92a90756512f61af4e576b951974628f221fa /llvm/lib | |
| parent | 85cc5744ba2622eaf73bad1c54affbc0ba9398e0 (diff) | |
| download | bcm5719-llvm-04009efe4819d2f3ceae420e330198e8a7620cfe.tar.gz bcm5719-llvm-04009efe4819d2f3ceae420e330198e8a7620cfe.zip | |
added support for implict operands in machine instruction
llvm-svn: 728
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Analysis/LiveVar/BBLiveVar.cpp | 89 | ||||
| -rw-r--r-- | llvm/lib/Analysis/LiveVar/FunctionLiveVarInfo.cpp | 16 | 
2 files changed, 76 insertions, 29 deletions
| diff --git a/llvm/lib/Analysis/LiveVar/BBLiveVar.cpp b/llvm/lib/Analysis/LiveVar/BBLiveVar.cpp index 80fde4e1571..638e000cc7d 100644 --- a/llvm/lib/Analysis/LiveVar/BBLiveVar.cpp +++ b/llvm/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/llvm/lib/Analysis/LiveVar/FunctionLiveVarInfo.cpp b/llvm/lib/Analysis/LiveVar/FunctionLiveVarInfo.cpp index b9fd0ffbe86..40ebf1e6bd3 100644 --- a/llvm/lib/Analysis/LiveVar/FunctionLiveVarInfo.cpp +++ b/llvm/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 ); + +  } + +  } | 

