Lines Matching +full:compute +full:- +full:cb

1 //===- ModuleSummaryAnalysis.cpp - Module summary index builder -----------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
12 //===----------------------------------------------------------------------===//
63 #define DEBUG_TYPE "module-summary-analysis"
66 // -import-cold-multiplier is set to 0. Useful for debugging.
73 "force-summary-edges-cold", cl::Hidden, cl::location(ForceSummaryEdgesCold),
77 "all-non-critical", "All non-critical edges."),
81 "module-summary-dot-file", cl::Hidden, cl::value_desc("filename"),
101 // local-linkage ifunc.
113 const auto *CB = dyn_cast<CallBase>(U); in findRefEdges() local
115 for (const auto &OI : U->operands()) { in findRefEdges()
127 if (!(CB && CB->isCallee(&OI))) { in findRefEdges()
133 GI && GI->hasLocalLinkage()) { in findRefEdges()
165 if (PSI->isHotCount(ProfileCount)) in getHotness()
167 if (PSI->isColdCount(ProfileCount)) in getHotness()
186 for (auto &Arg : drop_begin(Call.CB.args())) { in addVCallToSet()
188 if (!CI || CI->getBitWidth() > 64) { in addVCallToSet()
192 Args.push_back(CI->getZExtValue()); in addVCallToSet()
198 /// summary, do so via the non-constant reference arguments.
213 switch (CI->getCalledFunction()->getIntrinsicID()) { in addIntrinsicToSummary()
216 auto *TypeMDVal = cast<MetadataAsValue>(CI->getArgOperand(1)); in addIntrinsicToSummary()
217 auto *TypeId = dyn_cast<MDString>(TypeMDVal->getMetadata()); in addIntrinsicToSummary()
220 GlobalValue::GUID Guid = GlobalValue::getGUID(TypeId->getString()); in addIntrinsicToSummary()
226 bool HasNonAssumeUses = llvm::any_of(CI->uses(), [](const Use &CIU) { in addIntrinsicToSummary()
244 auto *TypeMDVal = cast<MetadataAsValue>(CI->getArgOperand(2)); in addIntrinsicToSummary()
245 auto *TypeId = dyn_cast<MDString>(TypeMDVal->getMetadata()); in addIntrinsicToSummary()
248 GlobalValue::GUID Guid = GlobalValue::getGUID(TypeId->getString()); in addIntrinsicToSummary()
256 // Any non-call uses of the result of llvm.type.checked.load will in addIntrinsicToSummary()
273 return !LI->isVolatile(); in isNonVolatileLoad()
280 return !SI->isVolatile(); in isNonVolatileStore()
345 // inlining may lead to an invalid cross-function reference. So we shouldn't in computeFunctionSummary()
348 for (User *U : BlockAddress::get(const_cast<BasicBlock *>(&BB))->users()) in computeFunctionSummary()
365 // Postpone processing of non-volatile load instructions in computeFunctionSummary()
374 // can be considered write-only if they're not referenced by any in computeFunctionSummary()
375 // non-store instruction. References from first operand of store in computeFunctionSummary()
376 // (stored value) can't be treated either as read- or as write-only in computeFunctionSummary()
378 // except non-volatile load. in computeFunctionSummary()
390 const auto *CB = dyn_cast<CallBase>(&I); in computeFunctionSummary() local
391 if (!CB) { in computeFunctionSummary()
403 if (HasLocalsInUsedOrAsm && CI && CI->isInlineAsm()) in computeFunctionSummary()
406 auto *CalledValue = CB->getCalledOperand(); in computeFunctionSummary()
407 auto *CalledFunction = CB->getCalledFunction(); in computeFunctionSummary()
409 CalledValue = CalledValue->stripPointerCasts(); in computeFunctionSummary()
417 CalledFunction = dyn_cast<Function>(GA->getAliaseeObject()); in computeFunctionSummary()
422 if (CI && CalledFunction->isIntrinsic()) { in computeFunctionSummary()
429 assert(CalledFunction->hasName()); in computeFunctionSummary()
430 auto ScaledCount = PSI->getProfileCount(*CB, BFI); in computeFunctionSummary()
443 if (CB->isTailCall()) in computeFunctionSummary()
448 uint64_t BBFreq = BFI->getBlockFreq(&BB).getFrequency(); in computeFunctionSummary()
449 uint64_t EntryFreq = BFI->getEntryFreq().getFrequency(); in computeFunctionSummary()
460 // Non-local ifunc is not cloned and does not have the issue. in computeFunctionSummary()
462 if (GI->hasLocalLinkage()) in computeFunctionSummary()
465 if (CI && CI->isInlineAsm()) in computeFunctionSummary()
476 for (const auto &Op : MD->operands()) { in computeFunctionSummary()
510 assert(mayHaveMemprofSummary(CB)); in computeFunctionSummary()
512 CallsThatMayHaveMemprofSummary.insert(CB); in computeFunctionSummary()
515 // Compute the list of stack ids first (so we can trim them from the stack in computeFunctionSummary()
523 for (auto &MDOp : MemProfMD->operands()) { in computeFunctionSummary()
568 if (PSI->hasPartialSampleProfile() && ScalePartialSampleProfileWorkingSetSize) in computeFunctionSummary()
583 // non-volatile loads and non-volatile value stores. Let's find in computeFunctionSummary()
641 const auto *CB = dyn_cast<CallBase>(&I); in computeFunctionSummary() local
642 if (!CB) in computeFunctionSummary()
645 if (CallsThatMayHaveMemprofSummary.count(CB)) in computeFunctionSummary()
647 assert(!mayHaveMemprofSummary(CB)); in computeFunctionSummary()
672 ParamAccesses = SSI->getParamAccesses(Index); in computeFunctionSummary()
695 if (I->getType()->isPointerTy()) { in findFuncPointers()
696 auto C = I->stripPointerCasts(); in findFuncPointers()
698 if (isa<Function>(C) || (A && isa<Function>(A->getAliasee()))) { in findFuncPointers()
703 if (GV && GV->getName() != "__cxa_pure_virtual") in findFuncPointers()
713 StructType *STy = dyn_cast<StructType>(C->getType()); in findFuncPointers()
715 const StructLayout *SL = DL.getStructLayout(C->getType()); in findFuncPointers()
717 for (auto EI : llvm::enumerate(STy->elements())) { in findFuncPointers()
718 auto Offset = SL->getElementOffset(EI.index()); in findFuncPointers()
719 unsigned Op = SL->getElementContainingOffset(Offset); in findFuncPointers()
720 findFuncPointers(cast<Constant>(I->getOperand(Op)), in findFuncPointers()
724 ArrayType *ATy = C->getType(); in findFuncPointers()
725 Type *EltTy = ATy->getElementType(); in findFuncPointers()
727 for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) { in findFuncPointers()
728 findFuncPointers(cast<Constant>(I->getOperand(i)), in findFuncPointers()
733 // For relative vtables, the next sub-component should be a trunc. in findFuncPointers()
734 if (CE->getOpcode() != Instruction::Trunc || in findFuncPointers()
735 !(CE = dyn_cast<ConstantExpr>(CE->getOperand(0)))) in findFuncPointers()
741 if (CE->getOpcode() == Instruction::Sub) { in findFuncPointers()
744 if (IsConstantOffsetFromGlobal(CE->getOperand(0), LHS, LHSOffset, DL) && in findFuncPointers()
745 IsConstantOffsetFromGlobal(CE->getOperand(1), RHS, RHSOffset, DL) && in findFuncPointers()
754 static_cast<uint64_t>(DL.getTypeAllocSize(OrigGV.getInitializer()->getType()))) { in findFuncPointers()
790 auto TypeID = Type->getOperand(1).get(); in recordTypeIdCompatibleVtableReferences()
794 cast<ConstantAsMetadata>(Type->getOperand(0))->getValue()) in recordTypeIdCompatibleVtableReferences()
795 ->getZExtValue(); in recordTypeIdCompatibleVtableReferences()
798 Index.getOrInsertTypeIdCompatibleVtableSummary(TypeId->getString()) in recordTypeIdCompatibleVtableReferences()
821 // If splitting is not enabled, then we compute the summary information in computeVariableSummary()
822 // necessary for index-based whole program devirtualization. in computeVariableSummary()
835 // Don't mark variables we won't be able to internalize as read/write-only. in computeVariableSummary()
848 GVarSummary->setNotEligibleToImport(); in computeVariableSummary()
850 GVarSummary->setVTableFuncs(VTableFuncs); in computeVariableSummary()
867 auto AliaseeVI = Index.getValueInfo(Aliasee->getGUID()); in computeAliasSummary()
870 "Expected a single entry per aliasee in per-module index"); in computeAliasSummary()
871 AS->setAliasee(AliaseeVI, AliaseeVI.getSummaryList()[0].get()); in computeAliasSummary()
881 Summary->setLive(true); in setLiveRoot()
894 EnableSplitLTOUnit = MD->getZExtValue(); in buildModuleSummaryIndex()
897 UnifiedLTO = MD->getZExtValue(); in buildModuleSummaryIndex()
913 if (V->hasLocalLinkage()) { in buildModuleSummaryIndex()
915 CantBePromoted.insert(V->getGUID()); in buildModuleSummaryIndex()
940 assert(GV->isDeclaration() && "Def in module asm already has definition"); in buildModuleSummaryIndex()
945 /* Local */ GV->isDSOLocal(), GV->canBeOmittedFromSymbolTable(), in buildModuleSummaryIndex()
947 CantBePromoted.insert(GV->getGUID()); in buildModuleSummaryIndex()
954 F->hasFnAttribute(Attribute::ReadNone), in buildModuleSummaryIndex()
955 F->hasFnAttribute(Attribute::ReadOnly), in buildModuleSummaryIndex()
956 F->hasFnAttribute(Attribute::NoRecurse), in buildModuleSummaryIndex()
957 F->returnDoesNotAlias(), in buildModuleSummaryIndex()
959 F->hasFnAttribute(Attribute::AlwaysInline), in buildModuleSummaryIndex()
960 F->hasFnAttribute(Attribute::NoUnwind), in buildModuleSummaryIndex()
979 false, false, cast<GlobalVariable>(GV)->isConstant(), in buildModuleSummaryIndex()
990 IsThinLTO = MD->getZExtValue(); in buildModuleSummaryIndex()
992 // Compute summaries for all functions defined in module, and save in the in buildModuleSummaryIndex()
1015 // Compute summaries for all variables defined in module, and save in the in buildModuleSummaryIndex()
1024 // Compute summaries for all aliases defined in module, and save in the in buildModuleSummaryIndex()
1032 Index.getGlobalValueSummary(GV)->setLive(true); in buildModuleSummaryIndex()
1039 Summary->setNotEligibleToImport(); in buildModuleSummaryIndex()
1043 // to flag them as live in the index to ensure index-based dead value in buildModuleSummaryIndex()
1060 Summary->setNotEligibleToImport(); in buildModuleSummaryIndex()
1065 llvm::all_of(Summary->refs(), [&](const ValueInfo &VI) { in buildModuleSummaryIndex()
1069 Summary->setNotEligibleToImport(); in buildModuleSummaryIndex()
1075 FuncSummary->calls(), [&](const FunctionSummary::EdgeTy &Edge) { in buildModuleSummaryIndex()
1079 Summary->setNotEligibleToImport(); in buildModuleSummaryIndex()
1109 [&FAM, NeedSSI](const Function &F) -> const StackSafetyInfo * { in run()
1118 INITIALIZE_PASS_BEGIN(ModuleSummaryIndexWrapperPass, "module-summary-analysis",
1123 INITIALIZE_PASS_END(ModuleSummaryIndexWrapperPass, "module-summary-analysis", in INITIALIZE_PASS_DEPENDENCY()
1141 return &(this->getAnalysis<BlockFrequencyInfoWrapperPass>( in runOnModule()
1146 [&](const Function &F) -> const StackSafetyInfo * { in runOnModule()
1186 INITIALIZE_PASS(ImmutableModuleSummaryIndexWrapperPass, "module-summary-info",
1189 bool llvm::mayHaveMemprofSummary(const CallBase *CB) { in mayHaveMemprofSummary() argument
1190 if (!CB) in mayHaveMemprofSummary()
1192 if (CB->isDebugOrPseudoInst()) in mayHaveMemprofSummary()
1194 auto *CI = dyn_cast<CallInst>(CB); in mayHaveMemprofSummary()
1195 auto *CalledValue = CB->getCalledOperand(); in mayHaveMemprofSummary()
1196 auto *CalledFunction = CB->getCalledFunction(); in mayHaveMemprofSummary()
1198 CalledValue = CalledValue->stripPointerCasts(); in mayHaveMemprofSummary()
1207 CalledFunction = dyn_cast<Function>(GA->getAliaseeObject()); in mayHaveMemprofSummary()
1212 if (CI && CalledFunction->isIntrinsic()) in mayHaveMemprofSummary()