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