LLVM  14.0.0git
Namespaces | Functions | Variables
ARC Optimization.

Namespaces

 llvm
 This file implements support for optimizing divisions by a constant.
 

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 collectReleaseInsertPts (const BlotMapVector< Value *, RRInfo > &Retains, DenseMap< const Instruction *, SmallPtrSet< const Value *, 2 >> &ReleaseInsertPtToRCIdentityRoots)
 
static const SmallPtrSet< const Value *, 2 > * getRCIdentityRootsFromReleaseInsertPt (const Instruction *InsertPt, const DenseMap< const Instruction *, SmallPtrSet< const Value *, 2 >> &ReleaseInsertPtToRCIdentityRoots)
 
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 1251 of file ObjCARCOpts.cpp.

References llvm_unreachable, S, llvm::objcarc::S_CanRelease, llvm::objcarc::S_MovableRelease, llvm::objcarc::S_None, llvm::objcarc::S_Retain, llvm::objcarc::S_Stop, and llvm::objcarc::S_Use.

◆ CheckForUseCFGHazard()

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

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.

Definition at line 1214 of file ObjCARCOpts.cpp.

References llvm_unreachable, S, llvm::objcarc::S_CanRelease, llvm::objcarc::S_MovableRelease, llvm::objcarc::S_None, llvm::objcarc::S_Retain, llvm::objcarc::S_Stop, and llvm::objcarc::S_Use.

◆ collectReleaseInsertPts()

static void collectReleaseInsertPts ( const BlotMapVector< Value *, RRInfo > &  Retains,
DenseMap< const Instruction *, SmallPtrSet< const Value *, 2 >> &  ReleaseInsertPtToRCIdentityRoots 
)
static

Definition at line 1504 of file ObjCARCOpts.cpp.

References llvm::objcarc::GetRCIdentityRoot(), P, and llvm::objcarc::Retain.

◆ ComputePostOrders()

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

◆ createObjCARCOptPass()

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

Definition at line 613 of file ObjCARCOpts.cpp.

◆ FindPredecessorAutoreleaseWithSafePath()

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

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.

Definition at line 2345 of file ObjCARCOpts.cpp.

References Arg, llvm::objcarc::Autorelease, BB, llvm::objcarc::findSingleDependency(), llvm::objcarc::GetArgRCIdentityRoot(), llvm::objcarc::GetBasicARCInstKind(), llvm::objcarc::IsAutorelease(), llvm::objcarc::NeedsPositiveRetainCount, and llvm::MipsISD::Ret.

◆ 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 2326 of file ObjCARCOpts.cpp.

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

◆ getRCIdentityRootsFromReleaseInsertPt()

static const SmallPtrSet<const Value *, 2>* getRCIdentityRootsFromReleaseInsertPt ( const Instruction InsertPt,
const DenseMap< const Instruction *, SmallPtrSet< const Value *, 2 >> &  ReleaseInsertPtToRCIdentityRoots 
)
static

Definition at line 1523 of file ObjCARCOpts.cpp.

References I.

◆ 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 2305 of file ObjCARCOpts.cpp.

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

◆ 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 907 of file ObjCARCOpts.cpp.

References llvm::PHINode::incoming_values(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::objcarc::IsNullOrUndef(), and llvm::Value::stripPointerCasts().

◆ operator<<()

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

Definition at line 437 of file ObjCARCOpts.cpp.

References llvm::dbgs(), E, I, LLVM_DEBUG, and P.

◆ STATISTIC() [1/10]

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

◆ STATISTIC() [2/10]

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

◆ STATISTIC() [3/10]

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

◆ STATISTIC() [4/10]

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

◆ STATISTIC() [5/10]

STATISTIC ( NumReleasesAfterOpt  ,
"Number of releases after optimization  
)

◆ STATISTIC() [6/10]

STATISTIC ( NumReleasesBeforeOpt  ,
"Number of releases before optimization  
)

◆ STATISTIC() [7/10]

STATISTIC ( NumRetainsAfterOpt  ,
"Number of retains after optimization  
)

◆ STATISTIC() [8/10]

STATISTIC ( NumRetainsBeforeOpt  ,
"Number of retains before optimization  
)

◆ STATISTIC() [9/10]

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

◆ STATISTIC() [10/10]

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

Variable Documentation

◆ arc

objc arc

Definition at line 610 of file ObjCARCOpts.cpp.

Referenced by llvm::GCOVFile::readGCDA(), and llvm::GCOVFile::readGCNO().

◆ false

objc ObjC ARC false

Definition at line 611 of file ObjCARCOpts.cpp.

◆ ID

char ObjCARCOptLegacyPass::ID = 0
static

Definition at line 598 of file ObjCARCOpts.cpp.

◆ optimization

objc ObjC ARC optimization

Definition at line 610 of file ObjCARCOpts.cpp.

◆ OverflowOccurredValue

const unsigned BBState::OverflowOccurredValue = 0xffffffff
static

Definition at line 211 of file ObjCARCOpts.cpp.