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 "AnalysisOptions.h"
16#include "llvm/ADT/ArrayRef.h"
17#include "llvm/ADT/DenseSet.h"
18#include "llvm/ADT/MapVector.h"
19#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/SetVector.h"
23#include "llvm/ADT/StringRef.h"
33#include "llvm/IR/Attributes.h"
34#include "llvm/IR/BasicBlock.h"
35#include "llvm/IR/Constant.h"
36#include "llvm/IR/Constants.h"
37#include "llvm/IR/CycleInfo.h"
38#include "llvm/IR/Dominators.h"
39#include "llvm/IR/Function.h"
40#include "llvm/IR/GlobalAlias.h"
41#include "llvm/IR/GlobalValue.h"
45#include "llvm/IR/LLVMContext.h"
46#include "llvm/IR/Metadata.h"
47#include "llvm/IR/Module.h"
49#include "llvm/IR/Use.h"
50#include "llvm/IR/User.h"
54#include "llvm/Pass.h"
59#include <cassert>
60#include <cstdint>
61#include <vector>
62
63using namespace llvm;
64using namespace llvm::memprof;
65
66#define DEBUG_TYPE "module-summary-analysis"
67
69 return getAnalysisOptions(C).module_summary_max_indirect_edges;
70}
71
72// Walk through the operands of a given User via worklist iteration and populate
73// the set of GlobalValue references encountered. Invoked either on an
74// Instruction or a GlobalVariable (which walks its initializer).
75// Return true if any of the operands contains blockaddress. This is important
76// to know when computing summary for global var, because if global variable
77// references basic block address we can't import it separately from function
78// containing that basic block. For simplicity we currently don't import such
79// global vars at all. When importing function we aren't interested if any
80// instruction in it takes an address of any basic block, because instruction
81// can only take an address of basic block located in the same function.
82// Set `RefLocalLinkageIFunc` to true if the analyzed value references a
83// local-linkage ifunc.
84static bool
85findRefEdges(ModuleSummaryIndex &Index, const User *CurUser,
88 bool &RefLocalLinkageIFunc) {
89 bool HasBlockAddress = false;
91 if (Visited.insert(CurUser).second)
92 Worklist.push_back(CurUser);
93
94 while (!Worklist.empty()) {
95 const User *U = Worklist.pop_back_val();
96 const auto *CB = dyn_cast<CallBase>(U);
97
98 for (const auto &OI : U->operands()) {
99 const User *Operand = dyn_cast<User>(OI);
100 if (!Operand)
101 continue;
102 if (isa<BlockAddress>(Operand)) {
103 HasBlockAddress = true;
104 continue;
105 }
106 if (auto *GV = dyn_cast<GlobalValue>(Operand)) {
107 // We have a reference to a global value. This should be added to
108 // the reference set unless it is a callee. Callees are handled
109 // specially by WriteFunction and are added to a separate list.
110 if (!(CB && CB->isCallee(&OI))) {
111 // If an ifunc has local linkage, do not add it into ref edges, and
112 // sets `RefLocalLinkageIFunc` to true. The referencer is not eligible
113 // for import. An ifunc doesn't have summary and ThinLTO cannot
114 // promote it; importing the referencer may cause linkage errors.
115 if (auto *GI = dyn_cast_if_present<GlobalIFunc>(GV);
116 GI && GI->hasLocalLinkage()) {
117 RefLocalLinkageIFunc = true;
118 continue;
119 }
120 RefEdges.insert(Index.getOrInsertValueInfo(GV));
121 }
122 continue;
123 }
124 if (Visited.insert(Operand).second)
125 Worklist.push_back(Operand);
126 }
127 }
128
129 const Instruction *I = dyn_cast<Instruction>(CurUser);
130 if (I) {
131 uint64_t TotalCount = 0;
132 // MaxNumVTableAnnotations is the maximum number of vtables annotated on
133 // the instruction.
134 auto ValueDataArray = getValueProfDataFromInst(
135 *I, IPVK_VTableTarget, getMaxNumVTableAnnotations(I->getContext()),
136 TotalCount);
137
138 for (const auto &V : ValueDataArray)
139 RefEdges.insert(Index.getOrInsertValueInfo(/* VTableGUID = */
140 V.Value));
141 }
142 return HasBlockAddress;
143}
144
145/// Collect globals referenced via !implicit.ref metadata on a function
146/// and add them as reference edges in the module summary. This ensures
147/// ThinLTO liveness analysis treats them as live when the function is
148/// live, and imports them alongside the function during cross-module
149/// importing.
151 ModuleSummaryIndex &Index, const Function &F,
153 if (!F.hasMetadata(LLVMContext::MD_implicit_ref))
154 return;
156 F.getMetadata(LLVMContext::MD_implicit_ref, MDs);
157 for (MDNode *MD : MDs) {
158 for (const MDOperand &Op : MD->operands()) {
159 if (auto *VAM = dyn_cast_or_null<ValueAsMetadata>(Op.get()))
160 if (auto *GV = dyn_cast<GlobalValue>(VAM->getValue()))
161 RefEdges.insert(Index.getOrInsertValueInfo(GV));
162 }
163 }
164}
165
167 ProfileSummaryInfo *PSI) {
168 if (!PSI)
170 if (PSI->isHotCount(ProfileCount))
172 if (PSI->isColdCount(ProfileCount))
175}
176
177static bool isNonRenamableLocal(const GlobalValue &GV) {
178 return GV.hasSection() && GV.hasLocalLinkage();
179}
180
181/// Determine whether this call has all constant integer arguments (excluding
182/// "this") and summarize it to VCalls or ConstVCalls as appropriate.
183static void addVCallToSet(
185 SetVector<FunctionSummary::VFuncId, std::vector<FunctionSummary::VFuncId>>
186 &VCalls,
188 std::vector<FunctionSummary::ConstVCall>> &ConstVCalls) {
189 std::vector<uint64_t> Args;
190 // Start from the second argument to skip the "this" pointer.
191 for (auto &Arg : drop_begin(Call.CB.args())) {
192 auto *CI = dyn_cast<ConstantInt>(Arg);
193 if (!CI || CI->getBitWidth() > 64) {
194 VCalls.insert({Guid, Call.Offset});
195 return;
196 }
197 Args.push_back(CI->getZExtValue());
198 }
199 ConstVCalls.insert({{Guid, Call.Offset}, std::move(Args)});
200}
201
202/// If this intrinsic call requires that we add information to the function
203/// summary, do so via the non-constant reference arguments.
205 const CallInst *CI,
206 SetVector<GlobalValue::GUID, std::vector<GlobalValue::GUID>> &TypeTests,
207 SetVector<FunctionSummary::VFuncId, std::vector<FunctionSummary::VFuncId>>
208 &TypeTestAssumeVCalls,
209 SetVector<FunctionSummary::VFuncId, std::vector<FunctionSummary::VFuncId>>
210 &TypeCheckedLoadVCalls,
212 std::vector<FunctionSummary::ConstVCall>>
213 &TypeTestAssumeConstVCalls,
215 std::vector<FunctionSummary::ConstVCall>>
216 &TypeCheckedLoadConstVCalls,
217 DominatorTree &DT) {
218 switch (CI->getCalledFunction()->getIntrinsicID()) {
219 case Intrinsic::type_test:
220 case Intrinsic::public_type_test: {
221 auto *TypeMDVal = cast<MetadataAsValue>(CI->getArgOperand(1));
222 auto *TypeId = dyn_cast<MDString>(TypeMDVal->getMetadata());
223 if (!TypeId)
224 break;
227
228 // Produce a summary from type.test intrinsics. We only summarize type.test
229 // intrinsics that are used other than by an llvm.assume intrinsic.
230 // Intrinsics that are assumed are relevant only to the devirtualization
231 // pass, not the type test lowering pass.
232 bool HasNonAssumeUses = llvm::any_of(CI->uses(), [](const Use &CIU) {
233 return !isa<AssumeInst>(CIU.getUser());
234 });
235 if (HasNonAssumeUses)
236 TypeTests.insert(Guid);
237
240 findDevirtualizableCallsForTypeTest(DevirtCalls, Assumes, CI, DT);
241 for (auto &Call : DevirtCalls)
242 addVCallToSet(Call, Guid, TypeTestAssumeVCalls,
243 TypeTestAssumeConstVCalls);
244
245 break;
246 }
247
248 case Intrinsic::type_checked_load_relative:
249 case Intrinsic::type_checked_load: {
250 auto *TypeMDVal = cast<MetadataAsValue>(CI->getArgOperand(2));
251 auto *TypeId = dyn_cast<MDString>(TypeMDVal->getMetadata());
252 if (!TypeId)
253 break;
256
260 bool HasNonCallUses = false;
261 findDevirtualizableCallsForTypeCheckedLoad(DevirtCalls, LoadedPtrs, Preds,
262 HasNonCallUses, CI, DT);
263 // Any non-call uses of the result of llvm.type.checked.load will
264 // prevent us from optimizing away the llvm.type.test.
265 if (HasNonCallUses)
266 TypeTests.insert(Guid);
267 for (auto &Call : DevirtCalls)
268 addVCallToSet(Call, Guid, TypeCheckedLoadVCalls,
269 TypeCheckedLoadConstVCalls);
270
271 break;
272 }
273 default:
274 break;
275 }
276}
277
278static bool isNonVolatileLoad(const Instruction *I) {
279 if (const auto *LI = dyn_cast<LoadInst>(I))
280 return !LI->isVolatile();
281
282 return false;
283}
284
285static bool isNonVolatileStore(const Instruction *I) {
286 if (const auto *SI = dyn_cast<StoreInst>(I))
287 return !SI->isVolatile();
288
289 return false;
290}
291
292// Returns true if the function definition must be unreachable.
293//
294// Note if this helper function returns true, `F` is guaranteed
295// to be unreachable; if it returns false, `F` might still
296// be unreachable but not covered by this helper function.
298 // A function must be unreachable if its entry block ends with an
299 // 'unreachable'.
300 assert(!F.isDeclaration());
301 return isa<UnreachableInst>(F.getEntryBlock().getTerminator());
302}
303
305 const AnalysisOptions &Opts, ModuleSummaryIndex &Index, const Module &M,
307 DominatorTree &DT, bool HasLocalsInUsedOrAsm,
308 DenseSet<GlobalValue::GUID> &CantBePromoted, bool IsThinLTO,
309 std::function<const StackSafetyInfo *(const Function &F)> GetSSICallback) {
310 // Summary not currently supported for anonymous functions, they should
311 // have been named.
312 assert(F.hasName());
313
314 unsigned NumInsts = 0;
315 // Map from callee ValueId to profile count. Used to accumulate profile
316 // counts for all static calls to a given callee.
319 CallGraphEdges;
321 StoreRefEdges;
324 TypeTestAssumeVCalls, TypeCheckedLoadVCalls;
326 std::vector<FunctionSummary::ConstVCall>>
327 TypeTestAssumeConstVCalls, TypeCheckedLoadConstVCalls;
328 ICallPromotionAnalysis ICallAnalysis;
330
331 // Add personality function, prefix data and prologue data to function's ref
332 // list.
333 bool HasLocalIFuncCallOrRef = false;
334 findRefEdges(Index, &F, RefEdges, Visited, HasLocalIFuncCallOrRef);
335 findImplicitRefEdges(Index, F, RefEdges);
336
337 std::vector<const Instruction *> NonVolatileLoads;
338 std::vector<const Instruction *> NonVolatileStores;
339
340 std::vector<CallsiteInfo> Callsites;
341 std::vector<AllocInfo> Allocs;
342
343#ifndef NDEBUG
344 DenseSet<const CallBase *> CallsThatMayHaveMemprofSummary;
345#endif
346
347 bool HasInlineAsmMaybeReferencingInternal = false;
348 bool HasIndirBranchToBlockAddress = false;
349 bool HasUnknownCall = false;
350 bool MayThrow = false;
351 for (const BasicBlock &BB : F) {
352 // We don't allow inlining of function with indirect branch to blockaddress.
353 // If the blockaddress escapes the function, e.g., via a global variable,
354 // inlining may lead to an invalid cross-function reference. So we shouldn't
355 // import such function either.
356 if (BB.hasAddressTaken()) {
357 for (User *U : BlockAddress::get(const_cast<BasicBlock *>(&BB))->users())
358 if (!isa<CallBrInst>(*U)) {
359 HasIndirBranchToBlockAddress = true;
360 break;
361 }
362 }
363
364 for (const Instruction &I : BB) {
366 continue;
367 ++NumInsts;
368
369 // Regular LTO module doesn't participate in ThinLTO import,
370 // so no reference from it can be read/writeonly, since this
371 // would require importing variable as local copy
372 if (IsThinLTO) {
373 if (isNonVolatileLoad(&I)) {
374 // Postpone processing of non-volatile load instructions
375 // See comments below
376 Visited.insert(&I);
377 NonVolatileLoads.push_back(&I);
378 continue;
379 } else if (isNonVolatileStore(&I)) {
380 Visited.insert(&I);
381 NonVolatileStores.push_back(&I);
382 // All references from second operand of store (destination address)
383 // can be considered write-only if they're not referenced by any
384 // non-store instruction. References from first operand of store
385 // (stored value) can't be treated either as read- or as write-only
386 // so we add them to RefEdges as we do with all other instructions
387 // except non-volatile load.
388 Value *Stored = I.getOperand(0);
389 if (auto *GV = dyn_cast<GlobalValue>(Stored))
390 // findRefEdges will try to examine GV operands, so instead
391 // of calling it we should add GV to RefEdges directly.
392 RefEdges.insert(Index.getOrInsertValueInfo(GV));
393 else if (auto *U = dyn_cast<User>(Stored))
394 findRefEdges(Index, U, RefEdges, Visited, HasLocalIFuncCallOrRef);
395 continue;
396 }
397 }
398 findRefEdges(Index, &I, RefEdges, Visited, HasLocalIFuncCallOrRef);
399 const auto *CB = dyn_cast<CallBase>(&I);
400 if (!CB) {
401 if (I.mayThrow())
402 MayThrow = true;
403 continue;
404 }
405
406 const auto *CI = dyn_cast<CallInst>(&I);
407 // Since we don't know exactly which local values are referenced in inline
408 // assembly, conservatively mark the function as possibly referencing
409 // a local value from inline assembly to ensure we don't export a
410 // reference (which would require renaming and promotion of the
411 // referenced value).
412 if (HasLocalsInUsedOrAsm && CI && CI->isInlineAsm())
413 HasInlineAsmMaybeReferencingInternal = true;
414
415 // Compute this once per indirect call.
416 uint32_t NumCandidates = 0;
417 uint64_t TotalCount = 0;
418 MutableArrayRef<InstrProfValueData> CandidateProfileData;
419
420 auto *CalledValue = CB->getCalledOperand();
421 auto *CalledFunction = CB->getCalledFunction();
422 if (CalledValue && !CalledFunction) {
423 CalledValue = CalledValue->stripPointerCasts();
424 // Stripping pointer casts can reveal a called function.
425 CalledFunction = dyn_cast<Function>(CalledValue);
426 }
427 // Check if this is an alias to a function. If so, get the
428 // called aliasee for the checks below.
429 if (auto *GA = dyn_cast<GlobalAlias>(CalledValue)) {
430 assert(!CalledFunction && "Expected null called function in callsite for alias");
431 CalledFunction = dyn_cast<Function>(GA->getAliaseeObject());
432 }
433 // Check if this is a direct call to a known function or a known
434 // intrinsic, or an indirect call with profile data.
435 if (CalledFunction) {
436 if (CI && CalledFunction->isIntrinsic()) {
438 CI, TypeTests, TypeTestAssumeVCalls, TypeCheckedLoadVCalls,
439 TypeTestAssumeConstVCalls, TypeCheckedLoadConstVCalls, DT);
440 continue;
441 }
442 // We should have named any anonymous globals
443 assert(CalledFunction->hasName());
444 auto ScaledCount = PSI->getProfileCount(*CB, BFI);
445 auto Hotness = ScaledCount ? getHotness(*ScaledCount, PSI)
447 if (Opts.force_summary_edges_cold != ForceSummaryHotness::None)
449
450 // Use the original CalledValue, in case it was an alias. We want
451 // to record the call edge to the alias in that case. Eventually
452 // an alias summary will be created to associate the alias and
453 // aliasee.
454 auto &ValueInfo = CallGraphEdges[Index.getOrInsertValueInfo(
455 cast<GlobalValue>(CalledValue))];
456 ValueInfo.updateHotness(Hotness);
457 if (CB->isTailCall())
458 ValueInfo.setHasTailCall(true);
459 } else {
460 HasUnknownCall = true;
461 // If F is imported, a local linkage ifunc (e.g. target_clones on a
462 // static function) called by F will be cloned. Since summaries don't
463 // track ifunc, we do not know implementation functions referenced by
464 // the ifunc resolver need to be promoted in the exporter, and we will
465 // get linker errors due to cloned declarations for implementation
466 // functions. As a simple fix, just mark F as not eligible for import.
467 // Non-local ifunc is not cloned and does not have the issue.
468 if (auto *GI = dyn_cast_if_present<GlobalIFunc>(CalledValue))
469 if (GI->hasLocalLinkage())
470 HasLocalIFuncCallOrRef = true;
471 // Skip inline assembly calls.
472 if (CI && CI->isInlineAsm())
473 continue;
474 // Skip direct calls.
475 if (!CalledValue || isa<Constant>(CalledValue))
476 continue;
477
478 // Check if the instruction has a callees metadata. If so, add callees
479 // to CallGraphEdges to reflect the references from the metadata, and
480 // to enable importing for subsequent indirect call promotion and
481 // inlining.
482 if (auto *MD = I.getMetadata(LLVMContext::MD_callees)) {
483 for (const auto &Op : MD->operands()) {
485 if (Callee)
486 CallGraphEdges[Index.getOrInsertValueInfo(Callee)]
487 .setHasIndirectCall(true);
488 }
489 }
490
491 CandidateProfileData =
493 &I, TotalCount, NumCandidates,
494 Opts.module_summary_max_indirect_edges);
495 for (const auto &Candidate : CandidateProfileData) {
496 auto &Edge =
497 CallGraphEdges[Index.getOrInsertValueInfo(Candidate.Value)];
498 Edge.updateHotness(getHotness(Candidate.Count, PSI));
499 Edge.setHasIndirectCall(true);
500 // Record that the profiled target was reached via a tail call, so
501 // that MemProf context disambiguation can identify frames missing
502 // from profiled contexts due to indirect tail calls (see
503 // findProfiledCalleeThroughTailCalls).
504 if (CB->isTailCall())
505 Edge.setHasTailCall(true);
506 }
507 }
508
509 // Summarize memprof related metadata. This is only needed for ThinLTO.
510 if (!IsThinLTO)
511 continue;
512
513 // Skip indirect calls if we haven't enabled memprof ICP.
514 if (!CalledFunction && !Opts.enable_memprof_indirect_call_support)
515 continue;
516
517 // Ensure we keep this analysis in sync with the handling in the ThinLTO
518 // backend (see MemProfContextDisambiguation::applyImport). Save this call
519 // so that we can skip it in checking the reverse case later.
521#ifndef NDEBUG
522 CallsThatMayHaveMemprofSummary.insert(CB);
523#endif
524
525 // Compute the list of stack ids first (so we can trim them from the stack
526 // ids on any MIBs).
528 I.getMetadata(LLVMContext::MD_callsite));
529 auto *MemProfMD = I.getMetadata(LLVMContext::MD_memprof);
530 if (MemProfMD) {
531 std::vector<MIBInfo> MIBs;
532 std::vector<std::vector<ContextTotalSize>> ContextSizeInfos;
533 bool HasNonZeroContextSizeInfos = false;
534 for (auto &MDOp : MemProfMD->operands()) {
535 auto *MIBMD = cast<const MDNode>(MDOp);
538 SmallVector<unsigned> StackIdIndices;
540 // Collapse out any on the allocation call (inlining).
541 for (auto ContextIter =
542 StackContext.beginAfterSharedPrefix(InstCallsite);
543 ContextIter != StackContext.end(); ++ContextIter) {
544 unsigned StackIdIdx = Index.addOrGetStackIdIndex(*ContextIter);
545 // If this is a direct recursion, simply skip the duplicate
546 // entries. If this is mutual recursion, handling is left to
547 // the LTO link analysis client.
548 if (StackIdIndices.empty() || StackIdIndices.back() != StackIdIdx)
549 StackIdIndices.push_back(StackIdIdx);
550 }
551 // If we have context size information, collect it for inclusion in
552 // the summary.
553 assert(MIBMD->getNumOperands() > 2 ||
555 if (MIBMD->getNumOperands() > 2) {
556 std::vector<ContextTotalSize> ContextSizes;
557 for (unsigned I = 2; I < MIBMD->getNumOperands(); I++) {
558 MDNode *ContextSizePair = dyn_cast<MDNode>(MIBMD->getOperand(I));
559 assert(ContextSizePair->getNumOperands() == 2);
561 ContextSizePair->getOperand(0))
562 ->getZExtValue();
564 ContextSizePair->getOperand(1))
565 ->getZExtValue();
566 ContextSizes.push_back({FullStackId, TS});
567 }
568 // Flag that we need to keep the ContextSizeInfos array for this
569 // alloc as it now contains non-zero context info sizes.
570 HasNonZeroContextSizeInfos = true;
571 ContextSizeInfos.push_back(std::move(ContextSizes));
572 } else {
573 // The ContextSizeInfos must be in the same relative position as the
574 // associated MIB. In some cases we only include a ContextSizeInfo
575 // for a subset of MIBs in an allocation. To handle that, eagerly
576 // fill any MIB entries that don't have context size info metadata
577 // with a pair of 0s. Later on we will only use this array if it
578 // ends up containing any non-zero entries (see where we set
579 // HasNonZeroContextSizeInfos above).
580 ContextSizeInfos.push_back({{0, 0}});
581 }
582 MIBs.push_back(
583 MIBInfo(getMIBAllocType(MIBMD), std::move(StackIdIndices)));
584 }
585 Allocs.push_back(AllocInfo(std::move(MIBs)));
586 assert(HasNonZeroContextSizeInfos ||
588 // We eagerly build the ContextSizeInfos array, but it will be filled
589 // with sub arrays of pairs of 0s if no MIBs on this alloc actually
590 // contained context size info metadata. Only save it if any MIBs had
591 // any such metadata.
592 if (HasNonZeroContextSizeInfos) {
593 assert(Allocs.back().MIBs.size() == ContextSizeInfos.size());
594 Allocs.back().ContextSizeInfos = std::move(ContextSizeInfos);
595 }
596 } else if (!InstCallsite.empty()) {
597 SmallVector<unsigned> StackIdIndices;
598 for (auto StackId : InstCallsite)
599 StackIdIndices.push_back(Index.addOrGetStackIdIndex(StackId));
600 if (CalledFunction) {
601 // Use the original CalledValue, in case it was an alias. We want
602 // to record the call edge to the alias in that case. Eventually
603 // an alias summary will be created to associate the alias and
604 // aliasee.
605 auto CalleeValueInfo =
606 Index.getOrInsertValueInfo(cast<GlobalValue>(CalledValue));
607 Callsites.push_back({CalleeValueInfo, StackIdIndices});
608 } else {
609 assert(Opts.enable_memprof_indirect_call_support);
610 // For indirect callsites, create multiple Callsites, one per target.
611 // This enables having a different set of clone versions per target,
612 // and we will apply the cloning decisions while speculatively
613 // devirtualizing in the ThinLTO backends.
614 for (const auto &Candidate : CandidateProfileData) {
615 auto CalleeValueInfo = Index.getOrInsertValueInfo(Candidate.Value);
616 Callsites.push_back({CalleeValueInfo, StackIdIndices});
617 }
618 }
619 }
620 }
621 }
622
623 if (PSI->hasPartialSampleProfile() &&
624 Opts.scale_partial_sample_profile_working_set_size)
625 Index.addBlockCount(F.size());
626
628 if (IsThinLTO) {
629 auto AddRefEdges =
630 [&](const std::vector<const Instruction *> &Instrs,
633 for (const auto *I : Instrs) {
634 Cache.erase(I);
635 findRefEdges(Index, I, Edges, Cache, HasLocalIFuncCallOrRef);
636 }
637 };
638
639 // By now we processed all instructions in a function, except
640 // non-volatile loads and non-volatile value stores. Let's find
641 // ref edges for both of instruction sets
642 AddRefEdges(NonVolatileLoads, LoadRefEdges, Visited);
643 // We can add some values to the Visited set when processing load
644 // instructions which are also used by stores in NonVolatileStores.
645 // For example this can happen if we have following code:
646 //
647 // store %Derived* @foo, %Derived** bitcast (%Base** @bar to %Derived**)
648 // %42 = load %Derived*, %Derived** bitcast (%Base** @bar to %Derived**)
649 //
650 // After processing loads we'll add bitcast to the Visited set, and if
651 // we use the same set while processing stores, we'll never see store
652 // to @bar and @bar will be mistakenly treated as readonly.
654 AddRefEdges(NonVolatileStores, StoreRefEdges, StoreCache);
655
656 // If both load and store instruction reference the same variable
657 // we won't be able to optimize it. Add all such reference edges
658 // to RefEdges set.
659 for (const auto &VI : StoreRefEdges)
660 if (LoadRefEdges.remove(VI))
661 RefEdges.insert(VI);
662
663 unsigned RefCnt = RefEdges.size();
664 // All new reference edges inserted in two loops below are either
665 // read or write only. They will be grouped in the end of RefEdges
666 // vector, so we can use a single integer value to identify them.
667 RefEdges.insert_range(LoadRefEdges);
668
669 unsigned FirstWORef = RefEdges.size();
670 RefEdges.insert_range(StoreRefEdges);
671
672 Refs = RefEdges.takeVector();
673 for (; RefCnt < FirstWORef; ++RefCnt)
674 Refs[RefCnt].setReadOnly();
675
676 for (; RefCnt < Refs.size(); ++RefCnt)
677 Refs[RefCnt].setWriteOnly();
678 } else {
679 Refs = RefEdges.takeVector();
680 }
681 // Explicit add hot edges to enforce importing for designated GUIDs for
682 // sample PGO, to enable the same inlines as the profiled optimized binary.
683 for (auto &I : F.getImportGUIDs())
684 CallGraphEdges[Index.getOrInsertValueInfo(I)].updateHotness(
685 Opts.force_summary_edges_cold == ForceSummaryHotness::All
688
689#ifndef NDEBUG
690 // Make sure that all calls we decided could not have memprof summaries get a
691 // false value for mayHaveMemprofSummary, to ensure that this handling remains
692 // in sync with the ThinLTO backend handling.
693 if (IsThinLTO) {
694 for (const BasicBlock &BB : F) {
695 for (const Instruction &I : BB) {
696 const auto *CB = dyn_cast<CallBase>(&I);
697 if (!CB)
698 continue;
699 // We already checked these above.
700 if (CallsThatMayHaveMemprofSummary.count(CB))
701 continue;
703 }
704 }
705 }
706#endif
707
708 bool NonRenamableLocal = isNonRenamableLocal(F);
709 bool NotEligibleForImport =
710 NonRenamableLocal || HasInlineAsmMaybeReferencingInternal ||
711 HasIndirBranchToBlockAddress || HasLocalIFuncCallOrRef;
713 F.getLinkage(), F.getVisibility(), NotEligibleForImport,
714 /* Live = */ false, F.isDSOLocal(), F.canBeOmittedFromSymbolTable(),
716 /* NoRenameOnPromotion = */ false);
718 F.doesNotAccessMemory(), F.onlyReadsMemory() && !F.doesNotAccessMemory(),
719 F.hasFnAttribute(Attribute::NoRecurse), F.returnDoesNotAlias(),
720 // FIXME: refactor this to use the same code that inliner is using.
721 // Don't try to import functions with noinline attribute.
722 F.getAttributes().hasFnAttr(Attribute::NoInline),
723 F.hasFnAttribute(Attribute::AlwaysInline),
724 F.hasFnAttribute(Attribute::NoUnwind), MayThrow, HasUnknownCall,
726 std::vector<FunctionSummary::ParamAccess> ParamAccesses;
727 if (auto *SSI = GetSSICallback(F))
728 ParamAccesses = SSI->getParamAccesses(Index);
729 auto FuncSummary = std::make_unique<FunctionSummary>(
730 Flags, NumInsts, FunFlags, std::move(Refs), CallGraphEdges.takeVector(),
731 TypeTests.takeVector(), TypeTestAssumeVCalls.takeVector(),
732 TypeCheckedLoadVCalls.takeVector(),
733 TypeTestAssumeConstVCalls.takeVector(),
734 TypeCheckedLoadConstVCalls.takeVector(), std::move(ParamAccesses),
735 std::move(Callsites), std::move(Allocs));
736 if (NonRenamableLocal)
737 CantBePromoted.insert(F.getGUID());
738 Index.addGlobalValueSummary(F, std::move(FuncSummary));
739}
740
741/// Find function pointers referenced within the given vtable initializer
742/// (or subset of an initializer) \p I. The starting offset of \p I within
743/// the vtable initializer is \p StartingOffset. Any discovered function
744/// pointers are added to \p VTableFuncs along with their cumulative offset
745/// within the initializer.
746static void findFuncPointers(const Constant *I, uint64_t StartingOffset,
747 const Module &M, ModuleSummaryIndex &Index,
748 VTableFuncList &VTableFuncs,
749 const GlobalVariable &OrigGV) {
750 // First check if this is a function pointer.
751 if (I->getType()->isPointerTy()) {
752 auto C = I->stripPointerCasts();
753 auto A = dyn_cast<GlobalAlias>(C);
754 if (isa<Function>(C) || (A && isa<Function>(A->getAliasee()))) {
755 auto GV = dyn_cast<GlobalValue>(C);
756 assert(GV);
757 // We can disregard __cxa_pure_virtual as a possible call target, as
758 // calls to pure virtuals are UB.
759 if (GV && GV->getName() != "__cxa_pure_virtual")
760 VTableFuncs.push_back({Index.getOrInsertValueInfo(GV), StartingOffset});
761 return;
762 }
763 }
764
765 // Walk through the elements in the constant struct or array and recursively
766 // look for virtual function pointers.
767 const DataLayout &DL = M.getDataLayout();
768 if (auto *C = dyn_cast<ConstantStruct>(I)) {
769 StructType *STy = C->getType();
770 assert(STy);
771 const StructLayout *SL = DL.getStructLayout(C->getType());
772
773 for (auto EI : llvm::enumerate(STy->elements())) {
774 auto Offset = SL->getElementOffset(EI.index());
775 unsigned Op = SL->getElementContainingOffset(Offset);
776 findFuncPointers(cast<Constant>(I->getOperand(Op)),
777 StartingOffset + Offset, M, Index, VTableFuncs, OrigGV);
778 }
779 } else if (auto *C = dyn_cast<ConstantArray>(I)) {
780 ArrayType *ATy = C->getType();
781 Type *EltTy = ATy->getElementType();
782 uint64_t EltSize = DL.getTypeAllocSize(EltTy);
783 for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) {
784 findFuncPointers(cast<Constant>(I->getOperand(i)),
785 StartingOffset + i * EltSize, M, Index, VTableFuncs,
786 OrigGV);
787 }
788 } else if (const auto *CE = dyn_cast<ConstantExpr>(I)) {
789 // For relative vtables, the next sub-component should be a trunc.
790 if (CE->getOpcode() != Instruction::Trunc ||
791 !(CE = dyn_cast<ConstantExpr>(CE->getOperand(0))))
792 return;
793
794 // If this constant can be reduced to the offset between a function and a
795 // global, then we know this is a valid virtual function if the RHS is the
796 // original vtable we're scanning through.
797 if (CE->getOpcode() == Instruction::Sub) {
799 APSInt LHSOffset, RHSOffset;
800 if (IsConstantOffsetFromGlobal(CE->getOperand(0), LHS, LHSOffset, DL) &&
801 IsConstantOffsetFromGlobal(CE->getOperand(1), RHS, RHSOffset, DL) &&
802 RHS == &OrigGV &&
803
804 // For relative vtables, this component should point to the callable
805 // function without any offsets.
806 LHSOffset == 0 &&
807
808 // Also, the RHS should always point to somewhere within the vtable.
809 RHSOffset <=
810 static_cast<uint64_t>(DL.getTypeAllocSize(OrigGV.getInitializer()->getType()))) {
811 findFuncPointers(LHS, StartingOffset, M, Index, VTableFuncs, OrigGV);
812 }
813 }
814 }
815}
816
817// Identify the function pointers referenced by vtable definition \p V.
819 const GlobalVariable &V, const Module &M,
820 VTableFuncList &VTableFuncs) {
821 if (!V.isConstant())
822 return;
823
824 findFuncPointers(V.getInitializer(), /*StartingOffset=*/0, M, Index,
825 VTableFuncs, V);
826
827#ifndef NDEBUG
828 // Validate that the VTableFuncs list is ordered by offset.
829 uint64_t PrevOffset = 0;
830 for (auto &P : VTableFuncs) {
831 // The findVFuncPointers traversal should have encountered the
832 // functions in offset order. We need to use ">=" since PrevOffset
833 // starts at 0.
834 assert(P.VTableOffset >= PrevOffset);
835 PrevOffset = P.VTableOffset;
836 }
837#endif
838}
839
840/// Record vtable definition \p V for each type metadata it references.
841static void
843 const GlobalVariable &V,
845 for (MDNode *Type : Types) {
846 auto TypeID = Type->getOperand(1).get();
847
850 cast<ConstantAsMetadata>(Type->getOperand(0))->getValue())
851 ->getZExtValue();
852
853 if (auto *TypeId = dyn_cast<MDString>(TypeID))
854 Index.getOrInsertTypeIdCompatibleVtableSummary(TypeId->getString())
855 .push_back({Offset, Index.getOrInsertValueInfo(&V)});
856 }
857}
858
860 const GlobalVariable &V,
861 DenseSet<GlobalValue::GUID> &CantBePromoted,
862 const Module &M,
866 bool RefLocalIFunc = false;
867 bool HasBlockAddress =
868 findRefEdges(Index, &V, RefEdges, Visited, RefLocalIFunc);
869 const bool NotEligibleForImport = (HasBlockAddress || RefLocalIFunc);
870 bool NonRenamableLocal = isNonRenamableLocal(V);
872 V.getLinkage(), V.getVisibility(), NonRenamableLocal,
873 /* Live = */ false, V.isDSOLocal(), V.canBeOmittedFromSymbolTable(),
874 GlobalValueSummary::Definition, /* NoRenameOnPromotion = */ false);
875
876 VTableFuncList VTableFuncs;
877 // If splitting is not enabled, then we compute the summary information
878 // necessary for index-based whole program devirtualization.
879 if (!Index.enableSplitLTOUnit()) {
880 Types.clear();
881 V.getMetadata(LLVMContext::MD_type, Types);
882 if (!Types.empty()) {
883 // Identify the function pointers referenced by this vtable definition.
884 computeVTableFuncs(Index, V, M, VTableFuncs);
885
886 // Record this vtable definition for each type metadata it references.
888 }
889 }
890
891 // Don't mark variables we won't be able to internalize as read/write-only.
892 bool CanBeInternalized =
893 !V.hasComdat() && !V.hasAppendingLinkage() && !V.isInterposable() &&
894 !V.hasAvailableExternallyLinkage() && !V.hasDLLExportStorageClass();
895 bool Constant = V.isConstant();
896 GlobalVarSummary::GVarFlags VarFlags(CanBeInternalized,
897 Constant ? false : CanBeInternalized,
898 Constant, V.getVCallVisibility());
899 auto GVarSummary = std::make_unique<GlobalVarSummary>(Flags, VarFlags,
900 RefEdges.takeVector());
901 if (NonRenamableLocal)
902 CantBePromoted.insert(V.getGUID());
903 if (NotEligibleForImport)
904 GVarSummary->setNotEligibleToImport();
905 if (!VTableFuncs.empty())
906 GVarSummary->setVTableFuncs(VTableFuncs);
907 Index.addGlobalValueSummary(V, std::move(GVarSummary));
908}
909
911 DenseSet<GlobalValue::GUID> &CantBePromoted) {
912 // Skip summary for indirect function aliases as summary for aliasee will not
913 // be emitted.
914 const GlobalObject *Aliasee = A.getAliaseeObject();
915 if (isa<GlobalIFunc>(Aliasee))
916 return;
917 bool NonRenamableLocal = isNonRenamableLocal(A);
919 A.getLinkage(), A.getVisibility(), NonRenamableLocal,
920 /* Live = */ false, A.isDSOLocal(), A.canBeOmittedFromSymbolTable(),
921 GlobalValueSummary::Definition, /* NoRenameOnPromotion = */ false);
922 auto AS = std::make_unique<AliasSummary>(Flags);
923 auto AliaseeVI = Index.getValueInfo(Aliasee->getGUID());
924 assert(AliaseeVI && "Alias expects aliasee summary to be available");
925 assert(AliaseeVI.getSummaryList().size() == 1 &&
926 "Expected a single entry per aliasee in per-module index");
927 AS->setAliasee(AliaseeVI, AliaseeVI.getSummaryList()[0].get());
928 if (NonRenamableLocal)
929 CantBePromoted.insert(A.getGUID());
930 Index.addGlobalValueSummary(A, std::move(AS));
931}
932
933// Set LiveRoot flag on entries matching the given value name.
934static void setLiveRoot(ModuleSummaryIndex &Index, StringRef Name) {
935 if (ValueInfo VI =
936 Index.getValueInfo(GlobalValue::getGUIDAssumingExternalLinkage(Name)))
937 for (const auto &Summary : VI.getSummaryList())
938 Summary->setLive(true);
939}
940
942 const Module &M,
943 std::function<BlockFrequencyInfo *(const Function &F)> GetBFICallback,
945 std::function<const StackSafetyInfo *(const Function &F)> GetSSICallback) {
946 assert(PSI);
947 const AnalysisOptions &Opts = getAnalysisOptions(M);
948 bool EnableSplitLTOUnit = false;
949 bool UnifiedLTO = false;
951 M.getModuleFlag("EnableSplitLTOUnit")))
952 EnableSplitLTOUnit = MD->getZExtValue();
953 if (auto *MD =
954 mdconst::extract_or_null<ConstantInt>(M.getModuleFlag("UnifiedLTO")))
955 UnifiedLTO = MD->getZExtValue();
956 ModuleSummaryIndex Index(/*HaveGVs=*/true, EnableSplitLTOUnit, UnifiedLTO);
957
958 // Identify the local values in the llvm.used and llvm.compiler.used sets,
959 // which should not be exported as they would then require renaming and
960 // promotion, but we may have opaque uses e.g. in inline asm. We collect them
961 // here because we use this information to mark functions containing inline
962 // assembly calls as not importable.
965 // First collect those in the llvm.used set.
966 collectUsedGlobalVariables(M, Used, /*CompilerUsed=*/false);
967 // Next collect those in the llvm.compiler.used set.
968 collectUsedGlobalVariables(M, Used, /*CompilerUsed=*/true);
969 DenseSet<GlobalValue::GUID> CantBePromoted;
970 for (auto *V : Used) {
971 if (V->hasLocalLinkage()) {
972 LocalsUsed.insert(V);
973 CantBePromoted.insert(V->getGUID());
974 }
975 }
976
977 bool HasLocalInlineAsmSymbol = false;
978 if (!M.getModuleInlineAsm().empty()) {
979 // Collect the local values defined by module level asm, and set up
980 // summaries for these symbols so that they can be marked as NoRename,
981 // to prevent export of any use of them in regular IR that would require
982 // renaming within the module level asm. Note we don't need to create a
983 // summary for weak or global defs, as they don't need to be flagged as
984 // NoRename, and defs in module level asm can't be imported anyway.
985 // Also, any values used but not defined within module level asm should
986 // be listed on the llvm.used or llvm.compiler.used global and marked as
987 // referenced from there.
989 M, [&](StringRef Name, object::BasicSymbolRef::Flags Flags) {
990 // Symbols not marked as Weak or Global are local definitions.
993 return;
994 HasLocalInlineAsmSymbol = true;
995 GlobalValue *GV = M.getNamedValue(Name);
996 if (!GV)
997 return;
998 assert(GV->isDeclaration() && "Def in module asm already has definition");
1001 /* NotEligibleToImport = */ true,
1002 /* Live = */ true,
1003 /* Local */ GV->isDSOLocal(), GV->canBeOmittedFromSymbolTable(),
1005 /* NoRenameOnPromotion = */ false);
1006 CantBePromoted.insert(GV->getGUID());
1007 // Create the appropriate summary type.
1008 if (Function *F = dyn_cast<Function>(GV)) {
1009 std::unique_ptr<FunctionSummary> Summary =
1010 std::make_unique<FunctionSummary>(
1011 GVFlags, /*InstCount=*/0,
1013 F->hasFnAttribute(Attribute::ReadNone),
1014 F->hasFnAttribute(Attribute::ReadOnly),
1015 F->hasFnAttribute(Attribute::NoRecurse),
1016 F->returnDoesNotAlias(),
1017 /* NoInline = */ false,
1018 F->hasFnAttribute(Attribute::AlwaysInline),
1019 F->hasFnAttribute(Attribute::NoUnwind),
1020 /* MayThrow */ true,
1021 /* HasUnknownCall */ true,
1022 /* MustBeUnreachable */ false},
1032 Index.addGlobalValueSummary(*GV, std::move(Summary));
1033 } else {
1034 std::unique_ptr<GlobalVarSummary> Summary =
1035 std::make_unique<GlobalVarSummary>(
1036 GVFlags,
1038 false, false, cast<GlobalVariable>(GV)->isConstant(),
1041 Index.addGlobalValueSummary(*GV, std::move(Summary));
1042 }
1043 });
1044 }
1045
1046 bool IsThinLTO = true;
1047 if (auto *MD =
1048 mdconst::extract_or_null<ConstantInt>(M.getModuleFlag("ThinLTO")))
1049 IsThinLTO = MD->getZExtValue();
1050
1051 // Compute summaries for all functions defined in module, and save in the
1052 // index.
1053 for (const auto &F : M) {
1054 if (F.isDeclaration())
1055 continue;
1056
1057 DominatorTree DT(const_cast<Function &>(F));
1058 BlockFrequencyInfo *BFI = nullptr;
1059 std::unique_ptr<BlockFrequencyInfo> BFIPtr;
1060 if (F.hasProfileData()) {
1061 if (GetBFICallback) {
1062 BFI = GetBFICallback(F);
1063 } else {
1064 CycleInfo CI;
1065 CI.compute(const_cast<Function &>(F));
1066 BranchProbabilityInfo BPI{F, CI};
1067 BFIPtr = std::make_unique<BlockFrequencyInfo>(F, BPI, CI);
1068 BFI = BFIPtr.get();
1069 }
1070 }
1071
1072 computeFunctionSummary(Opts, Index, M, F, BFI, PSI, DT,
1073 !LocalsUsed.empty() || HasLocalInlineAsmSymbol,
1074 CantBePromoted, IsThinLTO, GetSSICallback);
1075 }
1076
1077 // Compute summaries for all variables defined in module, and save in the
1078 // index.
1080 for (const GlobalVariable &G : M.globals()) {
1081 if (G.isDeclaration())
1082 continue;
1083 computeVariableSummary(Index, G, CantBePromoted, M, Types);
1084 }
1085
1086 // Compute summaries for all aliases defined in module, and save in the
1087 // index.
1088 for (const GlobalAlias &A : M.aliases())
1089 computeAliasSummary(Index, A, CantBePromoted);
1090
1091 // Iterate through ifuncs, set their resolvers all alive.
1092 for (const GlobalIFunc &I : M.ifuncs()) {
1093 I.applyAlongResolverPath([&Index](const GlobalValue &GV) {
1094 Index.getGlobalValueSummary(GV)->setLive(true);
1095 });
1096 }
1097
1098 for (auto *V : LocalsUsed) {
1099 auto *Summary = Index.getGlobalValueSummary(*V);
1100 assert(Summary && "Missing summary for global value");
1101 Summary->setNotEligibleToImport();
1102 }
1103
1104 // The linker doesn't know about these LLVM produced values, so we need
1105 // to flag them as live in the index to ensure index-based dead value
1106 // analysis treats them as live roots of the analysis.
1107 setLiveRoot(Index, "llvm.used");
1108 setLiveRoot(Index, "llvm.compiler.used");
1109 setLiveRoot(Index, "llvm.global_ctors");
1110 setLiveRoot(Index, "llvm.global_dtors");
1111 setLiveRoot(Index, "llvm.global.annotations");
1112
1113 for (auto &GlobalList : Index) {
1114 // Ignore entries for references that are undefined in the current module.
1115 if (GlobalList.second.getSummaryList().empty())
1116 continue;
1117
1118 assert(GlobalList.second.getSummaryList().size() == 1 &&
1119 "Expected module's index to have one summary per GUID");
1120 auto &Summary = GlobalList.second.getSummaryList()[0];
1121 if (!IsThinLTO) {
1122 Summary->setNotEligibleToImport();
1123 continue;
1124 }
1125
1126 bool AllRefsCanBeExternallyReferenced =
1127 llvm::all_of(Summary->refs(), [&](const ValueInfo &VI) {
1128 return !CantBePromoted.count(VI.getGUID());
1129 });
1130 if (!AllRefsCanBeExternallyReferenced) {
1131 Summary->setNotEligibleToImport();
1132 continue;
1133 }
1134
1135 if (auto *FuncSummary = dyn_cast<FunctionSummary>(Summary.get())) {
1136 bool AllCallsCanBeExternallyReferenced = llvm::all_of(
1137 FuncSummary->calls(), [&](const FunctionSummary::EdgeTy &Edge) {
1138 return !CantBePromoted.count(Edge.first.getGUID());
1139 });
1140 if (!AllCallsCanBeExternallyReferenced)
1141 Summary->setNotEligibleToImport();
1142 }
1143 }
1144
1145 if (!Opts.module_summary_dot_file.empty()) {
1146 std::error_code EC;
1147 raw_fd_ostream OSDot(Opts.module_summary_dot_file, EC,
1149 if (EC)
1150 report_fatal_error(Twine("Failed to open dot file ") +
1151 Opts.module_summary_dot_file + ": " + EC.message() +
1152 "\n");
1153 Index.exportToDot(OSDot, {});
1154 }
1155
1156 return Index;
1157}
1158
1159AnalysisKey ModuleSummaryIndexAnalysis::Key;
1160AnalysisKey ImmutableModuleSummaryIndexAnalysis::Key;
1161
1165 auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
1166 bool NeedSSI = needsParamAccessSummary(M);
1168 M,
1169 [&FAM](const Function &F) {
1170 return &FAM.getResult<BlockFrequencyAnalysis>(
1171 *const_cast<Function *>(&F));
1172 },
1173 &PSI,
1174 [&FAM, NeedSSI](const Function &F) -> const StackSafetyInfo * {
1175 return NeedSSI ? &FAM.getResult<StackSafetyAnalysis>(
1176 const_cast<Function &>(F))
1177 : nullptr;
1178 });
1179}
1180
1182
1184 "Module Summary Analysis", false, true)
1189 "Module Summary Analysis", false, true)
1190
1194
1197
1199 auto *PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
1200 bool NeedSSI = needsParamAccessSummary(M);
1201 Index.emplace(buildModuleSummaryIndex(
1202 M,
1203 [this](const Function &F) {
1205 *const_cast<Function *>(&F))
1206 .getBFI());
1207 },
1208 PSI,
1209 [&](const Function &F) -> const StackSafetyInfo * {
1211 const_cast<Function &>(F))
1212 .getResult()
1213 : nullptr;
1214 }));
1215 return false;
1216}
1217
1219 Index.reset();
1220 return false;
1221}
1222
1229
1231
1235
1240
1245
1247 "Module summary info", false, true)
1248
1250 if (!CB)
1251 return false;
1252 auto *CI = dyn_cast<CallInst>(CB);
1253 auto *CalledValue = CB->getCalledOperand();
1254 auto *CalledFunction = CB->getCalledFunction();
1255 if (CalledValue && !CalledFunction) {
1256 CalledValue = CalledValue->stripPointerCasts();
1257 // Stripping pointer casts can reveal a called function.
1258 CalledFunction = dyn_cast<Function>(CalledValue);
1259 }
1260 // Check if this is an alias to a function. If so, get the
1261 // called aliasee for the checks below.
1262 if (auto *GA = dyn_cast<GlobalAlias>(CalledValue)) {
1263 assert(!CalledFunction &&
1264 "Expected null called function in callsite for alias");
1265 CalledFunction = dyn_cast<Function>(GA->getAliaseeObject());
1266 }
1267 // Check if this is a direct call to a known function or a known
1268 // intrinsic, or an indirect call with profile data.
1269 if (CalledFunction) {
1270 if (CI && CalledFunction->isIntrinsic())
1271 return false;
1272 } else {
1273 // Skip indirect calls if we haven't enabled memprof ICP.
1274 if (!getAnalysisOptions(CB->getContext())
1275 .enable_memprof_indirect_call_support)
1276 return false;
1277 // Skip inline assembly calls.
1278 if (CI && CI->isInlineAsm())
1279 return false;
1280 // Skip direct calls via Constant.
1281 if (!CalledValue || isa<Constant>(CalledValue))
1282 return false;
1283 return true;
1284 }
1285 return true;
1286}
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")
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(const AnalysisOptions &Opts, 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:44
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.
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
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:76
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
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
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
LLVM_ABI bool needsParamAccessSummary(const Module &M)
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.
const AnalysisOptions & getAnalysisOptions(const LLVMContext &C)
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
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
LLVM_ABI unsigned getMaxSummaryIndirectEdges(const LLVMContext &C)
Return -module-summary-max-indirect-edges.
DWARFExpression::Operation Op
LLVM_ABI ImmutablePass * createImmutableModuleSummaryIndexWrapperPass(const ModuleSummaryIndex *Index)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI unsigned getMaxNumVTableAnnotations(const LLVMContext &C)
Return -icp-max-num-vtables.
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:966
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.