LLVM 22.0.0git
ModuleSummaryAnalysis.cpp
Go to the documentation of this file.
1//===- ModuleSummaryAnalysis.cpp - Module summary index builder -----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This pass builds a ModuleSummaryIndex object for the module, to be written
10// to bitcode or LLVM assembly.
11//
12//===----------------------------------------------------------------------===//
13
15#include "llvm/ADT/ArrayRef.h"
16#include "llvm/ADT/DenseSet.h"
17#include "llvm/ADT/MapVector.h"
18#include "llvm/ADT/STLExtras.h"
19#include "llvm/ADT/SetVector.h"
22#include "llvm/ADT/StringRef.h"
32#include "llvm/IR/Attributes.h"
33#include "llvm/IR/BasicBlock.h"
34#include "llvm/IR/Constant.h"
35#include "llvm/IR/Constants.h"
36#include "llvm/IR/Dominators.h"
37#include "llvm/IR/Function.h"
38#include "llvm/IR/GlobalAlias.h"
39#include "llvm/IR/GlobalValue.h"
43#include "llvm/IR/Metadata.h"
44#include "llvm/IR/Module.h"
46#include "llvm/IR/Use.h"
47#include "llvm/IR/User.h"
51#include "llvm/Pass.h"
56#include <cassert>
57#include <cstdint>
58#include <vector>
59
60using namespace llvm;
61using namespace llvm::memprof;
62
63#define DEBUG_TYPE "module-summary-analysis"
64
65// Option to force edges cold which will block importing when the
66// -import-cold-multiplier is set to 0. Useful for debugging.
67namespace llvm {
70} // namespace llvm
71
73 "force-summary-edges-cold", cl::Hidden, cl::location(ForceSummaryEdgesCold),
74 cl::desc("Force all edges in the function summary to cold"),
77 "all-non-critical", "All non-critical edges."),
78 clEnumValN(FunctionSummary::FSHT_All, "all", "All edges.")));
79
81 "module-summary-dot-file", cl::Hidden, cl::value_desc("filename"),
82 cl::desc("File to emit dot graph of new summary into"));
83
85 "enable-memprof-indirect-call-support", cl::init(true), cl::Hidden,
87 "Enable MemProf support for summarizing and cloning indirect calls"));
88
90
92
94
95// Walk through the operands of a given User via worklist iteration and populate
96// the set of GlobalValue references encountered. Invoked either on an
97// Instruction or a GlobalVariable (which walks its initializer).
98// Return true if any of the operands contains blockaddress. This is important
99// to know when computing summary for global var, because if global variable
100// references basic block address we can't import it separately from function
101// containing that basic block. For simplicity we currently don't import such
102// global vars at all. When importing function we aren't interested if any
103// instruction in it takes an address of any basic block, because instruction
104// can only take an address of basic block located in the same function.
105// Set `RefLocalLinkageIFunc` to true if the analyzed value references a
106// local-linkage ifunc.
107static bool
108findRefEdges(ModuleSummaryIndex &Index, const User *CurUser,
111 bool &RefLocalLinkageIFunc) {
112 bool HasBlockAddress = false;
114 if (Visited.insert(CurUser).second)
115 Worklist.push_back(CurUser);
116
117 while (!Worklist.empty()) {
118 const User *U = Worklist.pop_back_val();
119 const auto *CB = dyn_cast<CallBase>(U);
120
121 for (const auto &OI : U->operands()) {
122 const User *Operand = dyn_cast<User>(OI);
123 if (!Operand)
124 continue;
125 if (isa<BlockAddress>(Operand)) {
126 HasBlockAddress = true;
127 continue;
128 }
129 if (auto *GV = dyn_cast<GlobalValue>(Operand)) {
130 // We have a reference to a global value. This should be added to
131 // the reference set unless it is a callee. Callees are handled
132 // specially by WriteFunction and are added to a separate list.
133 if (!(CB && CB->isCallee(&OI))) {
134 // If an ifunc has local linkage, do not add it into ref edges, and
135 // sets `RefLocalLinkageIFunc` to true. The referencer is not eligible
136 // for import. An ifunc doesn't have summary and ThinLTO cannot
137 // promote it; importing the referencer may cause linkage errors.
138 if (auto *GI = dyn_cast_if_present<GlobalIFunc>(GV);
139 GI && GI->hasLocalLinkage()) {
140 RefLocalLinkageIFunc = true;
141 continue;
142 }
143 RefEdges.insert(Index.getOrInsertValueInfo(GV));
144 }
145 continue;
146 }
147 if (Visited.insert(Operand).second)
148 Worklist.push_back(Operand);
149 }
150 }
151
152 const Instruction *I = dyn_cast<Instruction>(CurUser);
153 if (I) {
154 uint64_t TotalCount = 0;
155 // MaxNumVTableAnnotations is the maximum number of vtables annotated on
156 // the instruction.
157 auto ValueDataArray = getValueProfDataFromInst(
158 *I, IPVK_VTableTarget, MaxNumVTableAnnotations, TotalCount);
159
160 for (const auto &V : ValueDataArray)
161 RefEdges.insert(Index.getOrInsertValueInfo(/* VTableGUID = */
162 V.Value));
163 }
164 return HasBlockAddress;
165}
166
168 ProfileSummaryInfo *PSI) {
169 if (!PSI)
170 return CalleeInfo::HotnessType::Unknown;
171 if (PSI->isHotCount(ProfileCount))
172 return CalleeInfo::HotnessType::Hot;
173 if (PSI->isColdCount(ProfileCount))
174 return CalleeInfo::HotnessType::Cold;
175 return CalleeInfo::HotnessType::None;
176}
177
178static bool isNonRenamableLocal(const GlobalValue &GV) {
179 return GV.hasSection() && GV.hasLocalLinkage();
180}
181
182/// Determine whether this call has all constant integer arguments (excluding
183/// "this") and summarize it to VCalls or ConstVCalls as appropriate.
184static void addVCallToSet(
186 SetVector<FunctionSummary::VFuncId, std::vector<FunctionSummary::VFuncId>>
187 &VCalls,
189 std::vector<FunctionSummary::ConstVCall>> &ConstVCalls) {
190 std::vector<uint64_t> Args;
191 // Start from the second argument to skip the "this" pointer.
192 for (auto &Arg : drop_begin(Call.CB.args())) {
193 auto *CI = dyn_cast<ConstantInt>(Arg);
194 if (!CI || CI->getBitWidth() > 64) {
195 VCalls.insert({Guid, Call.Offset});
196 return;
197 }
198 Args.push_back(CI->getZExtValue());
199 }
200 ConstVCalls.insert({{Guid, Call.Offset}, std::move(Args)});
201}
202
203/// If this intrinsic call requires that we add information to the function
204/// summary, do so via the non-constant reference arguments.
206 const CallInst *CI,
207 SetVector<GlobalValue::GUID, std::vector<GlobalValue::GUID>> &TypeTests,
208 SetVector<FunctionSummary::VFuncId, std::vector<FunctionSummary::VFuncId>>
209 &TypeTestAssumeVCalls,
210 SetVector<FunctionSummary::VFuncId, std::vector<FunctionSummary::VFuncId>>
211 &TypeCheckedLoadVCalls,
213 std::vector<FunctionSummary::ConstVCall>>
214 &TypeTestAssumeConstVCalls,
216 std::vector<FunctionSummary::ConstVCall>>
217 &TypeCheckedLoadConstVCalls,
218 DominatorTree &DT) {
219 switch (CI->getCalledFunction()->getIntrinsicID()) {
220 case Intrinsic::type_test:
221 case Intrinsic::public_type_test: {
222 auto *TypeMDVal = cast<MetadataAsValue>(CI->getArgOperand(1));
223 auto *TypeId = dyn_cast<MDString>(TypeMDVal->getMetadata());
224 if (!TypeId)
225 break;
228
229 // Produce a summary from type.test intrinsics. We only summarize type.test
230 // intrinsics that are used other than by an llvm.assume intrinsic.
231 // Intrinsics that are assumed are relevant only to the devirtualization
232 // pass, not the type test lowering pass.
233 bool HasNonAssumeUses = llvm::any_of(CI->uses(), [](const Use &CIU) {
234 return !isa<AssumeInst>(CIU.getUser());
235 });
236 if (HasNonAssumeUses)
237 TypeTests.insert(Guid);
238
241 findDevirtualizableCallsForTypeTest(DevirtCalls, Assumes, CI, DT);
242 for (auto &Call : DevirtCalls)
243 addVCallToSet(Call, Guid, TypeTestAssumeVCalls,
244 TypeTestAssumeConstVCalls);
245
246 break;
247 }
248
249 case Intrinsic::type_checked_load_relative:
250 case Intrinsic::type_checked_load: {
251 auto *TypeMDVal = cast<MetadataAsValue>(CI->getArgOperand(2));
252 auto *TypeId = dyn_cast<MDString>(TypeMDVal->getMetadata());
253 if (!TypeId)
254 break;
257
261 bool HasNonCallUses = false;
262 findDevirtualizableCallsForTypeCheckedLoad(DevirtCalls, LoadedPtrs, Preds,
263 HasNonCallUses, CI, DT);
264 // Any non-call uses of the result of llvm.type.checked.load will
265 // prevent us from optimizing away the llvm.type.test.
266 if (HasNonCallUses)
267 TypeTests.insert(Guid);
268 for (auto &Call : DevirtCalls)
269 addVCallToSet(Call, Guid, TypeCheckedLoadVCalls,
270 TypeCheckedLoadConstVCalls);
271
272 break;
273 }
274 default:
275 break;
276 }
277}
278
279static bool isNonVolatileLoad(const Instruction *I) {
280 if (const auto *LI = dyn_cast<LoadInst>(I))
281 return !LI->isVolatile();
282
283 return false;
284}
285
286static bool isNonVolatileStore(const Instruction *I) {
287 if (const auto *SI = dyn_cast<StoreInst>(I))
288 return !SI->isVolatile();
289
290 return false;
291}
292
293// Returns true if the function definition must be unreachable.
294//
295// Note if this helper function returns true, `F` is guaranteed
296// to be unreachable; if it returns false, `F` might still
297// be unreachable but not covered by this helper function.
299 // A function must be unreachable if its entry block ends with an
300 // 'unreachable'.
301 assert(!F.isDeclaration());
302 return isa<UnreachableInst>(F.getEntryBlock().getTerminator());
303}
304
306 ModuleSummaryIndex &Index, const Module &M, const Function &F,
308 bool HasLocalsInUsedOrAsm, DenseSet<GlobalValue::GUID> &CantBePromoted,
309 bool IsThinLTO,
310 std::function<const StackSafetyInfo *(const Function &F)> GetSSICallback) {
311 // Summary not currently supported for anonymous functions, they should
312 // have been named.
313 assert(F.hasName());
314
315 unsigned NumInsts = 0;
316 // Map from callee ValueId to profile count. Used to accumulate profile
317 // counts for all static calls to a given callee.
320 CallGraphEdges;
322 StoreRefEdges;
325 TypeTestAssumeVCalls, TypeCheckedLoadVCalls;
327 std::vector<FunctionSummary::ConstVCall>>
328 TypeTestAssumeConstVCalls, TypeCheckedLoadConstVCalls;
329 ICallPromotionAnalysis ICallAnalysis;
331
332 // Add personality function, prefix data and prologue data to function's ref
333 // list.
334 bool HasLocalIFuncCallOrRef = false;
335 findRefEdges(Index, &F, RefEdges, Visited, HasLocalIFuncCallOrRef);
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) {
364 if (I.isDebugOrPseudoInst())
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)
445 : CalleeInfo::HotnessType::Unknown;
447 Hotness = CalleeInfo::HotnessType::Cold;
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 // Add the relative block frequency to CalleeInfo if there is no profile
459 // information.
460 if (BFI != nullptr && Hotness == CalleeInfo::HotnessType::Unknown) {
461 uint64_t BBFreq = BFI->getBlockFreq(&BB).getFrequency();
462 uint64_t EntryFreq = BFI->getEntryFreq().getFrequency();
463 ValueInfo.updateRelBlockFreq(BBFreq, EntryFreq);
464 }
465 } else {
466 HasUnknownCall = true;
467 // If F is imported, a local linkage ifunc (e.g. target_clones on a
468 // static function) called by F will be cloned. Since summaries don't
469 // track ifunc, we do not know implementation functions referenced by
470 // the ifunc resolver need to be promoted in the exporter, and we will
471 // get linker errors due to cloned declarations for implementation
472 // functions. As a simple fix, just mark F as not eligible for import.
473 // Non-local ifunc is not cloned and does not have the issue.
474 if (auto *GI = dyn_cast_if_present<GlobalIFunc>(CalledValue))
475 if (GI->hasLocalLinkage())
476 HasLocalIFuncCallOrRef = true;
477 // Skip inline assembly calls.
478 if (CI && CI->isInlineAsm())
479 continue;
480 // Skip direct calls.
481 if (!CalledValue || isa<Constant>(CalledValue))
482 continue;
483
484 // Check if the instruction has a callees metadata. If so, add callees
485 // to CallGraphEdges to reflect the references from the metadata, and
486 // to enable importing for subsequent indirect call promotion and
487 // inlining.
488 if (auto *MD = I.getMetadata(LLVMContext::MD_callees)) {
489 for (const auto &Op : MD->operands()) {
490 Function *Callee = mdconst::extract_or_null<Function>(Op);
491 if (Callee)
492 CallGraphEdges[Index.getOrInsertValueInfo(Callee)];
493 }
494 }
495
496 CandidateProfileData =
497 ICallAnalysis.getPromotionCandidatesForInstruction(&I, TotalCount,
498 NumCandidates);
499 for (const auto &Candidate : CandidateProfileData)
500 CallGraphEdges[Index.getOrInsertValueInfo(Candidate.Value)]
501 .updateHotness(getHotness(Candidate.Count, PSI));
502 }
503
504 // Summarize memprof related metadata. This is only needed for ThinLTO.
505 if (!IsThinLTO)
506 continue;
507
508 // Skip indirect calls if we haven't enabled memprof ICP.
509 if (!CalledFunction && !EnableMemProfIndirectCallSupport)
510 continue;
511
512 // Ensure we keep this analysis in sync with the handling in the ThinLTO
513 // backend (see MemProfContextDisambiguation::applyImport). Save this call
514 // so that we can skip it in checking the reverse case later.
516#ifndef NDEBUG
517 CallsThatMayHaveMemprofSummary.insert(CB);
518#endif
519
520 // Compute the list of stack ids first (so we can trim them from the stack
521 // ids on any MIBs).
523 I.getMetadata(LLVMContext::MD_callsite));
524 auto *MemProfMD = I.getMetadata(LLVMContext::MD_memprof);
525 if (MemProfMD) {
526 std::vector<MIBInfo> MIBs;
527 std::vector<std::vector<ContextTotalSize>> ContextSizeInfos;
528 bool HasNonZeroContextSizeInfos = false;
529 for (auto &MDOp : MemProfMD->operands()) {
530 auto *MIBMD = cast<const MDNode>(MDOp);
533 SmallVector<unsigned> StackIdIndices;
535 // Collapse out any on the allocation call (inlining).
536 for (auto ContextIter =
537 StackContext.beginAfterSharedPrefix(InstCallsite);
538 ContextIter != StackContext.end(); ++ContextIter) {
539 unsigned StackIdIdx = Index.addOrGetStackIdIndex(*ContextIter);
540 // If this is a direct recursion, simply skip the duplicate
541 // entries. If this is mutual recursion, handling is left to
542 // the LTO link analysis client.
543 if (StackIdIndices.empty() || StackIdIndices.back() != StackIdIdx)
544 StackIdIndices.push_back(StackIdIdx);
545 }
546 // If we have context size information, collect it for inclusion in
547 // the summary.
548 assert(MIBMD->getNumOperands() > 2 ||
550 if (MIBMD->getNumOperands() > 2) {
551 std::vector<ContextTotalSize> ContextSizes;
552 for (unsigned I = 2; I < MIBMD->getNumOperands(); I++) {
553 MDNode *ContextSizePair = dyn_cast<MDNode>(MIBMD->getOperand(I));
554 assert(ContextSizePair->getNumOperands() == 2);
555 uint64_t FullStackId = mdconst::dyn_extract<ConstantInt>(
556 ContextSizePair->getOperand(0))
557 ->getZExtValue();
558 uint64_t TS = mdconst::dyn_extract<ConstantInt>(
559 ContextSizePair->getOperand(1))
560 ->getZExtValue();
561 ContextSizes.push_back({FullStackId, TS});
562 }
563 // Flag that we need to keep the ContextSizeInfos array for this
564 // alloc as it now contains non-zero context info sizes.
565 HasNonZeroContextSizeInfos = true;
566 ContextSizeInfos.push_back(std::move(ContextSizes));
567 } else {
568 // The ContextSizeInfos must be in the same relative position as the
569 // associated MIB. In some cases we only include a ContextSizeInfo
570 // for a subset of MIBs in an allocation. To handle that, eagerly
571 // fill any MIB entries that don't have context size info metadata
572 // with a pair of 0s. Later on we will only use this array if it
573 // ends up containing any non-zero entries (see where we set
574 // HasNonZeroContextSizeInfos above).
575 ContextSizeInfos.push_back({{0, 0}});
576 }
577 MIBs.push_back(
578 MIBInfo(getMIBAllocType(MIBMD), std::move(StackIdIndices)));
579 }
580 Allocs.push_back(AllocInfo(std::move(MIBs)));
581 assert(HasNonZeroContextSizeInfos ||
583 // We eagerly build the ContextSizeInfos array, but it will be filled
584 // with sub arrays of pairs of 0s if no MIBs on this alloc actually
585 // contained context size info metadata. Only save it if any MIBs had
586 // any such metadata.
587 if (HasNonZeroContextSizeInfos) {
588 assert(Allocs.back().MIBs.size() == ContextSizeInfos.size());
589 Allocs.back().ContextSizeInfos = std::move(ContextSizeInfos);
590 }
591 } else if (!InstCallsite.empty()) {
592 SmallVector<unsigned> StackIdIndices;
593 for (auto StackId : InstCallsite)
594 StackIdIndices.push_back(Index.addOrGetStackIdIndex(StackId));
595 if (CalledFunction) {
596 // Use the original CalledValue, in case it was an alias. We want
597 // to record the call edge to the alias in that case. Eventually
598 // an alias summary will be created to associate the alias and
599 // aliasee.
600 auto CalleeValueInfo =
601 Index.getOrInsertValueInfo(cast<GlobalValue>(CalledValue));
602 Callsites.push_back({CalleeValueInfo, StackIdIndices});
603 } else {
605 // For indirect callsites, create multiple Callsites, one per target.
606 // This enables having a different set of clone versions per target,
607 // and we will apply the cloning decisions while speculatively
608 // devirtualizing in the ThinLTO backends.
609 for (const auto &Candidate : CandidateProfileData) {
610 auto CalleeValueInfo = Index.getOrInsertValueInfo(Candidate.Value);
611 Callsites.push_back({CalleeValueInfo, StackIdIndices});
612 }
613 }
614 }
615 }
616 }
617
619 Index.addBlockCount(F.size());
620
622 if (IsThinLTO) {
623 auto AddRefEdges =
624 [&](const std::vector<const Instruction *> &Instrs,
627 for (const auto *I : Instrs) {
628 Cache.erase(I);
629 findRefEdges(Index, I, Edges, Cache, HasLocalIFuncCallOrRef);
630 }
631 };
632
633 // By now we processed all instructions in a function, except
634 // non-volatile loads and non-volatile value stores. Let's find
635 // ref edges for both of instruction sets
636 AddRefEdges(NonVolatileLoads, LoadRefEdges, Visited);
637 // We can add some values to the Visited set when processing load
638 // instructions which are also used by stores in NonVolatileStores.
639 // For example this can happen if we have following code:
640 //
641 // store %Derived* @foo, %Derived** bitcast (%Base** @bar to %Derived**)
642 // %42 = load %Derived*, %Derived** bitcast (%Base** @bar to %Derived**)
643 //
644 // After processing loads we'll add bitcast to the Visited set, and if
645 // we use the same set while processing stores, we'll never see store
646 // to @bar and @bar will be mistakenly treated as readonly.
648 AddRefEdges(NonVolatileStores, StoreRefEdges, StoreCache);
649
650 // If both load and store instruction reference the same variable
651 // we won't be able to optimize it. Add all such reference edges
652 // to RefEdges set.
653 for (const auto &VI : StoreRefEdges)
654 if (LoadRefEdges.remove(VI))
655 RefEdges.insert(VI);
656
657 unsigned RefCnt = RefEdges.size();
658 // All new reference edges inserted in two loops below are either
659 // read or write only. They will be grouped in the end of RefEdges
660 // vector, so we can use a single integer value to identify them.
661 RefEdges.insert_range(LoadRefEdges);
662
663 unsigned FirstWORef = RefEdges.size();
664 RefEdges.insert_range(StoreRefEdges);
665
666 Refs = RefEdges.takeVector();
667 for (; RefCnt < FirstWORef; ++RefCnt)
668 Refs[RefCnt].setReadOnly();
669
670 for (; RefCnt < Refs.size(); ++RefCnt)
671 Refs[RefCnt].setWriteOnly();
672 } else {
673 Refs = RefEdges.takeVector();
674 }
675 // Explicit add hot edges to enforce importing for designated GUIDs for
676 // sample PGO, to enable the same inlines as the profiled optimized binary.
677 for (auto &I : F.getImportGUIDs())
678 CallGraphEdges[Index.getOrInsertValueInfo(I)].updateHotness(
680 ? CalleeInfo::HotnessType::Cold
681 : CalleeInfo::HotnessType::Critical);
682
683#ifndef NDEBUG
684 // Make sure that all calls we decided could not have memprof summaries get a
685 // false value for mayHaveMemprofSummary, to ensure that this handling remains
686 // in sync with the ThinLTO backend handling.
687 if (IsThinLTO) {
688 for (const BasicBlock &BB : F) {
689 for (const Instruction &I : BB) {
690 const auto *CB = dyn_cast<CallBase>(&I);
691 if (!CB)
692 continue;
693 // We already checked these above.
694 if (CallsThatMayHaveMemprofSummary.count(CB))
695 continue;
697 }
698 }
699 }
700#endif
701
702 bool NonRenamableLocal = isNonRenamableLocal(F);
703 bool NotEligibleForImport =
704 NonRenamableLocal || HasInlineAsmMaybeReferencingInternal ||
705 HasIndirBranchToBlockAddress || HasLocalIFuncCallOrRef;
707 F.getLinkage(), F.getVisibility(), NotEligibleForImport,
708 /* Live = */ false, F.isDSOLocal(), F.canBeOmittedFromSymbolTable(),
709 GlobalValueSummary::ImportKind::Definition);
711 F.doesNotAccessMemory(), F.onlyReadsMemory() && !F.doesNotAccessMemory(),
712 F.hasFnAttribute(Attribute::NoRecurse), F.returnDoesNotAlias(),
713 // FIXME: refactor this to use the same code that inliner is using.
714 // Don't try to import functions with noinline attribute.
715 F.getAttributes().hasFnAttr(Attribute::NoInline),
716 F.hasFnAttribute(Attribute::AlwaysInline),
717 F.hasFnAttribute(Attribute::NoUnwind), MayThrow, HasUnknownCall,
719 std::vector<FunctionSummary::ParamAccess> ParamAccesses;
720 if (auto *SSI = GetSSICallback(F))
721 ParamAccesses = SSI->getParamAccesses(Index);
722 auto FuncSummary = std::make_unique<FunctionSummary>(
723 Flags, NumInsts, FunFlags, std::move(Refs), CallGraphEdges.takeVector(),
724 TypeTests.takeVector(), TypeTestAssumeVCalls.takeVector(),
725 TypeCheckedLoadVCalls.takeVector(),
726 TypeTestAssumeConstVCalls.takeVector(),
727 TypeCheckedLoadConstVCalls.takeVector(), std::move(ParamAccesses),
728 std::move(Callsites), std::move(Allocs));
729 if (NonRenamableLocal)
730 CantBePromoted.insert(F.getGUID());
731 Index.addGlobalValueSummary(F, std::move(FuncSummary));
732}
733
734/// Find function pointers referenced within the given vtable initializer
735/// (or subset of an initializer) \p I. The starting offset of \p I within
736/// the vtable initializer is \p StartingOffset. Any discovered function
737/// pointers are added to \p VTableFuncs along with their cumulative offset
738/// within the initializer.
739static void findFuncPointers(const Constant *I, uint64_t StartingOffset,
740 const Module &M, ModuleSummaryIndex &Index,
741 VTableFuncList &VTableFuncs,
742 const GlobalVariable &OrigGV) {
743 // First check if this is a function pointer.
744 if (I->getType()->isPointerTy()) {
745 auto C = I->stripPointerCasts();
746 auto A = dyn_cast<GlobalAlias>(C);
747 if (isa<Function>(C) || (A && isa<Function>(A->getAliasee()))) {
748 auto GV = dyn_cast<GlobalValue>(C);
749 assert(GV);
750 // We can disregard __cxa_pure_virtual as a possible call target, as
751 // calls to pure virtuals are UB.
752 if (GV && GV->getName() != "__cxa_pure_virtual")
753 VTableFuncs.push_back({Index.getOrInsertValueInfo(GV), StartingOffset});
754 return;
755 }
756 }
757
758 // Walk through the elements in the constant struct or array and recursively
759 // look for virtual function pointers.
760 const DataLayout &DL = M.getDataLayout();
761 if (auto *C = dyn_cast<ConstantStruct>(I)) {
762 StructType *STy = dyn_cast<StructType>(C->getType());
763 assert(STy);
764 const StructLayout *SL = DL.getStructLayout(C->getType());
765
766 for (auto EI : llvm::enumerate(STy->elements())) {
767 auto Offset = SL->getElementOffset(EI.index());
768 unsigned Op = SL->getElementContainingOffset(Offset);
769 findFuncPointers(cast<Constant>(I->getOperand(Op)),
770 StartingOffset + Offset, M, Index, VTableFuncs, OrigGV);
771 }
772 } else if (auto *C = dyn_cast<ConstantArray>(I)) {
773 ArrayType *ATy = C->getType();
774 Type *EltTy = ATy->getElementType();
775 uint64_t EltSize = DL.getTypeAllocSize(EltTy);
776 for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) {
777 findFuncPointers(cast<Constant>(I->getOperand(i)),
778 StartingOffset + i * EltSize, M, Index, VTableFuncs,
779 OrigGV);
780 }
781 } else if (const auto *CE = dyn_cast<ConstantExpr>(I)) {
782 // For relative vtables, the next sub-component should be a trunc.
783 if (CE->getOpcode() != Instruction::Trunc ||
784 !(CE = dyn_cast<ConstantExpr>(CE->getOperand(0))))
785 return;
786
787 // If this constant can be reduced to the offset between a function and a
788 // global, then we know this is a valid virtual function if the RHS is the
789 // original vtable we're scanning through.
790 if (CE->getOpcode() == Instruction::Sub) {
792 APSInt LHSOffset, RHSOffset;
793 if (IsConstantOffsetFromGlobal(CE->getOperand(0), LHS, LHSOffset, DL) &&
794 IsConstantOffsetFromGlobal(CE->getOperand(1), RHS, RHSOffset, DL) &&
795 RHS == &OrigGV &&
796
797 // For relative vtables, this component should point to the callable
798 // function without any offsets.
799 LHSOffset == 0 &&
800
801 // Also, the RHS should always point to somewhere within the vtable.
802 RHSOffset <=
803 static_cast<uint64_t>(DL.getTypeAllocSize(OrigGV.getInitializer()->getType()))) {
804 findFuncPointers(LHS, StartingOffset, M, Index, VTableFuncs, OrigGV);
805 }
806 }
807 }
808}
809
810// Identify the function pointers referenced by vtable definition \p V.
812 const GlobalVariable &V, const Module &M,
813 VTableFuncList &VTableFuncs) {
814 if (!V.isConstant())
815 return;
816
817 findFuncPointers(V.getInitializer(), /*StartingOffset=*/0, M, Index,
818 VTableFuncs, V);
819
820#ifndef NDEBUG
821 // Validate that the VTableFuncs list is ordered by offset.
822 uint64_t PrevOffset = 0;
823 for (auto &P : VTableFuncs) {
824 // The findVFuncPointers traversal should have encountered the
825 // functions in offset order. We need to use ">=" since PrevOffset
826 // starts at 0.
827 assert(P.VTableOffset >= PrevOffset);
828 PrevOffset = P.VTableOffset;
829 }
830#endif
831}
832
833/// Record vtable definition \p V for each type metadata it references.
834static void
836 const GlobalVariable &V,
838 for (MDNode *Type : Types) {
839 auto TypeID = Type->getOperand(1).get();
840
842 cast<ConstantInt>(
843 cast<ConstantAsMetadata>(Type->getOperand(0))->getValue())
844 ->getZExtValue();
845
846 if (auto *TypeId = dyn_cast<MDString>(TypeID))
847 Index.getOrInsertTypeIdCompatibleVtableSummary(TypeId->getString())
848 .push_back({Offset, Index.getOrInsertValueInfo(&V)});
849 }
850}
851
853 const GlobalVariable &V,
854 DenseSet<GlobalValue::GUID> &CantBePromoted,
855 const Module &M,
859 bool RefLocalIFunc = false;
860 bool HasBlockAddress =
861 findRefEdges(Index, &V, RefEdges, Visited, RefLocalIFunc);
862 const bool NotEligibleForImport = (HasBlockAddress || RefLocalIFunc);
863 bool NonRenamableLocal = isNonRenamableLocal(V);
865 V.getLinkage(), V.getVisibility(), NonRenamableLocal,
866 /* Live = */ false, V.isDSOLocal(), V.canBeOmittedFromSymbolTable(),
868
869 VTableFuncList VTableFuncs;
870 // If splitting is not enabled, then we compute the summary information
871 // necessary for index-based whole program devirtualization.
872 if (!Index.enableSplitLTOUnit()) {
873 Types.clear();
874 V.getMetadata(LLVMContext::MD_type, Types);
875 if (!Types.empty()) {
876 // Identify the function pointers referenced by this vtable definition.
877 computeVTableFuncs(Index, V, M, VTableFuncs);
878
879 // Record this vtable definition for each type metadata it references.
881 }
882 }
883
884 // Don't mark variables we won't be able to internalize as read/write-only.
885 bool CanBeInternalized =
886 !V.hasComdat() && !V.hasAppendingLinkage() && !V.isInterposable() &&
887 !V.hasAvailableExternallyLinkage() && !V.hasDLLExportStorageClass();
888 bool Constant = V.isConstant();
889 GlobalVarSummary::GVarFlags VarFlags(CanBeInternalized,
890 Constant ? false : CanBeInternalized,
891 Constant, V.getVCallVisibility());
892 auto GVarSummary = std::make_unique<GlobalVarSummary>(Flags, VarFlags,
893 RefEdges.takeVector());
894 if (NonRenamableLocal)
895 CantBePromoted.insert(V.getGUID());
896 if (NotEligibleForImport)
897 GVarSummary->setNotEligibleToImport();
898 if (!VTableFuncs.empty())
899 GVarSummary->setVTableFuncs(VTableFuncs);
900 Index.addGlobalValueSummary(V, std::move(GVarSummary));
901}
902
904 DenseSet<GlobalValue::GUID> &CantBePromoted) {
905 // Skip summary for indirect function aliases as summary for aliasee will not
906 // be emitted.
907 const GlobalObject *Aliasee = A.getAliaseeObject();
908 if (isa<GlobalIFunc>(Aliasee))
909 return;
910 bool NonRenamableLocal = isNonRenamableLocal(A);
912 A.getLinkage(), A.getVisibility(), NonRenamableLocal,
913 /* Live = */ false, A.isDSOLocal(), A.canBeOmittedFromSymbolTable(),
915 auto AS = std::make_unique<AliasSummary>(Flags);
916 auto AliaseeVI = Index.getValueInfo(Aliasee->getGUID());
917 assert(AliaseeVI && "Alias expects aliasee summary to be available");
918 assert(AliaseeVI.getSummaryList().size() == 1 &&
919 "Expected a single entry per aliasee in per-module index");
920 AS->setAliasee(AliaseeVI, AliaseeVI.getSummaryList()[0].get());
921 if (NonRenamableLocal)
922 CantBePromoted.insert(A.getGUID());
923 Index.addGlobalValueSummary(A, std::move(AS));
924}
925
926// Set LiveRoot flag on entries matching the given value name.
928 if (ValueInfo VI =
930 for (const auto &Summary : VI.getSummaryList())
931 Summary->setLive(true);
932}
933
935 const Module &M,
936 std::function<BlockFrequencyInfo *(const Function &F)> GetBFICallback,
938 std::function<const StackSafetyInfo *(const Function &F)> GetSSICallback) {
939 assert(PSI);
940 bool EnableSplitLTOUnit = false;
941 bool UnifiedLTO = false;
942 if (auto *MD = mdconst::extract_or_null<ConstantInt>(
943 M.getModuleFlag("EnableSplitLTOUnit")))
944 EnableSplitLTOUnit = MD->getZExtValue();
945 if (auto *MD =
946 mdconst::extract_or_null<ConstantInt>(M.getModuleFlag("UnifiedLTO")))
947 UnifiedLTO = MD->getZExtValue();
948 ModuleSummaryIndex Index(/*HaveGVs=*/true, EnableSplitLTOUnit, UnifiedLTO);
949
950 // Identify the local values in the llvm.used and llvm.compiler.used sets,
951 // which should not be exported as they would then require renaming and
952 // promotion, but we may have opaque uses e.g. in inline asm. We collect them
953 // here because we use this information to mark functions containing inline
954 // assembly calls as not importable.
957 // First collect those in the llvm.used set.
958 collectUsedGlobalVariables(M, Used, /*CompilerUsed=*/false);
959 // Next collect those in the llvm.compiler.used set.
960 collectUsedGlobalVariables(M, Used, /*CompilerUsed=*/true);
961 DenseSet<GlobalValue::GUID> CantBePromoted;
962 for (auto *V : Used) {
963 if (V->hasLocalLinkage()) {
964 LocalsUsed.insert(V);
965 CantBePromoted.insert(V->getGUID());
966 }
967 }
968
969 bool HasLocalInlineAsmSymbol = false;
970 if (!M.getModuleInlineAsm().empty()) {
971 // Collect the local values defined by module level asm, and set up
972 // summaries for these symbols so that they can be marked as NoRename,
973 // to prevent export of any use of them in regular IR that would require
974 // renaming within the module level asm. Note we don't need to create a
975 // summary for weak or global defs, as they don't need to be flagged as
976 // NoRename, and defs in module level asm can't be imported anyway.
977 // Also, any values used but not defined within module level asm should
978 // be listed on the llvm.used or llvm.compiler.used global and marked as
979 // referenced from there.
982 // Symbols not marked as Weak or Global are local definitions.
985 return;
986 HasLocalInlineAsmSymbol = true;
987 GlobalValue *GV = M.getNamedValue(Name);
988 if (!GV)
989 return;
990 assert(GV->isDeclaration() && "Def in module asm already has definition");
993 /* NotEligibleToImport = */ true,
994 /* Live = */ true,
995 /* Local */ GV->isDSOLocal(), GV->canBeOmittedFromSymbolTable(),
997 CantBePromoted.insert(GV->getGUID());
998 // Create the appropriate summary type.
999 if (Function *F = dyn_cast<Function>(GV)) {
1000 std::unique_ptr<FunctionSummary> Summary =
1001 std::make_unique<FunctionSummary>(
1002 GVFlags, /*InstCount=*/0,
1004 F->hasFnAttribute(Attribute::ReadNone),
1005 F->hasFnAttribute(Attribute::ReadOnly),
1006 F->hasFnAttribute(Attribute::NoRecurse),
1007 F->returnDoesNotAlias(),
1008 /* NoInline = */ false,
1009 F->hasFnAttribute(Attribute::AlwaysInline),
1010 F->hasFnAttribute(Attribute::NoUnwind),
1011 /* MayThrow */ true,
1012 /* HasUnknownCall */ true,
1013 /* MustBeUnreachable */ false},
1023 Index.addGlobalValueSummary(*GV, std::move(Summary));
1024 } else {
1025 std::unique_ptr<GlobalVarSummary> Summary =
1026 std::make_unique<GlobalVarSummary>(
1027 GVFlags,
1029 false, false, cast<GlobalVariable>(GV)->isConstant(),
1032 Index.addGlobalValueSummary(*GV, std::move(Summary));
1033 }
1034 });
1035 }
1036
1037 bool IsThinLTO = true;
1038 if (auto *MD =
1039 mdconst::extract_or_null<ConstantInt>(M.getModuleFlag("ThinLTO")))
1040 IsThinLTO = MD->getZExtValue();
1041
1042 // Compute summaries for all functions defined in module, and save in the
1043 // index.
1044 for (const auto &F : M) {
1045 if (F.isDeclaration())
1046 continue;
1047
1048 DominatorTree DT(const_cast<Function &>(F));
1049 BlockFrequencyInfo *BFI = nullptr;
1050 std::unique_ptr<BlockFrequencyInfo> BFIPtr;
1051 if (GetBFICallback)
1052 BFI = GetBFICallback(F);
1053 else if (F.hasProfileData()) {
1054 LoopInfo LI{DT};
1055 BranchProbabilityInfo BPI{F, LI};
1056 BFIPtr = std::make_unique<BlockFrequencyInfo>(F, BPI, LI);
1057 BFI = BFIPtr.get();
1058 }
1059
1060 computeFunctionSummary(Index, M, F, BFI, PSI, DT,
1061 !LocalsUsed.empty() || HasLocalInlineAsmSymbol,
1062 CantBePromoted, IsThinLTO, GetSSICallback);
1063 }
1064
1065 // Compute summaries for all variables defined in module, and save in the
1066 // index.
1068 for (const GlobalVariable &G : M.globals()) {
1069 if (G.isDeclaration())
1070 continue;
1071 computeVariableSummary(Index, G, CantBePromoted, M, Types);
1072 }
1073
1074 // Compute summaries for all aliases defined in module, and save in the
1075 // index.
1076 for (const GlobalAlias &A : M.aliases())
1077 computeAliasSummary(Index, A, CantBePromoted);
1078
1079 // Iterate through ifuncs, set their resolvers all alive.
1080 for (const GlobalIFunc &I : M.ifuncs()) {
1081 I.applyAlongResolverPath([&Index](const GlobalValue &GV) {
1082 Index.getGlobalValueSummary(GV)->setLive(true);
1083 });
1084 }
1085
1086 for (auto *V : LocalsUsed) {
1087 auto *Summary = Index.getGlobalValueSummary(*V);
1088 assert(Summary && "Missing summary for global value");
1089 Summary->setNotEligibleToImport();
1090 }
1091
1092 // The linker doesn't know about these LLVM produced values, so we need
1093 // to flag them as live in the index to ensure index-based dead value
1094 // analysis treats them as live roots of the analysis.
1095 setLiveRoot(Index, "llvm.used");
1096 setLiveRoot(Index, "llvm.compiler.used");
1097 setLiveRoot(Index, "llvm.global_ctors");
1098 setLiveRoot(Index, "llvm.global_dtors");
1099 setLiveRoot(Index, "llvm.global.annotations");
1100
1101 for (auto &GlobalList : Index) {
1102 // Ignore entries for references that are undefined in the current module.
1103 if (GlobalList.second.SummaryList.empty())
1104 continue;
1105
1106 assert(GlobalList.second.SummaryList.size() == 1 &&
1107 "Expected module's index to have one summary per GUID");
1108 auto &Summary = GlobalList.second.SummaryList[0];
1109 if (!IsThinLTO) {
1110 Summary->setNotEligibleToImport();
1111 continue;
1112 }
1113
1114 bool AllRefsCanBeExternallyReferenced =
1115 llvm::all_of(Summary->refs(), [&](const ValueInfo &VI) {
1116 return !CantBePromoted.count(VI.getGUID());
1117 });
1118 if (!AllRefsCanBeExternallyReferenced) {
1119 Summary->setNotEligibleToImport();
1120 continue;
1121 }
1122
1123 if (auto *FuncSummary = dyn_cast<FunctionSummary>(Summary.get())) {
1124 bool AllCallsCanBeExternallyReferenced = llvm::all_of(
1125 FuncSummary->calls(), [&](const FunctionSummary::EdgeTy &Edge) {
1126 return !CantBePromoted.count(Edge.first.getGUID());
1127 });
1128 if (!AllCallsCanBeExternallyReferenced)
1129 Summary->setNotEligibleToImport();
1130 }
1131 }
1132
1133 if (!ModuleSummaryDotFile.empty()) {
1134 std::error_code EC;
1135 raw_fd_ostream OSDot(ModuleSummaryDotFile, EC, sys::fs::OpenFlags::OF_Text);
1136 if (EC)
1137 report_fatal_error(Twine("Failed to open dot file ") +
1138 ModuleSummaryDotFile + ": " + EC.message() + "\n");
1139 Index.exportToDot(OSDot, {});
1140 }
1141
1142 return Index;
1143}
1144
1145AnalysisKey ModuleSummaryIndexAnalysis::Key;
1146
1150 auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
1151 bool NeedSSI = needsParamAccessSummary(M);
1153 M,
1154 [&FAM](const Function &F) {
1156 *const_cast<Function *>(&F));
1157 },
1158 &PSI,
1159 [&FAM, NeedSSI](const Function &F) -> const StackSafetyInfo * {
1160 return NeedSSI ? &FAM.getResult<StackSafetyAnalysis>(
1161 const_cast<Function &>(F))
1162 : nullptr;
1163 });
1164}
1165
1167
1169 "Module Summary Analysis", false, true)
1175
1177 return new ModuleSummaryIndexWrapperPass();
1178}
1179
1181 : ModulePass(ID) {}
1182
1184 auto *PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
1185 bool NeedSSI = needsParamAccessSummary(M);
1186 Index.emplace(buildModuleSummaryIndex(
1187 M,
1188 [this](const Function &F) {
1189 return &(this->getAnalysis<BlockFrequencyInfoWrapperPass>(
1190 *const_cast<Function *>(&F))
1191 .getBFI());
1192 },
1193 PSI,
1194 [&](const Function &F) -> const StackSafetyInfo * {
1195 return NeedSSI ? &getAnalysis<StackSafetyInfoWrapperPass>(
1196 const_cast<Function &>(F))
1197 .getResult()
1198 : nullptr;
1199 }));
1200 return false;
1201}
1202
1204 Index.reset();
1205 return false;
1206}
1207
1209 AU.setPreservesAll();
1213}
1214
1216
1218 const ModuleSummaryIndex *Index)
1219 : ImmutablePass(ID), Index(Index) {}
1220
1222 AnalysisUsage &AU) const {
1223 AU.setPreservesAll();
1224}
1225
1227 const ModuleSummaryIndex *Index) {
1229}
1230
1232 "Module summary info", false, true)
1233
1235 if (!CB)
1236 return false;
1237 if (CB->isDebugOrPseudoInst())
1238 return false;
1239 auto *CI = dyn_cast<CallInst>(CB);
1240 auto *CalledValue = CB->getCalledOperand();
1241 auto *CalledFunction = CB->getCalledFunction();
1242 if (CalledValue && !CalledFunction) {
1243 CalledValue = CalledValue->stripPointerCasts();
1244 // Stripping pointer casts can reveal a called function.
1245 CalledFunction = dyn_cast<Function>(CalledValue);
1246 }
1247 // Check if this is an alias to a function. If so, get the
1248 // called aliasee for the checks below.
1249 if (auto *GA = dyn_cast<GlobalAlias>(CalledValue)) {
1250 assert(!CalledFunction &&
1251 "Expected null called function in callsite for alias");
1252 CalledFunction = dyn_cast<Function>(GA->getAliaseeObject());
1253 }
1254 // Check if this is a direct call to a known function or a known
1255 // intrinsic, or an indirect call with profile data.
1256 if (CalledFunction) {
1257 if (CI && CalledFunction->isIntrinsic())
1258 return false;
1259 } else {
1260 // Skip indirect calls if we haven't enabled memprof ICP.
1262 return false;
1263 // Skip inline assembly calls.
1264 if (CI && CI->isInlineAsm())
1265 return false;
1266 // Skip direct calls via Constant.
1267 if (!CalledValue || isa<Constant>(CalledValue))
1268 return false;
1269 return true;
1270 }
1271 return true;
1272}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
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...
block Block Frequency Analysis
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
Definition: CommandLine.h:687
#define LLVM_ABI
Definition: Compiler.h:213
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseSet and SmallDenseSet classes.
std::string Name
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:55
#define I(x, y, z)
Definition: MD5.cpp:58
#define G(x, y, z)
Definition: MD5.cpp:56
This file implements a map that provides insertion order iteration.
This file contains the declarations for metadata subclasses.
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...
cl::opt< unsigned > MaxNumVTableAnnotations
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 cl::opt< bool > EnableMemProfIndirectCallSupport("enable-memprof-indirect-call-support", cl::init(true), cl::Hidden, cl::desc("Enable MemProf support for summarizing and cloning indirect calls"))
cl::opt< bool > MemProfReportHintedSizes
static bool isNonRenamableLocal(const GlobalValue &GV)
static void computeFunctionSummary(ModuleSummaryIndex &Index, const Module &M, const Function &F, BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI, DominatorTree &DT, bool HasLocalsInUsedOrAsm, DenseSet< GlobalValue::GUID > &CantBePromoted, bool IsThinLTO, std::function< const StackSafetyInfo *(const Function &F)> GetSSICallback)
LLVM_ABI cl::opt< bool > ScalePartialSampleProfileWorkingSetSize
static cl::opt< FunctionSummary::ForceSummaryHotnessType, true > FSEC("force-summary-edges-cold", cl::Hidden, cl::location(ForceSummaryEdgesCold), cl::desc("Force all edges in the function summary to cold"), cl::values(clEnumValN(FunctionSummary::FSHT_None, "none", "None."), clEnumValN(FunctionSummary::FSHT_AllNonCritical, "all-non-critical", "All non-critical edges."), clEnumValN(FunctionSummary::FSHT_All, "all", "All edges.")))
static bool mustBeUnreachableFunction(const Function &F)
static bool isNonVolatileStore(const Instruction *I)
module summary analysis
static cl::opt< std::string > ModuleSummaryDotFile("module-summary-dot-file", cl::Hidden, cl::value_desc("filename"), cl::desc("File to emit dot graph of new summary into"))
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
std::pair< BasicBlock *, BasicBlock * > Edge
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
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:255
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Definition: PassManager.h:412
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
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.
Definition: Constants.cpp:1911
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...
Definition: InstrTypes.h:1116
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
Definition: InstrTypes.h:1348
Value * getArgOperand(unsigned i) const
Definition: InstrTypes.h:1292
This class represents a function call, abstracting a target machine's calling convention.
This is an important base class in LLVM.
Definition: Constant.h:43
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:63
Implements a dense probed hash-table based set.
Definition: DenseSet.h:263
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition: Dominators.h:165
std::pair< ValueInfo, CalleeInfo > EdgeTy
<CalleeValueInfo, CalleeInfo> call edge pair.
ForceSummaryHotnessType
Types for -force-summary-edges-cold debugging option.
Class to represent profile counts.
Definition: Function.h:297
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
Definition: Function.h:244
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:77
bool isDSOLocal() const
Definition: GlobalValue.h:307
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:316
bool hasLocalLinkage() const
Definition: GlobalValue.h:530
GUID getGUID() const
Return a 64-bit global unique ID constructed from global value name (i.e.
Definition: GlobalValue.h:600
@ DefaultVisibility
The GV is visible.
Definition: GlobalValue.h:68
bool hasSection() const
Definition: GlobalValue.h:292
LLVM_ABI bool canBeOmittedFromSymbolTable() const
True if GV can be left out of the object symbol table.
Definition: Globals.cpp:444
@ InternalLinkage
Rename collisions when linking (static functions).
Definition: GlobalValue.h:60
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
MutableArrayRef< InstrProfValueData > getPromotionCandidatesForInstruction(const Instruction *I, uint64_t &TotalCount, uint32_t &NumCandidates)
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:285
An analysis over an "outer" IR unit that provides access to an analysis manager over an "inner" IR un...
Definition: PassManager.h:585
Metadata node.
Definition: Metadata.h:1077
const MDOperand & getOperand(unsigned I) const
Definition: Metadata.h:1445
unsigned getNumOperands() const
Return number of MDNode operands.
Definition: Metadata.h:1451
This class implements a map that also provides access to all stored values in a deterministic order.
Definition: MapVector.h:36
VectorType takeVector()
Clear the MapVector and return the underlying vector.
Definition: MapVector.h:48
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
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:67
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition: ArrayRef.h:303
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 std::optional< uint64_t > getProfileCount(const CallBase &CallInst, BlockFrequencyInfo *BFI, bool AllowSynthetic=false) const
Returns the profile count for CallInst.
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.
A vector that has set insertion semantics.
Definition: SetVector.h:59
bool remove(const value_type &X)
Remove an item from the set vector.
Definition: SetVector.h:198
size_type size() const
Determine the number of elements in the SetVector.
Definition: SetVector.h:104
void insert_range(Range &&R)
Definition: SetVector.h:193
Vector takeVector()
Clear the SetVector and return the underlying vector.
Definition: SetVector.h:93
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition: SetVector.h:168
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:401
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:541
bool empty() const
Definition: SmallVector.h:82
size_t size() const
Definition: SmallVector.h:79
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:574
iterator erase(const_iterator CI)
Definition: SmallVector.h:738
void push_back(const T &Elt)
Definition: SmallVector.h:414
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
StackSafetyInfo wrapper for the new pass manager.
StackSafetyInfo wrapper for the legacy pass manager.
Interface to access stack safety analysis results for single function.
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
Used to lazily calculate structure layout information for a target machine, based on the DataLayout s...
Definition: DataLayout.h:626
LLVM_ABI unsigned getElementContainingOffset(uint64_t FixedOffset) const
Given a valid byte offset into the structure, returns the structure index that contains it.
Definition: DataLayout.cpp:92
TypeSize getElementOffset(unsigned Idx) const
Definition: DataLayout.h:657
Class to represent struct types.
Definition: DerivedTypes.h:218
ArrayRef< Type * > elements() const
Definition: DerivedTypes.h:360
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:45
TypeID
Definitions of all of the base types for the Type system.
Definition: Type.h:54
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:256
iterator_range< use_iterator > uses()
Definition: Value.h:380
std::pair< iterator, bool > insert(const ValueT &V)
Definition: DenseSet.h:194
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:174
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.
Definition: raw_ostream.h:461
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
Definition: CommandLine.h:712
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:444
LocationClass< Ty > location(Ty &L)
Definition: CommandLine.h:464
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.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition: STLExtras.h:338
@ Offset
Definition: DWP.cpp:477
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:1744
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:2491
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.
FunctionSummary::ForceSummaryHotnessType ForceSummaryEdgesCold
bool needsParamAccessSummary(const Module &M)
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.
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
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:1751
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition: Error.cpp:167
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...
Definition: InstrProf.cpp:1402
LLVM_ABI ModulePass * createModuleSummaryIndexWrapperPass()
LLVM_ABI ImmutablePass * createImmutableModuleSummaryIndexWrapperPass(const ModuleSummaryIndex *Index)
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 ...
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:863
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.