LLVM 23.0.0git
GlobalsModRef.cpp
Go to the documentation of this file.
1//===- GlobalsModRef.cpp - Simple Mod/Ref Analysis for Globals ------------===//
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 simple pass provides alias and mod/ref information for global values
10// that do not have their address taken, and keeps track of whether functions
11// read or write memory (are "pure"). For this simple (but very common) case,
12// we can provide pretty accurate and useful information.
13//
14//===----------------------------------------------------------------------===//
15
19#include "llvm/ADT/Statistic.h"
24#include "llvm/IR/Constants.h"
27#include "llvm/IR/Module.h"
28#include "llvm/IR/PassManager.h"
30#include "llvm/Pass.h"
32
33using namespace llvm;
34
35#define DEBUG_TYPE "globalsmodref-aa"
36
37STATISTIC(NumNonAddrTakenGlobalVars,
38 "Number of global vars without address taken");
39STATISTIC(NumNonAddrTakenFunctions,"Number of functions without address taken");
40STATISTIC(NumNoMemFunctions, "Number of functions that do not access memory");
41STATISTIC(NumReadMemFunctions, "Number of functions that only read memory");
42STATISTIC(NumIndirectGlobalVars, "Number of indirect global objects");
43
44// An option to enable unsafe alias results from the GlobalsModRef analysis.
45// When enabled, GlobalsModRef will provide no-alias results which in extremely
46// rare cases may not be conservatively correct. In particular, in the face of
47// transforms which cause asymmetry between how effective getUnderlyingObject
48// is for two pointers, it may produce incorrect results.
49//
50// These unsafe results have been returned by GMR for many years without
51// causing significant issues in the wild and so we provide a mechanism to
52// re-enable them for users of LLVM that have a particular performance
53// sensitivity and no known issues. The option also makes it easy to evaluate
54// the performance impact of these results.
56 "enable-unsafe-globalsmodref-alias-results", cl::init(false), cl::Hidden);
57
58/// The mod/ref information collected for a particular function.
59///
60/// We collect information about mod/ref behavior of a function here, both in
61/// general and as pertains to specific globals. We only have this detailed
62/// information when we know *something* useful about the behavior. If we
63/// saturate to fully general mod/ref, we remove the info for the function.
66
67 /// Build a wrapper struct that has 8-byte alignment. All heap allocations
68 /// should provide this much alignment at least, but this makes it clear we
69 /// specifically rely on this amount of alignment.
70 struct alignas(8) AlignedMap {
71 AlignedMap() = default;
72 AlignedMap(const AlignedMap &Arg) = default;
73 GlobalInfoMapType Map;
74 };
75
76 /// Pointer traits for our aligned map.
77 struct AlignedMapPointerTraits {
78 static inline void *getAsVoidPointer(AlignedMap *P) { return P; }
79 static inline AlignedMap *getFromVoidPointer(void *P) {
80 return (AlignedMap *)P;
81 }
82 static constexpr int NumLowBitsAvailable = 3;
83 static_assert(alignof(AlignedMap) >= (1 << NumLowBitsAvailable),
84 "AlignedMap insufficiently aligned to have enough low bits.");
85 };
86
87 /// The bit that flags that this function may read any global. This is
88 /// chosen to mix together with ModRefInfo bits.
89 /// FIXME: This assumes ModRefInfo lattice will remain 4 bits!
90 /// FunctionInfo.getModRefInfo() masks out everything except ModRef so
91 /// this remains correct.
92 enum { MayReadAnyGlobal = 4 };
93
94 /// Checks to document the invariants of the bit packing here.
95 static_assert((MayReadAnyGlobal & static_cast<int>(ModRefInfo::ModRef)) == 0,
96 "ModRef and the MayReadAnyGlobal flag bits overlap.");
97 static_assert(((MayReadAnyGlobal | static_cast<int>(ModRefInfo::ModRef)) >>
98 AlignedMapPointerTraits::NumLowBitsAvailable) == 0,
99 "Insufficient low bits to store our flag and ModRef info.");
100
101public:
102 FunctionInfo() = default;
104 delete Info.getPointer();
105 }
106 // Spell out the copy ond move constructors and assignment operators to get
107 // deep copy semantics and correct move semantics in the face of the
108 // pointer-int pair.
110 : Info(nullptr, Arg.Info.getInt()) {
111 if (const auto *ArgPtr = Arg.Info.getPointer())
112 Info.setPointer(new AlignedMap(*ArgPtr));
113 }
115 : Info(Arg.Info.getPointer(), Arg.Info.getInt()) {
116 Arg.Info.setPointerAndInt(nullptr, 0);
117 }
119 delete Info.getPointer();
120 Info.setPointerAndInt(nullptr, RHS.Info.getInt());
121 if (const auto *RHSPtr = RHS.Info.getPointer())
122 Info.setPointer(new AlignedMap(*RHSPtr));
123 return *this;
124 }
126 delete Info.getPointer();
127 Info.setPointerAndInt(RHS.Info.getPointer(), RHS.Info.getInt());
128 RHS.Info.setPointerAndInt(nullptr, 0);
129 return *this;
130 }
131
132 /// This method clears MayReadAnyGlobal bit added by GlobalsAAResult to return
133 /// the corresponding ModRefInfo.
135 return ModRefInfo(I & static_cast<int>(ModRefInfo::ModRef));
136 }
137
138 /// Returns the \c ModRefInfo info for this function.
140 return globalClearMayReadAnyGlobal(Info.getInt());
141 }
142
143 /// Adds new \c ModRefInfo for this function to its state.
145 Info.setInt(Info.getInt() | static_cast<int>(NewMRI));
146 }
147
148 /// Returns whether this function may read any global variable, and we don't
149 /// know which global.
150 bool mayReadAnyGlobal() const { return Info.getInt() & MayReadAnyGlobal; }
151
152 /// Sets this function as potentially reading from any global.
153 void setMayReadAnyGlobal() { Info.setInt(Info.getInt() | MayReadAnyGlobal); }
154
155 /// Returns the \c ModRefInfo info for this function w.r.t. a particular
156 /// global, which may be more precise than the general information above.
158 ModRefInfo GlobalMRI =
160 if (AlignedMap *P = Info.getPointer()) {
161 auto I = P->Map.find(&GV);
162 if (I != P->Map.end())
163 GlobalMRI |= I->second;
164 }
165 return GlobalMRI;
166 }
167
168 /// Add mod/ref info from another function into ours, saturating towards
169 /// ModRef.
172
173 if (FI.mayReadAnyGlobal())
175
176 if (AlignedMap *P = FI.Info.getPointer())
177 for (const auto &G : P->Map)
178 addModRefInfoForGlobal(*G.first, G.second);
179 }
180
182 AlignedMap *P = Info.getPointer();
183 if (!P) {
184 P = new AlignedMap();
185 Info.setPointer(P);
186 }
187 auto &GlobalMRI = P->Map[&GV];
188 GlobalMRI |= NewMRI;
189 }
190
191 /// Clear a global's ModRef info. Should be used when a global is being
192 /// deleted.
194 if (AlignedMap *P = Info.getPointer())
195 P->Map.erase(&GV);
196 }
197
198private:
199 /// All of the information is encoded into a single pointer, with a three bit
200 /// integer in the low three bits. The high bit provides a flag for when this
201 /// function may read any global. The low two bits are the ModRefInfo. And
202 /// the pointer, when non-null, points to a map from GlobalValue to
203 /// ModRefInfo specific to that GlobalValue.
205};
206
207void GlobalsAAResult::DeletionCallbackHandle::deleted() {
208 Value *V = getValPtr();
209 if (auto *F = dyn_cast<Function>(V))
210 GAR->FunctionInfos.erase(F);
211
212 if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
213 if (GAR->NonAddressTakenGlobals.erase(GV)) {
214 // This global might be an indirect global. If so, remove it and
215 // remove any AllocRelatedValues for it.
216 if (GAR->IndirectGlobals.erase(GV)) {
217 // Remove any entries in AllocsForIndirectGlobals for this global.
218 GAR->AllocsForIndirectGlobals.remove_if(
219 [GV](const auto &Entry) { return Entry.second == GV; });
220 }
221
222 // Scan the function info we have collected and remove this global
223 // from all of them.
224 for (auto &FIPair : GAR->FunctionInfos)
225 FIPair.second.eraseModRefInfoForGlobal(*GV);
226 }
227 }
228
229 // If this is an allocation related to an indirect global, remove it.
230 GAR->AllocsForIndirectGlobals.erase(V);
231
232 // And clear out the handle.
233 setValPtr(nullptr);
234 GAR->Handles.erase(I);
235 // This object is now destroyed!
236}
237
239 if (FunctionInfo *FI = getFunctionInfo(F))
240 return MemoryEffects(FI->getModRefInfo());
241
242 return MemoryEffects::unknown();
243}
244
245/// Returns the function info for the function, or null if we don't have
246/// anything useful to say about it.
248GlobalsAAResult::getFunctionInfo(const Function *F) {
249 auto I = FunctionInfos.find(F);
250 if (I != FunctionInfos.end())
251 return &I->second;
252 return nullptr;
253}
254
255/// AnalyzeGlobals - Scan through the users of all of the internal
256/// GlobalValue's in the program. If none of them have their "address taken"
257/// (really, their address passed to something nontrivial), record this fact,
258/// and record the functions that they are used directly in.
259void GlobalsAAResult::AnalyzeGlobals(Module &M) {
260 SmallPtrSet<Function *, 32> TrackedFunctions;
261 for (Function &F : M)
262 if (F.hasLocalLinkage()) {
263 if (!AnalyzeUsesOfPointer(&F)) {
264 // Remember that we are tracking this global.
265 NonAddressTakenGlobals.insert(&F);
266 TrackedFunctions.insert(&F);
267 Handles.emplace_front(*this, &F);
268 Handles.front().I = Handles.begin();
269 ++NumNonAddrTakenFunctions;
270 } else
271 UnknownFunctionsWithLocalLinkage = true;
272 }
273
274 SmallPtrSet<Function *, 16> Readers, Writers;
275 for (GlobalVariable &GV : M.globals())
276 if (GV.hasLocalLinkage()) {
277 if (!AnalyzeUsesOfPointer(&GV, &Readers,
278 GV.isConstant() ? nullptr : &Writers)) {
279 // Remember that we are tracking this global, and the mod/ref fns
280 NonAddressTakenGlobals.insert(&GV);
281 Handles.emplace_front(*this, &GV);
282 Handles.front().I = Handles.begin();
283
284 for (Function *Reader : Readers) {
285 if (TrackedFunctions.insert(Reader).second) {
286 Handles.emplace_front(*this, Reader);
287 Handles.front().I = Handles.begin();
288 }
289 FunctionInfos[Reader].addModRefInfoForGlobal(GV, ModRefInfo::Ref);
290 }
291
292 if (!GV.isConstant()) // No need to keep track of writers to constants
293 for (Function *Writer : Writers) {
294 if (TrackedFunctions.insert(Writer).second) {
295 Handles.emplace_front(*this, Writer);
296 Handles.front().I = Handles.begin();
297 }
298 FunctionInfos[Writer].addModRefInfoForGlobal(GV, ModRefInfo::Mod);
299 }
300 ++NumNonAddrTakenGlobalVars;
301
302 // If this global holds a pointer type, see if it is an indirect global.
303 if (GV.getValueType()->isPointerTy() &&
304 AnalyzeIndirectGlobalMemory(&GV))
305 ++NumIndirectGlobalVars;
306 }
307 Readers.clear();
308 Writers.clear();
309 }
310}
311
312/// AnalyzeUsesOfPointer - Look at all of the users of the specified pointer.
313/// If this is used by anything complex (i.e., the address escapes), return
314/// true. Also, while we are at it, keep track of those functions that read and
315/// write to the value.
316///
317/// If OkayStoreDest is non-null, stores into this global are allowed.
318bool GlobalsAAResult::AnalyzeUsesOfPointer(Value *V,
319 SmallPtrSetImpl<Function *> *Readers,
320 SmallPtrSetImpl<Function *> *Writers,
321 GlobalValue *OkayStoreDest) {
322 if (!V->getType()->isPointerTy())
323 return true;
324
325 for (Use &U : V->uses()) {
326 User *I = U.getUser();
327 if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
328 if (Readers)
329 Readers->insert(LI->getParent()->getParent());
330 } else if (StoreInst *SI = dyn_cast<StoreInst>(I)) {
331 if (V == SI->getOperand(1)) {
332 if (Writers)
333 Writers->insert(SI->getParent()->getParent());
334 } else if (SI->getOperand(1) != OkayStoreDest) {
335 return true; // Storing the pointer
336 }
337 } else if (Operator::getOpcode(I) == Instruction::GetElementPtr) {
338 if (AnalyzeUsesOfPointer(I, Readers, Writers))
339 return true;
340 } else if (Operator::getOpcode(I) == Instruction::BitCast ||
341 Operator::getOpcode(I) == Instruction::AddrSpaceCast) {
342 if (AnalyzeUsesOfPointer(I, Readers, Writers, OkayStoreDest))
343 return true;
344 } else if (auto *Call = dyn_cast<CallBase>(I)) {
345 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
346 if (II->getIntrinsicID() == Intrinsic::threadlocal_address &&
347 V == II->getArgOperand(0)) {
348 if (AnalyzeUsesOfPointer(II, Readers, Writers))
349 return true;
350 continue;
351 }
352 }
353 // Make sure that this is just the function being called, not that it is
354 // passing into the function.
355 if (Call->isDataOperand(&U)) {
356 // Detect calls to free.
357 if (Call->isArgOperand(&U) &&
358 getFreedOperand(Call, &GetTLI(*Call->getFunction())) == U) {
359 if (Writers)
360 Writers->insert(Call->getParent()->getParent());
361 } else {
362 // In general, we return true for unknown calls, but there are
363 // some simple checks that we can do for functions that
364 // will never call back into the module.
365 auto *F = Call->getCalledFunction();
366 // TODO: we should be able to remove isDeclaration() check
367 // and let the function body analysis check for captures,
368 // and collect the mod-ref effects. This information will
369 // be later propagated via the call graph.
370 if (!F || !F->isDeclaration())
371 return true;
372 // Note that the NoCallback check here is a little bit too
373 // conservative. If there are no captures of the global
374 // in the module, then this call may not be a capture even
375 // if it does not have NoCallback.
376 if (!Call->hasFnAttr(Attribute::NoCallback) ||
377 !Call->isArgOperand(&U) ||
379 return true;
380
381 // Conservatively, assume the call reads and writes the global.
382 // We could use memory attributes to make it more precise.
383 if (Readers)
384 Readers->insert(Call->getParent()->getParent());
385 if (Writers)
386 Writers->insert(Call->getParent()->getParent());
387 }
388 }
389 } else if (ICmpInst *ICI = dyn_cast<ICmpInst>(I)) {
390 if (!isa<ConstantPointerNull>(ICI->getOperand(1)))
391 return true; // Allow comparison against null.
392 } else if (Constant *C = dyn_cast<Constant>(I)) {
393 // Ignore constants which don't have any live uses.
394 if (isa<GlobalValue>(C) || C->isConstantUsed())
395 return true;
396 } else {
397 return true;
398 }
399 }
400
401 return false;
402}
403
404/// AnalyzeIndirectGlobalMemory - We found an non-address-taken global variable
405/// which holds a pointer type. See if the global always points to non-aliased
406/// heap memory: that is, all initializers of the globals store a value known
407/// to be obtained via a noalias return function call which have no other use.
408/// Further, all loads out of GV must directly use the memory, not store the
409/// pointer somewhere. If this is true, we consider the memory pointed to by
410/// GV to be owned by GV and can disambiguate other pointers from it.
411bool GlobalsAAResult::AnalyzeIndirectGlobalMemory(GlobalVariable *GV) {
412 // Keep track of values related to the allocation of the memory, f.e. the
413 // value produced by the noalias call and any casts.
414 std::vector<Value *> AllocRelatedValues;
415
416 // If the initializer is a non-null pointer, bail.
417 if (Constant *C = GV->getInitializer())
419 return false;
420
421 // Walk the user list of the global. If we find anything other than a direct
422 // load or store, bail out.
423 for (User *U : GV->users()) {
424 if (LoadInst *LI = dyn_cast<LoadInst>(U)) {
425 // The pointer loaded from the global can only be used in simple ways:
426 // we allow addressing of it and loading storing to it. We do *not* allow
427 // storing the loaded pointer somewhere else or passing to a function.
428 if (AnalyzeUsesOfPointer(LI))
429 return false; // Loaded pointer escapes.
430 // TODO: Could try some IP mod/ref of the loaded pointer.
431 } else if (StoreInst *SI = dyn_cast<StoreInst>(U)) {
432 // Storing the global itself.
433 if (SI->getOperand(0) == GV)
434 return false;
435
436 // If storing the null pointer, ignore it.
437 if (isa<ConstantPointerNull>(SI->getOperand(0)))
438 continue;
439
440 // Check the value being stored.
441 Value *Ptr = getUnderlyingObject(SI->getOperand(0));
442
443 if (!isNoAliasCall(Ptr))
444 return false; // Too hard to analyze.
445
446 // Analyze all uses of the allocation. If any of them are used in a
447 // non-simple way (e.g. stored to another global) bail out.
448 if (AnalyzeUsesOfPointer(Ptr, /*Readers*/ nullptr, /*Writers*/ nullptr,
449 GV))
450 return false; // Loaded pointer escapes.
451
452 // Remember that this allocation is related to the indirect global.
453 AllocRelatedValues.push_back(Ptr);
454 } else {
455 // Something complex, bail out.
456 return false;
457 }
458 }
459
460 // Okay, this is an indirect global. Remember all of the allocations for
461 // this global in AllocsForIndirectGlobals.
462 while (!AllocRelatedValues.empty()) {
463 AllocsForIndirectGlobals[AllocRelatedValues.back()] = GV;
464 Handles.emplace_front(*this, AllocRelatedValues.back());
465 Handles.front().I = Handles.begin();
466 AllocRelatedValues.pop_back();
467 }
468 IndirectGlobals.insert(GV);
469 Handles.emplace_front(*this, GV);
470 Handles.front().I = Handles.begin();
471 return true;
472}
473
474void GlobalsAAResult::CollectSCCMembership(CallGraph &CG) {
475 // We do a bottom-up SCC traversal of the call graph. In other words, we
476 // visit all callees before callers (leaf-first).
477 unsigned SCCID = 0;
478 for (scc_iterator<CallGraph *> I = scc_begin(&CG); !I.isAtEnd(); ++I) {
479 const std::vector<CallGraphNode *> &SCC = *I;
480 assert(!SCC.empty() && "SCC with no functions?");
481
482 for (auto *CGN : SCC)
483 if (Function *F = CGN->getFunction())
484 FunctionToSCCMap[F] = SCCID;
485 ++SCCID;
486 }
487}
488
489/// AnalyzeCallGraph - At this point, we know the functions where globals are
490/// immediately stored to and read from. Propagate this information up the call
491/// graph to all callers and compute the mod/ref info for all memory for each
492/// function.
493void GlobalsAAResult::AnalyzeCallGraph(CallGraph &CG, Module &M) {
494 // We do a bottom-up SCC traversal of the call graph. In other words, we
495 // visit all callees before callers (leaf-first).
496 for (scc_iterator<CallGraph *> I = scc_begin(&CG); !I.isAtEnd(); ++I) {
497 const std::vector<CallGraphNode *> &SCC = *I;
498 assert(!SCC.empty() && "SCC with no functions?");
499
500 Function *F = SCC[0]->getFunction();
501
502 if (!F || !F->isDefinitionExact()) {
503 // Calls externally or not exact - can't say anything useful. Remove any
504 // existing function records (may have been created when scanning
505 // globals).
506 for (auto *Node : SCC)
507 FunctionInfos.erase(Node->getFunction());
508 continue;
509 }
510
511 FunctionInfo &FI = FunctionInfos[F];
512 Handles.emplace_front(*this, F);
513 Handles.front().I = Handles.begin();
514 bool KnowNothing = false;
515
516 // Intrinsics, like any other synchronizing function, can make effects
517 // of other threads visible. Without nosync we know nothing really.
518 // Similarly, if `nocallback` is missing the function, or intrinsic,
519 // can call into the module arbitrarily. If both are set the function
520 // has an effect but will not interact with accesses of internal
521 // globals inside the module. We are conservative here for optnone
522 // functions, might not be necessary.
523 auto MaySyncOrCallIntoModule = [](const Function &F) {
524 return !F.isDeclaration() || !F.hasNoSync() ||
525 !F.hasFnAttribute(Attribute::NoCallback);
526 };
527
528 // Collect the mod/ref properties due to called functions. We only compute
529 // one mod-ref set.
530 for (unsigned i = 0, e = SCC.size(); i != e && !KnowNothing; ++i) {
531 if (!F) {
532 KnowNothing = true;
533 break;
534 }
535
536 if (F->isDeclaration() || F->hasOptNone()) {
537 // Try to get mod/ref behaviour from function attributes.
538 if (F->doesNotAccessMemory()) {
539 // Can't do better than that!
540 } else if (F->onlyReadsMemory()) {
541 FI.addModRefInfo(ModRefInfo::Ref);
542 if (!F->onlyAccessesArgMemory() && MaySyncOrCallIntoModule(*F))
543 // This function might call back into the module and read a global -
544 // consider every global as possibly being read by this function.
545 FI.setMayReadAnyGlobal();
546 } else {
547 FI.addModRefInfo(ModRefInfo::ModRef);
548 if (!F->onlyAccessesArgMemory())
549 FI.setMayReadAnyGlobal();
550 if (MaySyncOrCallIntoModule(*F)) {
551 KnowNothing = true;
552 break;
553 }
554 }
555 continue;
556 }
557
558 for (CallGraphNode::iterator CI = SCC[i]->begin(), E = SCC[i]->end();
559 CI != E && !KnowNothing; ++CI)
560 if (Function *Callee = CI->second->getFunction()) {
561 if (FunctionInfo *CalleeFI = getFunctionInfo(Callee)) {
562 // Propagate function effect up.
563 FI.addFunctionInfo(*CalleeFI);
564 } else {
565 // Can't say anything about it. However, if it is inside our SCC,
566 // then nothing needs to be done.
567 CallGraphNode *CalleeNode = CG[Callee];
568 if (!is_contained(SCC, CalleeNode))
569 KnowNothing = true;
570 }
571 } else {
572 KnowNothing = true;
573 }
574 }
575
576 // If we can't say anything useful about this SCC, remove all SCC functions
577 // from the FunctionInfos map.
578 if (KnowNothing) {
579 for (auto *Node : SCC)
580 FunctionInfos.erase(Node->getFunction());
581 continue;
582 }
583
584 // Scan the function bodies for explicit loads or stores.
585 for (auto *Node : SCC) {
586 if (isModAndRefSet(FI.getModRefInfo()))
587 break; // The mod/ref lattice saturates here.
588
589 // Don't prove any properties based on the implementation of an optnone
590 // function. Function attributes were already used as a best approximation
591 // above.
592 if (Node->getFunction()->hasOptNone())
593 continue;
594
595 for (Instruction &I : instructions(Node->getFunction())) {
596 if (isModAndRefSet(FI.getModRefInfo()))
597 break; // The mod/ref lattice saturates here.
598
599 // We handle calls specially because the graph-relevant aspects are
600 // handled above.
601 if (isa<CallBase>(&I))
602 continue;
603
604 // All non-call instructions we use the primary predicates for whether
605 // they read or write memory.
606 if (I.mayReadFromMemory())
607 FI.addModRefInfo(ModRefInfo::Ref);
608 if (I.mayWriteToMemory())
609 FI.addModRefInfo(ModRefInfo::Mod);
610 }
611 }
612
613 if (!isModSet(FI.getModRefInfo()))
614 ++NumReadMemFunctions;
615 if (!isModOrRefSet(FI.getModRefInfo()))
616 ++NumNoMemFunctions;
617
618 // Finally, now that we know the full effect on this SCC, clone the
619 // information to each function in the SCC.
620 // FI is a reference into FunctionInfos, so copy it now so that it doesn't
621 // get invalidated if DenseMap decides to re-hash.
622 FunctionInfo CachedFI = FI;
623 for (unsigned i = 1, e = SCC.size(); i != e; ++i)
624 FunctionInfos[SCC[i]->getFunction()] = CachedFI;
625 }
626}
627
628// GV is a non-escaping global. V is a pointer address that has been loaded from.
629// If we can prove that V must escape, we can conclude that a load from V cannot
630// alias GV.
632 const Value *V,
633 int &Depth,
634 const DataLayout &DL) {
637 Visited.insert(V);
638 Inputs.push_back(V);
639 do {
640 const Value *Input = Inputs.pop_back_val();
641
644 // Arguments to functions or returns from functions are inherently
645 // escaping, so we can immediately classify those as not aliasing any
646 // non-addr-taken globals.
647 //
648 // (Transitive) loads from a global are also safe - if this aliased
649 // another global, its address would escape, so no alias.
650 continue;
651
652 // Recurse through a limited number of selects, loads and PHIs. This is an
653 // arbitrary depth of 4, lower numbers could be used to fix compile time
654 // issues if needed, but this is generally expected to be only be important
655 // for small depths.
656 if (++Depth > 4)
657 return false;
658
659 if (auto *LI = dyn_cast<LoadInst>(Input)) {
660 Inputs.push_back(getUnderlyingObject(LI->getPointerOperand()));
661 continue;
662 }
663 if (auto *SI = dyn_cast<SelectInst>(Input)) {
664 const Value *LHS = getUnderlyingObject(SI->getTrueValue());
665 const Value *RHS = getUnderlyingObject(SI->getFalseValue());
666 if (Visited.insert(LHS).second)
667 Inputs.push_back(LHS);
668 if (Visited.insert(RHS).second)
669 Inputs.push_back(RHS);
670 continue;
671 }
672 if (auto *PN = dyn_cast<PHINode>(Input)) {
673 for (const Value *Op : PN->incoming_values()) {
675 if (Visited.insert(Op).second)
676 Inputs.push_back(Op);
677 }
678 continue;
679 }
680
681 return false;
682 } while (!Inputs.empty());
683
684 // All inputs were known to be no-alias.
685 return true;
686}
687
688// There are particular cases where we can conclude no-alias between
689// a non-addr-taken global and some other underlying object. Specifically,
690// a non-addr-taken global is known to not be escaped from any function. It is
691// also incorrect for a transformation to introduce an escape of a global in
692// a way that is observable when it was not there previously. One function
693// being transformed to introduce an escape which could possibly be observed
694// (via loading from a global or the return value for example) within another
695// function is never safe. If the observation is made through non-atomic
696// operations on different threads, it is a data-race and UB. If the
697// observation is well defined, by being observed the transformation would have
698// changed program behavior by introducing the observed escape, making it an
699// invalid transform.
700//
701// This property does require that transformations which *temporarily* escape
702// a global that was not previously escaped, prior to restoring it, cannot rely
703// on the results of GMR::alias. This seems a reasonable restriction, although
704// currently there is no way to enforce it. There is also no realistic
705// optimization pass that would make this mistake. The closest example is
706// a transformation pass which does reg2mem of SSA values but stores them into
707// global variables temporarily before restoring the global variable's value.
708// This could be useful to expose "benign" races for example. However, it seems
709// reasonable to require that a pass which introduces escapes of global
710// variables in this way to either not trust AA results while the escape is
711// active, or to be forced to operate as a module pass that cannot co-exist
712// with an alias analysis such as GMR.
713bool GlobalsAAResult::isNonEscapingGlobalNoAlias(const GlobalValue *GV,
714 const Value *V,
715 const Instruction *CtxI) {
716 // In order to know that the underlying object cannot alias the
717 // non-addr-taken global, we must know that it would have to be an escape.
718 // Thus if the underlying object is a function argument, a load from
719 // a global, or the return of a function, it cannot alias. We can also
720 // recurse through PHI nodes and select nodes provided all of their inputs
721 // resolve to one of these known-escaping roots.
722
723 // A non-addr-taken global cannot alias with any non-pointer value.
724 // Check this early and exit.
725 if (!V->getType()->isPointerTy())
726 return true;
727
728 SmallPtrSet<const Value *, 8> Visited;
729 SmallVector<const Value *, 8> Inputs;
730 Visited.insert(V);
731 Inputs.push_back(V);
732 int Depth = 0;
733 do {
734 const Value *Input = Inputs.pop_back_val();
735
736 if (auto *InputGV = dyn_cast<GlobalValue>(Input)) {
737 // If one input is the very global we're querying against, then we can't
738 // conclude no-alias.
739 if (InputGV == GV)
740 return false;
741
742 // Distinct GlobalVariables never alias, unless overriden or zero-sized.
743 // FIXME: The condition can be refined, but be conservative for now.
744 auto *GVar = dyn_cast<GlobalVariable>(GV);
745 auto *InputGVar = dyn_cast<GlobalVariable>(InputGV);
746 if (GVar && InputGVar &&
747 !GVar->isDeclaration() && !InputGVar->isDeclaration() &&
748 !GVar->isInterposable() && !InputGVar->isInterposable()) {
749 Type *GVType = GVar->getInitializer()->getType();
750 Type *InputGVType = InputGVar->getInitializer()->getType();
751 if (GVType->isSized() && InputGVType->isSized() &&
752 (DL.getTypeAllocSize(GVType) > 0) &&
753 (DL.getTypeAllocSize(InputGVType) > 0))
754 continue;
755 }
756
757 // Conservatively return false, even though we could be smarter
758 // (e.g. look through GlobalAliases).
759 return false;
760 }
761
762 if (isa<Argument>(Input) || isa<CallInst>(Input) ||
763 isa<InvokeInst>(Input)) {
764 // Arguments to functions or returns from functions are inherently
765 // escaping, so we can immediately classify those as not aliasing any
766 // non-addr-taken globals.
767 continue;
768 }
769
770 if (CtxI)
771 if (auto *CPN = dyn_cast<ConstantPointerNull>(Input)) {
772 // Null pointer cannot alias with a non-addr-taken global.
773 const Function *F = CtxI->getFunction();
774 if (!NullPointerIsDefined(F, CPN->getPointerType()->getAddressSpace()))
775 continue;
776 }
777
778 // Recurse through a limited number of selects, loads and PHIs. This is an
779 // arbitrary depth of 4, lower numbers could be used to fix compile time
780 // issues if needed, but this is generally expected to be only be important
781 // for small depths.
782 if (++Depth > 4)
783 return false;
784
785 if (auto *LI = dyn_cast<LoadInst>(Input)) {
786 // A pointer loaded from a global would have been captured, and we know
787 // that the global is non-escaping, so no alias.
788 const Value *Ptr = getUnderlyingObject(LI->getPointerOperand());
790 // The load does not alias with GV.
791 continue;
792 // Otherwise, a load could come from anywhere, so bail.
793 return false;
794 }
795 if (auto *SI = dyn_cast<SelectInst>(Input)) {
796 const Value *LHS = getUnderlyingObject(SI->getTrueValue());
797 const Value *RHS = getUnderlyingObject(SI->getFalseValue());
798 if (Visited.insert(LHS).second)
799 Inputs.push_back(LHS);
800 if (Visited.insert(RHS).second)
801 Inputs.push_back(RHS);
802 continue;
803 }
804 if (auto *PN = dyn_cast<PHINode>(Input)) {
805 for (const Value *Op : PN->incoming_values()) {
807 if (Visited.insert(Op).second)
808 Inputs.push_back(Op);
809 }
810 continue;
811 }
812
813 // FIXME: It would be good to handle other obvious no-alias cases here, but
814 // it isn't clear how to do so reasonably without building a small version
815 // of BasicAA into this code.
816 return false;
817 } while (!Inputs.empty());
818
819 // If all the inputs to V were definitively no-alias, then V is no-alias.
820 return true;
821}
822
824 ModuleAnalysisManager::Invalidator &) {
825 // Check whether the analysis has been explicitly invalidated. Otherwise, it's
826 // stateless and remains preserved.
827 auto PAC = PA.getChecker<GlobalsAA>();
828 return !PAC.preservedWhenStateless();
829}
830
831/// alias - If one of the pointers is to a global that we are tracking, and the
832/// other is some random pointer, we know there cannot be an alias, because the
833/// address of the global isn't taken.
835 const MemoryLocation &LocB,
836 AAQueryInfo &AAQI, const Instruction *CtxI) {
837 // Get the base object these pointers point to.
838 const Value *UV1 =
840 const Value *UV2 =
842
843 // If either of the underlying values is a global, they may be non-addr-taken
844 // globals, which we can answer queries about.
845 const GlobalValue *GV1 = dyn_cast<GlobalValue>(UV1);
846 const GlobalValue *GV2 = dyn_cast<GlobalValue>(UV2);
847 if (GV1 || GV2) {
848 // If the global's address is taken, pretend we don't know it's a pointer to
849 // the global.
850 if (GV1 && !NonAddressTakenGlobals.count(GV1))
851 GV1 = nullptr;
852 if (GV2 && !NonAddressTakenGlobals.count(GV2))
853 GV2 = nullptr;
854
855 // If the two pointers are derived from two different non-addr-taken
856 // globals we know these can't alias.
857 if (GV1 && GV2 && GV1 != GV2)
859
860 // If one is and the other isn't, it isn't strictly safe but we can fake
861 // this result if necessary for performance. This does not appear to be
862 // a common problem in practice.
864 if ((GV1 || GV2) && GV1 != GV2)
866
867 // Check for a special case where a non-escaping global can be used to
868 // conclude no-alias.
869 if ((GV1 || GV2) && GV1 != GV2) {
870 const GlobalValue *GV = GV1 ? GV1 : GV2;
871 const Value *UV = GV1 ? UV2 : UV1;
872 if (isNonEscapingGlobalNoAlias(GV, UV, CtxI))
874 }
875
876 // Otherwise if they are both derived from the same addr-taken global, we
877 // can't know the two accesses don't overlap.
878 }
879
880 // These pointers may be based on the memory owned by an indirect global. If
881 // so, we may be able to handle this. First check to see if the base pointer
882 // is a direct load from an indirect global.
883 GV1 = GV2 = nullptr;
884 if (const LoadInst *LI = dyn_cast<LoadInst>(UV1))
885 if (GlobalVariable *GV = dyn_cast<GlobalVariable>(LI->getOperand(0)))
886 if (IndirectGlobals.count(GV))
887 GV1 = GV;
888 if (const LoadInst *LI = dyn_cast<LoadInst>(UV2))
889 if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(LI->getOperand(0)))
890 if (IndirectGlobals.count(GV))
891 GV2 = GV;
892
893 // These pointers may also be from an allocation for the indirect global. If
894 // so, also handle them.
895 if (!GV1)
896 GV1 = AllocsForIndirectGlobals.lookup(UV1);
897 if (!GV2)
898 GV2 = AllocsForIndirectGlobals.lookup(UV2);
899
900 // Now that we know whether the two pointers are related to indirect globals,
901 // use this to disambiguate the pointers. If the pointers are based on
902 // different indirect globals they cannot alias.
903 if (GV1 && GV2 && GV1 != GV2)
905
906 // If one is based on an indirect global and the other isn't, it isn't
907 // strictly safe but we can fake this result if necessary for performance.
908 // This does not appear to be a common problem in practice.
910 if ((GV1 || GV2) && GV1 != GV2)
912
914}
915
916ModRefInfo GlobalsAAResult::getModRefInfoForArgument(const CallBase *Call,
917 const GlobalValue *GV,
918 AAQueryInfo &AAQI) {
919 if (Call->doesNotAccessMemory())
921 ModRefInfo ConservativeResult =
922 Call->onlyReadsMemory() ? ModRefInfo::Ref : ModRefInfo::ModRef;
923
924 // Iterate through all the arguments to the called function. If any argument
925 // is based on GV, return the conservative result.
926 for (const auto &A : Call->args()) {
928 getUnderlyingObjects(A, Objects);
929
930 // All objects must be identified.
931 if (!all_of(Objects, isIdentifiedObject) &&
932 // Try ::alias to see if all objects are known not to alias GV.
933 !all_of(Objects, [&](const Value *V) {
937 }))
938 return ConservativeResult;
939
940 if (is_contained(Objects, GV))
941 return ConservativeResult;
942 }
943
944 // We identified all objects in the argument list, and none of them were GV.
946}
947
949 const MemoryLocation &Loc,
950 AAQueryInfo &AAQI) {
952
953 // If we are asking for mod/ref info of a direct call with a pointer to a
954 // global we are tracking, return information if we have it.
955 if (const GlobalValue *GV =
957 // If GV is internal to this IR and there is no function with local linkage
958 // that has had their address taken, keep looking for a tighter ModRefInfo.
959 if (GV->hasLocalLinkage() && !UnknownFunctionsWithLocalLinkage)
960 if (const Function *F = Call->getCalledFunction())
961 if (NonAddressTakenGlobals.count(GV))
962 if (const FunctionInfo *FI = getFunctionInfo(F))
963 Known = FI->getModRefInfoForGlobal(*GV) |
964 getModRefInfoForArgument(Call, GV, AAQI);
965
966 return Known;
967}
968
969GlobalsAAResult::GlobalsAAResult(
970 const DataLayout &DL,
971 std::function<const TargetLibraryInfo &(Function &F)> GetTLI)
972 : DL(DL), GetTLI(std::move(GetTLI)) {}
973
974GlobalsAAResult::GlobalsAAResult(GlobalsAAResult &&Arg)
975 : AAResultBase(std::move(Arg)), DL(Arg.DL), GetTLI(std::move(Arg.GetTLI)),
976 NonAddressTakenGlobals(std::move(Arg.NonAddressTakenGlobals)),
977 IndirectGlobals(std::move(Arg.IndirectGlobals)),
978 AllocsForIndirectGlobals(std::move(Arg.AllocsForIndirectGlobals)),
979 FunctionInfos(std::move(Arg.FunctionInfos)),
980 Handles(std::move(Arg.Handles)) {
981 // Update the parent for each DeletionCallbackHandle.
982 for (auto &H : Handles) {
983 assert(H.GAR == &Arg);
984 H.GAR = this;
985 }
986}
987
989
990/*static*/ GlobalsAAResult GlobalsAAResult::analyzeModule(
991 Module &M, std::function<const TargetLibraryInfo &(Function &F)> GetTLI,
992 CallGraph &CG) {
993 GlobalsAAResult Result(M.getDataLayout(), GetTLI);
994
995 // Discover which functions aren't recursive, to feed into AnalyzeGlobals.
996 Result.CollectSCCMembership(CG);
997
998 // Find non-addr taken globals.
999 Result.AnalyzeGlobals(M);
1000
1001 // Propagate on CG.
1002 Result.AnalyzeCallGraph(CG, M);
1003
1004 return Result;
1005}
1006
1007AnalysisKey GlobalsAA::Key;
1008
1012 auto GetTLI = [&FAM](Function &F) -> TargetLibraryInfo & {
1013 return FAM.getResult<TargetLibraryAnalysis>(F);
1014 };
1015 return GlobalsAAResult::analyzeModule(M, GetTLI,
1017}
1018
1021 if (auto *G = AM.getCachedResult<GlobalsAA>(M)) {
1022 auto &CG = AM.getResult<CallGraphAnalysis>(M);
1023 G->NonAddressTakenGlobals.clear();
1024 G->UnknownFunctionsWithLocalLinkage = false;
1025 G->IndirectGlobals.clear();
1026 G->AllocsForIndirectGlobals.clear();
1027 G->FunctionInfos.clear();
1028 G->FunctionToSCCMap.clear();
1029 G->Handles.clear();
1030 G->CollectSCCMembership(CG);
1031 G->AnalyzeGlobals(M);
1032 G->AnalyzeCallGraph(CG, M);
1033 }
1034 return PreservedAnalyses::all();
1035}
1036
1039 "Globals Alias Analysis", false, true)
1043 "Globals Alias Analysis", false, true)
1044
1048
1050
1052 auto GetTLI = [this](Function &F) -> TargetLibraryInfo & {
1053 return this->getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F);
1054 };
1056 M, GetTLI, getAnalysis<CallGraphWrapperPass>().getCallGraph())));
1057 return false;
1058}
1059
1061 Result.reset();
1062 return false;
1063}
1064
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file provides interfaces used to build and manipulate a call graph, which is a very useful tool ...
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static cl::opt< bool > EnableUnsafeGlobalsModRefAliasResults("enable-unsafe-globalsmodref-alias-results", cl::init(false), cl::Hidden)
static bool isNonEscapingGlobalNoAliasWithLoad(const GlobalValue *GV, const Value *V, int &Depth, const DataLayout &DL)
This is the interface for a simple mod/ref and alias analysis over globals.
Value * getPointer(Value *Ptr)
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
#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
#define H(x, y, z)
Definition MD5.cpp:56
Machine Check Debug Module
uint64_t IntrinsicInst * II
#define P(N)
FunctionAnalysisManager FAM
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
This builds on the llvm/ADT/GraphTraits.h file to find the strongly connected components (SCCs) of a ...
This file defines the SmallPtrSet class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
Value * RHS
Value * LHS
The mod/ref information collected for a particular function.
FunctionInfo & operator=(FunctionInfo &&RHS)
void eraseModRefInfoForGlobal(const GlobalValue &GV)
Clear a global's ModRef info.
void setMayReadAnyGlobal()
Sets this function as potentially reading from any global.
void addModRefInfo(ModRefInfo NewMRI)
Adds new ModRefInfo for this function to its state.
void addFunctionInfo(const FunctionInfo &FI)
Add mod/ref info from another function into ours, saturating towards ModRef.
ModRefInfo getModRefInfo() const
Returns the ModRefInfo info for this function.
FunctionInfo()=default
Checks to document the invariants of the bit packing here.
FunctionInfo & operator=(const FunctionInfo &RHS)
void addModRefInfoForGlobal(const GlobalValue &GV, ModRefInfo NewMRI)
ModRefInfo globalClearMayReadAnyGlobal(int I) const
This method clears MayReadAnyGlobal bit added by GlobalsAAResult to return the corresponding ModRefIn...
bool mayReadAnyGlobal() const
Returns whether this function may read any global variable, and we don't know which global.
FunctionInfo(const FunctionInfo &Arg)
ModRefInfo getModRefInfoForGlobal(const GlobalValue &GV) const
Returns the ModRefInfo info for this function w.r.t.
The Input class is used to parse a yaml document into in-memory structs and vectors.
This class stores info we want to provide to or retain within an alias query.
AAResultBase()=default
The possible results of an alias query.
@ MayAlias
The two locations may or may not alias.
@ NoAlias
The two locations do not alias at all.
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
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.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
bool doesNotCapture(unsigned OpNo) const
Determine whether this data operand is not captured.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
bool hasFnAttr(Attribute::AttrKind Kind) const
Determine whether this call has the given attribute.
unsigned getArgOperandNo(const Use *U) const
Given a use for a arg operand, get the arg operand number that corresponds to it.
bool isArgOperand(const Use *U) const
bool isDataOperand(const Use *U) const
An analysis pass to compute the CallGraph for a Module.
Definition CallGraph.h:286
std::vector< CallRecord >::iterator iterator
Definition CallGraph.h:189
The ModulePass which wraps up a CallGraph and the logic to build it.
Definition CallGraph.h:330
The basic data container for the call graph of a Module of IR.
Definition CallGraph.h:72
void setValPtr(Value *P)
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool hasLocalLinkage() const
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
An alias analysis result set for globals.
LLVM_ABI ~GlobalsAAResult()
LLVM_ABI ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc, AAQueryInfo &AAQI)
LLVM_ABI bool invalidate(Module &M, const PreservedAnalyses &PA, ModuleAnalysisManager::Invalidator &)
static LLVM_ABI GlobalsAAResult analyzeModule(Module &M, std::function< const TargetLibraryInfo &(Function &F)> GetTLI, CallGraph &CG)
LLVM_ABI MemoryEffects getMemoryEffects(const Function *F)
getMemoryEffects - Return the behavior of the specified function if called from the specified call si...
LLVM_ABI AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, AAQueryInfo &AAQI, const Instruction *CtxI)
alias - If one of the pointers is to a global that we are tracking, and the other is some random poin...
Legacy wrapper pass to provide the GlobalsAAResult object.
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
bool runOnModule(Module &M) override
runOnModule - Virtual method overriden by subclasses to process the module being operated on.
bool doFinalization(Module &M) override
doFinalization - Virtual method overriden by subclasses to do any necessary clean up after all passes...
Analysis pass providing a never-invalidated alias analysis result.
LLVM_ABI GlobalsAAResult run(Module &M, ModuleAnalysisManager &AM)
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
An instruction for reading from memory.
static MemoryEffectsBase unknown()
Definition ModRef.h:123
Representation for a specific memory location.
static MemoryLocation getBeforeOrAfter(const Value *Ptr, const AAMDNodes &AATags=AAMDNodes())
Return a location that may access any location before or after Ptr, while remaining within the underl...
const Value * Ptr
The address of the start of the location.
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
Definition Pass.h:255
ModulePass(char &pid)
Definition Pass.h:257
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
unsigned getOpcode() const
Return the opcode for this Instruction or ConstantExpr.
Definition Operator.h:43
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
PointerIntPair - This class implements a pair of a pointer and small integer.
void setPointerAndInt(PointerTy PtrVal, IntType IntVal) &
PointerTy getPointer() const
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalysisChecker getChecker() const
Build a checker for this PreservedAnalyses and the specified analysis type.
Definition Analysis.h:275
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.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
Definition Type.h:326
Value * getValPtr() const
LLVM Value Representation.
Definition Value.h:75
iterator_range< user_iterator > users()
Definition Value.h:426
LLVM_ABI const Value * stripPointerCastsForAliasAnalysis() const
Strip off pointer casts, all-zero GEPs, single-argument phi nodes and invariant group info.
Definition Value.cpp:725
const ParentTy * getParent() const
Definition ilist_node.h:34
CallInst * Call
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
initializer< Ty > init(const Ty &Val)
@ User
could "use" a pointer
NodeAddr< NodeBase * > Node
Definition RDFGraph.h:381
iterator end() const
Definition BasicBlock.h:89
LLVM_ABI iterator begin() const
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
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:1738
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
scc_iterator< T > scc_begin(const T &G)
Construct the begin iterator for a deduced graph type T.
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
LLVM_ABI bool isNoAliasCall(const Value *V)
Return true if this pointer is returned by a noalias function.
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
Definition ModRef.h:356
LLVM_ABI ModulePass * createGlobalsAAWrapperPass()
bool isModSet(const ModRefInfo MRI)
Definition ModRef.h:49
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
bool isModOrRefSet(const ModRefInfo MRI)
Definition ModRef.h:43
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
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
Definition ModRef.h:28
@ Ref
The access may reference the value stored in memory.
Definition ModRef.h:32
@ ModRef
The access may reference and may modify the value stored in memory.
Definition ModRef.h:36
@ Mod
The access may modify the value stored in memory.
Definition ModRef.h:34
@ NoModRef
The access neither references nor modifies the value stored in memory.
Definition ModRef.h:30
DWARFExpression::Operation Op
LLVM_ABI Value * getFreedOperand(const CallBase *CB, const TargetLibraryInfo *TLI)
If this if a call to a free function, return the freed operand.
bool isModAndRefSet(const ModRefInfo MRI)
Definition ModRef.h:46
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1916
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1946
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
LLVM_ABI void getUnderlyingObjects(const Value *V, SmallVectorImpl< const Value * > &Objects, const LoopInfo *LI=nullptr, unsigned MaxLookup=MaxLookupSearchDepth)
This method is similar to getUnderlyingObject except that it can look through phi and select instruct...
LLVM_ABI bool isIdentifiedObject(const Value *V)
Return true if this pointer refers to a distinct and identifiable object.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:874
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)