LLVM 22.0.0git
BasicAliasAnalysis.h
Go to the documentation of this file.
1//===- BasicAliasAnalysis.h - Stateless, local Alias Analysis ---*- 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 LLVM's primary stateless and local alias analysis.
10///
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_ANALYSIS_BASICALIASANALYSIS_H
14#define LLVM_ANALYSIS_BASICALIASANALYSIS_H
15
18#include "llvm/IR/PassManager.h"
19#include "llvm/Pass.h"
21#include <memory>
22#include <utility>
23
24namespace llvm {
25
26class AssumptionCache;
27class DataLayout;
28class DominatorTree;
29class Function;
30class GEPOperator;
31class PHINode;
32class SelectInst;
33class TargetLibraryInfo;
34class Value;
35
36/// This is the AA result object for the basic, local, and stateless alias
37/// analysis. It implements the AA query interface in an entirely stateless
38/// manner. As one consequence, it is never invalidated due to IR changes.
39/// While it does retain some storage, that is used as an optimization and not
40/// to preserve information from query to query. However it does retain handles
41/// to various other analyses and must be recomputed when those analyses are.
43 const DataLayout &DL;
44 const Function &F;
45 const TargetLibraryInfo &TLI;
47 /// Use getDT() instead of accessing this member directly, in order to
48 /// respect the AAQI.UseDominatorTree option.
49 DominatorTree *DT_;
50
51 DominatorTree *getDT(const AAQueryInfo &AAQI) const {
52 return AAQI.UseDominatorTree ? DT_ : nullptr;
53 }
54
55public:
56 BasicAAResult(const DataLayout &DL, const Function &F,
57 const TargetLibraryInfo &TLI, AssumptionCache &AC,
58 DominatorTree *DT = nullptr)
59 : DL(DL), F(F), TLI(TLI), AC(AC), DT_(DT) {}
60
62 : AAResultBase(Arg), DL(Arg.DL), F(Arg.F), TLI(Arg.TLI), AC(Arg.AC),
63 DT_(Arg.DT_) {}
65 : AAResultBase(std::move(Arg)), DL(Arg.DL), F(Arg.F), TLI(Arg.TLI),
66 AC(Arg.AC), DT_(Arg.DT_) {}
67
68 /// Handle invalidation events in the new pass manager.
71
73 const MemoryLocation &LocB, AAQueryInfo &AAQI,
74 const Instruction *CtxI);
75
77 const MemoryLocation &Loc,
78 AAQueryInfo &AAQI);
79
81 const CallBase *Call2, AAQueryInfo &AAQI);
82
83 /// Returns a bitmask that should be unconditionally applied to the ModRef
84 /// info of a memory location. This allows us to eliminate Mod and/or Ref
85 /// from the ModRef info based on the knowledge that the memory location
86 /// points to constant and/or locally-invariant memory.
87 ///
88 /// If IgnoreLocals is true, then this method returns NoModRef for memory
89 /// that points to a local alloca.
91 AAQueryInfo &AAQI,
92 bool IgnoreLocals = false);
93
94 /// Get the location associated with a pointer argument of a callsite.
95 LLVM_ABI ModRefInfo getArgModRefInfo(const CallBase *Call, unsigned ArgIdx);
96
97 /// Returns the behavior when calling the given call site.
99 AAQueryInfo &AAQI);
100
101 /// Returns the behavior when calling the given function. For use when the
102 /// call site is not known.
104
105private:
106 struct DecomposedGEP;
107
108 /// Tracks instructions visited by pointsToConstantMemory.
110
111 static DecomposedGEP
112 DecomposeGEPExpression(const Value *V, const DataLayout &DL,
114
115 /// A Heuristic for aliasGEP that searches for a constant offset
116 /// between the variables.
117 ///
118 /// GetLinearExpression has some limitations, as generally zext(%x + 1)
119 /// != zext(%x) + zext(1) if the arithmetic overflows. GetLinearExpression
120 /// will therefore conservatively refuse to decompose these expressions.
121 /// However, we know that, for all %x, zext(%x) != zext(%x + 1), even if
122 /// the addition overflows.
123 bool constantOffsetHeuristic(const DecomposedGEP &GEP, LocationSize V1Size,
124 LocationSize V2Size, AssumptionCache *AC,
125 DominatorTree *DT, const AAQueryInfo &AAQI);
126
127 bool isValueEqualInPotentialCycles(const Value *V1, const Value *V2,
128 const AAQueryInfo &AAQI);
129
130 void subtractDecomposedGEPs(DecomposedGEP &DestGEP,
131 const DecomposedGEP &SrcGEP,
132 const AAQueryInfo &AAQI);
133
134 AliasResult aliasGEP(const GEPOperator *V1, LocationSize V1Size,
135 const Value *V2, LocationSize V2Size,
136 const Value *UnderlyingV1, const Value *UnderlyingV2,
137 AAQueryInfo &AAQI);
138
139 AliasResult aliasPHI(const PHINode *PN, LocationSize PNSize,
140 const Value *V2, LocationSize V2Size, AAQueryInfo &AAQI);
141
142 AliasResult aliasSelect(const SelectInst *SI, LocationSize SISize,
143 const Value *V2, LocationSize V2Size,
144 AAQueryInfo &AAQI);
145
146 AliasResult aliasCheck(const Value *V1, LocationSize V1Size, const Value *V2,
147 LocationSize V2Size, AAQueryInfo &AAQI,
148 const Instruction *CtxI);
149
150 AliasResult aliasCheckRecursive(const Value *V1, LocationSize V1Size,
151 const Value *V2, LocationSize V2Size,
152 AAQueryInfo &AAQI, const Value *O1,
153 const Value *O2);
154};
155
156/// Analysis pass providing a never-invalidated alias analysis result.
157class BasicAA : public AnalysisInfoMixin<BasicAA> {
159
160 LLVM_ABI static AnalysisKey Key;
161
162public:
164
166};
167
168/// Legacy wrapper pass to provide the BasicAAResult object.
170 std::unique_ptr<BasicAAResult> Result;
171
172 virtual void anchor();
173
174public:
175 static char ID;
176
178
179 BasicAAResult &getResult() { return *Result; }
180 const BasicAAResult &getResult() const { return *Result; }
181
182 bool runOnFunction(Function &F) override;
183 void getAnalysisUsage(AnalysisUsage &AU) const override;
184};
185
186LLVM_ABI FunctionPass *createBasicAAWrapperPass();
187
188} // end namespace llvm
189
190#endif // LLVM_ANALYSIS_BASICALIASANALYSIS_H
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define LLVM_ABI
Definition: Compiler.h:213
static bool runOnFunction(Function &F, bool PostInlining)
Hexagon Common GEP
This header defines various interfaces for pass management in LLVM.
#define F(x, y, z)
Definition: MD5.cpp:55
StandardInstrumentations SI(Mod->getContext(), Debug, VerifyEach)
This file defines the SmallPtrSet class.
This class stores info we want to provide to or retain within an alias query.
bool UseDominatorTree
Whether alias analysis is allowed to use the dominator tree, for use by passes that lazily update the...
A base class to help implement the function alias analysis results concept.
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.
A cache of @llvm.assume calls within a function.
This is the AA result object for the basic, local, and stateless alias analysis.
BasicAAResult(const DataLayout &DL, const Function &F, const TargetLibraryInfo &TLI, AssumptionCache &AC, DominatorTree *DT=nullptr)
LLVM_ABI ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc, AAQueryInfo &AAQI)
Checks to see if the specified callsite can clobber the specified memory object.
LLVM_ABI ModRefInfo getArgModRefInfo(const CallBase *Call, unsigned ArgIdx)
Get the location associated with a pointer argument of a callsite.
BasicAAResult(BasicAAResult &&Arg)
LLVM_ABI MemoryEffects getMemoryEffects(const CallBase *Call, AAQueryInfo &AAQI)
Returns the behavior when calling the given call site.
BasicAAResult(const BasicAAResult &Arg)
LLVM_ABI ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI, bool IgnoreLocals=false)
Returns a bitmask that should be unconditionally applied to the ModRef info of a memory location.
LLVM_ABI bool invalidate(Function &Fn, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &Inv)
Handle invalidation events in the new pass manager.
LLVM_ABI AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, AAQueryInfo &AAQI, const Instruction *CtxI)
Legacy wrapper pass to provide the BasicAAResult object.
const BasicAAResult & getResult() const
Analysis pass providing a never-invalidated alias analysis result.
LLVM_ABI BasicAAResult run(Function &F, FunctionAnalysisManager &AM)
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Definition: InstrTypes.h:1116
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:63
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition: Dominators.h:165
FunctionPass class - This class is used to implement most global optimizations.
Definition: Pass.h:314
Representation for a specific memory location.
A set of analyses that are preserved following a run of a transformation pass.
Definition: Analysis.h:112
This class represents the LLVM 'select' instruction.
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 FunctionPass * createBasicAAWrapperPass()
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
Definition: ModRef.h:28
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:1886
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:856
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