From: Nikita Popov Date: Wed, 29 Sep 2021 21:40:43 +0000 (+0200) Subject: [BasicAA] Move DecomposedGEP out of header (NFC) X-Git-Tag: upstream/15.0.7~30096 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=28981015526f2192440c18f18e8a20cd11b0779c;p=platform%2Fupstream%2Fllvm.git [BasicAA] Move DecomposedGEP out of header (NFC) It's sufficient to have a forward declaration in the header, we can move the definition of the struct (and VariableGEPIndex) in the source file. --- diff --git a/llvm/include/llvm/Analysis/BasicAliasAnalysis.h b/llvm/include/llvm/Analysis/BasicAliasAnalysis.h index da1ed5f..ed9d1ba 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 f80a44f..6f0fd52 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. ///