LLVM: ARC Optimization. (original) (raw)
| 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 CallInst * | HasSafePathToPredecessorCall (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 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 two instructions that can affect the ref count of Arg. | |
| if ( |
|
| if ( |
|
| 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_ostream & | llvm::operator<< (raw_ostream &OS, BBState &BBState) |
| Variables | |
|---|---|
| CallInst * | Autorelease |
| 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. | |
| CallInst * | Retain |
| CallInst * | Call = HasSafePathToPredecessorCall(Arg, Retain, PA) |
| Changed = true | |
| NumRets | |
| static const unsigned | BBState::OverflowOccurredValue = 0xffffffff |
◆ CheckForCanReleaseCFGHazard()
◆ CheckForUseCFGHazard()
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 1172 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()
◆ ComputePostOrders()
The visited set, for doing DFS walks.
Definition at line 1640 of file ObjCARCOpts.cpp.
References llvm::SmallVectorTemplateCommon< T, typename >::back(), llvm::SmallPtrSetImplBase::clear(), llvm::SmallPtrSetImpl< PtrType >::count(), llvm::SmallVectorTemplateCommon< T, typename >::empty(), llvm::SmallPtrSetImpl< PtrType >::erase(), F, llvm::BasicBlock::getTerminator(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::SmallVectorTemplateBase< T, bool >::pop_back(), llvm::SmallVectorImpl< T >::pop_back_val(), llvm::pred_begin(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().
◆ eraseInst()
| BundledInsts eraseInst | ( | Retain | ) |
|---|
◆ EraseInstruction()
| EraseInstruction | ( | Autorelease | ) |
|---|
◆ FindPredecessorRetainWithSafePath()
◆ getRCIdentityRootsFromReleaseInsertPt()
◆ HasSafePathToPredecessorCall()
◆ if() [1/2]
◆ if() [2/2]
| if | ( | || | !Call->isTailCall() &&GetBasicARCInstKind(Retain)==ARCInstKind::RetainRV &&GetBasicARCInstKind(Autorelease)==ARCInstKind::AutoreleaseRV | ) |
| -- | - | ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | - |
◆ isInertARCValue()
◆ LLVM_DEBUG()
| LLVM_DEBUG | ( | dbgs()<< "Erasing: "<< *Retain<< "\nErasing: "<< *Autorelease<< "\n" | ) |
|---|
◆ MayAutorelease()
Interprocedurally determine if calls made by the given call site can possibly produce autoreleases.
Definition at line 2494 of file ObjCARCOpts.cpp.
References llvm::objcarc::Autorelease, llvm::objcarc::AutoreleasepoolPop, llvm::objcarc::AutoreleasepoolPush, llvm::objcarc::AutoreleaseRV, llvm::objcarc::Call, llvm::objcarc::CallOrUser, llvm::cast(), llvm::objcarc::CopyWeak, llvm::Depth, llvm::objcarc::DestroyWeak, llvm::objcarc::FusedRetainAutorelease, llvm::objcarc::FusedRetainAutoreleaseRV, llvm::objcarc::GetBasicARCInstKind(), llvm::CallBase::getCalledFunction(), I, llvm::objcarc::InitWeak, llvm::objcarc::IntrinsicUser, llvm::objcarc::LoadWeak, llvm::objcarc::LoadWeakRetained, MayAutorelease(), llvm::objcarc::MoveWeak, llvm::objcarc::None, llvm::objcarc::NoopCast, llvm::CallBase::onlyReadsMemory(), llvm::objcarc::Release, llvm::objcarc::Retain, llvm::objcarc::RetainBlock, llvm::objcarc::RetainRV, llvm::objcarc::StoreStrong, llvm::objcarc::StoreWeak, llvm::objcarc::UnsafeClaimRV, and llvm::objcarc::User.
Referenced by MayAutorelease().
◆ operator<<()
◆ 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" | ) |
◆ 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( 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: /
/ 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(&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 2345 of file ObjCARCOpts.cpp.
Referenced by EraseInstruction(), FindPredecessorRetainWithSafePath(), if(), if(), and LLVM_DEBUG().
◆ Call
Examples
/work/as-worker-4/publish-doxygen-docs/llvm-project/llvm/include/llvm/Transforms/Utils/Local.h.
Definition at line 2359 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::buildAPFixedPointInst(), 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::buildPipeInst(), llvm::buildTernaryBitwiseFunctionINTELInst(), llvm::calculateCXXStateForAsynchEH(), llvm::calculateSEHStateForAsynchEH(), llvm::AAResults::callCapturesBefore(), llvm::callsGCLeafFunction(), llvm::canConstantFoldCallTo(), canonicalizeConstantArg0ToArg1(), ChangeCalleesToFastCall(), changeCallSitesToColdCC(), 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::TargetLowering::expandMultipleResultFPLibCall(), expandProtectedFieldPtr(), expandToSwitch(), findBasePointers(), llvm::orc::SpeculateQuery::findCalles(), findLoadCallsAtConstantOffset(), findLocationForEntrySafepoint(), FlattenLoopPair(), llvm::InstCombinerImpl::fmulByZeroIsZero(), llvm::AMDGPULibCalls::fold(), foldMemChr(), llvm::InstCombinerImpl::foldMultiplicationOverflowCheck(), foldSqrt(), llvm::generate2DBlockIOINTELInst(), llvm::generateAPFixedPointInst(), llvm::generateAsyncCopy(), llvm::generateAtomicFloatingInst(), llvm::generateAtomicInst(), llvm::generateBarrierInst(), llvm::generateBindlessImageINTELInst(), llvm::generateBlockingPipesInst(), 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::generatePipeInst(), llvm::generatePredicatedLoadStoreInst(), 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::LibcallLoweringInfo::getLibcallCallingConv(), llvm::TargetLoweringBase::getLibcallCallingConv(), llvm::LibcallLoweringInfo::getLibcallImpl(), llvm::TargetLoweringBase::getLibcallImpl(), llvm::LibcallLoweringInfo::getLibcallImplCallingConv(), llvm::RTLIB::RuntimeLibcallsInfo::getLibcallImplCallingConv(), llvm::TargetLoweringBase::getLibcallImplCallingConv(), llvm::TargetLoweringBase::getLibcallImplName(), llvm::LibcallLoweringInfo::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(), isRegisterLiveInCall(), 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(), llvm::ARMAsmPrinter::LowerKCFI_CHECK(), 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(), OptimizeConstMinMax(), 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::LibcallLoweringInfo::setLibcallImpl(), llvm::TargetLoweringBase::setLibcallImpl(), llvm::RTLIB::RuntimeLibcallsInfo::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
Definition at line 2369 of file ObjCARCOpts.cpp.
Referenced by addArgumentAttrs(), addArgumentAttrsFromCallsites(), addArgumentReturnedAttrs(), addColdAttrs(), addDiscriminators(), addMemoryAttrs(), addNoAliasAttrs(), addNonNullAttrs(), addNoRecurseAttrs(), addNoReturnAttrs(), addNoUndefAttrs(), addSegmentsWithValNo(), addWillReturn(), AlignBlocks(), alwaysInlineImpl(), analyzeFunction(), bitTrackingDCE(), 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(), deriveAttrsInPostOrder(), doCallSiteSplitting(), doDefKillClear(), llvm::FPPassManager::doFinalization(), llvm::legacy::FunctionPassManagerImpl::doFinalization(), llvm::FPPassManager::doInitialization(), llvm::legacy::FunctionPassManagerImpl::doInitialization(), eliminateAvailableExternally(), eliminateConstraints(), llvm::EliminateDuplicatePHINodes(), EliminateDuplicatePHINodesNaiveImpl(), EliminateDuplicatePHINodesSetBasedImpl(), eliminateLoadsAcrossLoops(), EliminateNewDuplicatePHINodes(), 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::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(), iterativelyFlattenCFG(), 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(), optimizeUniformIntrinsic(), processBinOp(), processCallSite(), processGlobal(), processICmp(), processInternalGlobal(), processPHI(), llvm::ARMBlockPlacement::processPostOrderLoops(), processSelect(), processSwitch(), processTrunc(), promoteIndirectCalls(), promoteMemoryToRegister(), propagateLocalCopies(), llvm::SampleProfileLoaderBaseImpl< FT >::propagateThroughEdges(), llvm::SampleProfileLoaderBaseImpl< FT >::propagateWeights(), llvm::reconstitutePeeledArrayType(), ReduceLoopStrength(), llvm::refineInstruction(), registerSpirvTypeForNewInstructions(), 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::MemProfRemoveInfo::run(), llvm::MemProfUsePass::run(), llvm::ModuleInlinerPass::run(), llvm::NewGVNPass::run(), llvm::NoinlineNonPrevailing::run(), llvm::NoRecurseLTOInferencePass::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::RISCVCodeGenPreparePass::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(), llvm::X86AvoidTrailingCallPass::run(), llvm::X86DynAllocaExpanderPass::run(), llvm::X86FPStackifierPass::run(), llvm::X86LowerAMXIntrinsicsPass::run(), llvm::X86LowerAMXTypePass::run(), llvm::X86PartialReductionPass::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::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(), unifyLoopExits(), unswitchAllTrivialConditions(), llvm::LastRunTrackingInfo::update(), llvm::LastRunTrackingInfo::update(), UpdatedOnX86AvoidTrailingCallPass(), updateSuccessor(), llvm::UpgradeModuleFlags(), upgradeRetainReleaseMarker(), llvm::SLPVectorizerPass::vectorizeCmpInsts(), 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
◆ OverflowOccurredValue
◆ 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 2351 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().