[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:
parent
79b4220806
commit
2898101552
|
@ -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<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
|
||||
<< ")";
|
||||
}
|
||||
};
|
||||
struct DecomposedGEP;
|
||||
|
||||
/// Tracks phi nodes we have visited.
|
||||
///
|
||||
|
|
|
@ -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<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
|
||||
/// with a constant offset and a number of scaled symbolic offsets.
|
||||
///
|
||||
|
|
Loading…
Reference in New Issue