LLVM 22.0.0git
GlobalsModRef.h
Go to the documentation of this file.
1//===- GlobalsModRef.h - Simple Mod/Ref AA for Globals ----------*- C++ -*-===//
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/// \file
9/// This is the interface for a simple mod/ref and alias analysis over globals.
10///
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_ANALYSIS_GLOBALSMODREF_H
14#define LLVM_ANALYSIS_GLOBALSMODREF_H
15
17#include "llvm/IR/PassManager.h"
18#include "llvm/IR/ValueHandle.h"
19#include "llvm/Pass.h"
21#include <list>
22
23namespace llvm {
24class CallGraph;
25class Function;
26
27/// An alias analysis result set for globals.
28///
29/// This focuses on handling aliasing properties of globals and interprocedural
30/// function call mod/ref information.
32 class FunctionInfo;
33
34 const DataLayout &DL;
35 std::function<const TargetLibraryInfo &(Function &F)> GetTLI;
36
37 /// The globals that do not have their addresses taken.
38 SmallPtrSet<const GlobalValue *, 8> NonAddressTakenGlobals;
39
40 /// Are there functions with local linkage that may modify globals.
41 bool UnknownFunctionsWithLocalLinkage = false;
42
43 /// IndirectGlobals - The memory pointed to by this global is known to be
44 /// 'owned' by the global.
46
47 /// AllocsForIndirectGlobals - If an instruction allocates memory for an
48 /// indirect global, this map indicates which one.
49 DenseMap<const Value *, const GlobalValue *> AllocsForIndirectGlobals;
50
51 /// For each function, keep track of what globals are modified or read.
53
54 /// A map of functions to SCC. The SCCs are described by a simple integer
55 /// ID that is only useful for comparing for equality (are two functions
56 /// in the same SCC or not?)
58
59 /// Handle to clear this analysis on deletion of values.
60 struct LLVM_ABI DeletionCallbackHandle final : CallbackVH {
61 GlobalsAAResult *GAR;
62 std::list<DeletionCallbackHandle>::iterator I;
63
64 DeletionCallbackHandle(GlobalsAAResult &GAR, Value *V)
65 : CallbackVH(V), GAR(&GAR) {}
66
67 void deleted() override;
68 };
69
70 /// List of callbacks for globals being tracked by this analysis. Note that
71 /// these objects are quite large, but we only anticipate having one per
72 /// global tracked by this analysis. There are numerous optimizations we
73 /// could perform to the memory utilization here if this becomes a problem.
74 std::list<DeletionCallbackHandle> Handles;
75
76 explicit GlobalsAAResult(
77 const DataLayout &DL,
78 std::function<const TargetLibraryInfo &(Function &F)> GetTLI);
79
81
82public:
85
88
91 std::function<const TargetLibraryInfo &(Function &F)> GetTLI,
92 CallGraph &CG);
93
94 //------------------------------------------------
95 // Implement the AliasAnalysis API
96 //
98 const MemoryLocation &LocB, AAQueryInfo &AAQI,
99 const Instruction *CtxI);
100
103 const MemoryLocation &Loc,
104 AAQueryInfo &AAQI);
105
107 /// getMemoryEffects - Return the behavior of the specified function if
108 /// called from the specified call site. The call site may be null in which
109 /// case the most generic behavior of this function should be returned.
111
112private:
113 FunctionInfo *getFunctionInfo(const Function *F);
114
115 void AnalyzeGlobals(Module &M);
116 void AnalyzeCallGraph(CallGraph &CG, Module &M);
117 bool AnalyzeUsesOfPointer(Value *V,
118 SmallPtrSetImpl<Function *> *Readers = nullptr,
119 SmallPtrSetImpl<Function *> *Writers = nullptr,
120 GlobalValue *OkayStoreDest = nullptr);
121 bool AnalyzeIndirectGlobalMemory(GlobalVariable *GV);
122 void CollectSCCMembership(CallGraph &CG);
123
124 bool isNonEscapingGlobalNoAlias(const GlobalValue *GV, const Value *V,
125 const Instruction *CtxI);
126 ModRefInfo getModRefInfoForArgument(const CallBase *Call,
127 const GlobalValue *GV, AAQueryInfo &AAQI);
128};
129
130/// Analysis pass providing a never-invalidated alias analysis result.
131class GlobalsAA : public AnalysisInfoMixin<GlobalsAA> {
133 LLVM_ABI static AnalysisKey Key;
134
135public:
137
139};
140
141struct RecomputeGlobalsAAPass : PassInfoMixin<RecomputeGlobalsAAPass> {
143};
144
145/// Legacy wrapper pass to provide the GlobalsAAResult object.
147 std::unique_ptr<GlobalsAAResult> Result;
148
149public:
150 static char ID;
151
153
154 GlobalsAAResult &getResult() { return *Result; }
155 const GlobalsAAResult &getResult() const { return *Result; }
156
157 bool runOnModule(Module &M) override;
158 bool doFinalization(Module &M) override;
159 void getAnalysisUsage(AnalysisUsage &AU) const override;
160};
161
162//===--------------------------------------------------------------------===//
163//
164// createGlobalsAAWrapperPass - This pass provides alias and mod/ref info for
165// global values that do not have their addresses taken.
166//
168}
169
170#endif
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define LLVM_ABI
Definition: Compiler.h:213
This header defines various interfaces for pass management in LLVM.
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
The mod/ref information collected for a particular function.
This class stores info we want to provide to or retain within an alias query.
A base class to help implement the function alias analysis results concept.
MemoryEffects getMemoryEffects(const CallBase *Call, AAQueryInfo &AAQI)
ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc, AAQueryInfo &AAQI)
The possible results of an alias query.
Definition: AliasAnalysis.h:78
API to communicate dependencies between analyses during invalidation.
Definition: PassManager.h:294
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:255
Represent the analysis usage information of a pass.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Definition: InstrTypes.h:1116
The basic data container for the call graph of a Module of IR.
Definition: CallGraph.h:72
Value handle with callbacks on RAUW and destruction.
Definition: ValueHandle.h:384
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:63
An alias analysis result set for globals.
Definition: GlobalsModRef.h:31
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.
const GlobalsAAResult & getResult() const
GlobalsAAResult & getResult()
Analysis pass providing a never-invalidated alias analysis result.
LLVM_ABI GlobalsAAResult run(Module &M, ModuleAnalysisManager &AM)
GlobalsAAResult Result
Representation for a specific memory location.
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
Definition: Pass.h:255
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:67
A set of analyses that are preserved following a run of a transformation pass.
Definition: Analysis.h:112
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
Definition: SmallPtrSet.h:380
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:541
Provides information about what library functions are available for the current target.
LLVM Value Representation.
Definition: Value.h:75
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
LLVM_ABI ModulePass * createGlobalsAAWrapperPass()
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
Definition: ModRef.h:28
A CRTP mix-in that provides informational APIs needed for analysis passes.
Definition: PassManager.h:93
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition: Analysis.h:29
A CRTP mix-in to automatically provide informational APIs needed for passes.
Definition: PassManager.h:70
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)