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