LLVM 22.0.0git
ARC Optimization.

Namespaces

namespace  llvm
 This is an optimization pass for GlobalISel generic memory operations.

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")
static bool isInertARCValue (Value *V, SmallPtrSet< Value *, 1 > &VisitedPhis)
 This function returns true if the value is inert.
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.
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.
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.
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.
 if (!Autorelease) continue
 if (!Call||(!Call->isTailCall() &&GetBasicARCInstKind(Retain)==ARCInstKind::RetainRV &&GetBasicARCInstKind(Autorelease)==ARCInstKind::AutoreleaseRV)) continue
 LLVM_DEBUG (dbgs()<< "Erasing: "<< *Retain<< "\nErasing: "<< *Autorelease<< "\n")
BundledInsts eraseInst (Retain)
 EraseInstruction (Autorelease)
bool MayAutorelease (const CallBase &CB, unsigned Depth=0)
 Interprocedurally determine if calls made by the given call site can possibly produce autoreleases.
raw_ostreamllvm::operator<< (raw_ostream &OS, BBState &BBState) LLVM_ATTRIBUTE_UNUSED

Variables

CallInstAutorelease
 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.
CallInstRetain
CallInstCall = HasSafePathToPredecessorCall(Arg, Retain, PA)
 Changed = true
 NumRets
static const unsigned BBState::OverflowOccurredValue = 0xffffffff

Detailed Description

Function Documentation

◆ CheckForCanReleaseCFGHazard()

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

References llvm::objcarc::PtrState::IsKnownSafe(), llvm_unreachable, 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()

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

References llvm::objcarc::PtrState::ClearSequenceProgress(), llvm::objcarc::PtrState::IsKnownSafe(), llvm_unreachable, llvm::objcarc::S_CanRelease, llvm::objcarc::S_MovableRelease, llvm::objcarc::S_None, llvm::objcarc::S_Retain, llvm::objcarc::S_Stop, llvm::objcarc::S_Use, and llvm::objcarc::PtrState::SetCFGHazardAfflicted().

◆ collectReleaseInsertPts()

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

Definition at line 1463 of file ObjCARCOpts.cpp.

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

◆ ComputePostOrders()

◆ eraseInst()

BundledInsts eraseInst ( Retain )

References Retain.

◆ EraseInstruction()

EraseInstruction ( Autorelease )

References Autorelease.

◆ FindPredecessorRetainWithSafePath()

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

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

◆ getRCIdentityRootsFromReleaseInsertPt()

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

Definition at line 1482 of file ObjCARCOpts.cpp.

References I.

◆ HasSafePathToPredecessorCall()

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

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

◆ if() [1/2]

if ( ! Autorelease)

References Autorelease.

◆ if() [2/2]

if ( !Call|| !Call->isTailCall() &&GetBasicARCInstKind(Retain)==ARCInstKind::RetainRV &&GetBasicARCInstKind(Autorelease)==ARCInstKind::AutoreleaseRV)

◆ isInertARCValue()

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

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

Referenced by isInertARCValue().

◆ LLVM_DEBUG()

LLVM_DEBUG ( dbgs()<< "Erasing: "<< *Retain<< "\nErasing: "<< *Autorelease<< "\n" )

References Autorelease, and Retain.

◆ MayAutorelease()

◆ operator<<()

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

Definition at line 431 of file ObjCARCOpts.cpp.

References dbgs(), 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"  )

References NumRets.

◆ STATISTIC() [10/10]

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

Variable Documentation

◆ Autorelease

CallInst* Autorelease
Initial value:
=
FindPredecessorAutoreleaseWithSafePath(Arg, &BB, Ret, 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.

static CallInst *FindPredecessorAutoreleaseWithSafePath( const Value *Arg, BasicBlock *BB, ReturnInst *Ret, ProvenanceAnalysis &PA) { auto *Autorelease = dyn_cast_or_null<CallInst>( findSingleDependency(NeedsPositiveRetainCount, Arg, BB, Ret, PA));

if (!Autorelease) return nullptr; ARCInstKind AutoreleaseClass = GetBasicARCInstKind(Autorelease); if (!IsAutorelease(AutoreleaseClass)) return nullptr; if (GetArgRCIdentityRoot(Autorelease) != Arg) return nullptr;

return Autorelease; }

/ Look for this pattern: /

/// %call = call i8* @something(...)
/// %2 = call i8* @objc_retain(i8* %call)
/// %3 = call i8* @objc_autorelease(i8* %2)
/// ret i8* %3
///

/ And delete the retain and autorelease. void ObjCARCOpt::OptimizeReturns(Function &F) { if (!F.getReturnType()->isPointerTy()) return;

LLVM_DEBUG(dbgs() << "\n== ObjCARCOpt::OptimizeReturns ==\n");

for (BasicBlock &BB: F) { ReturnInst *Ret = dyn_cast<ReturnInst>(&BB.back()); if (!Ret) continue;

LLVM_DEBUG(dbgs() << "Visiting: " << *Ret << "\n");

const Value *Arg = GetRCIdentityRoot(Ret->getOperand(0));

Look for an `‘autorelease’' instruction that is a predecessor of Ret and

Definition at line 2346 of file ObjCARCOpts.cpp.

Referenced by EraseInstruction(), FindPredecessorRetainWithSafePath(), if(), if(), and LLVM_DEBUG().

◆ Call

Examples
/home/buildbot/as-worker-4/publish-doxygen-docs/llvm-project/llvm/include/llvm/Transforms/Utils/Local.h.

Definition at line 2360 of file ObjCARCOpts.cpp.

Referenced by llvm::AliasSetTracker::add(), AddAliasScopeMetadata(), addArgLocs(), llvm::CallGraphNode::addCalledFunction(), addCallToCallGraph(), addIntrinsicToSummary(), addStackMapLiveVars(), addVCallToSet(), llvm::CodeMetrics::analyzeBasicBlock(), analyzeParsePointLiveness(), llvm::build2DBlockIOINTELInst(), llvm::buildAtomicCompareExchangeInst(), llvm::buildAtomicFlagInst(), llvm::buildAtomicFloatingRMWInst(), llvm::buildAtomicInitInst(), llvm::buildAtomicLoadInst(), llvm::buildAtomicRMWInst(), llvm::buildAtomicStoreInst(), llvm::buildBarrierInst(), llvm::buildBindlessImageINTELInst(), llvm::buildEnqueueKernel(), llvm::buildExtendedBitOpsInst(), llvm::buildNDRange(), llvm::buildOpFromWrapper(), llvm::ARMBaseInstrInfo::buildOutlinedFrame(), llvm::buildTernaryBitwiseFunctionINTELInst(), llvm::calculateCXXStateForAsynchEH(), llvm::calculateSEHStateForAsynchEH(), llvm::AAResults::callCapturesBefore(), llvm::callsGCLeafFunction(), llvm::canConstantFoldCallTo(), canonicalizeConstantArg0ToArg1(), checkFunctionMemoryAccess(), llvm::computeDeadSymbolsAndUpdateIndirectCalls(), llvm::computeMinimumValueSizes(), llvm::ConstantFoldBinaryIntrinsic(), llvm::ConstantFoldCall(), containsUnconditionalCallSafepoint(), llvm::ConvergenceControlInst::CreateAnchor(), createCallWithOps(), llvm::MatrixBuilder::CreateColumnMajorLoad(), llvm::MatrixBuilder::CreateColumnMajorStore(), llvm::ConvergenceControlInst::CreateEntry(), CreateFailBB(), llvm::ConvergenceControlInst::CreateLoop(), createWrapper(), llvm::DetermineUseCaptureKind(), llvm::AAResults::doesNotAccessMemory(), doesNotRequireEntrySafepointBefore(), eliminateSwiftErrorAlloca(), llvm::coro::Shape::emitAlloc(), llvm::AtomicInfo::EmitAtomicLibcall(), llvm::AtomicInfo::EmitAtomicLoadLibcall(), llvm::AtomicInfo::EmitAtomicStoreLibcall(), llvm::coro::Shape::emitDealloc(), emitGetSwiftErrorValue(), llvm::HexagonTargetLowering::emitLoadLinked(), llvm::PPCTargetLowering::emitLoadLinked(), emitNoUnwindRuntimeCall(), emitSetAndGetSwiftErrorValueAround(), emitSetSwiftErrorValue(), llvm::HexagonTargetLowering::emitStoreConditional(), llvm::PPCTargetLowering::emitStoreConditional(), emitTPIDR2Save(), expandIToFP(), llvm::SelectionDAG::expandMultipleResultFPLibCall(), expandToSwitch(), findBasePointers(), llvm::orc::SpeculateQuery::findCalles(), findLoadCallsAtConstantOffset(), findLocationForEntrySafepoint(), FlattenLoopPair(), llvm::InstCombinerImpl::fmulByZeroIsZero(), llvm::AMDGPULibCalls::fold(), foldMemChr(), llvm::InstCombinerImpl::foldMultiplicationOverflowCheck(), foldSqrt(), llvm::generate2DBlockIOINTELInst(), llvm::generateAsyncCopy(), llvm::generateAtomicFloatingInst(), llvm::generateAtomicInst(), llvm::generateBarrierInst(), llvm::generateBindlessImageINTELInst(), llvm::generateBuiltinVar(), llvm::generateCastToPtrInst(), llvm::generateConstructInst(), llvm::generateConvertInst(), llvm::generateCoopMatrInst(), llvm::AMDGPU::generateCrashCode(), llvm::generateDotOrFMulInst(), llvm::generateEnqueueInst(), llvm::generateExtendedBitOpsInst(), llvm::generateExtInst(), llvm::generateGetQueryInst(), llvm::generateGroupInst(), llvm::generateGroupUniformInst(), llvm::generateICarryBorrowInst(), llvm::generateImageMiscQueryInst(), llvm::generateImageSizeQueryInst(), llvm::generateIntelSubgroupsInst(), llvm::generateKernelClockInst(), generateKeySubkey(), llvm::generateLoadStoreInst(), llvm::generateParamAccessSummary(), llvm::generateReadImageInst(), llvm::generateRelationalInst(), llvm::generateSampleImageInst(), llvm::generateSelectInst(), llvm::generateSpecConstantInst(), llvm::generateTernaryBitwiseFunctionINTELInst(), llvm::generateVectorLoadStoreInst(), llvm::generateWaveInst(), llvm::generateWriteImageInst(), llvm::genWorkgroupQuery(), llvm::AAResultBase::getArgModRefInfo(), llvm::AAResults::Concept::getArgModRefInfo(), llvm::AAResults::getArgModRefInfo(), llvm::BasicAAResult::getArgModRefInfo(), llvm::BatchAAResults::getArgModRefInfo(), llvm::getArgumentAliasingToReturnedPointer(), llvm::getArgumentAliasingToReturnedPointer(), llvm::getAttributeBasedInliningDecision(), llvm::CallLowering::getAttributesForArgIdx(), llvm::CallLowering::getAttributesForReturn(), getBaseElementType(), llvm::getCallsiteCost(), GetDeoptBundleOperands(), getDeoptLowering(), llvm::MemoryLocation::getForArgument(), llvm::MemoryLocation::getForArgument(), llvm::AArch64TTIImpl::getInlineCallPenalty(), llvm::TargetTransformInfo::getInlineCallPenalty(), llvm::TargetTransformInfoImplBase::getInlineCallPenalty(), llvm::getInlineCost(), llvm::getInlineCost(), llvm::getInliningCostEstimate(), llvm::getInliningCostFeatures(), getIntrinsicCmp(), llvm::RTLIB::RuntimeLibcallsInfo::getLibcallCallingConv(), llvm::TargetLoweringBase::getLibcallCallingConv(), llvm::RTLIB::RuntimeLibcallsInfo::getLibcallImpl(), llvm::TargetLoweringBase::getLibcallImpl(), llvm::RTLIB::RuntimeLibcallsInfo::getLibcallImplCallingConv(), llvm::TargetLoweringBase::getLibcallImplCallingConv(), llvm::TargetLoweringBase::getLibcallImplName(), llvm::RTLIB::RuntimeLibcallsInfo::getLibcallName(), llvm::TargetLoweringBase::getLibcallName(), llvm::AAResultBase::getMemoryEffects(), llvm::AAResults::Concept::getMemoryEffects(), llvm::AAResults::getMemoryEffects(), llvm::AAResults::getMemoryEffects(), llvm::BasicAAResult::getMemoryEffects(), llvm::BatchAAResults::getMemoryEffects(), llvm::NVPTXAAResult::getMemoryEffects(), llvm::TypeBasedAAResult::getMemoryEffects(), llvm::AAResultBase::getModRefInfo(), llvm::AAResults::Concept::getModRefInfo(), llvm::AAResults::getModRefInfo(), llvm::AAResults::getModRefInfo(), llvm::BasicAAResult::getModRefInfo(), llvm::GlobalsAAResult::getModRefInfo(), llvm::ScopedNoAliasAAResult::getModRefInfo(), llvm::TypeBasedAAResult::getModRefInfo(), getOperandAsUnsigned(), llvm::ProfileSummaryInfo::getProfileCount(), getSameOpcode(), llvm::getUnderlyingObject(), hasReturnsTwiceAttr(), HasSafePathToPredecessorCall(), if(), llvm::CallInfo::insert(), insertCall(), insertParsePoints(), InsertStackProtectors(), insertUseHolderAfter(), llvm::GCNTTIImpl::instCombineIntrinsic(), llvm::TargetLoweringBase::InstructionOpcodeToISD(), llvm::SampleProfileProber::instrumentOneFunc(), isArgUnmodifiedByAllCalls(), isDereferenceableAndAlignedPointer(), llvm::ARMTTIImpl::isHardwareLoopProfitable(), llvm::PPCTTIImpl::isHardwareLoopProfitable(), isInlineableCall(), llvm::isInlineViable(), llvm::isInTailCallPosition(), isIntrinsic(), isIntrinsicCall(), isIntrinsicCall(), llvm::isIntrinsicReturningPointerAliasingArgumentWithoutCapturing(), isKnownNonZeroFromOperator(), llvm::isMathLibCallNoop(), llvm::isNoAliasCall(), isOnlyCopiedFromConstantMemory(), isPointerOperand(), isPossibleIndirectCallTarget(), isSafeToMove(), isSehScopeBegin(), isSehScopeEnd(), llvm::TargetTransformInfo::isSourceOfDivergence(), legalizeCallAttributes(), LLVMGetCallSiteAttributeCount(), LLVMGetCallSiteAttributes(), LLVMGetTailCallKind(), LLVMIsTailCall(), LLVMSetInstrParamAlignment(), LLVMSetTailCall(), LLVMSetTailCallKind(), lowerAwaitSuspend(), llvm::SPIRV::lowerBuiltin(), llvm::NVPTXTargetLowering::LowerCall(), llvm::SITargetLowering::LowerCall(), llvm::RISCVCallLowering::lowerCall(), llvm::SelectionDAGBuilder::LowerCallSiteWithDeoptBundle(), llvm::SelectionDAGBuilder::LowerCallSiteWithDeoptBundleImpl(), llvm::InlineAsmLowering::lowerInlineAsm(), makeGEPAndLoad(), makeGEPAndStore(), makeStatepointExplicit(), makeStatepointExplicitImpl(), llvm::orc::makeStub(), llvm::SPIRV::mapBuiltinToOpcode(), mapWasmLandingPadIndex(), llvm::ARMTTIImpl::maybeLoweredToCall(), moveBelowOrigChain(), llvm::InsertFunctionStrategy::mutate(), needsStatepoint(), llvm::coro::normalizeCoroutine(), llvm::AAResults::onlyReadsMemory(), optimizeSQRT(), optimizeSymmetricCall(), llvm::TargetLowering::ParseConstraints(), llvm::CallGraph::populateCallGraphNode(), llvm::SelectionDAGBuilder::populateCallLoweringInfo(), llvm::StackSafetyGlobalInfo::print(), processUGT_ADDCST_ADD(), processUMulZExtIdiom(), propagateCallAttrsFromCallee(), recomputeLiveInValues(), reconstructCommon(), reconstructGEP(), llvm::BPFPreserveStaticOffsetPass::reconstructLoad(), llvm::BPFPreserveStaticOffsetPass::reconstructStore(), remarkCall(), rematerializeLiveValues(), llvm::BPFCoreSharedInfo::removeArrayAccessCall(), removeCallsiteMetadata(), removeGEPBuiltinsInFunc(), removeMemProfMetadata(), removePAICalls(), llvm::BPFCoreSharedInfo::removeStructAccessCall(), removeTailCallAttribute(), llvm::BPFCoreSharedInfo::removeUnionAccessCall(), replaceCalledFunction(), llvm::CallGraphNode::replaceCallEdge(), replaceWithGEP(), llvm::SCCPInstVisitor::resetLatticeValueFor(), llvm::SCCPSolver::resetLatticeValueFor(), rewriteFunction(), llvm::FunctionSpecializer::run(), llvm::InlinerPass::run(), llvm::JumpTableToSwitchPass::run(), llvm::KCFIPass::run(), llvm::ModuleInlinerPass::run(), llvm::PostOrderFunctionAttrsPass::run(), runAttributorLightOnFunctions(), llvm::AlignmentFromAssumptionsPass::runImpl(), llvm::RewriteStatepointsForGC::runOnFunction(), runPartiallyInlineLibCalls(), llvm::FastISel::selectCall(), llvm::FastISel::selectInstruction(), llvm::FunctionLoweringInfo::set(), llvm::TargetLoweringBase::ArgListEntry::setAttributes(), llvm::TargetLowering::CallLoweringInfo::setCallee(), llvm::codegen::setFunctionAttributes(), llvm::RTLIB::RuntimeLibcallsInfo::setLibcallImpl(), llvm::TargetLoweringBase::setLibcallImpl(), llvm::RTLIB::RuntimeLibcallsInfo::setLibcallImplCallingConv(), llvm::TargetLoweringBase::setLibcallImplCallingConv(), setParamElementType(), setParamReadNone(), setParamReadOnly(), setParamWriteOnly(), llvm::shouldInline(), llvm::UnreachableInst::shouldLowerToTrap(), llvm::simplifyBinaryIntrinsic(), llvm::simplifyCall(), llvm::simplifyConstrainedFPCall(), simplifyIntrinsic(), simplifyUnaryIntrinsic(), sinkMinMaxInBB(), llvm::TargetLowering::softenSetCCOperands(), stripNonValidDataFromBody(), tryConstantFoldCall(), unrollGEPLoad(), unrollGEPStore(), llvm::dxil::ValueEnumerator::ValueEnumerator(), llvm::ValueEnumerator::ValueEnumerator(), llvm::PGOIndirectCallVisitor::visitCallBase(), llvm::InstCombinerImpl::visitSub(), llvm::wouldInstructionBeTriviallyDead(), writeFunctionTypeMetadataRecords(), llvm::GlobalsAAResult::~GlobalsAAResult(), and llvm::SCCPSolver::~SCCPSolver().

◆ Changed

Changed = true

Definition at line 2370 of file ObjCARCOpts.cpp.

Referenced by addArgumentAttrs(), addArgumentAttrsFromCallsites(), addArgumentReturnedAttrs(), addColdAttrs(), addDiscriminators(), addMemoryAttrs(), addNoAliasAttrs(), addNonNullAttrs(), addNoRecurseAttrs(), addNoReturnAttrs(), addNoUndefAttrs(), addSegmentsWithValNo(), addWillReturn(), AlignBlocks(), alwaysInlineImpl(), analyzeFunction(), bitTrackingDCE(), llvm::RISCVInstrInfo::buildOutlinedFrame(), checkAndReplaceCondition(), CleanupConstantGlobalUsers(), CleanupPointerRootUsers(), llvm::Combiner::combineMachineInstrs(), llvm::SampleProfileLoaderBaseImpl< FT >::computeAndPropagateWeights(), llvm::SampleProfileLoaderBaseImpl< FT >::computeBlockWeights(), llvm::computeEHOnlyBlocks(), llvm::rdf::Liveness::computePhiInfo(), llvm::DIExpression::constantFold(), llvm::ConstantFoldTerminator(), constantFoldTerminators(), llvm::ListInit::convertInitializerTo(), convertToRelativeLookupTables(), llvm::convertUsersOfConstantsToInstructions(), copyFunctionByValArgs(), deduceFunctionAttributeInRPO(), DeleteDeadIFuncs(), llvm::DeleteDeadPHIs(), deleteLoopIfDead(), llvm::DependenceInfo::depends(), deriveAttrsInPostOrder(), doCallSiteSplitting(), doDefKillClear(), llvm::FPPassManager::doFinalization(), llvm::legacy::FunctionPassManagerImpl::doFinalization(), llvm::FPPassManager::doInitialization(), llvm::legacy::FunctionPassManagerImpl::doInitialization(), eliminateAvailableExternally(), eliminateConstraints(), llvm::EliminateDuplicatePHINodes(), EliminateDuplicatePHINodesNaiveImpl(), EliminateDuplicatePHINodesSetBasedImpl(), eliminateLoadsAcrossLoops(), llvm::Value::eraseMetadata(), exportKernelRuntimeHandles(), llvm::CallGraphUpdater::finalize(), llvm::finalizeBundles(), llvm::SSAUpdaterImpl< UpdaterT >::FindDominators(), findMoreOptimalIndexType(), llvm::SSAUpdaterImpl< UpdaterT >::FindPHIPlacement(), FixIrreducibleImpl(), llvm::InstCombinerImpl::foldAllocaCmp(), llvm::PPCInstrInfo::foldImmediate(), foldTwoEntryPHINode(), forEachCall(), llvm::formDedicatedExitBlocks(), formLCSSAForInstructionsImpl(), formLCSSAImpl(), formLCSSAOnAllLoops(), formLCSSARecursivelyImpl(), forwardDeviceParams(), forwardHandleAccesses(), forwardSwitchConditionToPHI(), llvm::InstCombinerImpl::freezeOtherUses(), llvm::Pass::getAnalysis(), llvm::Pass::getAnalysisID(), llvm::ScalarEvolution::getLosslessPtrToIntExpr(), llvm::ScalarEvolution::getSequentialMinMaxExpr(), llvm::DependenceInfo::getSplitIteration(), llvm::InstCombinerImpl::handleUnreachableFrom(), llvm::handleUnreachableTerminator(), hoistAndMergeSGPRInits(), llvm::hoistRegion(), llvm::DenormalFPMathState::indicateFixpoint(), inferAlignment(), inferAllPrototypeAttributes(), llvm::inferAttributesFromOthers(), inferAttrsFromFunctionBodies(), inferConvergent(), llvm::inferNonMandatoryLibFuncAttrs(), INITIALIZE_PASS(), INITIALIZE_PASS(), INITIALIZE_PASS(), INITIALIZE_PASS(), INITIALIZE_PASS(), INITIALIZE_PASS(), inlineGetBaseAndOffset(), llvm::AAPointerInfo::RangeList::insert(), llvm::objcarc::BundledRetainClaimRVs::insertAfterInvokes(), InsertIntrinsicCalls(), llvm::GCNTTIImpl::instCombineIntrinsic(), llvm::InternalizePass::internalizeModule(), isLoopDead(), iterativelySimplifyCFG(), llvm::Legalizer::legalizeMachineFunction(), LinearizeExprTree(), lowerAtomics(), llvm::LowerDbgDeclare(), lowerExpectIntrinsic(), lowerLoadRelative(), llvm::makeFollowupLoopID(), llvm::Loop::makeLoopInvariant(), llvm::Loop::makeLoopInvariant(), markAliveBlocks(), markKernelArgsAsInreg(), llvm::LPMUpdater::markLoopNestChanged(), llvm::CombinerHelper::matchShuffleUndefRHS(), maybeRewriteToDrop(), llvm::BitTracker::RegisterCell::meet(), llvm::AAPointerInfo::RangeList::merge(), llvm::GlobalMergeFunc::merge(), mergeBlocksIntoPredecessors(), mergeCompatibleInvokes(), mergeConditionalStores(), mergePartStores(), llvm::SIInstrInfo::moveToVALUImpl(), llvm::nameUnamedGlobals(), OptimizeAwayTrappingUsesOfLoads(), OptimizeAwayTrappingUsesOfValue(), optimizeDivRem(), OptimizeEmptyGlobalAtExitDtors(), OptimizeFunctions(), OptimizeGlobalAliases(), optimizeGlobalsInModule(), OptimizeGlobalVars(), optimizeLoopExitWithUnknownExitCount(), OptimizeNonTrivialIFuncs(), OptimizeStaticIFuncs(), processBinOp(), processCallSite(), processGlobal(), processICmp(), processInternalGlobal(), processPHI(), llvm::ARMBlockPlacement::processPostOrderLoops(), processSelect(), processSwitch(), processTrunc(), promoteIndirectCalls(), promoteMemoryToRegister(), propagateLocalCopies(), llvm::SampleProfileLoaderBaseImpl< FT >::propagateThroughEdges(), llvm::SampleProfileLoaderBaseImpl< FT >::propagateWeights(), ReduceLoopStrength(), llvm::refineInstruction(), llvm::MCAssembler::registerSymbol(), llvm::jitlink::relaxBlock(), llvm::jitlink::relaxOnce(), remapIndices(), llvm::removeASanIncompatibleFnAttributes(), llvm::InstCombinerImpl::removeInstructionsBeforeUnreachable(), removeRedundantDbgLocsUsingBackwardScan(), removeRedundantDbgLocsUsingForwardScan(), removeUndefDbgLocsFromEntryBlock(), llvm::removeUnreachableBlocks(), replaceAllPrepares(), replaceDominatedUses(), replaceFoldableUses(), replaceSubOverflowUses(), rescheduleCanonically(), rescheduleLexographically(), llvm::BitsInit::resolveReferences(), llvm::CondOpInit::resolveReferences(), llvm::ListInit::resolveReferences(), llvm::VarDefInit::resolveReferences(), llvm::ScalarEvolution::LoopGuards::rewrite(), rewriteDebugUsers(), rewritePHIs(), llvm::ADCEPass::run(), llvm::AlwaysInlinerPass::run(), llvm::AMDGPUAlwaysInlinePass::run(), llvm::AMDGPUImageIntrinsicOptimizerPass::run(), llvm::AMDGPULateCodeGenPreparePass::run(), llvm::AMDGPULowerKernelArgumentsPass::run(), llvm::AMDGPUPerfHintAnalysis::run(), llvm::AMDGPUPerfHintAnalysisPass::run(), llvm::AMDGPUPreloadKernelArgumentsPass::run(), llvm::AMDGPUPrintfRuntimeBindingPass::run(), llvm::AMDGPUPromoteAllocaPass::run(), llvm::AMDGPUPromoteAllocaToVectorPass::run(), llvm::AMDGPURewriteUndefForPHIPass::run(), llvm::AMDGPUSimplifyLibCallsPass::run(), llvm::AMDGPUUseNativeCallsPass::run(), llvm::ArgumentPromotionPass::run(), llvm::AssignmentTrackingPass::run(), llvm::AssumeBuilderPass::run(), llvm::AtomicExpandPass::run(), llvm::BPFASpaceCastSimplifyPass::run(), llvm::CallBrPreparePass::run(), llvm::CFGuardPass::run(), llvm::CodeGenPreparePass::run(), llvm::ControlHeightReductionPass::run(), llvm::CoroAnnotationElidePass::run(), llvm::CoroElidePass::run(), llvm::CorrelatedValuePropagationPass::run(), llvm::CrossDSOCFIPass::run(), llvm::DAGTypeLegalizer::run(), llvm::DeadArgumentEliminationPass::run(), llvm::DropUnnecessaryAssumesPass::run(), llvm::DSEPass::run(), llvm::DwarfEHPreparePass::run(), llvm::DXILCBufferAccess::run(), llvm::DXILForwardHandleAccesses::run(), llvm::DXILUpgradePass::run(), llvm::EarlyIfConverterPass::run(), llvm::FatLtoCleanup::run(), llvm::FinalizeISelPass::run(), llvm::ForceFunctionAttrsPass::run(), llvm::GCLoweringPass::run(), llvm::GCNDPPCombinePass::run(), llvm::GlobalDCEPass::run(), llvm::GlobalMergeFuncPass::run(), llvm::GlobalMergePass::run(), llvm::GVNPass::run(), llvm::HardwareLoopsPass::run(), llvm::HotColdSplitting::run(), llvm::IndirectBrExpandPass::run(), llvm::InferAddressSpacesPass::run(), llvm::InlinerPass::run(), llvm::InstSimplifyPass::run(), llvm::InterleavedAccessPass::run(), llvm::InterleavedLoadCombinePass::run(), llvm::IRCEPass::run(), llvm::JMCInstrumenterPass::run(), llvm::JumpTableToSwitchPass::run(), llvm::JumpThreadingPass::run(), llvm::legacy::FunctionPassManagerImpl::run(), llvm::legacy::PassManagerImpl::run(), llvm::LNICMPass::run(), llvm::LoadStoreVectorizerPass::run(), llvm::LocalStackSlotAllocationPass::run(), llvm::LoopDataPrefetchPass::run(), llvm::LoopDistributePass::run(), llvm::LoopFlattenPass::run(), llvm::LoopFullUnrollPass::run(), llvm::LoopFusePass::run(), llvm::LoopLoadEliminationPass::run(), llvm::LoopRotatePass::run(), llvm::LoopSimplifyPass::run(), llvm::LoopSinkPass::run(), llvm::LoopUnrollPass::run(), llvm::LowerEmuTLSPass::run(), llvm::LowerGlobalDtorsPass::run(), llvm::LowerInvokePass::run(), llvm::LowerTypeTestsPass::run(), llvm::MachineCSEPass::run(), llvm::MachineLICMBasePass< DerivedT, PreRegAlloc >::run(), llvm::MachineSchedulerPass::run(), llvm::MachineSinkingPass::run(), llvm::MemProfUsePass::run(), llvm::ModuleInlinerPass::run(), llvm::NewGVNPass::run(), llvm::NoinlineNonPrevailing::run(), llvm::NVPTXLowerArgsPass::run(), llvm::ObjCARCContractPass::run(), llvm::ObjCARCOptPass::run(), llvm::OpenMPOptCGSCCPass::run(), llvm::OpenMPOptPass::run(), llvm::PeepholeOptimizerPass::run(), llvm::PGOCtxProfLoweringPass::run(), llvm::PGOMemOPSizeOpt::run(), llvm::PHIEliminationPass::run(), llvm::PostMachineSchedulerPass::run(), llvm::PostOrderFunctionAttrsPass::run(), llvm::PostRASchedulerPass::run(), llvm::rdf::CopyPropagation::run(), llvm::RedundantDbgInstEliminationPass::run(), llvm::RegAllocFastPass::run(), llvm::RegToMemPass::run(), llvm::ReplaceWithVeclib::run(), llvm::RewriteStatepointsForGC::run(), llvm::SafeStackPass::run(), llvm::SandboxVectorizerPass::run(), llvm::ScalarizerPass::run(), llvm::ShadowStackGCLoweringPass::run(), llvm::SIAnnotateControlFlowPass::run(), llvm::SIFixSGPRCopiesPass::run(), llvm::SIFoldOperandsPass::run(), llvm::SILoadStoreOptimizerPass::run(), llvm::SILowerControlFlowPass::run(), llvm::SILowerI1CopiesPass::run(), llvm::SimplifyTypeTestsPass::run(), llvm::SIOptimizeVGPRLiveRangePass::run(), llvm::SIWholeQuadModePass::run(), llvm::SjLjEHPreparePass::run(), llvm::SLPVectorizerPass::run(), llvm::SpeculativeExecutionPass::run(), llvm::SROAPass::run(), llvm::StackProtectorPass::run(), llvm::StackSlotColoringPass::run(), llvm::StructurizeCFGPass::run(), llvm::TailCallElimPass::run(), llvm::ThinLTOBitcodeWriterPass::run(), llvm::TwoAddressInstructionPass::run(), llvm::TypePromotionPass::run(), llvm::UnifyFunctionExitNodesPass::run(), llvm::UnreachableBlockElimPass::run(), llvm::WasmEHPreparePass::run(), llvm::WinEHPreparePass::run(), RAGreedyPass::run(), runAttributorLightOnFunctions(), runAttributorOnFunctions(), runCVP(), runFixI1Copies(), llvm::AlignmentFromAssumptionsPass::runImpl(), llvm::JumpThreadingPass::runImpl(), llvm::LoopVectorizePass::runImpl(), llvm::NaryReassociatePass::runImpl(), llvm::RewriteSymbolPass::runImpl(), llvm::SLPVectorizerPass::runImpl(), llvm::SpeculativeExecutionPass::runImpl(), runImpl(), runImpl(), runImpl(), runImpl(), runImpl(), runImpl(), runNVVMIntrRange(), runOnBasicBlock(), runOnBasicBlock(), llvm::FPPassManager::runOnFunction(), llvm::LPPassManager::runOnFunction(), llvm::MIRProfileLoader::runOnFunction(), llvm::RegToMemWrapperPass::runOnFunction(), llvm::RGPassManager::runOnFunction(), llvm::StackProtector::runOnFunction(), runOnFunction(), llvm::ARMBlockPlacement::runOnMachineFunction(), llvm::ErrataWorkaround::runOnMachineFunction(), llvm::LiveDebugVariables::LDVImpl::runOnMachineFunction(), llvm::LoadStoreOpt::runOnMachineFunction(), llvm::Localizer::runOnMachineFunction(), StaticDataSplitter::runOnMachineFunction(), llvm::FPPassManager::runOnModule(), StaticDataAnnotator::runOnModule(), llvm::AMDGPUPerfHintAnalysis::runOnSCC(), runPartiallyInlineLibCalls(), llvm::SelectionDAG::salvageDebugInfo(), llvm::salvageKnowledge(), llvm::set_union(), llvm::SetVector< EdgeType * >::set_union(), setArgsNoUndef(), setShiftFlags(), simplifyAndDCEInstruction(), llvm::InstCombinerImpl::SimplifyAssociativeOrCommutative(), simplifyFunctionCFG(), llvm::ScalarEvolution::SimplifyICmpOperands(), llvm::simplifyLoop(), simplifyLoopCFG(), simplifyLoopInst(), llvm::simplifyLoopIVs(), simplifyOneLoop(), sink(), sinkCommonCodeFromPredecessors(), sinkLoopInvariantInstructions(), sinkMinMaxInBB(), llvm::sinkRegion(), llvm::sinkRegionForLoopNest(), sinkScalarOperands(), SplitCriticalEdges(), splitGlobals(), llvm::SplitIndirectBrCriticalEdges(), STATISTIC(), stripDeadDebugInfoImpl(), llvm::stripDebugifyMetadata(), llvm::StripDebugInfo(), llvm::stripDebugInfo(), llvm::stripNonLineTableDebugInfo(), tagInvariantLoads(), tailMergeBlocksWithSimilarFunctionTerminators(), llvm::thinLTOFinalizeInModule(), llvm::thinLTOPropagateFunctionAttrs(), llvm::SelectionDAG::transferDbgValues(), transformGlobalArray(), llvm::LegalizationArtifactCombiner::tryCombineInstruction(), tryFoldHelper(), tryToSimplifyOverflowMath(), tryToVectorizeSequence(), unswitchAllTrivialConditions(), llvm::LastRunTrackingInfo::update(), llvm::LastRunTrackingInfo::update(), updateSuccessor(), llvm::UpgradeModuleFlags(), upgradeRetainReleaseMarker(), llvm::InstCombinerImpl::visitAdd(), llvm::SCEVRewriteVisitor< SC >::visitAddExpr(), llvm::SCEVRewriteVisitor< SC >::visitAddRecExpr(), llvm::InstCombinerImpl::visitCallInst(), llvm::InstCombinerImpl::visitFCmpInst(), llvm::InstCombinerImpl::visitGetElementPtrInst(), llvm::InstCombinerImpl::visitICmpInst(), llvm::InstCombinerImpl::visitMul(), llvm::SCEVRewriteVisitor< SC >::visitMulExpr(), llvm::SCEVRewriteVisitor< SC >::visitSequentialUMinExpr(), llvm::SCEVRewriteVisitor< SC >::visitSMaxExpr(), llvm::SCEVRewriteVisitor< SC >::visitSMinExpr(), llvm::InstCombinerImpl::visitSub(), llvm::InstCombinerImpl::visitTrunc(), llvm::SCEVRewriteVisitor< SC >::visitUDivExpr(), llvm::SCEVRewriteVisitor< SC >::visitUMaxExpr(), and llvm::SCEVRewriteVisitor< SC >::visitUMinExpr().

◆ NumRets

NumRets

Definition at line 2371 of file ObjCARCOpts.cpp.

Referenced by STATISTIC().

◆ OverflowOccurredValue

const unsigned BBState::OverflowOccurredValue = 0xffffffff
static

Definition at line 205 of file ObjCARCOpts.cpp.

◆ Retain

CallInst* Retain
Initial value:
Arg, Autorelease->getParent(), Autorelease, PA)
CallInst * Autorelease
Look for an `‘autorelease’' instruction dependent on Arg such that there are / no instructions depend...
static CallInst * FindPredecessorRetainWithSafePath(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...

Definition at line 2352 of file ObjCARCOpts.cpp.

Referenced by calcUniqueIDUpdateFlagsAndSize(), collectReleaseInsertPts(), eraseInst(), FindPredecessorRetainWithSafePath(), findRetainForStoreStrongContraction(), getWasmSectionFlags(), HasSafePathToPredecessorCall(), if(), LLVM_DEBUG(), llvm::vfs::makeMirroringOutputBackend(), selectELFSectionForGlobal(), selectExplicitSectionGlobal(), llvm::TargetLoweringObjectFileWasm::SelectSectionForGlobal(), and selectWasmSectionForGlobal().