xref: /llvm-project/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp (revision fae7b98c221b5b28797f7b56b656b6b819d99f27)
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 
14 #include "llvm/Analysis/ModuleSummaryAnalysis.h"
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"
20 #include "llvm/ADT/SmallPtrSet.h"
21 #include "llvm/ADT/SmallVector.h"
22 #include "llvm/ADT/StringRef.h"
23 #include "llvm/Analysis/BlockFrequencyInfo.h"
24 #include "llvm/Analysis/BranchProbabilityInfo.h"
25 #include "llvm/Analysis/IndirectCallPromotionAnalysis.h"
26 #include "llvm/Analysis/LoopInfo.h"
27 #include "llvm/Analysis/MemoryProfileInfo.h"
28 #include "llvm/Analysis/ProfileSummaryInfo.h"
29 #include "llvm/Analysis/StackSafetyAnalysis.h"
30 #include "llvm/Analysis/TypeMetadataUtils.h"
31 #include "llvm/IR/Attributes.h"
32 #include "llvm/IR/BasicBlock.h"
33 #include "llvm/IR/Constant.h"
34 #include "llvm/IR/Constants.h"
35 #include "llvm/IR/Dominators.h"
36 #include "llvm/IR/Function.h"
37 #include "llvm/IR/GlobalAlias.h"
38 #include "llvm/IR/GlobalValue.h"
39 #include "llvm/IR/GlobalVariable.h"
40 #include "llvm/IR/Instructions.h"
41 #include "llvm/IR/IntrinsicInst.h"
42 #include "llvm/IR/Metadata.h"
43 #include "llvm/IR/Module.h"
44 #include "llvm/IR/ModuleSummaryIndex.h"
45 #include "llvm/IR/Use.h"
46 #include "llvm/IR/User.h"
47 #include "llvm/InitializePasses.h"
48 #include "llvm/Object/ModuleSymbolTable.h"
49 #include "llvm/Object/SymbolicFile.h"
50 #include "llvm/Pass.h"
51 #include "llvm/Support/Casting.h"
52 #include "llvm/Support/CommandLine.h"
53 #include "llvm/Support/FileSystem.h"
54 #include <algorithm>
55 #include <cassert>
56 #include <cstdint>
57 #include <vector>
58 
59 using namespace llvm;
60 using namespace llvm::memprof;
61 
62 #define DEBUG_TYPE "module-summary-analysis"
63 
64 // Option to force edges cold which will block importing when the
65 // -import-cold-multiplier is set to 0. Useful for debugging.
66 namespace llvm {
67 FunctionSummary::ForceSummaryHotnessType ForceSummaryEdgesCold =
68     FunctionSummary::FSHT_None;
69 } // namespace llvm
70 
71 static cl::opt<FunctionSummary::ForceSummaryHotnessType, true> FSEC(
72     "force-summary-edges-cold", cl::Hidden, cl::location(ForceSummaryEdgesCold),
73     cl::desc("Force all edges in the function summary to cold"),
74     cl::values(clEnumValN(FunctionSummary::FSHT_None, "none", "None."),
75                clEnumValN(FunctionSummary::FSHT_AllNonCritical,
76                           "all-non-critical", "All non-critical edges."),
77                clEnumValN(FunctionSummary::FSHT_All, "all", "All edges.")));
78 
79 static cl::opt<std::string> ModuleSummaryDotFile(
80     "module-summary-dot-file", cl::Hidden, cl::value_desc("filename"),
81     cl::desc("File to emit dot graph of new summary into"));
82 
83 extern cl::opt<bool> ScalePartialSampleProfileWorkingSetSize;
84 
85 // Walk through the operands of a given User via worklist iteration and populate
86 // the set of GlobalValue references encountered. Invoked either on an
87 // Instruction or a GlobalVariable (which walks its initializer).
88 // Return true if any of the operands contains blockaddress. This is important
89 // to know when computing summary for global var, because if global variable
90 // references basic block address we can't import it separately from function
91 // containing that basic block. For simplicity we currently don't import such
92 // global vars at all. When importing function we aren't interested if any
93 // instruction in it takes an address of any basic block, because instruction
94 // can only take an address of basic block located in the same function.
95 static bool findRefEdges(ModuleSummaryIndex &Index, const User *CurUser,
96                          SetVector<ValueInfo, std::vector<ValueInfo>> &RefEdges,
97                          SmallPtrSet<const User *, 8> &Visited) {
98   bool HasBlockAddress = false;
99   SmallVector<const User *, 32> Worklist;
100   if (Visited.insert(CurUser).second)
101     Worklist.push_back(CurUser);
102 
103   while (!Worklist.empty()) {
104     const User *U = Worklist.pop_back_val();
105     const auto *CB = dyn_cast<CallBase>(U);
106 
107     for (const auto &OI : U->operands()) {
108       const User *Operand = dyn_cast<User>(OI);
109       if (!Operand)
110         continue;
111       if (isa<BlockAddress>(Operand)) {
112         HasBlockAddress = true;
113         continue;
114       }
115       if (auto *GV = dyn_cast<GlobalValue>(Operand)) {
116         // We have a reference to a global value. This should be added to
117         // the reference set unless it is a callee. Callees are handled
118         // specially by WriteFunction and are added to a separate list.
119         if (!(CB && CB->isCallee(&OI)))
120           RefEdges.insert(Index.getOrInsertValueInfo(GV));
121         continue;
122       }
123       if (Visited.insert(Operand).second)
124         Worklist.push_back(Operand);
125     }
126   }
127   return HasBlockAddress;
128 }
129 
130 static CalleeInfo::HotnessType getHotness(uint64_t ProfileCount,
131                                           ProfileSummaryInfo *PSI) {
132   if (!PSI)
133     return CalleeInfo::HotnessType::Unknown;
134   if (PSI->isHotCount(ProfileCount))
135     return CalleeInfo::HotnessType::Hot;
136   if (PSI->isColdCount(ProfileCount))
137     return CalleeInfo::HotnessType::Cold;
138   return CalleeInfo::HotnessType::None;
139 }
140 
141 static bool isNonRenamableLocal(const GlobalValue &GV) {
142   return GV.hasSection() && GV.hasLocalLinkage();
143 }
144 
145 /// Determine whether this call has all constant integer arguments (excluding
146 /// "this") and summarize it to VCalls or ConstVCalls as appropriate.
147 static void addVCallToSet(
148     DevirtCallSite Call, GlobalValue::GUID Guid,
149     SetVector<FunctionSummary::VFuncId, std::vector<FunctionSummary::VFuncId>>
150         &VCalls,
151     SetVector<FunctionSummary::ConstVCall,
152               std::vector<FunctionSummary::ConstVCall>> &ConstVCalls) {
153   std::vector<uint64_t> Args;
154   // Start from the second argument to skip the "this" pointer.
155   for (auto &Arg : drop_begin(Call.CB.args())) {
156     auto *CI = dyn_cast<ConstantInt>(Arg);
157     if (!CI || CI->getBitWidth() > 64) {
158       VCalls.insert({Guid, Call.Offset});
159       return;
160     }
161     Args.push_back(CI->getZExtValue());
162   }
163   ConstVCalls.insert({{Guid, Call.Offset}, std::move(Args)});
164 }
165 
166 /// If this intrinsic call requires that we add information to the function
167 /// summary, do so via the non-constant reference arguments.
168 static void addIntrinsicToSummary(
169     const CallInst *CI,
170     SetVector<GlobalValue::GUID, std::vector<GlobalValue::GUID>> &TypeTests,
171     SetVector<FunctionSummary::VFuncId, std::vector<FunctionSummary::VFuncId>>
172         &TypeTestAssumeVCalls,
173     SetVector<FunctionSummary::VFuncId, std::vector<FunctionSummary::VFuncId>>
174         &TypeCheckedLoadVCalls,
175     SetVector<FunctionSummary::ConstVCall,
176               std::vector<FunctionSummary::ConstVCall>>
177         &TypeTestAssumeConstVCalls,
178     SetVector<FunctionSummary::ConstVCall,
179               std::vector<FunctionSummary::ConstVCall>>
180         &TypeCheckedLoadConstVCalls,
181     DominatorTree &DT) {
182   switch (CI->getCalledFunction()->getIntrinsicID()) {
183   case Intrinsic::type_test:
184   case Intrinsic::public_type_test: {
185     auto *TypeMDVal = cast<MetadataAsValue>(CI->getArgOperand(1));
186     auto *TypeId = dyn_cast<MDString>(TypeMDVal->getMetadata());
187     if (!TypeId)
188       break;
189     GlobalValue::GUID Guid = GlobalValue::getGUID(TypeId->getString());
190 
191     // Produce a summary from type.test intrinsics. We only summarize type.test
192     // intrinsics that are used other than by an llvm.assume intrinsic.
193     // Intrinsics that are assumed are relevant only to the devirtualization
194     // pass, not the type test lowering pass.
195     bool HasNonAssumeUses = llvm::any_of(CI->uses(), [](const Use &CIU) {
196       return !isa<AssumeInst>(CIU.getUser());
197     });
198     if (HasNonAssumeUses)
199       TypeTests.insert(Guid);
200 
201     SmallVector<DevirtCallSite, 4> DevirtCalls;
202     SmallVector<CallInst *, 4> Assumes;
203     findDevirtualizableCallsForTypeTest(DevirtCalls, Assumes, CI, DT);
204     for (auto &Call : DevirtCalls)
205       addVCallToSet(Call, Guid, TypeTestAssumeVCalls,
206                     TypeTestAssumeConstVCalls);
207 
208     break;
209   }
210 
211   case Intrinsic::type_checked_load_relative:
212   case Intrinsic::type_checked_load: {
213     auto *TypeMDVal = cast<MetadataAsValue>(CI->getArgOperand(2));
214     auto *TypeId = dyn_cast<MDString>(TypeMDVal->getMetadata());
215     if (!TypeId)
216       break;
217     GlobalValue::GUID Guid = GlobalValue::getGUID(TypeId->getString());
218 
219     SmallVector<DevirtCallSite, 4> DevirtCalls;
220     SmallVector<Instruction *, 4> LoadedPtrs;
221     SmallVector<Instruction *, 4> Preds;
222     bool HasNonCallUses = false;
223     findDevirtualizableCallsForTypeCheckedLoad(DevirtCalls, LoadedPtrs, Preds,
224                                                HasNonCallUses, CI, DT);
225     // Any non-call uses of the result of llvm.type.checked.load will
226     // prevent us from optimizing away the llvm.type.test.
227     if (HasNonCallUses)
228       TypeTests.insert(Guid);
229     for (auto &Call : DevirtCalls)
230       addVCallToSet(Call, Guid, TypeCheckedLoadVCalls,
231                     TypeCheckedLoadConstVCalls);
232 
233     break;
234   }
235   default:
236     break;
237   }
238 }
239 
240 static bool isNonVolatileLoad(const Instruction *I) {
241   if (const auto *LI = dyn_cast<LoadInst>(I))
242     return !LI->isVolatile();
243 
244   return false;
245 }
246 
247 static bool isNonVolatileStore(const Instruction *I) {
248   if (const auto *SI = dyn_cast<StoreInst>(I))
249     return !SI->isVolatile();
250 
251   return false;
252 }
253 
254 // Returns true if the function definition must be unreachable.
255 //
256 // Note if this helper function returns true, `F` is guaranteed
257 // to be unreachable; if it returns false, `F` might still
258 // be unreachable but not covered by this helper function.
259 static bool mustBeUnreachableFunction(const Function &F) {
260   // A function must be unreachable if its entry block ends with an
261   // 'unreachable'.
262   assert(!F.isDeclaration());
263   return isa<UnreachableInst>(F.getEntryBlock().getTerminator());
264 }
265 
266 static void computeFunctionSummary(
267     ModuleSummaryIndex &Index, const Module &M, const Function &F,
268     BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI, DominatorTree &DT,
269     bool HasLocalsInUsedOrAsm, DenseSet<GlobalValue::GUID> &CantBePromoted,
270     bool IsThinLTO,
271     std::function<const StackSafetyInfo *(const Function &F)> GetSSICallback) {
272   // Summary not currently supported for anonymous functions, they should
273   // have been named.
274   assert(F.hasName());
275 
276   unsigned NumInsts = 0;
277   // Map from callee ValueId to profile count. Used to accumulate profile
278   // counts for all static calls to a given callee.
279   MapVector<ValueInfo, CalleeInfo, DenseMap<ValueInfo, unsigned>,
280             std::vector<std::pair<ValueInfo, CalleeInfo>>>
281       CallGraphEdges;
282   SetVector<ValueInfo, std::vector<ValueInfo>> RefEdges, LoadRefEdges,
283       StoreRefEdges;
284   SetVector<GlobalValue::GUID, std::vector<GlobalValue::GUID>> TypeTests;
285   SetVector<FunctionSummary::VFuncId, std::vector<FunctionSummary::VFuncId>>
286       TypeTestAssumeVCalls, TypeCheckedLoadVCalls;
287   SetVector<FunctionSummary::ConstVCall,
288             std::vector<FunctionSummary::ConstVCall>>
289       TypeTestAssumeConstVCalls, TypeCheckedLoadConstVCalls;
290   ICallPromotionAnalysis ICallAnalysis;
291   SmallPtrSet<const User *, 8> Visited;
292 
293   // Add personality function, prefix data and prologue data to function's ref
294   // list.
295   findRefEdges(Index, &F, RefEdges, Visited);
296   std::vector<const Instruction *> NonVolatileLoads;
297   std::vector<const Instruction *> NonVolatileStores;
298 
299   std::vector<CallsiteInfo> Callsites;
300   std::vector<AllocInfo> Allocs;
301 
302 #ifndef NDEBUG
303   DenseSet<const CallBase *> CallsThatMayHaveMemprofSummary;
304 #endif
305 
306   bool HasInlineAsmMaybeReferencingInternal = false;
307   bool HasIndirBranchToBlockAddress = false;
308   bool HasUnknownCall = false;
309   bool MayThrow = false;
310   for (const BasicBlock &BB : F) {
311     // We don't allow inlining of function with indirect branch to blockaddress.
312     // If the blockaddress escapes the function, e.g., via a global variable,
313     // inlining may lead to an invalid cross-function reference. So we shouldn't
314     // import such function either.
315     if (BB.hasAddressTaken()) {
316       for (User *U : BlockAddress::get(const_cast<BasicBlock *>(&BB))->users())
317         if (!isa<CallBrInst>(*U)) {
318           HasIndirBranchToBlockAddress = true;
319           break;
320         }
321     }
322 
323     for (const Instruction &I : BB) {
324       if (I.isDebugOrPseudoInst())
325         continue;
326       ++NumInsts;
327 
328       // Regular LTO module doesn't participate in ThinLTO import,
329       // so no reference from it can be read/writeonly, since this
330       // would require importing variable as local copy
331       if (IsThinLTO) {
332         if (isNonVolatileLoad(&I)) {
333           // Postpone processing of non-volatile load instructions
334           // See comments below
335           Visited.insert(&I);
336           NonVolatileLoads.push_back(&I);
337           continue;
338         } else if (isNonVolatileStore(&I)) {
339           Visited.insert(&I);
340           NonVolatileStores.push_back(&I);
341           // All references from second operand of store (destination address)
342           // can be considered write-only if they're not referenced by any
343           // non-store instruction. References from first operand of store
344           // (stored value) can't be treated either as read- or as write-only
345           // so we add them to RefEdges as we do with all other instructions
346           // except non-volatile load.
347           Value *Stored = I.getOperand(0);
348           if (auto *GV = dyn_cast<GlobalValue>(Stored))
349             // findRefEdges will try to examine GV operands, so instead
350             // of calling it we should add GV to RefEdges directly.
351             RefEdges.insert(Index.getOrInsertValueInfo(GV));
352           else if (auto *U = dyn_cast<User>(Stored))
353             findRefEdges(Index, U, RefEdges, Visited);
354           continue;
355         }
356       }
357       findRefEdges(Index, &I, RefEdges, Visited);
358       const auto *CB = dyn_cast<CallBase>(&I);
359       if (!CB) {
360         if (I.mayThrow())
361           MayThrow = true;
362         continue;
363       }
364 
365       const auto *CI = dyn_cast<CallInst>(&I);
366       // Since we don't know exactly which local values are referenced in inline
367       // assembly, conservatively mark the function as possibly referencing
368       // a local value from inline assembly to ensure we don't export a
369       // reference (which would require renaming and promotion of the
370       // referenced value).
371       if (HasLocalsInUsedOrAsm && CI && CI->isInlineAsm())
372         HasInlineAsmMaybeReferencingInternal = true;
373 
374       auto *CalledValue = CB->getCalledOperand();
375       auto *CalledFunction = CB->getCalledFunction();
376       if (CalledValue && !CalledFunction) {
377         CalledValue = CalledValue->stripPointerCasts();
378         // Stripping pointer casts can reveal a called function.
379         CalledFunction = dyn_cast<Function>(CalledValue);
380       }
381       // Check if this is an alias to a function. If so, get the
382       // called aliasee for the checks below.
383       if (auto *GA = dyn_cast<GlobalAlias>(CalledValue)) {
384         assert(!CalledFunction && "Expected null called function in callsite for alias");
385         CalledFunction = dyn_cast<Function>(GA->getAliaseeObject());
386       }
387       // Check if this is a direct call to a known function or a known
388       // intrinsic, or an indirect call with profile data.
389       if (CalledFunction) {
390         if (CI && CalledFunction->isIntrinsic()) {
391           addIntrinsicToSummary(
392               CI, TypeTests, TypeTestAssumeVCalls, TypeCheckedLoadVCalls,
393               TypeTestAssumeConstVCalls, TypeCheckedLoadConstVCalls, DT);
394           continue;
395         }
396         // We should have named any anonymous globals
397         assert(CalledFunction->hasName());
398         auto ScaledCount = PSI->getProfileCount(*CB, BFI);
399         auto Hotness = ScaledCount ? getHotness(*ScaledCount, PSI)
400                                    : CalleeInfo::HotnessType::Unknown;
401         if (ForceSummaryEdgesCold != FunctionSummary::FSHT_None)
402           Hotness = CalleeInfo::HotnessType::Cold;
403 
404         // Use the original CalledValue, in case it was an alias. We want
405         // to record the call edge to the alias in that case. Eventually
406         // an alias summary will be created to associate the alias and
407         // aliasee.
408         auto &ValueInfo = CallGraphEdges[Index.getOrInsertValueInfo(
409             cast<GlobalValue>(CalledValue))];
410         ValueInfo.updateHotness(Hotness);
411         // Add the relative block frequency to CalleeInfo if there is no profile
412         // information.
413         if (BFI != nullptr && Hotness == CalleeInfo::HotnessType::Unknown) {
414           uint64_t BBFreq = BFI->getBlockFreq(&BB).getFrequency();
415           uint64_t EntryFreq = BFI->getEntryFreq();
416           ValueInfo.updateRelBlockFreq(BBFreq, EntryFreq);
417         }
418       } else {
419         HasUnknownCall = true;
420         // Skip inline assembly calls.
421         if (CI && CI->isInlineAsm())
422           continue;
423         // Skip direct calls.
424         if (!CalledValue || isa<Constant>(CalledValue))
425           continue;
426 
427         // Check if the instruction has a callees metadata. If so, add callees
428         // to CallGraphEdges to reflect the references from the metadata, and
429         // to enable importing for subsequent indirect call promotion and
430         // inlining.
431         if (auto *MD = I.getMetadata(LLVMContext::MD_callees)) {
432           for (const auto &Op : MD->operands()) {
433             Function *Callee = mdconst::extract_or_null<Function>(Op);
434             if (Callee)
435               CallGraphEdges[Index.getOrInsertValueInfo(Callee)];
436           }
437         }
438 
439         uint32_t NumVals, NumCandidates;
440         uint64_t TotalCount;
441         auto CandidateProfileData =
442             ICallAnalysis.getPromotionCandidatesForInstruction(
443                 &I, NumVals, TotalCount, NumCandidates);
444         for (const auto &Candidate : CandidateProfileData)
445           CallGraphEdges[Index.getOrInsertValueInfo(Candidate.Value)]
446               .updateHotness(getHotness(Candidate.Count, PSI));
447       }
448 
449       // Summarize memprof related metadata. This is only needed for ThinLTO.
450       if (!IsThinLTO)
451         continue;
452 
453       // TODO: Skip indirect calls for now. Need to handle these better, likely
454       // by creating multiple Callsites, one per target, then speculatively
455       // devirtualize while applying clone info in the ThinLTO backends. This
456       // will also be important because we will have a different set of clone
457       // versions per target. This handling needs to match that in the ThinLTO
458       // backend so we handle things consistently for matching of callsite
459       // summaries to instructions.
460       if (!CalledFunction)
461         continue;
462 
463       // Ensure we keep this analysis in sync with the handling in the ThinLTO
464       // backend (see MemProfContextDisambiguation::applyImport). Save this call
465       // so that we can skip it in checking the reverse case later.
466       assert(mayHaveMemprofSummary(CB));
467 #ifndef NDEBUG
468       CallsThatMayHaveMemprofSummary.insert(CB);
469 #endif
470 
471       // Compute the list of stack ids first (so we can trim them from the stack
472       // ids on any MIBs).
473       CallStack<MDNode, MDNode::op_iterator> InstCallsite(
474           I.getMetadata(LLVMContext::MD_callsite));
475       auto *MemProfMD = I.getMetadata(LLVMContext::MD_memprof);
476       if (MemProfMD) {
477         std::vector<MIBInfo> MIBs;
478         for (auto &MDOp : MemProfMD->operands()) {
479           auto *MIBMD = cast<const MDNode>(MDOp);
480           MDNode *StackNode = getMIBStackNode(MIBMD);
481           assert(StackNode);
482           SmallVector<unsigned> StackIdIndices;
483           CallStack<MDNode, MDNode::op_iterator> StackContext(StackNode);
484           // Collapse out any on the allocation call (inlining).
485           for (auto ContextIter =
486                    StackContext.beginAfterSharedPrefix(InstCallsite);
487                ContextIter != StackContext.end(); ++ContextIter) {
488             unsigned StackIdIdx = Index.addOrGetStackIdIndex(*ContextIter);
489             // If this is a direct recursion, simply skip the duplicate
490             // entries. If this is mutual recursion, handling is left to
491             // the LTO link analysis client.
492             if (StackIdIndices.empty() || StackIdIndices.back() != StackIdIdx)
493               StackIdIndices.push_back(StackIdIdx);
494           }
495           MIBs.push_back(
496               MIBInfo(getMIBAllocType(MIBMD), std::move(StackIdIndices)));
497         }
498         Allocs.push_back(AllocInfo(std::move(MIBs)));
499       } else if (!InstCallsite.empty()) {
500         SmallVector<unsigned> StackIdIndices;
501         for (auto StackId : InstCallsite)
502           StackIdIndices.push_back(Index.addOrGetStackIdIndex(StackId));
503         // Use the original CalledValue, in case it was an alias. We want
504         // to record the call edge to the alias in that case. Eventually
505         // an alias summary will be created to associate the alias and
506         // aliasee.
507         auto CalleeValueInfo =
508             Index.getOrInsertValueInfo(cast<GlobalValue>(CalledValue));
509         Callsites.push_back({CalleeValueInfo, StackIdIndices});
510       }
511     }
512   }
513 
514   if (PSI->hasPartialSampleProfile() && ScalePartialSampleProfileWorkingSetSize)
515     Index.addBlockCount(F.size());
516 
517   std::vector<ValueInfo> Refs;
518   if (IsThinLTO) {
519     auto AddRefEdges = [&](const std::vector<const Instruction *> &Instrs,
520                            SetVector<ValueInfo, std::vector<ValueInfo>> &Edges,
521                            SmallPtrSet<const User *, 8> &Cache) {
522       for (const auto *I : Instrs) {
523         Cache.erase(I);
524         findRefEdges(Index, I, Edges, Cache);
525       }
526     };
527 
528     // By now we processed all instructions in a function, except
529     // non-volatile loads and non-volatile value stores. Let's find
530     // ref edges for both of instruction sets
531     AddRefEdges(NonVolatileLoads, LoadRefEdges, Visited);
532     // We can add some values to the Visited set when processing load
533     // instructions which are also used by stores in NonVolatileStores.
534     // For example this can happen if we have following code:
535     //
536     // store %Derived* @foo, %Derived** bitcast (%Base** @bar to %Derived**)
537     // %42 = load %Derived*, %Derived** bitcast (%Base** @bar to %Derived**)
538     //
539     // After processing loads we'll add bitcast to the Visited set, and if
540     // we use the same set while processing stores, we'll never see store
541     // to @bar and @bar will be mistakenly treated as readonly.
542     SmallPtrSet<const llvm::User *, 8> StoreCache;
543     AddRefEdges(NonVolatileStores, StoreRefEdges, StoreCache);
544 
545     // If both load and store instruction reference the same variable
546     // we won't be able to optimize it. Add all such reference edges
547     // to RefEdges set.
548     for (const auto &VI : StoreRefEdges)
549       if (LoadRefEdges.remove(VI))
550         RefEdges.insert(VI);
551 
552     unsigned RefCnt = RefEdges.size();
553     // All new reference edges inserted in two loops below are either
554     // read or write only. They will be grouped in the end of RefEdges
555     // vector, so we can use a single integer value to identify them.
556     for (const auto &VI : LoadRefEdges)
557       RefEdges.insert(VI);
558 
559     unsigned FirstWORef = RefEdges.size();
560     for (const auto &VI : StoreRefEdges)
561       RefEdges.insert(VI);
562 
563     Refs = RefEdges.takeVector();
564     for (; RefCnt < FirstWORef; ++RefCnt)
565       Refs[RefCnt].setReadOnly();
566 
567     for (; RefCnt < Refs.size(); ++RefCnt)
568       Refs[RefCnt].setWriteOnly();
569   } else {
570     Refs = RefEdges.takeVector();
571   }
572   // Explicit add hot edges to enforce importing for designated GUIDs for
573   // sample PGO, to enable the same inlines as the profiled optimized binary.
574   for (auto &I : F.getImportGUIDs())
575     CallGraphEdges[Index.getOrInsertValueInfo(I)].updateHotness(
576         ForceSummaryEdgesCold == FunctionSummary::FSHT_All
577             ? CalleeInfo::HotnessType::Cold
578             : CalleeInfo::HotnessType::Critical);
579 
580 #ifndef NDEBUG
581   // Make sure that all calls we decided could not have memprof summaries get a
582   // false value for mayHaveMemprofSummary, to ensure that this handling remains
583   // in sync with the ThinLTO backend handling.
584   if (IsThinLTO) {
585     for (const BasicBlock &BB : F) {
586       for (const Instruction &I : BB) {
587         const auto *CB = dyn_cast<CallBase>(&I);
588         if (!CB)
589           continue;
590         // We already checked these above.
591         if (CallsThatMayHaveMemprofSummary.count(CB))
592           continue;
593         assert(!mayHaveMemprofSummary(CB));
594       }
595     }
596   }
597 #endif
598 
599   bool NonRenamableLocal = isNonRenamableLocal(F);
600   bool NotEligibleForImport = NonRenamableLocal ||
601                               HasInlineAsmMaybeReferencingInternal ||
602                               HasIndirBranchToBlockAddress;
603   GlobalValueSummary::GVFlags Flags(
604       F.getLinkage(), F.getVisibility(), NotEligibleForImport,
605       /* Live = */ false, F.isDSOLocal(), F.canBeOmittedFromSymbolTable());
606   FunctionSummary::FFlags FunFlags{
607       F.doesNotAccessMemory(), F.onlyReadsMemory() && !F.doesNotAccessMemory(),
608       F.hasFnAttribute(Attribute::NoRecurse), F.returnDoesNotAlias(),
609       // FIXME: refactor this to use the same code that inliner is using.
610       // Don't try to import functions with noinline attribute.
611       F.getAttributes().hasFnAttr(Attribute::NoInline),
612       F.hasFnAttribute(Attribute::AlwaysInline),
613       F.hasFnAttribute(Attribute::NoUnwind), MayThrow, HasUnknownCall,
614       mustBeUnreachableFunction(F)};
615   std::vector<FunctionSummary::ParamAccess> ParamAccesses;
616   if (auto *SSI = GetSSICallback(F))
617     ParamAccesses = SSI->getParamAccesses(Index);
618   auto FuncSummary = std::make_unique<FunctionSummary>(
619       Flags, NumInsts, FunFlags, /*EntryCount=*/0, std::move(Refs),
620       CallGraphEdges.takeVector(), TypeTests.takeVector(),
621       TypeTestAssumeVCalls.takeVector(), TypeCheckedLoadVCalls.takeVector(),
622       TypeTestAssumeConstVCalls.takeVector(),
623       TypeCheckedLoadConstVCalls.takeVector(), std::move(ParamAccesses),
624       std::move(Callsites), std::move(Allocs));
625   if (NonRenamableLocal)
626     CantBePromoted.insert(F.getGUID());
627   Index.addGlobalValueSummary(F, std::move(FuncSummary));
628 }
629 
630 /// Find function pointers referenced within the given vtable initializer
631 /// (or subset of an initializer) \p I. The starting offset of \p I within
632 /// the vtable initializer is \p StartingOffset. Any discovered function
633 /// pointers are added to \p VTableFuncs along with their cumulative offset
634 /// within the initializer.
635 static void findFuncPointers(const Constant *I, uint64_t StartingOffset,
636                              const Module &M, ModuleSummaryIndex &Index,
637                              VTableFuncList &VTableFuncs) {
638   // First check if this is a function pointer.
639   if (I->getType()->isPointerTy()) {
640     auto C = I->stripPointerCasts();
641     auto A = dyn_cast<GlobalAlias>(C);
642     if (isa<Function>(C) || (A && isa<Function>(A->getAliasee()))) {
643       auto GV = dyn_cast<GlobalValue>(C);
644       assert(GV);
645       // We can disregard __cxa_pure_virtual as a possible call target, as
646       // calls to pure virtuals are UB.
647       if (GV && GV->getName() != "__cxa_pure_virtual")
648         VTableFuncs.push_back({Index.getOrInsertValueInfo(GV), StartingOffset});
649       return;
650     }
651   }
652 
653   // Walk through the elements in the constant struct or array and recursively
654   // look for virtual function pointers.
655   const DataLayout &DL = M.getDataLayout();
656   if (auto *C = dyn_cast<ConstantStruct>(I)) {
657     StructType *STy = dyn_cast<StructType>(C->getType());
658     assert(STy);
659     const StructLayout *SL = DL.getStructLayout(C->getType());
660 
661     for (auto EI : llvm::enumerate(STy->elements())) {
662       auto Offset = SL->getElementOffset(EI.index());
663       unsigned Op = SL->getElementContainingOffset(Offset);
664       findFuncPointers(cast<Constant>(I->getOperand(Op)),
665                        StartingOffset + Offset, M, Index, VTableFuncs);
666     }
667   } else if (auto *C = dyn_cast<ConstantArray>(I)) {
668     ArrayType *ATy = C->getType();
669     Type *EltTy = ATy->getElementType();
670     uint64_t EltSize = DL.getTypeAllocSize(EltTy);
671     for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) {
672       findFuncPointers(cast<Constant>(I->getOperand(i)),
673                        StartingOffset + i * EltSize, M, Index, VTableFuncs);
674     }
675   }
676 }
677 
678 // Identify the function pointers referenced by vtable definition \p V.
679 static void computeVTableFuncs(ModuleSummaryIndex &Index,
680                                const GlobalVariable &V, const Module &M,
681                                VTableFuncList &VTableFuncs) {
682   if (!V.isConstant())
683     return;
684 
685   findFuncPointers(V.getInitializer(), /*StartingOffset=*/0, M, Index,
686                    VTableFuncs);
687 
688 #ifndef NDEBUG
689   // Validate that the VTableFuncs list is ordered by offset.
690   uint64_t PrevOffset = 0;
691   for (auto &P : VTableFuncs) {
692     // The findVFuncPointers traversal should have encountered the
693     // functions in offset order. We need to use ">=" since PrevOffset
694     // starts at 0.
695     assert(P.VTableOffset >= PrevOffset);
696     PrevOffset = P.VTableOffset;
697   }
698 #endif
699 }
700 
701 /// Record vtable definition \p V for each type metadata it references.
702 static void
703 recordTypeIdCompatibleVtableReferences(ModuleSummaryIndex &Index,
704                                        const GlobalVariable &V,
705                                        SmallVectorImpl<MDNode *> &Types) {
706   for (MDNode *Type : Types) {
707     auto TypeID = Type->getOperand(1).get();
708 
709     uint64_t Offset =
710         cast<ConstantInt>(
711             cast<ConstantAsMetadata>(Type->getOperand(0))->getValue())
712             ->getZExtValue();
713 
714     if (auto *TypeId = dyn_cast<MDString>(TypeID))
715       Index.getOrInsertTypeIdCompatibleVtableSummary(TypeId->getString())
716           .push_back({Offset, Index.getOrInsertValueInfo(&V)});
717   }
718 }
719 
720 static void computeVariableSummary(ModuleSummaryIndex &Index,
721                                    const GlobalVariable &V,
722                                    DenseSet<GlobalValue::GUID> &CantBePromoted,
723                                    const Module &M,
724                                    SmallVectorImpl<MDNode *> &Types) {
725   SetVector<ValueInfo, std::vector<ValueInfo>> RefEdges;
726   SmallPtrSet<const User *, 8> Visited;
727   bool HasBlockAddress = findRefEdges(Index, &V, RefEdges, Visited);
728   bool NonRenamableLocal = isNonRenamableLocal(V);
729   GlobalValueSummary::GVFlags Flags(
730       V.getLinkage(), V.getVisibility(), NonRenamableLocal,
731       /* Live = */ false, V.isDSOLocal(), V.canBeOmittedFromSymbolTable());
732 
733   VTableFuncList VTableFuncs;
734   // If splitting is not enabled, then we compute the summary information
735   // necessary for index-based whole program devirtualization.
736   if (!Index.enableSplitLTOUnit()) {
737     Types.clear();
738     V.getMetadata(LLVMContext::MD_type, Types);
739     if (!Types.empty()) {
740       // Identify the function pointers referenced by this vtable definition.
741       computeVTableFuncs(Index, V, M, VTableFuncs);
742 
743       // Record this vtable definition for each type metadata it references.
744       recordTypeIdCompatibleVtableReferences(Index, V, Types);
745     }
746   }
747 
748   // Don't mark variables we won't be able to internalize as read/write-only.
749   bool CanBeInternalized =
750       !V.hasComdat() && !V.hasAppendingLinkage() && !V.isInterposable() &&
751       !V.hasAvailableExternallyLinkage() && !V.hasDLLExportStorageClass();
752   bool Constant = V.isConstant();
753   GlobalVarSummary::GVarFlags VarFlags(CanBeInternalized,
754                                        Constant ? false : CanBeInternalized,
755                                        Constant, V.getVCallVisibility());
756   auto GVarSummary = std::make_unique<GlobalVarSummary>(Flags, VarFlags,
757                                                          RefEdges.takeVector());
758   if (NonRenamableLocal)
759     CantBePromoted.insert(V.getGUID());
760   if (HasBlockAddress)
761     GVarSummary->setNotEligibleToImport();
762   if (!VTableFuncs.empty())
763     GVarSummary->setVTableFuncs(VTableFuncs);
764   Index.addGlobalValueSummary(V, std::move(GVarSummary));
765 }
766 
767 static void computeAliasSummary(ModuleSummaryIndex &Index, const GlobalAlias &A,
768                                 DenseSet<GlobalValue::GUID> &CantBePromoted) {
769   // Skip summary for indirect function aliases as summary for aliasee will not
770   // be emitted.
771   const GlobalObject *Aliasee = A.getAliaseeObject();
772   if (isa<GlobalIFunc>(Aliasee))
773     return;
774   bool NonRenamableLocal = isNonRenamableLocal(A);
775   GlobalValueSummary::GVFlags Flags(
776       A.getLinkage(), A.getVisibility(), NonRenamableLocal,
777       /* Live = */ false, A.isDSOLocal(), A.canBeOmittedFromSymbolTable());
778   auto AS = std::make_unique<AliasSummary>(Flags);
779   auto AliaseeVI = Index.getValueInfo(Aliasee->getGUID());
780   assert(AliaseeVI && "Alias expects aliasee summary to be available");
781   assert(AliaseeVI.getSummaryList().size() == 1 &&
782          "Expected a single entry per aliasee in per-module index");
783   AS->setAliasee(AliaseeVI, AliaseeVI.getSummaryList()[0].get());
784   if (NonRenamableLocal)
785     CantBePromoted.insert(A.getGUID());
786   Index.addGlobalValueSummary(A, std::move(AS));
787 }
788 
789 // Set LiveRoot flag on entries matching the given value name.
790 static void setLiveRoot(ModuleSummaryIndex &Index, StringRef Name) {
791   if (ValueInfo VI = Index.getValueInfo(GlobalValue::getGUID(Name)))
792     for (const auto &Summary : VI.getSummaryList())
793       Summary->setLive(true);
794 }
795 
796 ModuleSummaryIndex llvm::buildModuleSummaryIndex(
797     const Module &M,
798     std::function<BlockFrequencyInfo *(const Function &F)> GetBFICallback,
799     ProfileSummaryInfo *PSI,
800     std::function<const StackSafetyInfo *(const Function &F)> GetSSICallback) {
801   assert(PSI);
802   bool EnableSplitLTOUnit = false;
803   bool UnifiedLTO = false;
804   if (auto *MD = mdconst::extract_or_null<ConstantInt>(
805           M.getModuleFlag("EnableSplitLTOUnit")))
806     EnableSplitLTOUnit = MD->getZExtValue();
807   if (auto *MD =
808           mdconst::extract_or_null<ConstantInt>(M.getModuleFlag("UnifiedLTO")))
809     UnifiedLTO = MD->getZExtValue();
810   ModuleSummaryIndex Index(/*HaveGVs=*/true, EnableSplitLTOUnit, UnifiedLTO);
811 
812   // Identify the local values in the llvm.used and llvm.compiler.used sets,
813   // which should not be exported as they would then require renaming and
814   // promotion, but we may have opaque uses e.g. in inline asm. We collect them
815   // here because we use this information to mark functions containing inline
816   // assembly calls as not importable.
817   SmallPtrSet<GlobalValue *, 4> LocalsUsed;
818   SmallVector<GlobalValue *, 4> Used;
819   // First collect those in the llvm.used set.
820   collectUsedGlobalVariables(M, Used, /*CompilerUsed=*/false);
821   // Next collect those in the llvm.compiler.used set.
822   collectUsedGlobalVariables(M, Used, /*CompilerUsed=*/true);
823   DenseSet<GlobalValue::GUID> CantBePromoted;
824   for (auto *V : Used) {
825     if (V->hasLocalLinkage()) {
826       LocalsUsed.insert(V);
827       CantBePromoted.insert(V->getGUID());
828     }
829   }
830 
831   bool HasLocalInlineAsmSymbol = false;
832   if (!M.getModuleInlineAsm().empty()) {
833     // Collect the local values defined by module level asm, and set up
834     // summaries for these symbols so that they can be marked as NoRename,
835     // to prevent export of any use of them in regular IR that would require
836     // renaming within the module level asm. Note we don't need to create a
837     // summary for weak or global defs, as they don't need to be flagged as
838     // NoRename, and defs in module level asm can't be imported anyway.
839     // Also, any values used but not defined within module level asm should
840     // be listed on the llvm.used or llvm.compiler.used global and marked as
841     // referenced from there.
842     ModuleSymbolTable::CollectAsmSymbols(
843         M, [&](StringRef Name, object::BasicSymbolRef::Flags Flags) {
844           // Symbols not marked as Weak or Global are local definitions.
845           if (Flags & (object::BasicSymbolRef::SF_Weak |
846                        object::BasicSymbolRef::SF_Global))
847             return;
848           HasLocalInlineAsmSymbol = true;
849           GlobalValue *GV = M.getNamedValue(Name);
850           if (!GV)
851             return;
852           assert(GV->isDeclaration() && "Def in module asm already has definition");
853           GlobalValueSummary::GVFlags GVFlags(
854               GlobalValue::InternalLinkage, GlobalValue::DefaultVisibility,
855               /* NotEligibleToImport = */ true,
856               /* Live = */ true,
857               /* Local */ GV->isDSOLocal(), GV->canBeOmittedFromSymbolTable());
858           CantBePromoted.insert(GV->getGUID());
859           // Create the appropriate summary type.
860           if (Function *F = dyn_cast<Function>(GV)) {
861             std::unique_ptr<FunctionSummary> Summary =
862                 std::make_unique<FunctionSummary>(
863                     GVFlags, /*InstCount=*/0,
864                     FunctionSummary::FFlags{
865                         F->hasFnAttribute(Attribute::ReadNone),
866                         F->hasFnAttribute(Attribute::ReadOnly),
867                         F->hasFnAttribute(Attribute::NoRecurse),
868                         F->returnDoesNotAlias(),
869                         /* NoInline = */ false,
870                         F->hasFnAttribute(Attribute::AlwaysInline),
871                         F->hasFnAttribute(Attribute::NoUnwind),
872                         /* MayThrow */ true,
873                         /* HasUnknownCall */ true,
874                         /* MustBeUnreachable */ false},
875                     /*EntryCount=*/0, ArrayRef<ValueInfo>{},
876                     ArrayRef<FunctionSummary::EdgeTy>{},
877                     ArrayRef<GlobalValue::GUID>{},
878                     ArrayRef<FunctionSummary::VFuncId>{},
879                     ArrayRef<FunctionSummary::VFuncId>{},
880                     ArrayRef<FunctionSummary::ConstVCall>{},
881                     ArrayRef<FunctionSummary::ConstVCall>{},
882                     ArrayRef<FunctionSummary::ParamAccess>{},
883                     ArrayRef<CallsiteInfo>{}, ArrayRef<AllocInfo>{});
884             Index.addGlobalValueSummary(*GV, std::move(Summary));
885           } else {
886             std::unique_ptr<GlobalVarSummary> Summary =
887                 std::make_unique<GlobalVarSummary>(
888                     GVFlags,
889                     GlobalVarSummary::GVarFlags(
890                         false, false, cast<GlobalVariable>(GV)->isConstant(),
891                         GlobalObject::VCallVisibilityPublic),
892                     ArrayRef<ValueInfo>{});
893             Index.addGlobalValueSummary(*GV, std::move(Summary));
894           }
895         });
896   }
897 
898   bool IsThinLTO = true;
899   if (auto *MD =
900           mdconst::extract_or_null<ConstantInt>(M.getModuleFlag("ThinLTO")))
901     IsThinLTO = MD->getZExtValue();
902 
903   // Compute summaries for all functions defined in module, and save in the
904   // index.
905   for (const auto &F : M) {
906     if (F.isDeclaration())
907       continue;
908 
909     DominatorTree DT(const_cast<Function &>(F));
910     BlockFrequencyInfo *BFI = nullptr;
911     std::unique_ptr<BlockFrequencyInfo> BFIPtr;
912     if (GetBFICallback)
913       BFI = GetBFICallback(F);
914     else if (F.hasProfileData()) {
915       LoopInfo LI{DT};
916       BranchProbabilityInfo BPI{F, LI};
917       BFIPtr = std::make_unique<BlockFrequencyInfo>(F, BPI, LI);
918       BFI = BFIPtr.get();
919     }
920 
921     computeFunctionSummary(Index, M, F, BFI, PSI, DT,
922                            !LocalsUsed.empty() || HasLocalInlineAsmSymbol,
923                            CantBePromoted, IsThinLTO, GetSSICallback);
924   }
925 
926   // Compute summaries for all variables defined in module, and save in the
927   // index.
928   SmallVector<MDNode *, 2> Types;
929   for (const GlobalVariable &G : M.globals()) {
930     if (G.isDeclaration())
931       continue;
932     computeVariableSummary(Index, G, CantBePromoted, M, Types);
933   }
934 
935   // Compute summaries for all aliases defined in module, and save in the
936   // index.
937   for (const GlobalAlias &A : M.aliases())
938     computeAliasSummary(Index, A, CantBePromoted);
939 
940   // Iterate through ifuncs, set their resolvers all alive.
941   for (const GlobalIFunc &I : M.ifuncs()) {
942     I.applyAlongResolverPath([&Index](const GlobalValue &GV) {
943       Index.getGlobalValueSummary(GV)->setLive(true);
944     });
945   }
946 
947   for (auto *V : LocalsUsed) {
948     auto *Summary = Index.getGlobalValueSummary(*V);
949     assert(Summary && "Missing summary for global value");
950     Summary->setNotEligibleToImport();
951   }
952 
953   // The linker doesn't know about these LLVM produced values, so we need
954   // to flag them as live in the index to ensure index-based dead value
955   // analysis treats them as live roots of the analysis.
956   setLiveRoot(Index, "llvm.used");
957   setLiveRoot(Index, "llvm.compiler.used");
958   setLiveRoot(Index, "llvm.global_ctors");
959   setLiveRoot(Index, "llvm.global_dtors");
960   setLiveRoot(Index, "llvm.global.annotations");
961 
962   for (auto &GlobalList : Index) {
963     // Ignore entries for references that are undefined in the current module.
964     if (GlobalList.second.SummaryList.empty())
965       continue;
966 
967     assert(GlobalList.second.SummaryList.size() == 1 &&
968            "Expected module's index to have one summary per GUID");
969     auto &Summary = GlobalList.second.SummaryList[0];
970     if (!IsThinLTO) {
971       Summary->setNotEligibleToImport();
972       continue;
973     }
974 
975     bool AllRefsCanBeExternallyReferenced =
976         llvm::all_of(Summary->refs(), [&](const ValueInfo &VI) {
977           return !CantBePromoted.count(VI.getGUID());
978         });
979     if (!AllRefsCanBeExternallyReferenced) {
980       Summary->setNotEligibleToImport();
981       continue;
982     }
983 
984     if (auto *FuncSummary = dyn_cast<FunctionSummary>(Summary.get())) {
985       bool AllCallsCanBeExternallyReferenced = llvm::all_of(
986           FuncSummary->calls(), [&](const FunctionSummary::EdgeTy &Edge) {
987             return !CantBePromoted.count(Edge.first.getGUID());
988           });
989       if (!AllCallsCanBeExternallyReferenced)
990         Summary->setNotEligibleToImport();
991     }
992   }
993 
994   if (!ModuleSummaryDotFile.empty()) {
995     std::error_code EC;
996     raw_fd_ostream OSDot(ModuleSummaryDotFile, EC, sys::fs::OpenFlags::OF_None);
997     if (EC)
998       report_fatal_error(Twine("Failed to open dot file ") +
999                          ModuleSummaryDotFile + ": " + EC.message() + "\n");
1000     Index.exportToDot(OSDot, {});
1001   }
1002 
1003   return Index;
1004 }
1005 
1006 AnalysisKey ModuleSummaryIndexAnalysis::Key;
1007 
1008 ModuleSummaryIndex
1009 ModuleSummaryIndexAnalysis::run(Module &M, ModuleAnalysisManager &AM) {
1010   ProfileSummaryInfo &PSI = AM.getResult<ProfileSummaryAnalysis>(M);
1011   auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
1012   bool NeedSSI = needsParamAccessSummary(M);
1013   return buildModuleSummaryIndex(
1014       M,
1015       [&FAM](const Function &F) {
1016         return &FAM.getResult<BlockFrequencyAnalysis>(
1017             *const_cast<Function *>(&F));
1018       },
1019       &PSI,
1020       [&FAM, NeedSSI](const Function &F) -> const StackSafetyInfo * {
1021         return NeedSSI ? &FAM.getResult<StackSafetyAnalysis>(
1022                              const_cast<Function &>(F))
1023                        : nullptr;
1024       });
1025 }
1026 
1027 char ModuleSummaryIndexWrapperPass::ID = 0;
1028 
1029 INITIALIZE_PASS_BEGIN(ModuleSummaryIndexWrapperPass, "module-summary-analysis",
1030                       "Module Summary Analysis", false, true)
1031 INITIALIZE_PASS_DEPENDENCY(BlockFrequencyInfoWrapperPass)
1032 INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
1033 INITIALIZE_PASS_DEPENDENCY(StackSafetyInfoWrapperPass)
1034 INITIALIZE_PASS_END(ModuleSummaryIndexWrapperPass, "module-summary-analysis",
1035                     "Module Summary Analysis", false, true)
1036 
1037 ModulePass *llvm::createModuleSummaryIndexWrapperPass() {
1038   return new ModuleSummaryIndexWrapperPass();
1039 }
1040 
1041 ModuleSummaryIndexWrapperPass::ModuleSummaryIndexWrapperPass()
1042     : ModulePass(ID) {
1043   initializeModuleSummaryIndexWrapperPassPass(*PassRegistry::getPassRegistry());
1044 }
1045 
1046 bool ModuleSummaryIndexWrapperPass::runOnModule(Module &M) {
1047   auto *PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
1048   bool NeedSSI = needsParamAccessSummary(M);
1049   Index.emplace(buildModuleSummaryIndex(
1050       M,
1051       [this](const Function &F) {
1052         return &(this->getAnalysis<BlockFrequencyInfoWrapperPass>(
1053                          *const_cast<Function *>(&F))
1054                      .getBFI());
1055       },
1056       PSI,
1057       [&](const Function &F) -> const StackSafetyInfo * {
1058         return NeedSSI ? &getAnalysis<StackSafetyInfoWrapperPass>(
1059                               const_cast<Function &>(F))
1060                               .getResult()
1061                        : nullptr;
1062       }));
1063   return false;
1064 }
1065 
1066 bool ModuleSummaryIndexWrapperPass::doFinalization(Module &M) {
1067   Index.reset();
1068   return false;
1069 }
1070 
1071 void ModuleSummaryIndexWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
1072   AU.setPreservesAll();
1073   AU.addRequired<BlockFrequencyInfoWrapperPass>();
1074   AU.addRequired<ProfileSummaryInfoWrapperPass>();
1075   AU.addRequired<StackSafetyInfoWrapperPass>();
1076 }
1077 
1078 char ImmutableModuleSummaryIndexWrapperPass::ID = 0;
1079 
1080 ImmutableModuleSummaryIndexWrapperPass::ImmutableModuleSummaryIndexWrapperPass(
1081     const ModuleSummaryIndex *Index)
1082     : ImmutablePass(ID), Index(Index) {
1083   initializeImmutableModuleSummaryIndexWrapperPassPass(
1084       *PassRegistry::getPassRegistry());
1085 }
1086 
1087 void ImmutableModuleSummaryIndexWrapperPass::getAnalysisUsage(
1088     AnalysisUsage &AU) const {
1089   AU.setPreservesAll();
1090 }
1091 
1092 ImmutablePass *llvm::createImmutableModuleSummaryIndexWrapperPass(
1093     const ModuleSummaryIndex *Index) {
1094   return new ImmutableModuleSummaryIndexWrapperPass(Index);
1095 }
1096 
1097 INITIALIZE_PASS(ImmutableModuleSummaryIndexWrapperPass, "module-summary-info",
1098                 "Module summary info", false, true)
1099 
1100 bool llvm::mayHaveMemprofSummary(const CallBase *CB) {
1101   if (!CB)
1102     return false;
1103   if (CB->isDebugOrPseudoInst())
1104     return false;
1105   auto *CI = dyn_cast<CallInst>(CB);
1106   auto *CalledValue = CB->getCalledOperand();
1107   auto *CalledFunction = CB->getCalledFunction();
1108   if (CalledValue && !CalledFunction) {
1109     CalledValue = CalledValue->stripPointerCasts();
1110     // Stripping pointer casts can reveal a called function.
1111     CalledFunction = dyn_cast<Function>(CalledValue);
1112   }
1113   // Check if this is an alias to a function. If so, get the
1114   // called aliasee for the checks below.
1115   if (auto *GA = dyn_cast<GlobalAlias>(CalledValue)) {
1116     assert(!CalledFunction &&
1117            "Expected null called function in callsite for alias");
1118     CalledFunction = dyn_cast<Function>(GA->getAliaseeObject());
1119   }
1120   // Check if this is a direct call to a known function or a known
1121   // intrinsic, or an indirect call with profile data.
1122   if (CalledFunction) {
1123     if (CI && CalledFunction->isIntrinsic())
1124       return false;
1125   } else {
1126     // TODO: For now skip indirect calls. See comments in
1127     // computeFunctionSummary for what is needed to handle this.
1128     return false;
1129   }
1130   return true;
1131 }
1132