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