LLVM 24.0.0git
ModuleSummaryAnalysis.cpp
Go to the documentation of this file.
1//===- ModuleSummaryAnalysis.cpp - Module summary index builder -----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This pass builds a ModuleSummaryIndex object for the module, to be written
10// to bitcode or LLVM assembly.
11//
12//===----------------------------------------------------------------------===//
13
15#include "llvm/ADT/ArrayRef.h"
16#include "llvm/ADT/DenseSet.h"
17#include "llvm/ADT/MapVector.h"
18#include "llvm/ADT/STLExtras.h"
19#include "llvm/ADT/SetVector.h"
22#include "llvm/ADT/StringRef.h"
32#include "llvm/IR/Attributes.h"
33#include "llvm/IR/BasicBlock.h"
34#include "llvm/IR/Constant.h"
35#include "llvm/IR/Constants.h"
36#include "llvm/IR/CycleInfo.h"
37#include "llvm/IR/Dominators.h"
38#include "llvm/IR/Function.h"
39#include "llvm/IR/GlobalAlias.h"
40#include "llvm/IR/GlobalValue.h"
44#include "llvm/IR/LLVMContext.h"
45#include "llvm/IR/Metadata.h"
46#include "llvm/IR/Module.h"
48#include "llvm/IR/Use.h"
49#include "llvm/IR/User.h"
53#include "llvm/Pass.h"
58#include <cassert>
59#include <cstdint>
60#include <vector>
61
62using namespace llvm;
63using namespace llvm::memprof;
64
65#define DEBUG_TYPE "module-summary-analysis"
66
67// Option to force edges cold which will block importing when the
68// -import-cold-multiplier is set to 0. Useful for debugging.
69namespace llvm {
72
74 "force-summary-edges-cold", cl::Hidden, cl::location(ForceSummaryEdgesCold),
75 cl::desc("Force all edges in the function summary to cold"),
78 "all-non-critical", "All non-critical edges."),
79 clEnumValN(FunctionSummary::FSHT_All, "all", "All edges.")));
80
82 "module-summary-dot-file", cl::Hidden, cl::value_desc("filename"),
83 cl::desc("File to emit dot graph of new summary into"));
84
86 "enable-memprof-indirect-call-support", cl::init(true), cl::Hidden,
88 "Enable MemProf support for summarizing and cloning indirect calls"));
89
90// This can be used to override the number of callees created from VP metadata
91// normally taken from the -icp-max-prom option with a larger amount, if useful
92// for analysis. Use a separate option so that we can control the number of
93// indirect callees for ThinLTO summary based analysis (e.g. for MemProf which
94// needs this information for a correct and not overly-conservative callsite
95// graph analysis, especially because allocation contexts may not be very
96// frequent), without affecting normal ICP.
98 MaxSummaryIndirectEdges("module-summary-max-indirect-edges", cl::init(0),
100 cl::desc("Max number of summary edges added from "
101 "indirect call profile metadata"));
102
104
106
108} // namespace llvm
109
110// Walk through the operands of a given User via worklist iteration and populate
111// the set of GlobalValue references encountered. Invoked either on an
112// Instruction or a GlobalVariable (which walks its initializer).
113// Return true if any of the operands contains blockaddress. This is important
114// to know when computing summary for global var, because if global variable
115// references basic block address we can't import it separately from function
116// containing that basic block. For simplicity we currently don't import such
117// global vars at all. When importing function we aren't interested if any
118// instruction in it takes an address of any basic block, because instruction
119// can only take an address of basic block located in the same function.
120// Set `RefLocalLinkageIFunc` to true if the analyzed value references a
121// local-linkage ifunc.
122static bool
123findRefEdges(ModuleSummaryIndex &Index, const User *CurUser,
126 bool &RefLocalLinkageIFunc) {
127 bool HasBlockAddress = false;
129 if (Visited.insert(CurUser).second)
130 Worklist.push_back(CurUser);
131
132 while (!Worklist.empty()) {
133 const User *U = Worklist.pop_back_val();
134 const auto *CB = dyn_cast<CallBase>(U);
135
136 for (const auto &OI : U->operands()) {
137 const User *Operand = dyn_cast<User>(OI);
138 if (!Operand)
139 continue;
140 if (isa<BlockAddress>(Operand)) {
141 HasBlockAddress = true;
142 continue;
143 }
144 if (auto *GV = dyn_cast<GlobalValue>(Operand)) {
145 // We have a reference to a global value. This should be added to
146 // the reference set unless it is a callee. Callees are handled
147 // specially by WriteFunction and are added to a separate list.
148 if (!(CB && CB->isCallee(&OI))) {
149 // If an ifunc has local linkage, do not add it into ref edges, and
150 // sets `RefLocalLinkageIFunc` to true. The referencer is not eligible
151 // for import. An ifunc doesn't have summary and ThinLTO cannot
152 // promote it; importing the referencer may cause linkage errors.
153 if (auto *GI = dyn_cast_if_present<GlobalIFunc>(GV);
154 GI && GI->hasLocalLinkage()) {
155 RefLocalLinkageIFunc = true;
156 continue;
157 }
158 RefEdges.insert(Index.getOrInsertValueInfo(GV));
159 }
160 continue;
161 }
162 if (Visited.insert(Operand).second)
163 Worklist.push_back(Operand);
164 }
165 }
166
167 const Instruction *I = dyn_cast<Instruction>(CurUser);
168 if (I) {
169 uint64_t TotalCount = 0;
170 // MaxNumVTableAnnotations is the maximum number of vtables annotated on
171 // the instruction.
172 auto ValueDataArray = getValueProfDataFromInst(
173 *I, IPVK_VTableTarget, MaxNumVTableAnnotations, TotalCount);
174
175 for (const auto &V : ValueDataArray)
176 RefEdges.insert(Index.getOrInsertValueInfo(/* VTableGUID = */
177 V.Value));
178 }
179 return HasBlockAddress;
180}
181
182/// Collect globals referenced via !implicit.ref metadata on a function
183/// and add them as reference edges in the module summary. This ensures
184/// ThinLTO liveness analysis treats them as live when the function is
185/// live, and imports them alongside the function during cross-module
186/// importing.
188 ModuleSummaryIndex &Index, const Function &F,
190 if (!F.hasMetadata(LLVMContext::MD_implicit_ref))
191 return;
193 F.getMetadata(LLVMContext::MD_implicit_ref, MDs);
194 for (MDNode *MD : MDs) {
195 for (const MDOperand &Op : MD->operands()) {
196 if (auto *VAM = dyn_cast_or_null<ValueAsMetadata>(Op.get()))
197 if (auto *GV = dyn_cast<GlobalValue>(VAM->getValue()))
198 RefEdges.insert(Index.getOrInsertValueInfo(GV));
199 }
200 }
201}
202
204 ProfileSummaryInfo *PSI) {
205 if (!PSI)
207 if (PSI->isHotCount(ProfileCount))
209 if (PSI->isColdCount(ProfileCount))
212}
213
214static bool isNonRenamableLocal(const GlobalValue &GV) {
215 return GV.hasSection() && GV.hasLocalLinkage();
216}
217
218/// Determine whether this call has all constant integer arguments (excluding
219/// "this") and summarize it to VCalls or ConstVCalls as appropriate.
220static void addVCallToSet(
222 SetVector<FunctionSummary::VFuncId, std::vector<FunctionSummary::VFuncId>>
223 &VCalls,
225 std::vector<FunctionSummary::ConstVCall>> &ConstVCalls) {
226 std::vector<uint64_t> Args;
227 // Start from the second argument to skip the "this" pointer.
228 for (auto &Arg : drop_begin(Call.CB.args())) {
229 auto *CI = dyn_cast<ConstantInt>(Arg);
230 if (!CI || CI->getBitWidth() > 64) {
231 VCalls.insert({Guid, Call.Offset});
232 return;
233 }
234 Args.push_back(CI->getZExtValue());
235 }
236 ConstVCalls.insert({{Guid, Call.Offset}, std::move(Args)});
237}
238
239/// If this intrinsic call requires that we add information to the function
240/// summary, do so via the non-constant reference arguments.
242 const CallInst *CI,
243 SetVector<GlobalValue::GUID, std::vector<GlobalValue::GUID>> &TypeTests,
244 SetVector<FunctionSummary::VFuncId, std::vector<FunctionSummary::VFuncId>>
245 &TypeTestAssumeVCalls,
246 SetVector<FunctionSummary::VFuncId, std::vector<FunctionSummary::VFuncId>>
247 &TypeCheckedLoadVCalls,
249 std::vector<FunctionSummary::ConstVCall>>
250 &TypeTestAssumeConstVCalls,
252 std::vector<FunctionSummary::ConstVCall>>
253 &TypeCheckedLoadConstVCalls,
254 DominatorTree &DT) {
255 switch (CI->getCalledFunction()->getIntrinsicID()) {
256 case Intrinsic::type_test:
257 case Intrinsic::public_type_test: {
258 auto *TypeMDVal = cast<MetadataAsValue>(CI->getArgOperand(1));
259 auto *TypeId = dyn_cast<MDString>(TypeMDVal->getMetadata());
260 if (!TypeId)
261 break;
264
265 // Produce a summary from type.test intrinsics. We only summarize type.test
266 // intrinsics that are used other than by an llvm.assume intrinsic.
267 // Intrinsics that are assumed are relevant only to the devirtualization
268 // pass, not the type test lowering pass.
269 bool HasNonAssumeUses = llvm::any_of(CI->uses(), [](const Use &CIU) {
270 return !isa<AssumeInst>(CIU.getUser());
271 });
272 if (HasNonAssumeUses)
273 TypeTests.insert(Guid);
274
277 findDevirtualizableCallsForTypeTest(DevirtCalls, Assumes, CI, DT);
278 for (auto &Call : DevirtCalls)
279 addVCallToSet(Call, Guid, TypeTestAssumeVCalls,
280 TypeTestAssumeConstVCalls);
281
282 break;
283 }
284
285 case Intrinsic::type_checked_load_relative:
286 case Intrinsic::type_checked_load: {
287 auto *TypeMDVal = cast<MetadataAsValue>(CI->getArgOperand(2));
288 auto *TypeId = dyn_cast<MDString>(TypeMDVal->getMetadata());
289 if (!TypeId)
290 break;
293
297 bool HasNonCallUses = false;
298 findDevirtualizableCallsForTypeCheckedLoad(DevirtCalls, LoadedPtrs, Preds,
299 HasNonCallUses, CI, DT);
300 // Any non-call uses of the result of llvm.type.checked.load will
301 // prevent us from optimizing away the llvm.type.test.
302 if (HasNonCallUses)
303 TypeTests.insert(Guid);
304 for (auto &Call : DevirtCalls)
305 addVCallToSet(Call, Guid, TypeCheckedLoadVCalls,
306 TypeCheckedLoadConstVCalls);
307
308 break;
309 }
310 default:
311 break;
312 }
313}
314
315static bool isNonVolatileLoad(const Instruction *I) {
316 if (const auto *LI = dyn_cast<LoadInst>(I))
317 return !LI->isVolatile();
318
319 return false;
320}
321
322static bool isNonVolatileStore(const Instruction *I) {
323 if (const auto *SI = dyn_cast<StoreInst>(I))
324 return !SI->isVolatile();
325
326 return false;
327}
328
329// Returns true if the function definition must be unreachable.
330//
331// Note if this helper function returns true, `F` is guaranteed
332// to be unreachable; if it returns false, `F` might still
333// be unreachable but not covered by this helper function.
335 // A function must be unreachable if its entry block ends with an
336 // 'unreachable'.
337 assert(!F.isDeclaration());
338 return isa<UnreachableInst>(F.getEntryBlock().getTerminator());
339}
340
342 ModuleSummaryIndex &Index, const Module &M, const Function &F,
344 bool HasLocalsInUsedOrAsm, DenseSet<GlobalValue::GUID> &CantBePromoted,
345 bool IsThinLTO,
346 std::function<const StackSafetyInfo *(const Function &F)> GetSSICallback) {
347 // Summary not currently supported for anonymous functions, they should
348 // have been named.
349 assert(F.hasName());
350
351 unsigned NumInsts = 0;
352 // Map from callee ValueId to profile count. Used to accumulate profile
353 // counts for all static calls to a given callee.
356 CallGraphEdges;
358 StoreRefEdges;
361 TypeTestAssumeVCalls, TypeCheckedLoadVCalls;
363 std::vector<FunctionSummary::ConstVCall>>
364 TypeTestAssumeConstVCalls, TypeCheckedLoadConstVCalls;
365 ICallPromotionAnalysis ICallAnalysis;
367
368 // Add personality function, prefix data and prologue data to function's ref
369 // list.
370 bool HasLocalIFuncCallOrRef = false;
371 findRefEdges(Index, &F, RefEdges, Visited, HasLocalIFuncCallOrRef);
372 findImplicitRefEdges(Index, F, RefEdges);
373
374 std::vector<const Instruction *> NonVolatileLoads;
375 std::vector<const Instruction *> NonVolatileStores;
376
377 std::vector<CallsiteInfo> Callsites;
378 std::vector<AllocInfo> Allocs;
379
380#ifndef NDEBUG
381 DenseSet<const CallBase *> CallsThatMayHaveMemprofSummary;
382#endif
383
384 bool HasInlineAsmMaybeReferencingInternal = false;
385 bool HasIndirBranchToBlockAddress = false;
386 bool HasUnknownCall = false;
387 bool MayThrow = false;
388 for (const BasicBlock &BB : F) {
389 // We don't allow inlining of function with indirect branch to blockaddress.
390 // If the blockaddress escapes the function, e.g., via a global variable,
391 // inlining may lead to an invalid cross-function reference. So we shouldn't
392 // import such function either.
393 if (BB.hasAddressTaken()) {
394 for (User *U : BlockAddress::get(const_cast<BasicBlock *>(&BB))->users())
395 if (!isa<CallBrInst>(*U)) {
396 HasIndirBranchToBlockAddress = true;
397 break;
398 }
399 }
400
401 for (const Instruction &I : BB) {
403 continue;
404 ++NumInsts;
405
406 // Regular LTO module doesn't participate in ThinLTO import,
407 // so no reference from it can be read/writeonly, since this
408 // would require importing variable as local copy
409 if (IsThinLTO) {
410 if (isNonVolatileLoad(&I)) {
411 // Postpone processing of non-volatile load instructions
412 // See comments below
413 Visited.insert(&I);
414 NonVolatileLoads.push_back(&I);
415 continue;
416 } else if (isNonVolatileStore(&I)) {
417 Visited.insert(&I);
418 NonVolatileStores.push_back(&I);
419 // All references from second operand of store (destination address)
420 // can be considered write-only if they're not referenced by any
421 // non-store instruction. References from first operand of store
422 // (stored value) can't be treated either as read- or as write-only
423 // so we add them to RefEdges as we do with all other instructions
424 // except non-volatile load.
425 Value *Stored = I.getOperand(0);
426 if (auto *GV = dyn_cast<GlobalValue>(Stored))
427 // findRefEdges will try to examine GV operands, so instead
428 // of calling it we should add GV to RefEdges directly.
429 RefEdges.insert(Index.getOrInsertValueInfo(GV));
430 else if (auto *U = dyn_cast<User>(Stored))
431 findRefEdges(Index, U, RefEdges, Visited, HasLocalIFuncCallOrRef);
432 continue;
433 }
434 }
435 findRefEdges(Index, &I, RefEdges, Visited, HasLocalIFuncCallOrRef);
436 const auto *CB = dyn_cast<CallBase>(&I);
437 if (!CB) {
438 if (I.mayThrow())
439 MayThrow = true;
440 continue;
441 }
442
443 const auto *CI = dyn_cast<CallInst>(&I);
444 // Since we don't know exactly which local values are referenced in inline
445 // assembly, conservatively mark the function as possibly referencing
446 // a local value from inline assembly to ensure we don't export a
447 // reference (which would require renaming and promotion of the
448 // referenced value).
449 if (HasLocalsInUsedOrAsm && CI && CI->isInlineAsm())
450 HasInlineAsmMaybeReferencingInternal = true;
451
452 // Compute this once per indirect call.
453 uint32_t NumCandidates = 0;
454 uint64_t TotalCount = 0;
455 MutableArrayRef<InstrProfValueData> CandidateProfileData;
456
457 auto *CalledValue = CB->getCalledOperand();
458 auto *CalledFunction = CB->getCalledFunction();
459 if (CalledValue && !CalledFunction) {
460 CalledValue = CalledValue->stripPointerCasts();
461 // Stripping pointer casts can reveal a called function.
462 CalledFunction = dyn_cast<Function>(CalledValue);
463 }
464 // Check if this is an alias to a function. If so, get the
465 // called aliasee for the checks below.
466 if (auto *GA = dyn_cast<GlobalAlias>(CalledValue)) {
467 assert(!CalledFunction && "Expected null called function in callsite for alias");
468 CalledFunction = dyn_cast<Function>(GA->getAliaseeObject());
469 }
470 // Check if this is a direct call to a known function or a known
471 // intrinsic, or an indirect call with profile data.
472 if (CalledFunction) {
473 if (CI && CalledFunction->isIntrinsic()) {
475 CI, TypeTests, TypeTestAssumeVCalls, TypeCheckedLoadVCalls,
476 TypeTestAssumeConstVCalls, TypeCheckedLoadConstVCalls, DT);
477 continue;
478 }
479 // We should have named any anonymous globals
480 assert(CalledFunction->hasName());
481 auto ScaledCount = PSI->getProfileCount(*CB, BFI);
482 auto Hotness = ScaledCount ? getHotness(*ScaledCount, PSI)
486
487 // Use the original CalledValue, in case it was an alias. We want
488 // to record the call edge to the alias in that case. Eventually
489 // an alias summary will be created to associate the alias and
490 // aliasee.
491 auto &ValueInfo = CallGraphEdges[Index.getOrInsertValueInfo(
492 cast<GlobalValue>(CalledValue))];
493 ValueInfo.updateHotness(Hotness);
494 if (CB->isTailCall())
495 ValueInfo.setHasTailCall(true);
496 } else {
497 HasUnknownCall = true;
498 // If F is imported, a local linkage ifunc (e.g. target_clones on a
499 // static function) called by F will be cloned. Since summaries don't
500 // track ifunc, we do not know implementation functions referenced by
501 // the ifunc resolver need to be promoted in the exporter, and we will
502 // get linker errors due to cloned declarations for implementation
503 // functions. As a simple fix, just mark F as not eligible for import.
504 // Non-local ifunc is not cloned and does not have the issue.
505 if (auto *GI = dyn_cast_if_present<GlobalIFunc>(CalledValue))
506 if (GI->hasLocalLinkage())
507 HasLocalIFuncCallOrRef = true;
508 // Skip inline assembly calls.
509 if (CI && CI->isInlineAsm())
510 continue;
511 // Skip direct calls.
512 if (!CalledValue || isa<Constant>(CalledValue))
513 continue;
514
515 // Check if the instruction has a callees metadata. If so, add callees
516 // to CallGraphEdges to reflect the references from the metadata, and
517 // to enable importing for subsequent indirect call promotion and
518 // inlining.
519 if (auto *MD = I.getMetadata(LLVMContext::MD_callees)) {
520 for (const auto &Op : MD->operands()) {
522 if (Callee)
523 CallGraphEdges[Index.getOrInsertValueInfo(Callee)]
524 .setHasIndirectCall(true);
525 }
526 }
527
528 CandidateProfileData =
530 &I, TotalCount, NumCandidates, MaxSummaryIndirectEdges);
531 for (const auto &Candidate : CandidateProfileData) {
532 auto &Edge =
533 CallGraphEdges[Index.getOrInsertValueInfo(Candidate.Value)];
534 Edge.updateHotness(getHotness(Candidate.Count, PSI));
535 Edge.setHasIndirectCall(true);
536 }
537 }
538
539 // Summarize memprof related metadata. This is only needed for ThinLTO.
540 if (!IsThinLTO)
541 continue;
542
543 // Skip indirect calls if we haven't enabled memprof ICP.
544 if (!CalledFunction && !EnableMemProfIndirectCallSupport)
545 continue;
546
547 // Ensure we keep this analysis in sync with the handling in the ThinLTO
548 // backend (see MemProfContextDisambiguation::applyImport). Save this call
549 // so that we can skip it in checking the reverse case later.
551#ifndef NDEBUG
552 CallsThatMayHaveMemprofSummary.insert(CB);
553#endif
554
555 // Compute the list of stack ids first (so we can trim them from the stack
556 // ids on any MIBs).
558 I.getMetadata(LLVMContext::MD_callsite));
559 auto *MemProfMD = I.getMetadata(LLVMContext::MD_memprof);
560 if (MemProfMD) {
561 std::vector<MIBInfo> MIBs;
562 std::vector<std::vector<ContextTotalSize>> ContextSizeInfos;
563 bool HasNonZeroContextSizeInfos = false;
564 for (auto &MDOp : MemProfMD->operands()) {
565 auto *MIBMD = cast<const MDNode>(MDOp);
568 SmallVector<unsigned> StackIdIndices;
570 // Collapse out any on the allocation call (inlining).
571 for (auto ContextIter =
572 StackContext.beginAfterSharedPrefix(InstCallsite);
573 ContextIter != StackContext.end(); ++ContextIter) {
574 unsigned StackIdIdx = Index.addOrGetStackIdIndex(*ContextIter);
575 // If this is a direct recursion, simply skip the duplicate
576 // entries. If this is mutual recursion, handling is left to
577 // the LTO link analysis client.
578 if (StackIdIndices.empty() || StackIdIndices.back() != StackIdIdx)
579 StackIdIndices.push_back(StackIdIdx);
580 }
581 // If we have context size information, collect it for inclusion in
582 // the summary.
583 assert(MIBMD->getNumOperands() > 2 ||
585 if (MIBMD->getNumOperands() > 2) {
586 std::vector<ContextTotalSize> ContextSizes;
587 for (unsigned I = 2; I < MIBMD->getNumOperands(); I++) {
588 MDNode *ContextSizePair = dyn_cast<MDNode>(MIBMD->getOperand(I));
589 assert(ContextSizePair->getNumOperands() == 2);
591 ContextSizePair->getOperand(0))
592 ->getZExtValue();
594 ContextSizePair->getOperand(1))
595 ->getZExtValue();
596 ContextSizes.push_back({FullStackId, TS});
597 }
598 // Flag that we need to keep the ContextSizeInfos array for this
599 // alloc as it now contains non-zero context info sizes.
600 HasNonZeroContextSizeInfos = true;
601 ContextSizeInfos.push_back(std::move(ContextSizes));
602 } else {
603 // The ContextSizeInfos must be in the same relative position as the
604 // associated MIB. In some cases we only include a ContextSizeInfo
605 // for a subset of MIBs in an allocation. To handle that, eagerly
606 // fill any MIB entries that don't have context size info metadata
607 // with a pair of 0s. Later on we will only use this array if it
608 // ends up containing any non-zero entries (see where we set
609 // HasNonZeroContextSizeInfos above).
610 ContextSizeInfos.push_back({{0, 0}});
611 }
612 MIBs.push_back(
613 MIBInfo(getMIBAllocType(MIBMD), std::move(StackIdIndices)));
614 }
615 Allocs.push_back(AllocInfo(std::move(MIBs)));
616 assert(HasNonZeroContextSizeInfos ||
618 // We eagerly build the ContextSizeInfos array, but it will be filled
619 // with sub arrays of pairs of 0s if no MIBs on this alloc actually
620 // contained context size info metadata. Only save it if any MIBs had
621 // any such metadata.
622 if (HasNonZeroContextSizeInfos) {
623 assert(Allocs.back().MIBs.size() == ContextSizeInfos.size());
624 Allocs.back().ContextSizeInfos = std::move(ContextSizeInfos);
625 }
626 } else if (!InstCallsite.empty()) {
627 SmallVector<unsigned> StackIdIndices;
628 for (auto StackId : InstCallsite)
629 StackIdIndices.push_back(Index.addOrGetStackIdIndex(StackId));
630 if (CalledFunction) {
631 // Use the original CalledValue, in case it was an alias. We want
632 // to record the call edge to the alias in that case. Eventually
633 // an alias summary will be created to associate the alias and
634 // aliasee.
635 auto CalleeValueInfo =
636 Index.getOrInsertValueInfo(cast<GlobalValue>(CalledValue));
637 Callsites.push_back({CalleeValueInfo, StackIdIndices});
638 } else {
640 // For indirect callsites, create multiple Callsites, one per target.
641 // This enables having a different set of clone versions per target,
642 // and we will apply the cloning decisions while speculatively
643 // devirtualizing in the ThinLTO backends.
644 for (const auto &Candidate : CandidateProfileData) {
645 auto CalleeValueInfo = Index.getOrInsertValueInfo(Candidate.Value);
646 Callsites.push_back({CalleeValueInfo, StackIdIndices});
647 }
648 }
649 }
650 }
651 }
652
654 Index.addBlockCount(F.size());
655
657 if (IsThinLTO) {
658 auto AddRefEdges =
659 [&](const std::vector<const Instruction *> &Instrs,
662 for (const auto *I : Instrs) {
663 Cache.erase(I);
664 findRefEdges(Index, I, Edges, Cache, HasLocalIFuncCallOrRef);
665 }
666 };
667
668 // By now we processed all instructions in a function, except
669 // non-volatile loads and non-volatile value stores. Let's find
670 // ref edges for both of instruction sets
671 AddRefEdges(NonVolatileLoads, LoadRefEdges, Visited);
672 // We can add some values to the Visited set when processing load
673 // instructions which are also used by stores in NonVolatileStores.
674 // For example this can happen if we have following code:
675 //
676 // store %Derived* @foo, %Derived** bitcast (%Base** @bar to %Derived**)
677 // %42 = load %Derived*, %Derived** bitcast (%Base** @bar to %Derived**)
678 //
679 // After processing loads we'll add bitcast to the Visited set, and if
680 // we use the same set while processing stores, we'll never see store
681 // to @bar and @bar will be mistakenly treated as readonly.
683 AddRefEdges(NonVolatileStores, StoreRefEdges, StoreCache);
684
685 // If both load and store instruction reference the same variable
686 // we won't be able to optimize it. Add all such reference edges
687 // to RefEdges set.
688 for (const auto &VI : StoreRefEdges)
689 if (LoadRefEdges.remove(VI))
690 RefEdges.insert(VI);
691
692 unsigned RefCnt = RefEdges.size();
693 // All new reference edges inserted in two loops below are either
694 // read or write only. They will be grouped in the end of RefEdges
695 // vector, so we can use a single integer value to identify them.
696 RefEdges.insert_range(LoadRefEdges);
697
698 unsigned FirstWORef = RefEdges.size();
699 RefEdges.insert_range(StoreRefEdges);
700
701 Refs = RefEdges.takeVector();
702 for (; RefCnt < FirstWORef; ++RefCnt)
703 Refs[RefCnt].setReadOnly();
704
705 for (; RefCnt < Refs.size(); ++RefCnt)
706 Refs[RefCnt].setWriteOnly();
707 } else {
708 Refs = RefEdges.takeVector();
709 }
710 // Explicit add hot edges to enforce importing for designated GUIDs for
711 // sample PGO, to enable the same inlines as the profiled optimized binary.
712 for (auto &I : F.getImportGUIDs())
713 CallGraphEdges[Index.getOrInsertValueInfo(I)].updateHotness(
717
718#ifndef NDEBUG
719 // Make sure that all calls we decided could not have memprof summaries get a
720 // false value for mayHaveMemprofSummary, to ensure that this handling remains
721 // in sync with the ThinLTO backend handling.
722 if (IsThinLTO) {
723 for (const BasicBlock &BB : F) {
724 for (const Instruction &I : BB) {
725 const auto *CB = dyn_cast<CallBase>(&I);
726 if (!CB)
727 continue;
728 // We already checked these above.
729 if (CallsThatMayHaveMemprofSummary.count(CB))
730 continue;
732 }
733 }
734 }
735#endif
736
737 bool NonRenamableLocal = isNonRenamableLocal(F);
738 bool NotEligibleForImport =
739 NonRenamableLocal || HasInlineAsmMaybeReferencingInternal ||
740 HasIndirBranchToBlockAddress || HasLocalIFuncCallOrRef;
742 F.getLinkage(), F.getVisibility(), NotEligibleForImport,
743 /* Live = */ false, F.isDSOLocal(), F.canBeOmittedFromSymbolTable(),
745 /* NoRenameOnPromotion = */ false);
747 F.doesNotAccessMemory(), F.onlyReadsMemory() && !F.doesNotAccessMemory(),
748 F.hasFnAttribute(Attribute::NoRecurse), F.returnDoesNotAlias(),
749 // FIXME: refactor this to use the same code that inliner is using.
750 // Don't try to import functions with noinline attribute.
751 F.getAttributes().hasFnAttr(Attribute::NoInline),
752 F.hasFnAttribute(Attribute::AlwaysInline),
753 F.hasFnAttribute(Attribute::NoUnwind), MayThrow, HasUnknownCall,
755 std::vector<FunctionSummary::ParamAccess> ParamAccesses;
756 if (auto *SSI = GetSSICallback(F))
757 ParamAccesses = SSI->getParamAccesses(Index);
758 auto FuncSummary = std::make_unique<FunctionSummary>(
759 Flags, NumInsts, FunFlags, std::move(Refs), CallGraphEdges.takeVector(),
760 TypeTests.takeVector(), TypeTestAssumeVCalls.takeVector(),
761 TypeCheckedLoadVCalls.takeVector(),
762 TypeTestAssumeConstVCalls.takeVector(),
763 TypeCheckedLoadConstVCalls.takeVector(), std::move(ParamAccesses),
764 std::move(Callsites), std::move(Allocs));
765 if (NonRenamableLocal)
766 CantBePromoted.insert(F.getGUID());
767 Index.addGlobalValueSummary(F, std::move(FuncSummary));
768}
769
770/// Find function pointers referenced within the given vtable initializer
771/// (or subset of an initializer) \p I. The starting offset of \p I within
772/// the vtable initializer is \p StartingOffset. Any discovered function
773/// pointers are added to \p VTableFuncs along with their cumulative offset
774/// within the initializer.
775static void findFuncPointers(const Constant *I, uint64_t StartingOffset,
776 const Module &M, ModuleSummaryIndex &Index,
777 VTableFuncList &VTableFuncs,
778 const GlobalVariable &OrigGV) {
779 // First check if this is a function pointer.
780 if (I->getType()->isPointerTy()) {
781 auto C = I->stripPointerCasts();
782 auto A = dyn_cast<GlobalAlias>(C);
783 if (isa<Function>(C) || (A && isa<Function>(A->getAliasee()))) {
784 auto GV = dyn_cast<GlobalValue>(C);
785 assert(GV);
786 // We can disregard __cxa_pure_virtual as a possible call target, as
787 // calls to pure virtuals are UB.
788 if (GV && GV->getName() != "__cxa_pure_virtual")
789 VTableFuncs.push_back({Index.getOrInsertValueInfo(GV), StartingOffset});
790 return;
791 }
792 }
793
794 // Walk through the elements in the constant struct or array and recursively
795 // look for virtual function pointers.
796 const DataLayout &DL = M.getDataLayout();
797 if (auto *C = dyn_cast<ConstantStruct>(I)) {
798 StructType *STy = C->getType();
799 assert(STy);
800 const StructLayout *SL = DL.getStructLayout(C->getType());
801
802 for (auto EI : llvm::enumerate(STy->elements())) {
803 auto Offset = SL->getElementOffset(EI.index());
804 unsigned Op = SL->getElementContainingOffset(Offset);
805 findFuncPointers(cast<Constant>(I->getOperand(Op)),
806 StartingOffset + Offset, M, Index, VTableFuncs, OrigGV);
807 }
808 } else if (auto *C = dyn_cast<ConstantArray>(I)) {
809 ArrayType *ATy = C->getType();
810 Type *EltTy = ATy->getElementType();
811 uint64_t EltSize = DL.getTypeAllocSize(EltTy);
812 for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) {
813 findFuncPointers(cast<Constant>(I->getOperand(i)),
814 StartingOffset + i * EltSize, M, Index, VTableFuncs,
815 OrigGV);
816 }
817 } else if (const auto *CE = dyn_cast<ConstantExpr>(I)) {
818 // For relative vtables, the next sub-component should be a trunc.
819 if (CE->getOpcode() != Instruction::Trunc ||
820 !(CE = dyn_cast<ConstantExpr>(CE->getOperand(0))))
821 return;
822
823 // If this constant can be reduced to the offset between a function and a
824 // global, then we know this is a valid virtual function if the RHS is the
825 // original vtable we're scanning through.
826 if (CE->getOpcode() == Instruction::Sub) {
828 APSInt LHSOffset, RHSOffset;
829 if (IsConstantOffsetFromGlobal(CE->getOperand(0), LHS, LHSOffset, DL) &&
830 IsConstantOffsetFromGlobal(CE->getOperand(1), RHS, RHSOffset, DL) &&
831 RHS == &OrigGV &&
832
833 // For relative vtables, this component should point to the callable
834 // function without any offsets.
835 LHSOffset == 0 &&
836
837 // Also, the RHS should always point to somewhere within the vtable.
838 RHSOffset <=
839 static_cast<uint64_t>(DL.getTypeAllocSize(OrigGV.getInitializer()->getType()))) {
840 findFuncPointers(LHS, StartingOffset, M, Index, VTableFuncs, OrigGV);
841 }
842 }
843 }
844}
845
846// Identify the function pointers referenced by vtable definition \p V.
848 const GlobalVariable &V, const Module &M,
849 VTableFuncList &VTableFuncs) {
850 if (!V.isConstant())
851 return;
852
853 findFuncPointers(V.getInitializer(), /*StartingOffset=*/0, M, Index,
854 VTableFuncs, V);
855
856#ifndef NDEBUG
857 // Validate that the VTableFuncs list is ordered by offset.
858 uint64_t PrevOffset = 0;
859 for (auto &P : VTableFuncs) {
860 // The findVFuncPointers traversal should have encountered the
861 // functions in offset order. We need to use ">=" since PrevOffset
862 // starts at 0.
863 assert(P.VTableOffset >= PrevOffset);
864 PrevOffset = P.VTableOffset;
865 }
866#endif
867}
868
869/// Record vtable definition \p V for each type metadata it references.
870static void
872 const GlobalVariable &V,
874 for (MDNode *Type : Types) {
875 auto TypeID = Type->getOperand(1).get();
876
879 cast<ConstantAsMetadata>(Type->getOperand(0))->getValue())
880 ->getZExtValue();
881
882 if (auto *TypeId = dyn_cast<MDString>(TypeID))
883 Index.getOrInsertTypeIdCompatibleVtableSummary(TypeId->getString())
884 .push_back({Offset, Index.getOrInsertValueInfo(&V)});
885 }
886}
887
889 const GlobalVariable &V,
890 DenseSet<GlobalValue::GUID> &CantBePromoted,
891 const Module &M,
895 bool RefLocalIFunc = false;
896 bool HasBlockAddress =
897 findRefEdges(Index, &V, RefEdges, Visited, RefLocalIFunc);
898 const bool NotEligibleForImport = (HasBlockAddress || RefLocalIFunc);
899 bool NonRenamableLocal = isNonRenamableLocal(V);
901 V.getLinkage(), V.getVisibility(), NonRenamableLocal,
902 /* Live = */ false, V.isDSOLocal(), V.canBeOmittedFromSymbolTable(),
903 GlobalValueSummary::Definition, /* NoRenameOnPromotion = */ false);
904
905 VTableFuncList VTableFuncs;
906 // If splitting is not enabled, then we compute the summary information
907 // necessary for index-based whole program devirtualization.
908 if (!Index.enableSplitLTOUnit()) {
909 Types.clear();
910 V.getMetadata(LLVMContext::MD_type, Types);
911 if (!Types.empty()) {
912 // Identify the function pointers referenced by this vtable definition.
913 computeVTableFuncs(Index, V, M, VTableFuncs);
914
915 // Record this vtable definition for each type metadata it references.
917 }
918 }
919
920 // Don't mark variables we won't be able to internalize as read/write-only.
921 bool CanBeInternalized =
922 !V.hasComdat() && !V.hasAppendingLinkage() && !V.isInterposable() &&
923 !V.hasAvailableExternallyLinkage() && !V.hasDLLExportStorageClass();
924 bool Constant = V.isConstant();
925 GlobalVarSummary::GVarFlags VarFlags(CanBeInternalized,
926 Constant ? false : CanBeInternalized,
927 Constant, V.getVCallVisibility());
928 auto GVarSummary = std::make_unique<GlobalVarSummary>(Flags, VarFlags,
929 RefEdges.takeVector());
930 if (NonRenamableLocal)
931 CantBePromoted.insert(V.getGUID());
932 if (NotEligibleForImport)
933 GVarSummary->setNotEligibleToImport();
934 if (!VTableFuncs.empty())
935 GVarSummary->setVTableFuncs(VTableFuncs);
936 Index.addGlobalValueSummary(V, std::move(GVarSummary));
937}
938
940 DenseSet<GlobalValue::GUID> &CantBePromoted) {
941 // Skip summary for indirect function aliases as summary for aliasee will not
942 // be emitted.
943 const GlobalObject *Aliasee = A.getAliaseeObject();
944 if (isa<GlobalIFunc>(Aliasee))
945 return;
946 bool NonRenamableLocal = isNonRenamableLocal(A);
948 A.getLinkage(), A.getVisibility(), NonRenamableLocal,
949 /* Live = */ false, A.isDSOLocal(), A.canBeOmittedFromSymbolTable(),
950 GlobalValueSummary::Definition, /* NoRenameOnPromotion = */ false);
951 auto AS = std::make_unique<AliasSummary>(Flags);
952 auto AliaseeVI = Index.getValueInfo(Aliasee->getGUID());
953 assert(AliaseeVI && "Alias expects aliasee summary to be available");
954 assert(AliaseeVI.getSummaryList().size() == 1 &&
955 "Expected a single entry per aliasee in per-module index");
956 AS->setAliasee(AliaseeVI, AliaseeVI.getSummaryList()[0].get());
957 if (NonRenamableLocal)
958 CantBePromoted.insert(A.getGUID());
959 Index.addGlobalValueSummary(A, std::move(AS));
960}
961
962// Set LiveRoot flag on entries matching the given value name.
963static void setLiveRoot(ModuleSummaryIndex &Index, StringRef Name) {
964 if (ValueInfo VI =
965 Index.getValueInfo(GlobalValue::getGUIDAssumingExternalLinkage(Name)))
966 for (const auto &Summary : VI.getSummaryList())
967 Summary->setLive(true);
968}
969
971 const Module &M,
972 std::function<BlockFrequencyInfo *(const Function &F)> GetBFICallback,
974 std::function<const StackSafetyInfo *(const Function &F)> GetSSICallback) {
975 assert(PSI);
976 bool EnableSplitLTOUnit = false;
977 bool UnifiedLTO = false;
979 M.getModuleFlag("EnableSplitLTOUnit")))
980 EnableSplitLTOUnit = MD->getZExtValue();
981 if (auto *MD =
982 mdconst::extract_or_null<ConstantInt>(M.getModuleFlag("UnifiedLTO")))
983 UnifiedLTO = MD->getZExtValue();
984 ModuleSummaryIndex Index(/*HaveGVs=*/true, EnableSplitLTOUnit, UnifiedLTO);
985
986 // Identify the local values in the llvm.used and llvm.compiler.used sets,
987 // which should not be exported as they would then require renaming and
988 // promotion, but we may have opaque uses e.g. in inline asm. We collect them
989 // here because we use this information to mark functions containing inline
990 // assembly calls as not importable.
993 // First collect those in the llvm.used set.
994 collectUsedGlobalVariables(M, Used, /*CompilerUsed=*/false);
995 // Next collect those in the llvm.compiler.used set.
996 collectUsedGlobalVariables(M, Used, /*CompilerUsed=*/true);
997 DenseSet<GlobalValue::GUID> CantBePromoted;
998 for (auto *V : Used) {
999 if (V->hasLocalLinkage()) {
1000 LocalsUsed.insert(V);
1001 CantBePromoted.insert(V->getGUID());
1002 }
1003 }
1004
1005 bool HasLocalInlineAsmSymbol = false;
1006 if (!M.getModuleInlineAsm().empty()) {
1007 // Collect the local values defined by module level asm, and set up
1008 // summaries for these symbols so that they can be marked as NoRename,
1009 // to prevent export of any use of them in regular IR that would require
1010 // renaming within the module level asm. Note we don't need to create a
1011 // summary for weak or global defs, as they don't need to be flagged as
1012 // NoRename, and defs in module level asm can't be imported anyway.
1013 // Also, any values used but not defined within module level asm should
1014 // be listed on the llvm.used or llvm.compiler.used global and marked as
1015 // referenced from there.
1017 M, [&](StringRef Name, object::BasicSymbolRef::Flags Flags) {
1018 // Symbols not marked as Weak or Global are local definitions.
1019 if (Flags & (object::BasicSymbolRef::SF_Weak |
1021 return;
1022 HasLocalInlineAsmSymbol = true;
1023 GlobalValue *GV = M.getNamedValue(Name);
1024 if (!GV)
1025 return;
1026 assert(GV->isDeclaration() && "Def in module asm already has definition");
1029 /* NotEligibleToImport = */ true,
1030 /* Live = */ true,
1031 /* Local */ GV->isDSOLocal(), GV->canBeOmittedFromSymbolTable(),
1033 /* NoRenameOnPromotion = */ false);
1034 CantBePromoted.insert(GV->getGUID());
1035 // Create the appropriate summary type.
1036 if (Function *F = dyn_cast<Function>(GV)) {
1037 std::unique_ptr<FunctionSummary> Summary =
1038 std::make_unique<FunctionSummary>(
1039 GVFlags, /*InstCount=*/0,
1041 F->hasFnAttribute(Attribute::ReadNone),
1042 F->hasFnAttribute(Attribute::ReadOnly),
1043 F->hasFnAttribute(Attribute::NoRecurse),
1044 F->returnDoesNotAlias(),
1045 /* NoInline = */ false,
1046 F->hasFnAttribute(Attribute::AlwaysInline),
1047 F->hasFnAttribute(Attribute::NoUnwind),
1048 /* MayThrow */ true,
1049 /* HasUnknownCall */ true,
1050 /* MustBeUnreachable */ false},
1060 Index.addGlobalValueSummary(*GV, std::move(Summary));
1061 } else {
1062 std::unique_ptr<GlobalVarSummary> Summary =
1063 std::make_unique<GlobalVarSummary>(
1064 GVFlags,
1066 false, false, cast<GlobalVariable>(GV)->isConstant(),
1069 Index.addGlobalValueSummary(*GV, std::move(Summary));
1070 }
1071 });
1072 }
1073
1074 bool IsThinLTO = true;
1075 if (auto *MD =
1076 mdconst::extract_or_null<ConstantInt>(M.getModuleFlag("ThinLTO")))
1077 IsThinLTO = MD->getZExtValue();
1078
1079 // Compute summaries for all functions defined in module, and save in the
1080 // index.
1081 for (const auto &F : M) {
1082 if (F.isDeclaration())
1083 continue;
1084
1085 DominatorTree DT(const_cast<Function &>(F));
1086 BlockFrequencyInfo *BFI = nullptr;
1087 std::unique_ptr<BlockFrequencyInfo> BFIPtr;
1088 if (F.hasProfileData()) {
1089 if (GetBFICallback) {
1090 BFI = GetBFICallback(F);
1091 } else {
1092 CycleInfo CI;
1093 CI.compute(const_cast<Function &>(F));
1094 BranchProbabilityInfo BPI{F, CI};
1095 BFIPtr = std::make_unique<BlockFrequencyInfo>(F, BPI, CI);
1096 BFI = BFIPtr.get();
1097 }
1098 }
1099
1100 computeFunctionSummary(Index, M, F, BFI, PSI, DT,
1101 !LocalsUsed.empty() || HasLocalInlineAsmSymbol,
1102 CantBePromoted, IsThinLTO, GetSSICallback);
1103 }
1104
1105 // Compute summaries for all variables defined in module, and save in the
1106 // index.
1108 for (const GlobalVariable &G : M.globals()) {
1109 if (G.isDeclaration())
1110 continue;
1111 computeVariableSummary(Index, G, CantBePromoted, M, Types);
1112 }
1113
1114 // Compute summaries for all aliases defined in module, and save in the
1115 // index.
1116 for (const GlobalAlias &A : M.aliases())
1117 computeAliasSummary(Index, A, CantBePromoted);
1118
1119 // Iterate through ifuncs, set their resolvers all alive.
1120 for (const GlobalIFunc &I : M.ifuncs()) {
1121 I.applyAlongResolverPath([&Index](const GlobalValue &GV) {
1122 Index.getGlobalValueSummary(GV)->setLive(true);
1123 });
1124 }
1125
1126 for (auto *V : LocalsUsed) {
1127 auto *Summary = Index.getGlobalValueSummary(*V);
1128 assert(Summary && "Missing summary for global value");
1129 Summary->setNotEligibleToImport();
1130 }
1131
1132 // The linker doesn't know about these LLVM produced values, so we need
1133 // to flag them as live in the index to ensure index-based dead value
1134 // analysis treats them as live roots of the analysis.
1135 setLiveRoot(Index, "llvm.used");
1136 setLiveRoot(Index, "llvm.compiler.used");
1137 setLiveRoot(Index, "llvm.global_ctors");
1138 setLiveRoot(Index, "llvm.global_dtors");
1139 setLiveRoot(Index, "llvm.global.annotations");
1140
1141 for (auto &GlobalList : Index) {
1142 // Ignore entries for references that are undefined in the current module.
1143 if (GlobalList.second.getSummaryList().empty())
1144 continue;
1145
1146 assert(GlobalList.second.getSummaryList().size() == 1 &&
1147 "Expected module's index to have one summary per GUID");
1148 auto &Summary = GlobalList.second.getSummaryList()[0];
1149 if (!IsThinLTO) {
1150 Summary->setNotEligibleToImport();
1151 continue;
1152 }
1153
1154 bool AllRefsCanBeExternallyReferenced =
1155 llvm::all_of(Summary->refs(), [&](const ValueInfo &VI) {
1156 return !CantBePromoted.count(VI.getGUID());
1157 });
1158 if (!AllRefsCanBeExternallyReferenced) {
1159 Summary->setNotEligibleToImport();
1160 continue;
1161 }
1162
1163 if (auto *FuncSummary = dyn_cast<FunctionSummary>(Summary.get())) {
1164 bool AllCallsCanBeExternallyReferenced = llvm::all_of(
1165 FuncSummary->calls(), [&](const FunctionSummary::EdgeTy &Edge) {
1166 return !CantBePromoted.count(Edge.first.getGUID());
1167 });
1168 if (!AllCallsCanBeExternallyReferenced)
1169 Summary->setNotEligibleToImport();
1170 }
1171 }
1172
1173 if (!ModuleSummaryDotFile.empty()) {
1174 std::error_code EC;
1176 if (EC)
1177 report_fatal_error(Twine("Failed to open dot file ") +
1178 ModuleSummaryDotFile + ": " + EC.message() + "\n");
1179 Index.exportToDot(OSDot, {});
1180 }
1181
1182 return Index;
1183}
1184
1185AnalysisKey ModuleSummaryIndexAnalysis::Key;
1186AnalysisKey ImmutableModuleSummaryIndexAnalysis::Key;
1187
1191 auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
1192 bool NeedSSI = needsParamAccessSummary(M);
1194 M,
1195 [&FAM](const Function &F) {
1196 return &FAM.getResult<BlockFrequencyAnalysis>(
1197 *const_cast<Function *>(&F));
1198 },
1199 &PSI,
1200 [&FAM, NeedSSI](const Function &F) -> const StackSafetyInfo * {
1201 return NeedSSI ? &FAM.getResult<StackSafetyAnalysis>(
1202 const_cast<Function &>(F))
1203 : nullptr;
1204 });
1205}
1206
1208
1210 "Module Summary Analysis", false, true)
1215 "Module Summary Analysis", false, true)
1216
1220
1223
1225 auto *PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
1226 bool NeedSSI = needsParamAccessSummary(M);
1227 Index.emplace(buildModuleSummaryIndex(
1228 M,
1229 [this](const Function &F) {
1231 *const_cast<Function *>(&F))
1232 .getBFI());
1233 },
1234 PSI,
1235 [&](const Function &F) -> const StackSafetyInfo * {
1237 const_cast<Function &>(F))
1238 .getResult()
1239 : nullptr;
1240 }));
1241 return false;
1242}
1243
1245 Index.reset();
1246 return false;
1247}
1248
1255
1257
1261
1266
1271
1273 "Module summary info", false, true)
1274
1276 if (!CB)
1277 return false;
1278 auto *CI = dyn_cast<CallInst>(CB);
1279 auto *CalledValue = CB->getCalledOperand();
1280 auto *CalledFunction = CB->getCalledFunction();
1281 if (CalledValue && !CalledFunction) {
1282 CalledValue = CalledValue->stripPointerCasts();
1283 // Stripping pointer casts can reveal a called function.
1284 CalledFunction = dyn_cast<Function>(CalledValue);
1285 }
1286 // Check if this is an alias to a function. If so, get the
1287 // called aliasee for the checks below.
1288 if (auto *GA = dyn_cast<GlobalAlias>(CalledValue)) {
1289 assert(!CalledFunction &&
1290 "Expected null called function in callsite for alias");
1291 CalledFunction = dyn_cast<Function>(GA->getAliaseeObject());
1292 }
1293 // Check if this is a direct call to a known function or a known
1294 // intrinsic, or an indirect call with profile data.
1295 if (CalledFunction) {
1296 if (CI && CalledFunction->isIntrinsic())
1297 return false;
1298 } else {
1299 // Skip indirect calls if we haven't enabled memprof ICP.
1301 return false;
1302 // Skip inline assembly calls.
1303 if (CI && CI->isInlineAsm())
1304 return false;
1305 // Skip direct calls via Constant.
1306 if (!CalledValue || isa<Constant>(CalledValue))
1307 return false;
1308 return true;
1309 }
1310 return true;
1311}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
uint64_t uint64_t
static bool isConstant(const MachineInstr &MI)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
#define LLVM_ABI
Definition Compiler.h:211
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file declares the LLVM IR specialization of the GenericCycle templates.
This file defines the DenseSet and SmallDenseSet classes.
Module.h This file contains the declarations for the Module class.
This defines the Use class.
iv users
Definition IVUsers.cpp:48
Interface to identify indirect call promotion candidates.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
This file implements a map that provides insertion order iteration.
This file contains the declarations for metadata subclasses.
Type::TypeID TypeID
static void addVCallToSet(DevirtCallSite Call, GlobalValue::GUID Guid, SetVector< FunctionSummary::VFuncId, std::vector< FunctionSummary::VFuncId > > &VCalls, SetVector< FunctionSummary::ConstVCall, std::vector< FunctionSummary::ConstVCall > > &ConstVCalls)
Determine whether this call has all constant integer arguments (excluding "this") and summarize it to...
static void computeVTableFuncs(ModuleSummaryIndex &Index, const GlobalVariable &V, const Module &M, VTableFuncList &VTableFuncs)
static void computeAliasSummary(ModuleSummaryIndex &Index, const GlobalAlias &A, DenseSet< GlobalValue::GUID > &CantBePromoted)
static void findFuncPointers(const Constant *I, uint64_t StartingOffset, const Module &M, ModuleSummaryIndex &Index, VTableFuncList &VTableFuncs, const GlobalVariable &OrigGV)
Find function pointers referenced within the given vtable initializer (or subset of an initializer) I...
static void computeVariableSummary(ModuleSummaryIndex &Index, const GlobalVariable &V, DenseSet< GlobalValue::GUID > &CantBePromoted, const Module &M, SmallVectorImpl< MDNode * > &Types)
static void setLiveRoot(ModuleSummaryIndex &Index, StringRef Name)
static CalleeInfo::HotnessType getHotness(uint64_t ProfileCount, ProfileSummaryInfo *PSI)
static bool isNonVolatileLoad(const Instruction *I)
static void findImplicitRefEdges(ModuleSummaryIndex &Index, const Function &F, SetVector< ValueInfo, SmallVector< ValueInfo, 0 > > &RefEdges)
Collect globals referenced via !implicit.ref metadata on a function and add them as reference edges i...
static bool isNonRenamableLocal(const GlobalValue &GV)
static void computeFunctionSummary(ModuleSummaryIndex &Index, const Module &M, const Function &F, BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI, DominatorTree &DT, bool HasLocalsInUsedOrAsm, DenseSet< GlobalValue::GUID > &CantBePromoted, bool IsThinLTO, std::function< const StackSafetyInfo *(const Function &F)> GetSSICallback)
static bool mustBeUnreachableFunction(const Function &F)
static bool isNonVolatileStore(const Instruction *I)
static bool findRefEdges(ModuleSummaryIndex &Index, const User *CurUser, SetVector< ValueInfo, SmallVector< ValueInfo, 0 > > &RefEdges, SmallPtrSet< const User *, 8 > &Visited, bool &RefLocalLinkageIFunc)
static void addIntrinsicToSummary(const CallInst *CI, SetVector< GlobalValue::GUID, std::vector< GlobalValue::GUID > > &TypeTests, SetVector< FunctionSummary::VFuncId, std::vector< FunctionSummary::VFuncId > > &TypeTestAssumeVCalls, SetVector< FunctionSummary::VFuncId, std::vector< FunctionSummary::VFuncId > > &TypeCheckedLoadVCalls, SetVector< FunctionSummary::ConstVCall, std::vector< FunctionSummary::ConstVCall > > &TypeTestAssumeConstVCalls, SetVector< FunctionSummary::ConstVCall, std::vector< FunctionSummary::ConstVCall > > &TypeCheckedLoadConstVCalls, DominatorTree &DT)
If this intrinsic call requires that we add information to the function summary, do so via the non-co...
static void recordTypeIdCompatibleVtableReferences(ModuleSummaryIndex &Index, const GlobalVariable &V, SmallVectorImpl< MDNode * > &Types)
Record vtable definition V for each type metadata it references.
This is the interface to build a ModuleSummaryIndex for a module.
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
#define P(N)
FunctionAnalysisManager FAM
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition PassSupport.h:56
This file contains some templates that are useful if you are working with the STL at all.
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
Value * RHS
Value * LHS
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
LLVM Basic Block Representation.
Definition BasicBlock.h:62
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
Analysis pass which computes BlockFrequencyInfo.
Legacy analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Analysis providing branch probability information.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
Value * getArgOperand(unsigned i) const
This class represents a function call, abstracting a target machine's calling convention.
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
std::pair< ValueInfo, CalleeInfo > EdgeTy
<CalleeValueInfo, CalleeInfo> call edge pair.
ForceSummaryHotnessType
Types for -force-summary-edges-cold debugging option.
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
Definition Function.h:247
void compute(FunctionT &F)
Compute the cycle info for a function.
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
Definition Globals.cpp:80
bool isDSOLocal() const
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
Definition Globals.cpp:408
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
bool hasLocalLinkage() const
LLVM_ABI GUID getGUID() const
Return a 64-bit global unique ID for this value.
Definition Globals.cpp:103
@ DefaultVisibility
The GV is visible.
Definition GlobalValue.h:68
bool hasSection() const
LLVM_ABI bool canBeOmittedFromSymbolTable() const
True if GV can be left out of the object symbol table.
Definition Globals.cpp:546
@ InternalLinkage
Rename collisions when linking (static functions).
Definition GlobalValue.h:60
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
LLVM_ABI MutableArrayRef< InstrProfValueData > getPromotionCandidatesForInstruction(const Instruction *I, uint64_t &TotalCount, uint32_t &NumCandidates, unsigned MaxNumValueData=0)
Returns reference to array of InstrProfValueData for the given instruction I.
Legacy wrapper pass to provide the ModuleSummaryIndex object.
ImmutableModuleSummaryIndexWrapperPass(const ModuleSummaryIndex *Index=nullptr)
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
ImmutablePass class - This class is used to provide information that does not need to be run.
Definition Pass.h:283
ImmutablePass(char &pid)
Definition Pass.h:285
Metadata node.
Definition Metadata.h:1081
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1437
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1443
Tracking metadata reference owned by Metadata.
Definition Metadata.h:902
This class implements a map that also provides access to all stored values in a deterministic order.
Definition MapVector.h:38
VectorType takeVector()
Clear the MapVector and return the underlying vector.
Definition MapVector.h:50
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
Definition Pass.h:253
ModulePass(char &pid)
Definition Pass.h:255
LLVM_ABI Result run(Module &M, ModuleAnalysisManager &AM)
Legacy wrapper pass to provide the ModuleSummaryIndex object.
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
bool doFinalization(Module &M) override
doFinalization - Virtual method overriden by subclasses to do any necessary clean up after all passes...
bool runOnModule(Module &M) override
runOnModule - Virtual method overriden by subclasses to process the module being operated on.
Class to hold module path string table and global value map, and encapsulate methods for operating on...
static LLVM_ABI void CollectAsmSymbols(const Module &M, function_ref< void(StringRef, object::BasicSymbolRef::Flags)> AsmSymbol)
Parse inline ASM and collect the symbols that are defined or referenced in the current module.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
An analysis pass based on the new PM to deliver ProfileSummaryInfo.
An analysis pass based on legacy pass manager to deliver ProfileSummaryInfo.
Analysis providing profile information.
LLVM_ABI bool isColdCount(uint64_t C) const
Returns true if count C is considered cold.
LLVM_ABI bool hasPartialSampleProfile() const
Returns true if module M has partial-profile sample profile.
LLVM_ABI bool isHotCount(uint64_t C) const
Returns true if count C is considered hot.
LLVM_ABI std::optional< uint64_t > getProfileCount(const CallBase &CallInst, BlockFrequencyInfo *BFI) const
Returns the profile count for CallInst.
A vector that has set insertion semantics.
Definition SetVector.h:57
bool remove(const value_type &X)
Remove an item from the set vector.
Definition SetVector.h:187
size_type size() const
Determine the number of elements in the SetVector.
Definition SetVector.h:103
void insert_range(Range &&R)
Definition SetVector.h:182
Vector takeVector()
Clear the SetVector and return the underlying vector.
Definition SetVector.h:94
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:157
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StackSafetyInfo wrapper for the new pass manager.
StackSafetyInfo wrapper for the legacy pass manager.
Interface to access stack safety analysis results for single function.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Used to lazily calculate structure layout information for a target machine, based on the DataLayout s...
Definition DataLayout.h:743
LLVM_ABI unsigned getElementContainingOffset(uint64_t FixedOffset) const
Given a valid byte offset into the structure, returns the structure index that contains it.
TypeSize getElementOffset(unsigned Idx) const
Definition DataLayout.h:774
Class to represent struct types.
ArrayRef< Type * > elements() const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
iterator_range< use_iterator > uses()
Definition Value.h:382
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:209
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
Definition DenseSet.h:187
Helper class to iterate through stack ids in both metadata (memprof MIB and callsite) and the corresp...
CallStackIterator beginAfterSharedPrefix(const CallStack &Other)
CallStackIterator end() const
A raw_ostream that writes to a file descriptor.
CallInst * Call
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
LocationClass< Ty > location(Ty &L)
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract_or_null(Y &&MD)
Extract a Value from Metadata, allowing null.
Definition Metadata.h:694
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract(Y &&MD)
Extract a Value from Metadata, if any.
Definition Metadata.h:707
LLVM_ABI bool metadataIncludesAllContextSizeInfo()
Whether the alloc memeprof metadata will include context size info for all MIBs.
LLVM_ABI AllocationType getMIBAllocType(const MDNode *MIB)
Returns the allocation type from an MIB metadata node.
LLVM_ABI MDNode * getMIBStackNode(const MDNode *MIB)
Returns the stack node from an MIB metadata node.
@ OF_Text
The file should be opened in text mode on platforms like z/OS that make this distinction.
Definition FileSystem.h:793
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition STLExtras.h:316
@ Offset
Definition DWP.cpp:577
cl::opt< bool > MemProfReportHintedSizes("memprof-report-hinted-sizes", cl::init(false), cl::Hidden, cl::desc("Report total allocation sizes of hinted allocations"))
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1755
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2570
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI bool mayHaveMemprofSummary(const CallBase *CB)
Returns true if the instruction could have memprof metadata, used to ensure consistency between summa...
LLVM_ABI bool IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV, APInt &Offset, const DataLayout &DL, DSOLocalEquivalent **DSOEquiv=nullptr)
If this constant is a constant offset from a global, return the global and the constant.
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:732
FunctionSummary::ForceSummaryHotnessType ForceSummaryEdgesCold
LLVM_ABI bool needsParamAccessSummary(const Module &M)
static cl::opt< std::string > ModuleSummaryDotFile("module-summary-dot-file", cl::Hidden, cl::value_desc("filename"), cl::desc("File to emit dot graph of new summary into"))
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
LLVM_ABI ModuleSummaryIndex buildModuleSummaryIndex(const Module &M, std::function< BlockFrequencyInfo *(const Function &F)> GetBFICallback, ProfileSummaryInfo *PSI, std::function< const StackSafetyInfo *(const Function &F)> GetSSICallback=[](const Function &F) -> const StackSafetyInfo *{ return nullptr;})
Direct function to compute a ModuleSummaryIndex from a given module.
cl::opt< unsigned > MaxNumVTableAnnotations("icp-max-num-vtables", cl::init(6), cl::Hidden, cl::desc("Max number of vtables annotated for a vtable load instruction."))
LLVM_ABI cl::opt< bool > ScalePartialSampleProfileWorkingSetSize
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1762
cl::opt< unsigned > MaxSummaryIndirectEdges("module-summary-max-indirect-edges", cl::init(0), cl::Hidden, cl::desc("Max number of summary edges added from " "indirect call profile metadata"))
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
LLVM_ABI void findDevirtualizableCallsForTypeCheckedLoad(SmallVectorImpl< DevirtCallSite > &DevirtCalls, SmallVectorImpl< Instruction * > &LoadedPtrs, SmallVectorImpl< Instruction * > &Preds, bool &HasNonCallUses, const CallInst *CI, DominatorTree &DT)
Given a call to the intrinsic @llvm.type.checked.load, find all devirtualizable call sites based on t...
LLVM_ABI SmallVector< InstrProfValueData, 4 > getValueProfDataFromInst(const Instruction &Inst, InstrProfValueKind ValueKind, uint32_t MaxNumValueData, uint64_t &TotalC, bool GetNoICPValue=false)
Extract the value profile data from Inst and returns them if Inst is annotated with value profile dat...
LLVM_ABI ModulePass * createModuleSummaryIndexWrapperPass()
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
DWARFExpression::Operation Op
LLVM_ABI ImmutablePass * createImmutableModuleSummaryIndexWrapperPass(const ModuleSummaryIndex *Index)
static cl::opt< FunctionSummary::ForceSummaryHotnessType, true > FSEC("force-summary-edges-cold", cl::Hidden, cl::location(ForceSummaryEdgesCold), cl::desc("Force all edges in the function summary to cold"), cl::values(clEnumValN(FunctionSummary::FSHT_None, "none", "None."), clEnumValN(FunctionSummary::FSHT_AllNonCritical, "all-non-critical", "All non-critical edges."), clEnumValN(FunctionSummary::FSHT_All, "all", "All edges.")))
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
static cl::opt< bool > EnableMemProfIndirectCallSupport("enable-memprof-indirect-call-support", cl::init(true), cl::Hidden, cl::desc("Enable MemProf support for summarizing and cloning indirect calls"))
LLVM_ABI void findDevirtualizableCallsForTypeTest(SmallVectorImpl< DevirtCallSite > &DevirtCalls, SmallVectorImpl< CallInst * > &Assumes, const CallInst *CI, DominatorTree &DT)
Given a call to the intrinsic @llvm.type.test, find all devirtualizable call sites based on the call ...
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
LLVM_ABI GlobalVariable * collectUsedGlobalVariables(const Module &M, SmallVectorImpl< GlobalValue * > &Vec, bool CompilerUsed)
Given "llvm.used" or "llvm.compiler.used" as a global name, collect the initializer elements of that ...
Definition Module.cpp:951
Summary of memprof metadata on allocations.
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
A call site that could be devirtualized.
A specification for a virtual function call with all constant integer arguments.
Flags specific to function summaries.
An "identifier" for a virtual function.
Group flags (Linkage, NotEligibleToImport, etc.) as a bitfield.
Summary of a single MIB in a memprof metadata on allocations.
Struct that holds a reference to a particular GUID in a global value summary.