LLVM 24.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 // Check the pointer operand use of the store.
332 if (&U == &SI->getOperandUse(1)) {
333 if (Writers)
334 Writers->insert(SI->getParent()->getParent());
335 } else if (SI->getOperand(1) != OkayStoreDest) {
336 return true; // Storing the pointer
337 }
338 } else if (Operator::getOpcode(I) == Instruction::GetElementPtr) {
339 if (AnalyzeUsesOfPointer(I, Readers, Writers))
340 return true;
341 } else if (Operator::getOpcode(I) == Instruction::BitCast ||
342 Operator::getOpcode(I) == Instruction::AddrSpaceCast) {
343 if (AnalyzeUsesOfPointer(I, Readers, Writers, OkayStoreDest))
344 return true;
345 } else if (auto *Call = dyn_cast<CallBase>(I)) {
346 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
347 if (II->getIntrinsicID() == Intrinsic::threadlocal_address &&
348 V == II->getArgOperand(0)) {
349 if (AnalyzeUsesOfPointer(II, Readers, Writers))
350 return true;
351 continue;
352 }
353 }
354 // Make sure that this is just the function being called, not that it is
355 // passing into the function.
356 if (Call->isDataOperand(&U)) {
357 // Detect calls to free.
358 if (Call->isArgOperand(&U) &&
359 getFreedOperand(Call, &GetTLI(*Call->getFunction())) == U) {
360 if (Writers)
361 Writers->insert(Call->getParent()->getParent());
362 } else {
363 // In general, we return true for unknown calls, but there are
364 // some simple checks that we can do for functions that
365 // will never call back into the module.
366 auto *F = Call->getCalledFunction();
367 // TODO: we should be able to remove isDeclaration() check
368 // and let the function body analysis check for captures,
369 // and collect the mod-ref effects. This information will
370 // be later propagated via the call graph.
371 if (!F || !F->isDeclaration())
372 return true;
373 // Note that the NoCallback check here is a little bit too
374 // conservative. If there are no captures of the global
375 // in the module, then this call may not be a capture even
376 // if it does not have NoCallback.
377 if (!Call->hasFnAttr(Attribute::NoCallback) ||
378 !Call->isArgOperand(&U) ||
380 return true;
381
382 // Conservatively, assume the call reads and writes the global.
383 // We could use memory attributes to make it more precise.
384 if (Readers)
385 Readers->insert(Call->getParent()->getParent());
386 if (Writers)
387 Writers->insert(Call->getParent()->getParent());
388 }
389 }
390 } else if (ICmpInst *ICI = dyn_cast<ICmpInst>(I)) {
391 if (!isa<ConstantPointerNull>(ICI->getOperand(1)))
392 return true; // Allow comparison against null.
393 } else if (Constant *C = dyn_cast<Constant>(I)) {
394 // Ignore constants which don't have any live uses.
395 if (isa<GlobalValue>(C) || C->isConstantUsed())
396 return true;
397 } else {
398 return true;
399 }
400 }
401
402 return false;
403}
404
405/// AnalyzeIndirectGlobalMemory - We found an non-address-taken global variable
406/// which holds a pointer type. See if the global always points to non-aliased
407/// heap memory: that is, all initializers of the globals store a value known
408/// to be obtained via a noalias return function call which have no other use.
409/// Further, all loads out of GV must directly use the memory, not store the
410/// pointer somewhere. If this is true, we consider the memory pointed to by
411/// GV to be owned by GV and can disambiguate other pointers from it.
412bool GlobalsAAResult::AnalyzeIndirectGlobalMemory(GlobalVariable *GV) {
413 // Keep track of values related to the allocation of the memory, f.e. the
414 // value produced by the noalias call and any casts.
415 std::vector<Value *> AllocRelatedValues;
416
417 // If the initializer is a non-null pointer, bail.
418 if (Constant *C = GV->getInitializer())
420 return false;
421
422 // Walk the user list of the global. If we find anything other than a direct
423 // load or store, bail out.
424 for (User *U : GV->users()) {
425 if (LoadInst *LI = dyn_cast<LoadInst>(U)) {
426 // The pointer loaded from the global can only be used in simple ways:
427 // we allow addressing of it and loading storing to it. We do *not* allow
428 // storing the loaded pointer somewhere else or passing to a function.
429 if (AnalyzeUsesOfPointer(LI))
430 return false; // Loaded pointer escapes.
431 // TODO: Could try some IP mod/ref of the loaded pointer.
432 } else if (StoreInst *SI = dyn_cast<StoreInst>(U)) {
433 // Storing the global itself.
434 if (SI->getOperand(0) == GV)
435 return false;
436
437 // If storing the null pointer, ignore it.
438 if (isa<ConstantPointerNull>(SI->getOperand(0)))
439 continue;
440
441 // Check the value being stored.
442 Value *Ptr = getUnderlyingObject(SI->getOperand(0));
443
444 if (!isNoAliasCall(Ptr))
445 return false; // Too hard to analyze.
446
447 // Analyze all uses of the allocation. If any of them are used in a
448 // non-simple way (e.g. stored to another global) bail out.
449 if (AnalyzeUsesOfPointer(Ptr, /*Readers*/ nullptr, /*Writers*/ nullptr,
450 GV))
451 return false; // Loaded pointer escapes.
452
453 // Remember that this allocation is related to the indirect global.
454 AllocRelatedValues.push_back(Ptr);
455 } else {
456 // Something complex, bail out.
457 return false;
458 }
459 }
460
461 // Okay, this is an indirect global. Remember all of the allocations for
462 // this global in AllocsForIndirectGlobals.
463 while (!AllocRelatedValues.empty()) {
464 AllocsForIndirectGlobals[AllocRelatedValues.back()] = GV;
465 Handles.emplace_front(*this, AllocRelatedValues.back());
466 Handles.front().I = Handles.begin();
467 AllocRelatedValues.pop_back();
468 }
469 IndirectGlobals.insert(GV);
470 Handles.emplace_front(*this, GV);
471 Handles.front().I = Handles.begin();
472 return true;
473}
474
475void GlobalsAAResult::CollectSCCMembership(CallGraph &CG) {
476 // We do a bottom-up SCC traversal of the call graph. In other words, we
477 // visit all callees before callers (leaf-first).
478 unsigned SCCID = 0;
479 for (scc_iterator<CallGraph *> I = scc_begin(&CG); !I.isAtEnd(); ++I) {
480 const std::vector<CallGraphNode *> &SCC = *I;
481 assert(!SCC.empty() && "SCC with no functions?");
482
483 for (auto *CGN : SCC)
484 if (Function *F = CGN->getFunction())
485 FunctionToSCCMap[F] = SCCID;
486 ++SCCID;
487 }
488}
489
490/// AnalyzeCallGraph - At this point, we know the functions where globals are
491/// immediately stored to and read from. Propagate this information up the call
492/// graph to all callers and compute the mod/ref info for all memory for each
493/// function.
494void GlobalsAAResult::AnalyzeCallGraph(CallGraph &CG, Module &M) {
495 // We do a bottom-up SCC traversal of the call graph. In other words, we
496 // visit all callees before callers (leaf-first).
497 for (scc_iterator<CallGraph *> I = scc_begin(&CG); !I.isAtEnd(); ++I) {
498 const std::vector<CallGraphNode *> &SCC = *I;
499 assert(!SCC.empty() && "SCC with no functions?");
500
501 Function *FirstF = SCC[0]->getFunction();
502
503 if (!FirstF || !FirstF->isDefinitionExact()) {
504 // Calls externally or not exact - can't say anything useful. Remove any
505 // existing function records (may have been created when scanning
506 // globals).
507 for (auto *Node : SCC)
508 FunctionInfos.erase(Node->getFunction());
509 continue;
510 }
511
512 FunctionInfo &FI = FunctionInfos[FirstF];
513 Handles.emplace_front(*this, FirstF);
514 Handles.front().I = Handles.begin();
515 bool KnowNothing = false;
516
517 // Intrinsics, like any other synchronizing function, can make effects
518 // of other threads visible. Without nosync we know nothing really.
519 // Similarly, if `nocallback` is missing the function, or intrinsic,
520 // can call into the module arbitrarily. If both are set the function
521 // has an effect but will not interact with accesses of internal
522 // globals inside the module. We are conservative here for optnone
523 // functions, might not be necessary.
524 auto MaySyncOrCallIntoModule = [](const Function &F) {
525 return !F.isDeclaration() || !F.hasNoSync() ||
526 !F.hasFnAttribute(Attribute::NoCallback);
527 };
528
529 // Collect the mod/ref properties due to called functions. We only compute
530 // one mod-ref set.
531 for (unsigned i = 0, e = SCC.size(); i != e && !KnowNothing; ++i) {
532 Function *F = SCC[i]->getFunction();
533 if (!F) {
534 KnowNothing = true;
535 break;
536 }
537
538 if (F->isDeclaration() || F->hasOptNone()) {
539 // Try to get mod/ref behaviour from function attributes.
540 if (F->doesNotAccessMemory()) {
541 // Can't do better than that!
542 } else if (F->onlyReadsMemory()) {
543 FI.addModRefInfo(ModRefInfo::Ref);
544 if (!F->onlyAccessesArgMemory() && MaySyncOrCallIntoModule(*F))
545 // This function might call back into the module and read a global -
546 // consider every global as possibly being read by this function.
547 FI.setMayReadAnyGlobal();
548 } else {
549 FI.addModRefInfo(ModRefInfo::ModRef);
550 if (!F->onlyAccessesArgMemory())
551 FI.setMayReadAnyGlobal();
552 if (MaySyncOrCallIntoModule(*F)) {
553 KnowNothing = true;
554 break;
555 }
556 }
557 continue;
558 }
559
560 for (CallGraphNode::iterator CI = SCC[i]->begin(), E = SCC[i]->end();
561 CI != E && !KnowNothing; ++CI)
562 if (Function *Callee = CI->second->getFunction()) {
563 if (FunctionInfo *CalleeFI = getFunctionInfo(Callee)) {
564 // Propagate function effect up.
565 FI.addFunctionInfo(*CalleeFI);
566 } else {
567 // Can't say anything about it. However, if it is inside our SCC,
568 // then nothing needs to be done.
569 CallGraphNode *CalleeNode = CG[Callee];
570 if (!is_contained(SCC, CalleeNode))
571 KnowNothing = true;
572 }
573 } else {
574 KnowNothing = true;
575 }
576 }
577
578 // If we can't say anything useful about this SCC, remove all SCC functions
579 // from the FunctionInfos map.
580 if (KnowNothing) {
581 for (auto *Node : SCC)
582 FunctionInfos.erase(Node->getFunction());
583 continue;
584 }
585
586 // Scan the function bodies for explicit loads or stores.
587 for (auto *Node : SCC) {
588 if (isModAndRefSet(FI.getModRefInfo()))
589 break; // The mod/ref lattice saturates here.
590
591 // Don't prove any properties based on the implementation of an optnone
592 // function. Function attributes were already used as a best approximation
593 // above.
594 if (Node->getFunction()->hasOptNone())
595 continue;
596
597 for (Instruction &I : instructions(Node->getFunction())) {
598 if (isModAndRefSet(FI.getModRefInfo()))
599 break; // The mod/ref lattice saturates here.
600
601 // We handle calls specially because the graph-relevant aspects are
602 // handled above.
603 if (isa<CallBase>(&I))
604 continue;
605
606 // All non-call instructions we use the primary predicates for whether
607 // they read or write memory.
608 if (I.mayReadFromMemory())
609 FI.addModRefInfo(ModRefInfo::Ref);
610 if (I.mayWriteToMemory())
611 FI.addModRefInfo(ModRefInfo::Mod);
612 }
613 }
614
615 if (!isModSet(FI.getModRefInfo()))
616 ++NumReadMemFunctions;
617 if (!isModOrRefSet(FI.getModRefInfo()))
618 ++NumNoMemFunctions;
619
620 // Finally, now that we know the full effect on this SCC, clone the
621 // information to each function in the SCC.
622 // FI is a reference into FunctionInfos, so copy it now so that it doesn't
623 // get invalidated if DenseMap decides to re-hash.
624 FunctionInfo CachedFI = FI;
625 for (unsigned i = 1, e = SCC.size(); i != e; ++i)
626 FunctionInfos[SCC[i]->getFunction()] = CachedFI;
627 }
628}
629
630// GV is a non-escaping global. V is a pointer address that has been loaded from.
631// If we can prove that V must escape, we can conclude that a load from V cannot
632// alias GV.
634 const Value *V,
635 int &Depth,
636 const DataLayout &DL) {
639 Visited.insert(V);
640 Inputs.push_back(V);
641 do {
642 const Value *Input = Inputs.pop_back_val();
643
646 // Arguments to functions or returns from functions are inherently
647 // escaping, so we can immediately classify those as not aliasing any
648 // non-addr-taken globals.
649 //
650 // (Transitive) loads from a global are also safe - if this aliased
651 // another global, its address would escape, so no alias.
652 continue;
653
654 // Recurse through a limited number of selects, loads and PHIs. This is an
655 // arbitrary depth of 4, lower numbers could be used to fix compile time
656 // issues if needed, but this is generally expected to be only be important
657 // for small depths.
658 if (++Depth > 4)
659 return false;
660
661 if (auto *LI = dyn_cast<LoadInst>(Input)) {
662 Inputs.push_back(getUnderlyingObject(LI->getPointerOperand()));
663 continue;
664 }
665 if (auto *SI = dyn_cast<SelectInst>(Input)) {
666 const Value *LHS = getUnderlyingObject(SI->getTrueValue());
667 const Value *RHS = getUnderlyingObject(SI->getFalseValue());
668 if (Visited.insert(LHS).second)
669 Inputs.push_back(LHS);
670 if (Visited.insert(RHS).second)
671 Inputs.push_back(RHS);
672 continue;
673 }
674 if (auto *PN = dyn_cast<PHINode>(Input)) {
675 for (const Value *Op : PN->incoming_values()) {
677 if (Visited.insert(Op).second)
678 Inputs.push_back(Op);
679 }
680 continue;
681 }
682
683 return false;
684 } while (!Inputs.empty());
685
686 // All inputs were known to be no-alias.
687 return true;
688}
689
690// There are particular cases where we can conclude no-alias between
691// a non-addr-taken global and some other underlying object. Specifically,
692// a non-addr-taken global is known to not be escaped from any function. It is
693// also incorrect for a transformation to introduce an escape of a global in
694// a way that is observable when it was not there previously. One function
695// being transformed to introduce an escape which could possibly be observed
696// (via loading from a global or the return value for example) within another
697// function is never safe. If the observation is made through non-atomic
698// operations on different threads, it is a data-race and UB. If the
699// observation is well defined, by being observed the transformation would have
700// changed program behavior by introducing the observed escape, making it an
701// invalid transform.
702//
703// This property does require that transformations which *temporarily* escape
704// a global that was not previously escaped, prior to restoring it, cannot rely
705// on the results of GMR::alias. This seems a reasonable restriction, although
706// currently there is no way to enforce it. There is also no realistic
707// optimization pass that would make this mistake. The closest example is
708// a transformation pass which does reg2mem of SSA values but stores them into
709// global variables temporarily before restoring the global variable's value.
710// This could be useful to expose "benign" races for example. However, it seems
711// reasonable to require that a pass which introduces escapes of global
712// variables in this way to either not trust AA results while the escape is
713// active, or to be forced to operate as a module pass that cannot co-exist
714// with an alias analysis such as GMR.
715bool GlobalsAAResult::isNonEscapingGlobalNoAlias(const GlobalValue *GV,
716 const Value *V,
717 const Instruction *CtxI) {
718 // In order to know that the underlying object cannot alias the
719 // non-addr-taken global, we must know that it would have to be an escape.
720 // Thus if the underlying object is a function argument, a load from
721 // a global, or the return of a function, it cannot alias. We can also
722 // recurse through PHI nodes and select nodes provided all of their inputs
723 // resolve to one of these known-escaping roots.
724
725 // A non-addr-taken global cannot alias with any non-pointer value.
726 // Check this early and exit.
727 if (!V->getType()->isPointerTy())
728 return true;
729
730 SmallPtrSet<const Value *, 8> Visited;
731 SmallVector<const Value *, 8> Inputs;
732 Visited.insert(V);
733 Inputs.push_back(V);
734 int Depth = 0;
735 do {
736 const Value *Input = Inputs.pop_back_val();
737
738 if (auto *InputGV = dyn_cast<GlobalValue>(Input)) {
739 // If one input is the very global we're querying against, then we can't
740 // conclude no-alias.
741 if (InputGV == GV)
742 return false;
743
744 // Distinct GlobalVariables never alias, unless overriden or zero-sized.
745 // FIXME: The condition can be refined, but be conservative for now.
746 auto *GVar = dyn_cast<GlobalVariable>(GV);
747 auto *InputGVar = dyn_cast<GlobalVariable>(InputGV);
748 if (GVar && InputGVar &&
749 !GVar->isDeclaration() && !InputGVar->isDeclaration() &&
750 !GVar->isInterposable() && !InputGVar->isInterposable()) {
751 Type *GVType = GVar->getInitializer()->getType();
752 Type *InputGVType = InputGVar->getInitializer()->getType();
753 if (GVType->isSized() && InputGVType->isSized() &&
754 (DL.getTypeAllocSize(GVType) > 0) &&
755 (DL.getTypeAllocSize(InputGVType) > 0))
756 continue;
757 }
758
759 // Conservatively return false, even though we could be smarter
760 // (e.g. look through GlobalAliases).
761 return false;
762 }
763
764 if (isa<Argument>(Input) || isa<CallInst>(Input) ||
765 isa<InvokeInst>(Input)) {
766 // Arguments to functions or returns from functions are inherently
767 // escaping, so we can immediately classify those as not aliasing any
768 // non-addr-taken globals.
769 continue;
770 }
771
772 if (CtxI)
773 if (auto *CPN = dyn_cast<ConstantPointerNull>(Input)) {
774 // Null pointer cannot alias with a non-addr-taken global.
775 const Function *F = CtxI->getFunction();
776 if (!NullPointerIsDefined(F, CPN->getPointerType()->getAddressSpace()))
777 continue;
778 }
779
780 // Recurse through a limited number of selects, loads and PHIs. This is an
781 // arbitrary depth of 4, lower numbers could be used to fix compile time
782 // issues if needed, but this is generally expected to be only be important
783 // for small depths.
784 if (++Depth > 4)
785 return false;
786
787 if (auto *LI = dyn_cast<LoadInst>(Input)) {
788 // A pointer loaded from a global would have been captured, and we know
789 // that the global is non-escaping, so no alias.
790 const Value *Ptr = getUnderlyingObject(LI->getPointerOperand());
792 // The load does not alias with GV.
793 continue;
794 // Otherwise, a load could come from anywhere, so bail.
795 return false;
796 }
797 if (auto *SI = dyn_cast<SelectInst>(Input)) {
798 const Value *LHS = getUnderlyingObject(SI->getTrueValue());
799 const Value *RHS = getUnderlyingObject(SI->getFalseValue());
800 if (Visited.insert(LHS).second)
801 Inputs.push_back(LHS);
802 if (Visited.insert(RHS).second)
803 Inputs.push_back(RHS);
804 continue;
805 }
806 if (auto *PN = dyn_cast<PHINode>(Input)) {
807 for (const Value *Op : PN->incoming_values()) {
809 if (Visited.insert(Op).second)
810 Inputs.push_back(Op);
811 }
812 continue;
813 }
814
815 // FIXME: It would be good to handle other obvious no-alias cases here, but
816 // it isn't clear how to do so reasonably without building a small version
817 // of BasicAA into this code.
818 return false;
819 } while (!Inputs.empty());
820
821 // If all the inputs to V were definitively no-alias, then V is no-alias.
822 return true;
823}
824
826 ModuleAnalysisManager::Invalidator &) {
827 // Check whether the analysis has been explicitly invalidated. Otherwise, it's
828 // stateless and remains preserved.
829 auto PAC = PA.getChecker<GlobalsAA>();
830 return !PAC.preservedWhenStateless();
831}
832
833/// alias - If one of the pointers is to a global that we are tracking, and the
834/// other is some random pointer, we know there cannot be an alias, because the
835/// address of the global isn't taken.
837 const MemoryLocation &LocB,
838 AAQueryInfo &AAQI, const Instruction *CtxI) {
839 // Get the base object these pointers point to.
840 const Value *UV1 =
842 const Value *UV2 =
844
845 // If either of the underlying values is a global, they may be non-addr-taken
846 // globals, which we can answer queries about.
847 const GlobalValue *GV1 = dyn_cast<GlobalValue>(UV1);
848 const GlobalValue *GV2 = dyn_cast<GlobalValue>(UV2);
849 if (GV1 || GV2) {
850 // If the global's address is taken, pretend we don't know it's a pointer to
851 // the global.
852 if (GV1 && !NonAddressTakenGlobals.count(GV1))
853 GV1 = nullptr;
854 if (GV2 && !NonAddressTakenGlobals.count(GV2))
855 GV2 = nullptr;
856
857 // If the two pointers are derived from two different non-addr-taken
858 // globals we know these can't alias.
859 if (GV1 && GV2 && GV1 != GV2)
861
862 // If one is and the other isn't, it isn't strictly safe but we can fake
863 // this result if necessary for performance. This does not appear to be
864 // a common problem in practice.
866 if ((GV1 || GV2) && GV1 != GV2)
868
869 // Check for a special case where a non-escaping global can be used to
870 // conclude no-alias.
871 if ((GV1 || GV2) && GV1 != GV2) {
872 const GlobalValue *GV = GV1 ? GV1 : GV2;
873 const Value *UV = GV1 ? UV2 : UV1;
874 if (isNonEscapingGlobalNoAlias(GV, UV, CtxI))
876 }
877
878 // Otherwise if they are both derived from the same addr-taken global, we
879 // can't know the two accesses don't overlap.
880 }
881
882 // These pointers may be based on the memory owned by an indirect global. If
883 // so, we may be able to handle this. First check to see if the base pointer
884 // is a direct load from an indirect global.
885 GV1 = GV2 = nullptr;
886 if (const LoadInst *LI = dyn_cast<LoadInst>(UV1))
887 if (GlobalVariable *GV = dyn_cast<GlobalVariable>(LI->getOperand(0)))
888 if (IndirectGlobals.count(GV))
889 GV1 = GV;
890 if (const LoadInst *LI = dyn_cast<LoadInst>(UV2))
891 if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(LI->getOperand(0)))
892 if (IndirectGlobals.count(GV))
893 GV2 = GV;
894
895 // These pointers may also be from an allocation for the indirect global. If
896 // so, also handle them.
897 if (!GV1)
898 GV1 = AllocsForIndirectGlobals.lookup(UV1);
899 if (!GV2)
900 GV2 = AllocsForIndirectGlobals.lookup(UV2);
901
902 // Now that we know whether the two pointers are related to indirect globals,
903 // use this to disambiguate the pointers. If the pointers are based on
904 // different indirect globals they cannot alias.
905 if (GV1 && GV2 && GV1 != GV2)
907
908 // If one is based on an indirect global and the other isn't, it isn't
909 // strictly safe but we can fake this result if necessary for performance.
910 // This does not appear to be a common problem in practice.
912 if ((GV1 || GV2) && GV1 != GV2)
914
916}
917
918ModRefInfo GlobalsAAResult::getModRefInfoForArgument(const CallBase *Call,
919 const GlobalValue *GV,
920 AAQueryInfo &AAQI) {
921 if (Call->doesNotAccessMemory())
923 ModRefInfo ConservativeResult =
924 Call->onlyReadsMemory() ? ModRefInfo::Ref : ModRefInfo::ModRef;
925
926 // Iterate through all the arguments to the called function. If any argument
927 // is based on GV, return the conservative result.
928 for (const auto &A : Call->args()) {
930 getUnderlyingObjects(A, Objects);
931
932 // All objects must be identified.
933 if (!all_of(Objects, isIdentifiedObject) &&
934 // Try ::alias to see if all objects are known not to alias GV.
935 !all_of(Objects, [&](const Value *V) {
939 }))
940 return ConservativeResult;
941
942 if (is_contained(Objects, GV))
943 return ConservativeResult;
944 }
945
946 // We identified all objects in the argument list, and none of them were GV.
948}
949
951 const MemoryLocation &Loc,
952 AAQueryInfo &AAQI) {
954
955 // If we are asking for mod/ref info of a direct call with a pointer to a
956 // global we are tracking, return information if we have it.
957 if (const GlobalValue *GV =
959 // If GV is internal to this IR and there is no function with local linkage
960 // that has had their address taken, keep looking for a tighter ModRefInfo.
961 if (GV->hasLocalLinkage() && !UnknownFunctionsWithLocalLinkage)
962 if (const Function *F = Call->getCalledFunction())
963 if (NonAddressTakenGlobals.count(GV))
964 if (const FunctionInfo *FI = getFunctionInfo(F))
965 Known = FI->getModRefInfoForGlobal(*GV) |
966 getModRefInfoForArgument(Call, GV, AAQI);
967
968 return Known;
969}
970
971GlobalsAAResult::GlobalsAAResult(
972 const DataLayout &DL,
973 std::function<const TargetLibraryInfo &(Function &F)> GetTLI)
974 : DL(DL), GetTLI(std::move(GetTLI)) {}
975
976GlobalsAAResult::GlobalsAAResult(GlobalsAAResult &&Arg)
977 : AAResultBase(std::move(Arg)), DL(Arg.DL), GetTLI(std::move(Arg.GetTLI)),
978 NonAddressTakenGlobals(std::move(Arg.NonAddressTakenGlobals)),
979 IndirectGlobals(std::move(Arg.IndirectGlobals)),
980 AllocsForIndirectGlobals(std::move(Arg.AllocsForIndirectGlobals)),
981 FunctionInfos(std::move(Arg.FunctionInfos)),
982 Handles(std::move(Arg.Handles)) {
983 // Update the parent for each DeletionCallbackHandle.
984 for (auto &H : Handles) {
985 assert(H.GAR == &Arg);
986 H.GAR = this;
987 }
988}
989
991
992/*static*/ GlobalsAAResult GlobalsAAResult::analyzeModule(
993 Module &M, std::function<const TargetLibraryInfo &(Function &F)> GetTLI,
994 CallGraph &CG) {
995 GlobalsAAResult Result(M.getDataLayout(), GetTLI);
996
997 // Discover which functions aren't recursive, to feed into AnalyzeGlobals.
998 Result.CollectSCCMembership(CG);
999
1000 // Find non-addr taken globals.
1001 Result.AnalyzeGlobals(M);
1002
1003 // Propagate on CG.
1004 Result.AnalyzeCallGraph(CG, M);
1005
1006 return Result;
1007}
1008
1009AnalysisKey GlobalsAA::Key;
1010
1014 auto GetTLI = [&FAM](Function &F) -> TargetLibraryInfo & {
1015 return FAM.getResult<TargetLibraryAnalysis>(F);
1016 };
1017 return GlobalsAAResult::analyzeModule(M, GetTLI,
1019}
1020
1023 if (auto *G = AM.getCachedResult<GlobalsAA>(M)) {
1024 auto &CG = AM.getResult<CallGraphAnalysis>(M);
1025 G->NonAddressTakenGlobals.clear();
1026 G->UnknownFunctionsWithLocalLinkage = false;
1027 G->IndirectGlobals.clear();
1028 G->AllocsForIndirectGlobals.clear();
1029 G->FunctionInfos.clear();
1030 G->FunctionToSCCMap.clear();
1031 G->Handles.clear();
1032 G->CollectSCCMembership(CG);
1033 G->AnalyzeGlobals(M);
1034 G->AnalyzeCallGraph(CG, M);
1035 }
1036 return PreservedAnalyses::all();
1037}
1038
1041 "Globals Alias Analysis", false, true)
1045 "Globals Alias Analysis", false, true)
1046
1050
1052
1054 auto GetTLI = [this](Function &F) -> TargetLibraryInfo & {
1055 return this->getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F);
1056 };
1058 M, GetTLI, getAnalysis<CallGraphWrapperPass>().getCallGraph())));
1059 return false;
1060}
1061
1063 Result.reset();
1064 return false;
1065}
1066
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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
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 isDefinitionExact() const
Return true if the currently visible definition of this global (if any) is exactly the definition we ...
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:67
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:729
const ParentTy * getParent() const
Definition ilist_node.h:34
CallInst * Call
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.
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:1739
@ Known
Known to have no common set bits.
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
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
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:1917
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
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:878
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)