File indexing completed on 2026-05-10 08:43:11
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef LLVM_ANALYSIS_BASICALIASANALYSIS_H
0014 #define LLVM_ANALYSIS_BASICALIASANALYSIS_H
0015
0016 #include "llvm/ADT/SmallPtrSet.h"
0017 #include "llvm/Analysis/AliasAnalysis.h"
0018 #include "llvm/IR/PassManager.h"
0019 #include "llvm/Pass.h"
0020 #include <memory>
0021 #include <utility>
0022
0023 namespace llvm {
0024
0025 class AssumptionCache;
0026 class DataLayout;
0027 class DominatorTree;
0028 class Function;
0029 class GEPOperator;
0030 class PHINode;
0031 class SelectInst;
0032 class TargetLibraryInfo;
0033 class Value;
0034
0035
0036
0037
0038
0039
0040
0041 class BasicAAResult : public AAResultBase {
0042 const DataLayout &DL;
0043 const Function &F;
0044 const TargetLibraryInfo &TLI;
0045 AssumptionCache &AC;
0046
0047
0048 DominatorTree *DT_;
0049
0050 DominatorTree *getDT(const AAQueryInfo &AAQI) const {
0051 return AAQI.UseDominatorTree ? DT_ : nullptr;
0052 }
0053
0054 public:
0055 BasicAAResult(const DataLayout &DL, const Function &F,
0056 const TargetLibraryInfo &TLI, AssumptionCache &AC,
0057 DominatorTree *DT = nullptr)
0058 : DL(DL), F(F), TLI(TLI), AC(AC), DT_(DT) {}
0059
0060 BasicAAResult(const BasicAAResult &Arg)
0061 : AAResultBase(Arg), DL(Arg.DL), F(Arg.F), TLI(Arg.TLI), AC(Arg.AC),
0062 DT_(Arg.DT_) {}
0063 BasicAAResult(BasicAAResult &&Arg)
0064 : AAResultBase(std::move(Arg)), DL(Arg.DL), F(Arg.F), TLI(Arg.TLI),
0065 AC(Arg.AC), DT_(Arg.DT_) {}
0066
0067
0068 bool invalidate(Function &Fn, const PreservedAnalyses &PA,
0069 FunctionAnalysisManager::Invalidator &Inv);
0070
0071 AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB,
0072 AAQueryInfo &AAQI, const Instruction *CtxI);
0073
0074 ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc,
0075 AAQueryInfo &AAQI);
0076
0077 ModRefInfo getModRefInfo(const CallBase *Call1, const CallBase *Call2,
0078 AAQueryInfo &AAQI);
0079
0080
0081
0082
0083
0084
0085
0086
0087 ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI,
0088 bool IgnoreLocals = false);
0089
0090
0091 ModRefInfo getArgModRefInfo(const CallBase *Call, unsigned ArgIdx);
0092
0093
0094 MemoryEffects getMemoryEffects(const CallBase *Call, AAQueryInfo &AAQI);
0095
0096
0097
0098 MemoryEffects getMemoryEffects(const Function *Fn);
0099
0100 private:
0101 struct DecomposedGEP;
0102
0103
0104 SmallPtrSet<const Value *, 16> Visited;
0105
0106 static DecomposedGEP
0107 DecomposeGEPExpression(const Value *V, const DataLayout &DL,
0108 AssumptionCache *AC, DominatorTree *DT);
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118 bool constantOffsetHeuristic(const DecomposedGEP &GEP, LocationSize V1Size,
0119 LocationSize V2Size, AssumptionCache *AC,
0120 DominatorTree *DT, const AAQueryInfo &AAQI);
0121
0122 bool isValueEqualInPotentialCycles(const Value *V1, const Value *V2,
0123 const AAQueryInfo &AAQI);
0124
0125 void subtractDecomposedGEPs(DecomposedGEP &DestGEP,
0126 const DecomposedGEP &SrcGEP,
0127 const AAQueryInfo &AAQI);
0128
0129 AliasResult aliasGEP(const GEPOperator *V1, LocationSize V1Size,
0130 const Value *V2, LocationSize V2Size,
0131 const Value *UnderlyingV1, const Value *UnderlyingV2,
0132 AAQueryInfo &AAQI);
0133
0134 AliasResult aliasPHI(const PHINode *PN, LocationSize PNSize,
0135 const Value *V2, LocationSize V2Size, AAQueryInfo &AAQI);
0136
0137 AliasResult aliasSelect(const SelectInst *SI, LocationSize SISize,
0138 const Value *V2, LocationSize V2Size,
0139 AAQueryInfo &AAQI);
0140
0141 AliasResult aliasCheck(const Value *V1, LocationSize V1Size, const Value *V2,
0142 LocationSize V2Size, AAQueryInfo &AAQI,
0143 const Instruction *CtxI);
0144
0145 AliasResult aliasCheckRecursive(const Value *V1, LocationSize V1Size,
0146 const Value *V2, LocationSize V2Size,
0147 AAQueryInfo &AAQI, const Value *O1,
0148 const Value *O2);
0149 };
0150
0151
0152 class BasicAA : public AnalysisInfoMixin<BasicAA> {
0153 friend AnalysisInfoMixin<BasicAA>;
0154
0155 static AnalysisKey Key;
0156
0157 public:
0158 using Result = BasicAAResult;
0159
0160 BasicAAResult run(Function &F, FunctionAnalysisManager &AM);
0161 };
0162
0163
0164 class BasicAAWrapperPass : public FunctionPass {
0165 std::unique_ptr<BasicAAResult> Result;
0166
0167 virtual void anchor();
0168
0169 public:
0170 static char ID;
0171
0172 BasicAAWrapperPass();
0173
0174 BasicAAResult &getResult() { return *Result; }
0175 const BasicAAResult &getResult() const { return *Result; }
0176
0177 bool runOnFunction(Function &F) override;
0178 void getAnalysisUsage(AnalysisUsage &AU) const override;
0179 };
0180
0181 FunctionPass *createBasicAAWrapperPass();
0182
0183 }
0184
0185 #endif