[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.
This commit is contained in:
Nikita Popov 2021-09-29 23:40:43 +02:00
parent 79b4220806
commit 2898101552
2 changed files with 70 additions and 68 deletions

View File

@ -13,10 +13,8 @@
#ifndef LLVM_ANALYSIS_BASICALIASANALYSIS_H #ifndef LLVM_ANALYSIS_BASICALIASANALYSIS_H
#define LLVM_ANALYSIS_BASICALIASANALYSIS_H #define LLVM_ANALYSIS_BASICALIASANALYSIS_H
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/Optional.h" #include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/IR/PassManager.h" #include "llvm/IR/PassManager.h"
#include "llvm/Pass.h" #include "llvm/Pass.h"
@ -28,7 +26,6 @@
namespace llvm { namespace llvm {
struct AAMDNodes; struct AAMDNodes;
class APInt;
class AssumptionCache; class AssumptionCache;
class BasicBlock; class BasicBlock;
class DataLayout; class DataLayout;
@ -98,71 +95,7 @@ public:
FunctionModRefBehavior getModRefBehavior(const Function *Fn); FunctionModRefBehavior getModRefBehavior(const Function *Fn);
private: private:
// A linear transformation of a Value; this class represents ZExt(SExt(V, struct DecomposedGEP;
// 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<VariableGEPIndex, 4> 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<bool> 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
<< ")";
}
};
/// Tracks phi nodes we have visited. /// Tracks phi nodes we have visited.
/// ///

View File

@ -455,6 +455,75 @@ static unsigned getMaxPointerSize(const DataLayout &DL) {
return MaxPointerSize; 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<VariableGEPIndex, 4> 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<bool> 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 /// If V is a symbolic pointer expression, decompose it into a base pointer
/// with a constant offset and a number of scaled symbolic offsets. /// with a constant offset and a number of scaled symbolic offsets.
/// ///