[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
|
#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.
|
||||||
///
|
///
|
||||||
|
|
|
@ -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.
|
||||||
///
|
///
|
||||||
|
|
Loading…
Reference in New Issue