LLVM  12.0.0git
Namespaces | Functions | Variables
ARC Optimization.

Namespaces

 llvm
 This class represents lattice values for constants.
 

Functions

 STATISTIC (NumNoops, "Number of no-op objc calls eliminated")
 
 STATISTIC (NumPartialNoops, "Number of partially no-op objc calls eliminated")
 
 STATISTIC (NumAutoreleases,"Number of autoreleases converted to releases")
 
 STATISTIC (NumRets, "Number of return value forwarding " "retain+autoreleases eliminated")
 
 STATISTIC (NumRRs, "Number of retain+release paths eliminated")
 
 STATISTIC (NumPeeps, "Number of calls peephole-optimized")
 
 STATISTIC (NumRetainsBeforeOpt, "Number of retains before optimization")
 
 STATISTIC (NumReleasesBeforeOpt, "Number of releases before optimization")
 
 STATISTIC (NumRetainsAfterOpt, "Number of retains after optimization")
 
 STATISTIC (NumReleasesAfterOpt, "Number of releases after optimization")
 
 INITIALIZE_PASS_BEGIN (ObjCARCOptLegacyPass, "objc-arc", "ObjC ARC optimization", false, false) INITIALIZE_PASS_END(ObjCARCOptLegacyPass
 
static bool isInertARCValue (Value *V, SmallPtrSet< Value *, 1 > &VisitedPhis)
 This function returns true if the value is inert. More...
 
static void CheckForUseCFGHazard (const Sequence SuccSSeq, const bool SuccSRRIKnownSafe, TopDownPtrState &S, bool &SomeSuccHasSame, bool &AllSuccsHaveSame, bool &NotAllSeqEqualButKnownSafe, bool &ShouldContinue)
 If we have a top down pointer in the S_Use state, make sure that there are no CFG hazards by checking the states of various bottom up pointers. More...
 
static void CheckForCanReleaseCFGHazard (const Sequence SuccSSeq, const bool SuccSRRIKnownSafe, TopDownPtrState &S, bool &SomeSuccHasSame, bool &AllSuccsHaveSame, bool &NotAllSeqEqualButKnownSafe)
 If we have a Top Down pointer in the S_CanRelease state, make sure that there are no CFG hazards by checking the states of various bottom up pointers. More...
 
static void ComputePostOrders (Function &F, SmallVectorImpl< BasicBlock *> &PostOrder, SmallVectorImpl< BasicBlock *> &ReverseCFGPostOrder, unsigned NoObjCARCExceptionsMDKind, DenseMap< const BasicBlock *, BBState > &BBStates)
 
static CallInstHasSafePathToPredecessorCall (const Value *Arg, Instruction *Retain, ProvenanceAnalysis &PA)
 Check if there is a dependent call earlier that does not have anything in between the Retain and the call that can affect the reference count of their shared pointer argument. More...
 
static CallInstFindPredecessorRetainWithSafePath (const Value *Arg, BasicBlock *BB, Instruction *Autorelease, ProvenanceAnalysis &PA)
 Find a dependent retain that precedes the given autorelease for which there is nothing in between the two instructions that can affect the ref count of Arg. More...
 
static CallInstFindPredecessorAutoreleaseWithSafePath (const Value *Arg, BasicBlock *BB, ReturnInst *Ret, ProvenanceAnalysis &PA)
 Look for an ``autorelease'' instruction dependent on Arg such that there are no instructions dependent on Arg that need a positive ref count in between the autorelease and the ret. More...
 
raw_ostreamllvm::operator<< (raw_ostream &OS, BBState &BBState) LLVM_ATTRIBUTE_UNUSED
 
Passllvm::createObjCARCOptPass ()
 

Variables

objc arc
 
objc ObjC ARC optimization
 
objc ObjC ARC false
 
static const unsigned BBState::OverflowOccurredValue = 0xffffffff
 
static char ObjCARCOptLegacyPass::ID = 0
 

Detailed Description

Function Documentation

◆ CheckForCanReleaseCFGHazard()

static void CheckForCanReleaseCFGHazard ( const Sequence  SuccSSeq,
const bool  SuccSRRIKnownSafe,
TopDownPtrState S,
bool SomeSuccHasSame,
bool AllSuccsHaveSame,
bool NotAllSeqEqualButKnownSafe 
)
static

If we have a Top Down pointer in the S_CanRelease state, make sure that there are no CFG hazards by checking the states of various bottom up pointers.

Definition at line 1232 of file ObjCARCOpts.cpp.

References assert(), llvm::objcarc::AutoreleasepoolPop, llvm::objcarc::AutoreleasepoolPush, llvm::BasicBlock::back(), llvm::BasicBlock::begin(), CheckForUseCFGHazard(), llvm::objcarc::PtrState::ClearSequenceProgress(), llvm::dbgs(), E, llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::BasicBlock::end(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::objcarc::GetARCInstKind(), llvm::objcarc::GetArgRCIdentityRoot(), llvm::objcarc::PtrState::GetRRInfo(), llvm::objcarc::PtrState::GetSeq(), llvm::objcarc::BottomUpPtrState::HandlePotentialAlterRefCount(), llvm::objcarc::TopDownPtrState::HandlePotentialAlterRefCount(), llvm::objcarc::BottomUpPtrState::HandlePotentialUse(), llvm::objcarc::TopDownPtrState::HandlePotentialUse(), llvm::BasicBlock::hasNPredecessors(), I, llvm::objcarc::BottomUpPtrState::InitBottomUp(), llvm::objcarc::TopDownPtrState::InitTopDown(), llvm::objcarc::PtrState::IsKnownSafe(), LLVM_DEBUG, llvm_unreachable, llvm::objcarc::TopDownPtrState::MatchWithRelease(), llvm::objcarc::BottomUpPtrState::MatchWithRetain(), MaxPtrStates, MI, llvm::objcarc::None, llvm::objcarc::Release, llvm::objcarc::Retain, llvm::objcarc::RetainBlock, llvm::objcarc::RetainRV, llvm::objcarc::S_CanRelease, llvm::objcarc::S_MovableRelease, llvm::objcarc::S_None, llvm::objcarc::S_Release, llvm::objcarc::S_Retain, llvm::objcarc::S_Stop, llvm::objcarc::S_Use, llvm::objcarc::PtrState::SetCFGHazardAfflicted(), SI, and llvm::successors().

◆ CheckForUseCFGHazard()

static void CheckForUseCFGHazard ( const Sequence  SuccSSeq,
const bool  SuccSRRIKnownSafe,
TopDownPtrState S,
bool SomeSuccHasSame,
bool AllSuccsHaveSame,
bool NotAllSeqEqualButKnownSafe,
bool ShouldContinue 
)
static

◆ ComputePostOrders()

static void ComputePostOrders ( Function F,
SmallVectorImpl< BasicBlock *> &  PostOrder,
SmallVectorImpl< BasicBlock *> &  ReverseCFGPostOrder,
unsigned  NoObjCARCExceptionsMDKind,
DenseMap< const BasicBlock *, BBState > &  BBStates 
)
static

The visited set, for doing DFS walks.

Definition at line 1615 of file ObjCARCOpts.cpp.

References Arg, assert(), llvm::objcarc::AutoreleasepoolPush, B, llvm::SmallVectorTemplateCommon< T >::back(), llvm::BlotMapVector< KeyT, ValueT >::begin(), llvm::BasicBlock::begin(), llvm::BlotMapVector< KeyT, ValueT >::blot(), llvm::objcarc::Call, llvm::objcarc::RRInfo::Calls, llvm::SmallPtrSetImplBase::clear(), llvm::objcarc::CopyWeak, llvm::SmallPtrSetImpl< PtrType >::count(), llvm::CallInst::Create(), llvm::dbgs(), llvm::objcarc::DestroyWeak, E, llvm::SmallVectorBase< SmallVectorSizeType< T > >::empty(), llvm::SmallVectorBase< Size_T >::empty(), llvm::BlotMapVector< KeyT, ValueT >::end(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::erase(), llvm::SmallPtrSetImpl< PtrType >::erase(), llvm::Instruction::eraseFromParent(), llvm::objcarc::EraseInstruction(), llvm::BlotMapVector< KeyT, ValueT >::find(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::objcarc::GetARCInstKind(), llvm::CallBase::getArgOperand(), llvm::objcarc::GetArgRCIdentityRoot(), llvm::objcarc::GetBasicARCInstKind(), llvm::InstIterator< BB_t, BB_i_t, BI_t, II_t >::getBasicBlockIterator(), llvm::Type::getContext(), llvm::Function::getEntryBlock(), llvm::InstIterator< BB_t, BB_i_t, BI_t, II_t >::getInstructionIterator(), llvm::Type::getInt8Ty(), llvm::Instruction::getParent(), llvm::GlobalValue::getParent(), llvm::objcarc::GetRCIdentityRoot(), llvm::BasicBlock::getTerminator(), llvm::Value::getType(), llvm::PointerType::getUnqual(), I, llvm::objcarc::ImpreciseRelease, llvm::objcarc::InitWeak, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::inst_begin(), llvm::inst_end(), llvm::objcarc::IntrinsicUser, llvm::objcarc::RRInfo::IsTailCallRelease, llvm::objcarc::RRInfo::KnownSafe, LLVM_DEBUG, llvm_unreachable, llvm::objcarc::LoadWeak, llvm::objcarc::LoadWeakRetained, llvm::MayAlias, llvm::objcarc::MoveWeak, llvm::MustAlias, llvm::NoAlias, llvm::objcarc::None, llvm::objcarc::NoObjCARCExceptions, llvm::PartialAlias, llvm::SmallVectorTemplateBase< T >::pop_back(), llvm::SmallVectorImpl< T >::pop_back_val(), llvm::pred_begin(), llvm::SmallVectorTemplateBase< T >::push_back(), llvm::objcarc::Release, llvm::objcarc::RRInfo::ReleaseMetadata, llvm::Value::replaceAllUsesWith(), llvm::objcarc::Retain, llvm::reverse(), llvm::objcarc::RRInfo::ReverseInsertPts, llvm::CallBase::setDoesNotThrow(), llvm::Instruction::setMetadata(), llvm::CallInst::setTailCall(), llvm::objcarc::StoreWeak, llvm::Value::use_empty(), llvm::objcarc::User, and llvm::Value::users().

◆ createObjCARCOptPass()

objc ObjC ARC false Pass * llvm::createObjCARCOptPass ( )

Definition at line 608 of file ObjCARCOpts.cpp.

References llvm::AnalysisUsage::addRequired(), Arg, assert(), llvm::objcarc::Autorelease, llvm::objcarc::AutoreleaseRV, llvm::BasicBlock::begin(), llvm::objcarc::Call, llvm::NVPTXISD::CallArg, llvm::objcarc::CallOrUser, llvm::objcarc::ClaimRV, llvm::classifyEHPersonality(), llvm::colorEHFunclets(), llvm::CallInst::Create(), llvm::dbgs(), llvm::dyn_cast(), E, llvm::SmallVectorImpl< T >::emplace_back(), llvm::SmallVectorBase< SmallVectorSizeType< T > >::empty(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::empty(), llvm::objcarc::EraseInstruction(), F(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::TinyPtrVector< EltTy >::front(), llvm::objcarc::GetArgRCIdentityRoot(), llvm::objcarc::GetBasicARCInstKind(), llvm::objcarc::getEquivalentPHIs(), llvm::CallBase::getIntrinsicID(), llvm::CallBase::getNumOperandBundles(), llvm::CallBase::getOperandBundleAt(), llvm::Instruction::getParent(), llvm::Function::getPersonalityFn(), llvm::Function::hasPersonalityFn(), I, llvm::inst_begin(), llvm::inst_end(), llvm::is_contained(), llvm::objcarc::IsAlwaysTail(), llvm::objcarc::IsNoopInstruction(), llvm::isScopedEHPersonality(), LLVM_DEBUG, llvm::objcarc::None, llvm::Intrinsic::not_intrinsic, llvm::LLVMContext::OB_funclet, llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T >::push_back(), llvm::objcarc::Release, llvm::Value::replaceAllUsesWith(), llvm::objcarc::Retain, llvm::objcarc::RetainRV, llvm::CallBase::setCalledFunction(), llvm::AnalysisUsage::setPreservesCFG(), llvm::CallInst::setTailCall(), llvm::TinyPtrVector< EltTy >::size(), llvm::objcarc::User, Users, and llvm::Value::users().

◆ FindPredecessorAutoreleaseWithSafePath()

static CallInst* FindPredecessorAutoreleaseWithSafePath ( const Value Arg,
BasicBlock BB,
ReturnInst Ret,
ProvenanceAnalysis PA 
)
static

◆ FindPredecessorRetainWithSafePath()

static CallInst* FindPredecessorRetainWithSafePath ( const Value Arg,
BasicBlock BB,
Instruction Autorelease,
ProvenanceAnalysis PA 
)
static

Find a dependent retain that precedes the given autorelease for which there is nothing in between the two instructions that can affect the ref count of Arg.

Definition at line 2255 of file ObjCARCOpts.cpp.

References Arg, llvm::objcarc::CanChangeRetainCount, llvm::objcarc::findSingleDependency(), llvm::objcarc::GetArgRCIdentityRoot(), llvm::objcarc::GetBasicARCInstKind(), llvm::objcarc::IsRetain(), and llvm::objcarc::Retain.

Referenced by FindPredecessorAutoreleaseWithSafePath().

◆ HasSafePathToPredecessorCall()

static CallInst* HasSafePathToPredecessorCall ( const Value Arg,
Instruction Retain,
ProvenanceAnalysis PA 
)
static

Check if there is a dependent call earlier that does not have anything in between the Retain and the call that can affect the reference count of their shared pointer argument.

Note that Retain need not be in BB.

Definition at line 2234 of file ObjCARCOpts.cpp.

References llvm::objcarc::Call, llvm::objcarc::CallOrUser, llvm::objcarc::CanChangeRetainCount, llvm::objcarc::findSingleDependency(), llvm::objcarc::GetBasicARCInstKind(), llvm::Instruction::getParent(), and llvm::objcarc::Retain.

Referenced by FindPredecessorAutoreleaseWithSafePath().

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( ObjCARCOptLegacyPass  ,
"objc-arc ,
"ObjC ARC optimization ,
false  ,
false   
)

◆ isInertARCValue()

static bool isInertARCValue ( Value V,
SmallPtrSet< Value *, 1 > &  VisitedPhis 
)
static

This function returns true if the value is inert.

An ObjC ARC runtime call taking an inert operand can be safely deleted.

Definition at line 892 of file ObjCARCOpts.cpp.

References Arg, llvm::objcarc::Autorelease, llvm::objcarc::AutoreleasePoolBoundary, llvm::objcarc::AutoreleaseRV, llvm::BasicBlock::back(), C, llvm::objcarc::Call, llvm::objcarc::ClaimRV, llvm::objcarc::CopyWeak, llvm::CallInst::Create(), llvm::dbgs(), llvm::objcarc::DestroyWeak, llvm::dyn_cast(), llvm::numbers::e, llvm::SmallVectorBase< SmallVectorSizeType< T > >::empty(), llvm::Instruction::eraseFromParent(), llvm::objcarc::EraseInstruction(), llvm::objcarc::findSingleDependency(), FindSingleUseIdentifiedObject(), llvm::MDNode::get(), llvm::UndefValue::get(), llvm::CallBase::getArgOperand(), llvm::objcarc::GetArgRCIdentityRoot(), llvm::Value::getContext(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::Instruction::getMetadata(), llvm::Constant::getNullValue(), llvm::PHINode::getNumIncomingValues(), llvm::Instruction::getNumSuccessors(), llvm::User::getOperand(), llvm::Instruction::getParent(), llvm::objcarc::GetRCIdentityRoot(), llvm::BasicBlock::getTerminator(), llvm::Value::getType(), llvm::objcarc::ImpreciseRelease, llvm::objcarc::InitWeak, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::Instruction::insertBefore(), llvm::objcarc::IsAlwaysTail(), llvm::objcarc::IsAutorelease(), llvm::objcarc::IsNeverTail(), llvm::objcarc::IsNoopOnGlobal(), llvm::objcarc::IsNoopOnNull(), llvm::objcarc::IsNoThrow(), llvm::objcarc::IsNullOrUndef(), llvm::Type::isVoidTy(), LLVM_DEBUG, llvm_unreachable, llvm::objcarc::LoadWeak, llvm::objcarc::LoadWeakRetained, llvm::objcarc::MoveWeak, llvm::objcarc::NeedsPositiveRetainCount, llvm::objcarc::None, llvm::objcarc::NoopCast, llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T >::push_back(), llvm::objcarc::Release, llvm::Value::replaceAllUsesWith(), llvm::objcarc::Retain, llvm::objcarc::RetainBlock, llvm::objcarc::RetainRV, llvm::CallBase::setArgOperand(), setDoesNotThrow(), llvm::Instruction::setMetadata(), llvm::objcarc::StoreWeak, llvm::Value::stripPointerCasts(), and llvm::Value::use_empty().

◆ operator<<()

raw_ostream & llvm::operator<< ( raw_ostream OS,
BBState &  BBState 
)

◆ STATISTIC() [1/10]

STATISTIC ( NumNoops  ,
"Number of no-op objc calls eliminated"   
)

◆ STATISTIC() [2/10]

STATISTIC ( NumPartialNoops  ,
"Number of partially no-op objc calls eliminated"   
)

◆ STATISTIC() [3/10]

STATISTIC ( NumAutoreleases  ,
"Number of autoreleases converted to releases"   
)

◆ STATISTIC() [4/10]

STATISTIC ( NumRets  ,
"Number of return value forwarding " "retain+autoreleases eliminated"   
)

◆ STATISTIC() [5/10]

STATISTIC ( NumRRs  ,
"Number of retain+release paths eliminated"   
)

◆ STATISTIC() [6/10]

STATISTIC ( NumPeeps  ,
"Number of calls peephole-optimized"   
)

◆ STATISTIC() [7/10]

STATISTIC ( NumRetainsBeforeOpt  ,
"Number of retains before optimization  
)

◆ STATISTIC() [8/10]

STATISTIC ( NumReleasesBeforeOpt  ,
"Number of releases before optimization  
)

◆ STATISTIC() [9/10]

STATISTIC ( NumRetainsAfterOpt  ,
"Number of retains after optimization  
)

◆ STATISTIC() [10/10]

STATISTIC ( NumReleasesAfterOpt  ,
"Number of releases after optimization  
)

Variable Documentation

◆ arc

objc arc

◆ false

objc ObjC ARC false

Definition at line 605 of file ObjCARCOpts.cpp.

◆ ID

char ObjCARCOptLegacyPass::ID = 0
static

Definition at line 593 of file ObjCARCOpts.cpp.

◆ optimization

objc ObjC ARC optimization

Definition at line 605 of file ObjCARCOpts.cpp.

◆ OverflowOccurredValue

const unsigned BBState::OverflowOccurredValue = 0xffffffff
static

Definition at line 210 of file ObjCARCOpts.cpp.