diff --git a/llvm/include/llvm/Analysis/BasicAliasAnalysis.h b/llvm/include/llvm/Analysis/BasicAliasAnalysis.h index da1ed5f6fe41..ed9d1ba4c5a7 100644 --- a/llvm/include/llvm/Analysis/BasicAliasAnalysis.h +++ b/llvm/include/llvm/Analysis/BasicAliasAnalysis.h @@ -13,10 +13,8 @@ #ifndef LLVM_ANALYSIS_BASICALIASANALYSIS_H #define LLVM_ANALYSIS_BASICALIASANALYSIS_H -#include "llvm/ADT/DenseMap.h" #include "llvm/ADT/Optional.h" #include "llvm/ADT/SmallPtrSet.h" -#include "llvm/ADT/SmallVector.h" #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/IR/PassManager.h" #include "llvm/Pass.h" @@ -28,7 +26,6 @@ namespace llvm { struct AAMDNodes; -class APInt; class AssumptionCache; class BasicBlock; class DataLayout; @@ -98,71 +95,7 @@ public: FunctionModRefBehavior getModRefBehavior(const Function *Fn); private: - // A linear transformation of a Value; this class represents ZExt(SExt(V, - // SExtBits), ZExtBits) * Scale + Offset. - struct VariableGEPIndex { - // An opaque Value - we can't decompose this further. - const Value *V; - - // We need to track what extensions we've done as we consider the same Value - // with different extensions as different variables in a GEP's linear - // expression; - // e.g.: if V == -1, then sext(x) != zext(x). - unsigned ZExtBits; - unsigned SExtBits; - - APInt Scale; - - // Context instruction to use when querying information about this index. - const Instruction *CxtI; - - /// True if all operations in this expression are NSW. - bool IsNSW; - - void dump() const { - print(dbgs()); - dbgs() << "\n"; - } - void print(raw_ostream &OS) const { - OS << "(V=" << V->getName() - << ", zextbits=" << ZExtBits - << ", sextbits=" << SExtBits - << ", scale=" << Scale << ")"; - } - }; - - // Represents the internal structure of a GEP, decomposed into a base pointer, - // constant offsets, and variable scaled indices. - struct DecomposedGEP { - // Base pointer of the GEP - const Value *Base; - // Total constant offset from base. - APInt Offset; - // Scaled variable (non-constant) indices. - SmallVector VarIndices; - // Is GEP index scale compile-time constant. - bool HasCompileTimeConstantScale; - // Are all operations inbounds GEPs or non-indexing operations? - // (None iff expression doesn't involve any geps) - Optional InBounds; - - void dump() const { - print(dbgs()); - dbgs() << "\n"; - } - void print(raw_ostream &OS) const { - OS << "(DecomposedGEP Base=" << Base->getName() - << ", Offset=" << Offset - << ", VarIndices=["; - for (size_t i = 0; i < VarIndices.size(); i++) { - if (i != 0) - OS << ", "; - VarIndices[i].print(OS); - } - OS << "], HasCompileTimeConstantScale=" << HasCompileTimeConstantScale - << ")"; - } - }; + struct DecomposedGEP; /// Tracks phi nodes we have visited. /// diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index f80a44fd7a11..6f0fd52ca541 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -455,6 +455,75 @@ static unsigned getMaxPointerSize(const DataLayout &DL) { return MaxPointerSize; } +namespace { +// A linear transformation of a Value; this class represents ZExt(SExt(V, +// SExtBits), ZExtBits) * Scale + Offset. +struct VariableGEPIndex { + // An opaque Value - we can't decompose this further. + const Value *V; + + // We need to track what extensions we've done as we consider the same Value + // with different extensions as different variables in a GEP's linear + // expression; + // e.g.: if V == -1, then sext(x) != zext(x). + unsigned ZExtBits; + unsigned SExtBits; + + APInt Scale; + + // Context instruction to use when querying information about this index. + const Instruction *CxtI; + + /// True if all operations in this expression are NSW. + bool IsNSW; + + void dump() const { + print(dbgs()); + dbgs() << "\n"; + } + void print(raw_ostream &OS) const { + OS << "(V=" << V->getName() + << ", zextbits=" << ZExtBits + << ", sextbits=" << SExtBits + << ", scale=" << Scale << ")"; + } +}; +} + +// Represents the internal structure of a GEP, decomposed into a base pointer, +// constant offsets, and variable scaled indices. +struct BasicAAResult::DecomposedGEP { + // Base pointer of the GEP + const Value *Base; + // Total constant offset from base. + APInt Offset; + // Scaled variable (non-constant) indices. + SmallVector VarIndices; + // Is GEP index scale compile-time constant. + bool HasCompileTimeConstantScale; + // Are all operations inbounds GEPs or non-indexing operations? + // (None iff expression doesn't involve any geps) + Optional InBounds; + + void dump() const { + print(dbgs()); + dbgs() << "\n"; + } + void print(raw_ostream &OS) const { + OS << "(DecomposedGEP Base=" << Base->getName() + << ", Offset=" << Offset + << ", VarIndices=["; + for (size_t i = 0; i < VarIndices.size(); i++) { + if (i != 0) + OS << ", "; + VarIndices[i].print(OS); + } + OS << "], HasCompileTimeConstantScale=" << HasCompileTimeConstantScale + << ")"; + } +}; + + /// If V is a symbolic pointer expression, decompose it into a base pointer /// with a constant offset and a number of scaled symbolic offsets. ///