forked from OSchip/llvm-project
Move the ConstantInt uniquing table into LLVMContextImpl. This exposed a number of issues in
our current context-passing stuff, which is also fixed here llvm-svn: 76089
This commit is contained in:
parent
ca75db7c02
commit
20b34ac794
|
@ -80,13 +80,13 @@ void addMainFunction(Module *mod) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//ret i32 0
|
//ret i32 0
|
||||||
ReturnInst::Create(ConstantInt::get(APInt(32, 0)), bb);
|
ReturnInst::Create(getGlobalContext().getConstantInt(APInt(32, 0)), bb);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
cl::ParseCommandLineOptions(argc, argv, " BrainF compiler\n");
|
cl::ParseCommandLineOptions(argc, argv, " BrainF compiler\n");
|
||||||
|
|
||||||
LLVMContext Context;
|
LLVMContext &Context = getGlobalContext();
|
||||||
|
|
||||||
if (InputFilename == "") {
|
if (InputFilename == "") {
|
||||||
std::cerr<<"Error: You must specify the filename of the program to "
|
std::cerr<<"Error: You must specify the filename of the program to "
|
||||||
|
|
|
@ -37,6 +37,7 @@ public:
|
||||||
|
|
||||||
// Initialization and finalization hooks.
|
// Initialization and finalization hooks.
|
||||||
virtual bool doInitialization(Loop *L, LPPassManager &LPM) {
|
virtual bool doInitialization(Loop *L, LPPassManager &LPM) {
|
||||||
|
Context = L->getHeader()->getContext();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#define LLVM_CALL_GRAPH_SCC_PASS_H
|
#define LLVM_CALL_GRAPH_SCC_PASS_H
|
||||||
|
|
||||||
#include "llvm/Pass.h"
|
#include "llvm/Pass.h"
|
||||||
|
#include "llvm/Analysis/CallGraph.h"
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
|
@ -37,6 +38,7 @@ struct CallGraphSCCPass : public Pass {
|
||||||
/// doInitialization - This method is called before the SCC's of the program
|
/// doInitialization - This method is called before the SCC's of the program
|
||||||
/// has been processed, allowing the pass to do initialization as necessary.
|
/// has been processed, allowing the pass to do initialization as necessary.
|
||||||
virtual bool doInitialization(CallGraph &CG) {
|
virtual bool doInitialization(CallGraph &CG) {
|
||||||
|
Context = &CG.getModule().getContext();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,7 @@ class ConstantInt : public Constant {
|
||||||
ConstantInt(const ConstantInt &); // DO NOT IMPLEMENT
|
ConstantInt(const ConstantInt &); // DO NOT IMPLEMENT
|
||||||
ConstantInt(const IntegerType *Ty, const APInt& V);
|
ConstantInt(const IntegerType *Ty, const APInt& V);
|
||||||
APInt Val;
|
APInt Val;
|
||||||
|
friend class LLVMContextImpl;
|
||||||
protected:
|
protected:
|
||||||
// allocate space for exactly zero operands
|
// allocate space for exactly zero operands
|
||||||
void *operator new(size_t s) {
|
void *operator new(size_t s) {
|
||||||
|
@ -102,10 +103,6 @@ public:
|
||||||
return CreateTrueFalseVals(false);
|
return CreateTrueFalseVals(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return a ConstantInt with the specified value and an implied Type. The
|
|
||||||
/// type is the integer type that corresponds to the bit width of the value.
|
|
||||||
static ConstantInt *get(const APInt &V);
|
|
||||||
|
|
||||||
/// getType - Specialize the getType() method to always return an IntegerType,
|
/// getType - Specialize the getType() method to always return an IntegerType,
|
||||||
/// which reduces the amount of casting needed in parts of the compiler.
|
/// which reduces the amount of casting needed in parts of the compiler.
|
||||||
///
|
///
|
||||||
|
|
|
@ -93,6 +93,8 @@ public:
|
||||||
ConstantInt* getConstantIntSigned(const IntegerType* Ty, int64_t V);
|
ConstantInt* getConstantIntSigned(const IntegerType* Ty, int64_t V);
|
||||||
Constant *getConstantIntSigned(const Type *Ty, int64_t V);
|
Constant *getConstantIntSigned(const Type *Ty, int64_t V);
|
||||||
|
|
||||||
|
/// Return a ConstantInt with the specified value and an implied Type. The
|
||||||
|
/// type is the integer type that corresponds to the bit width of the value.
|
||||||
ConstantInt* getConstantInt(const APInt& V);
|
ConstantInt* getConstantInt(const APInt& V);
|
||||||
|
|
||||||
/// If Ty is a vector type, return a Constant with a splat of the given
|
/// If Ty is a vector type, return a Constant with a splat of the given
|
||||||
|
|
|
@ -312,6 +312,8 @@ BasicAliasAnalysis::getModRefInfo(CallSite CS1, CallSite CS2) {
|
||||||
AliasAnalysis::AliasResult
|
AliasAnalysis::AliasResult
|
||||||
BasicAliasAnalysis::alias(const Value *V1, unsigned V1Size,
|
BasicAliasAnalysis::alias(const Value *V1, unsigned V1Size,
|
||||||
const Value *V2, unsigned V2Size) {
|
const Value *V2, unsigned V2Size) {
|
||||||
|
Context = &V1->getType()->getContext();
|
||||||
|
|
||||||
// Strip off any constant expression casts if they exist
|
// Strip off any constant expression casts if they exist
|
||||||
if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(V1))
|
if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(V1))
|
||||||
if (CE->isCast() && isa<PointerType>(CE->getOperand(0)->getType()))
|
if (CE->isCast() && isa<PointerType>(CE->getOperand(0)->getType()))
|
||||||
|
@ -530,6 +532,8 @@ BasicAliasAnalysis::CheckGEPInstructions(
|
||||||
|
|
||||||
const PointerType *GEPPointerTy = cast<PointerType>(BasePtr1Ty);
|
const PointerType *GEPPointerTy = cast<PointerType>(BasePtr1Ty);
|
||||||
|
|
||||||
|
Context = &GEPPointerTy->getContext();
|
||||||
|
|
||||||
// Find the (possibly empty) initial sequence of equal values... which are not
|
// Find the (possibly empty) initial sequence of equal values... which are not
|
||||||
// necessarily constants.
|
// necessarily constants.
|
||||||
unsigned NumGEP1Operands = NumGEP1Ops, NumGEP2Operands = NumGEP2Ops;
|
unsigned NumGEP1Operands = NumGEP1Ops, NumGEP2Operands = NumGEP2Ops;
|
||||||
|
|
|
@ -191,7 +191,7 @@ const SCEV *ScalarEvolution::getConstant(ConstantInt *V) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const SCEV *ScalarEvolution::getConstant(const APInt& Val) {
|
const SCEV *ScalarEvolution::getConstant(const APInt& Val) {
|
||||||
return getConstant(ConstantInt::get(Val));
|
return getConstant(Context->getConstantInt(Val));
|
||||||
}
|
}
|
||||||
|
|
||||||
const SCEV *
|
const SCEV *
|
||||||
|
@ -1517,7 +1517,7 @@ const SCEV *ScalarEvolution::getMulExpr(SmallVectorImpl<const SCEV *> &Ops) {
|
||||||
++Idx;
|
++Idx;
|
||||||
while (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(Ops[Idx])) {
|
while (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(Ops[Idx])) {
|
||||||
// We found two constants, fold them together!
|
// We found two constants, fold them together!
|
||||||
ConstantInt *Fold = ConstantInt::get(LHSC->getValue()->getValue() *
|
ConstantInt *Fold = Context->getConstantInt(LHSC->getValue()->getValue() *
|
||||||
RHSC->getValue()->getValue());
|
RHSC->getValue()->getValue());
|
||||||
Ops[0] = getConstant(Fold);
|
Ops[0] = getConstant(Fold);
|
||||||
Ops.erase(Ops.begin()+1); // Erase the folded element
|
Ops.erase(Ops.begin()+1); // Erase the folded element
|
||||||
|
@ -1868,7 +1868,7 @@ ScalarEvolution::getSMaxExpr(SmallVectorImpl<const SCEV *> &Ops) {
|
||||||
assert(Idx < Ops.size());
|
assert(Idx < Ops.size());
|
||||||
while (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(Ops[Idx])) {
|
while (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(Ops[Idx])) {
|
||||||
// We found two constants, fold them together!
|
// We found two constants, fold them together!
|
||||||
ConstantInt *Fold = ConstantInt::get(
|
ConstantInt *Fold = Context->getConstantInt(
|
||||||
APIntOps::smax(LHSC->getValue()->getValue(),
|
APIntOps::smax(LHSC->getValue()->getValue(),
|
||||||
RHSC->getValue()->getValue()));
|
RHSC->getValue()->getValue()));
|
||||||
Ops[0] = getConstant(Fold);
|
Ops[0] = getConstant(Fold);
|
||||||
|
@ -1965,7 +1965,7 @@ ScalarEvolution::getUMaxExpr(SmallVectorImpl<const SCEV *> &Ops) {
|
||||||
assert(Idx < Ops.size());
|
assert(Idx < Ops.size());
|
||||||
while (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(Ops[Idx])) {
|
while (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(Ops[Idx])) {
|
||||||
// We found two constants, fold them together!
|
// We found two constants, fold them together!
|
||||||
ConstantInt *Fold = ConstantInt::get(
|
ConstantInt *Fold = Context->getConstantInt(
|
||||||
APIntOps::umax(LHSC->getValue()->getValue(),
|
APIntOps::umax(LHSC->getValue()->getValue(),
|
||||||
RHSC->getValue()->getValue()));
|
RHSC->getValue()->getValue()));
|
||||||
Ops[0] = getConstant(Fold);
|
Ops[0] = getConstant(Fold);
|
||||||
|
@ -2887,7 +2887,7 @@ const SCEV *ScalarEvolution::createSCEV(Value *V) {
|
||||||
// Turn shift left of a constant amount into a multiply.
|
// Turn shift left of a constant amount into a multiply.
|
||||||
if (ConstantInt *SA = dyn_cast<ConstantInt>(U->getOperand(1))) {
|
if (ConstantInt *SA = dyn_cast<ConstantInt>(U->getOperand(1))) {
|
||||||
uint32_t BitWidth = cast<IntegerType>(V->getType())->getBitWidth();
|
uint32_t BitWidth = cast<IntegerType>(V->getType())->getBitWidth();
|
||||||
Constant *X = ConstantInt::get(
|
Constant *X = Context->getConstantInt(
|
||||||
APInt(BitWidth, 1).shl(SA->getLimitedValue(BitWidth)));
|
APInt(BitWidth, 1).shl(SA->getLimitedValue(BitWidth)));
|
||||||
return getMulExpr(getSCEV(U->getOperand(0)), getSCEV(X));
|
return getMulExpr(getSCEV(U->getOperand(0)), getSCEV(X));
|
||||||
}
|
}
|
||||||
|
@ -2897,7 +2897,7 @@ const SCEV *ScalarEvolution::createSCEV(Value *V) {
|
||||||
// Turn logical shift right of a constant into a unsigned divide.
|
// Turn logical shift right of a constant into a unsigned divide.
|
||||||
if (ConstantInt *SA = dyn_cast<ConstantInt>(U->getOperand(1))) {
|
if (ConstantInt *SA = dyn_cast<ConstantInt>(U->getOperand(1))) {
|
||||||
uint32_t BitWidth = cast<IntegerType>(V->getType())->getBitWidth();
|
uint32_t BitWidth = cast<IntegerType>(V->getType())->getBitWidth();
|
||||||
Constant *X = ConstantInt::get(
|
Constant *X = Context->getConstantInt(
|
||||||
APInt(BitWidth, 1).shl(SA->getLimitedValue(BitWidth)));
|
APInt(BitWidth, 1).shl(SA->getLimitedValue(BitWidth)));
|
||||||
return getUDivExpr(getSCEV(U->getOperand(0)), getSCEV(X));
|
return getUDivExpr(getSCEV(U->getOperand(0)), getSCEV(X));
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,7 +108,7 @@ unsigned FastISel::getRegForValue(Value *V) {
|
||||||
if (isExact) {
|
if (isExact) {
|
||||||
APInt IntVal(IntBitWidth, 2, x);
|
APInt IntVal(IntBitWidth, 2, x);
|
||||||
|
|
||||||
unsigned IntegerReg = getRegForValue(ConstantInt::get(IntVal));
|
unsigned IntegerReg = getRegForValue(Context->getConstantInt(IntVal));
|
||||||
if (IntegerReg != 0)
|
if (IntegerReg != 0)
|
||||||
Reg = FastEmit_r(IntVT.getSimpleVT(), VT, ISD::SINT_TO_FP, IntegerReg);
|
Reg = FastEmit_r(IntVT.getSimpleVT(), VT, ISD::SINT_TO_FP, IntegerReg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2305,7 +2305,8 @@ SDValue DAGTypeLegalizer::ExpandIntOp_UINT_TO_FP(SDNode *N) {
|
||||||
ISD::SETLT);
|
ISD::SETLT);
|
||||||
|
|
||||||
// Build a 64 bit pair (0, FF) in the constant pool, with FF in the lo bits.
|
// Build a 64 bit pair (0, FF) in the constant pool, with FF in the lo bits.
|
||||||
SDValue FudgePtr = DAG.getConstantPool(ConstantInt::get(FF.zext(64)),
|
SDValue FudgePtr = DAG.getConstantPool(
|
||||||
|
DAG.getContext()->getConstantInt(FF.zext(64)),
|
||||||
TLI.getPointerTy());
|
TLI.getPointerTy());
|
||||||
|
|
||||||
// Get a pointer to FF if the sign bit was set, or to 0 otherwise.
|
// Get a pointer to FF if the sign bit was set, or to 0 otherwise.
|
||||||
|
|
|
@ -874,7 +874,7 @@ SDValue SelectionDAG::getConstant(uint64_t Val, MVT VT, bool isT) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SDValue SelectionDAG::getConstant(const APInt &Val, MVT VT, bool isT) {
|
SDValue SelectionDAG::getConstant(const APInt &Val, MVT VT, bool isT) {
|
||||||
return getConstant(*ConstantInt::get(Val), VT, isT);
|
return getConstant(*Context->getConstantInt(Val), VT, isT);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDValue SelectionDAG::getConstant(const ConstantInt &Val, MVT VT, bool isT) {
|
SDValue SelectionDAG::getConstant(const ConstantInt &Val, MVT VT, bool isT) {
|
||||||
|
|
|
@ -2406,7 +2406,8 @@ void SelectionDAGLowering::visitShuffleVector(User &I) {
|
||||||
// Convert the ConstantVector mask operand into an array of ints, with -1
|
// Convert the ConstantVector mask operand into an array of ints, with -1
|
||||||
// representing undef values.
|
// representing undef values.
|
||||||
SmallVector<Constant*, 8> MaskElts;
|
SmallVector<Constant*, 8> MaskElts;
|
||||||
cast<Constant>(I.getOperand(2))->getVectorElements(*Context, MaskElts);
|
cast<Constant>(I.getOperand(2))->getVectorElements(*DAG.getContext(),
|
||||||
|
MaskElts);
|
||||||
unsigned MaskNumElts = MaskElts.size();
|
unsigned MaskNumElts = MaskElts.size();
|
||||||
for (unsigned i = 0; i != MaskNumElts; ++i) {
|
for (unsigned i = 0; i != MaskNumElts; ++i) {
|
||||||
if (isa<UndefValue>(MaskElts[i]))
|
if (isa<UndefValue>(MaskElts[i]))
|
||||||
|
|
|
@ -908,6 +908,7 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) {
|
||||||
|
|
||||||
bool DAE::runOnModule(Module &M) {
|
bool DAE::runOnModule(Module &M) {
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
|
Context = &M.getContext();
|
||||||
|
|
||||||
// First pass: Do a simple check to see if any functions can have their "..."
|
// First pass: Do a simple check to see if any functions can have their "..."
|
||||||
// removed. We can do this if they never call va_start. This loop cannot be
|
// removed. We can do this if they never call va_start. This loop cannot be
|
||||||
|
|
|
@ -77,6 +77,7 @@ static inline bool ShouldNukeSymtabEntry(const Type *Ty){
|
||||||
//
|
//
|
||||||
bool DTE::runOnModule(Module &M) {
|
bool DTE::runOnModule(Module &M) {
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
|
Context = &M.getContext();
|
||||||
|
|
||||||
TypeSymbolTable &ST = M.getTypeSymbolTable();
|
TypeSymbolTable &ST = M.getTypeSymbolTable();
|
||||||
std::set<const Type *> UsedTypes = getAnalysis<FindUsedTypes>().getTypes();
|
std::set<const Type *> UsedTypes = getAnalysis<FindUsedTypes>().getTypes();
|
||||||
|
|
|
@ -44,6 +44,8 @@ namespace {
|
||||||
return false; // Nothing to extract
|
return false; // Nothing to extract
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Context = &M.getContext();
|
||||||
|
|
||||||
if (deleteStuff)
|
if (deleteStuff)
|
||||||
return deleteGV();
|
return deleteGV();
|
||||||
M.setModuleInlineAsm("");
|
M.setModuleInlineAsm("");
|
||||||
|
|
|
@ -58,6 +58,8 @@ ModulePass *llvm::createGlobalDCEPass() { return new GlobalDCE(); }
|
||||||
|
|
||||||
bool GlobalDCE::runOnModule(Module &M) {
|
bool GlobalDCE::runOnModule(Module &M) {
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
|
Context = &M.getContext();
|
||||||
|
|
||||||
// Loop over the module, adding globals which are obviously necessary.
|
// Loop over the module, adding globals which are obviously necessary.
|
||||||
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
|
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
|
||||||
Changed |= RemoveUnusedGlobalValue(*I);
|
Changed |= RemoveUnusedGlobalValue(*I);
|
||||||
|
|
|
@ -2476,6 +2476,7 @@ bool GlobalOpt::OptimizeGlobalAliases(Module &M) {
|
||||||
|
|
||||||
bool GlobalOpt::runOnModule(Module &M) {
|
bool GlobalOpt::runOnModule(Module &M) {
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
|
Context = &M.getContext();
|
||||||
|
|
||||||
// Try to find the llvm.globalctors list.
|
// Try to find the llvm.globalctors list.
|
||||||
GlobalVariable *GlobalCtors = FindGlobalCtors(M);
|
GlobalVariable *GlobalCtors = FindGlobalCtors(M);
|
||||||
|
|
|
@ -56,6 +56,8 @@ bool IPCP::runOnModule(Module &M) {
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
bool LocalChange = true;
|
bool LocalChange = true;
|
||||||
|
|
||||||
|
Context = &M.getContext();
|
||||||
|
|
||||||
// FIXME: instead of using smart algorithms, we just iterate until we stop
|
// FIXME: instead of using smart algorithms, we just iterate until we stop
|
||||||
// making changes.
|
// making changes.
|
||||||
while (LocalChange) {
|
while (LocalChange) {
|
||||||
|
|
|
@ -44,6 +44,8 @@ static RegisterPass<IndMemRemPass>
|
||||||
X("indmemrem","Indirect Malloc and Free Removal");
|
X("indmemrem","Indirect Malloc and Free Removal");
|
||||||
|
|
||||||
bool IndMemRemPass::runOnModule(Module &M) {
|
bool IndMemRemPass::runOnModule(Module &M) {
|
||||||
|
Context = &M.getContext();
|
||||||
|
|
||||||
// In theory, all direct calls of malloc and free should be promoted
|
// In theory, all direct calls of malloc and free should be promoted
|
||||||
// to intrinsics. Therefore, this goes through and finds where the
|
// to intrinsics. Therefore, this goes through and finds where the
|
||||||
// address of free or malloc are taken and replaces those with bounce
|
// address of free or malloc are taken and replaces those with bounce
|
||||||
|
|
|
@ -101,6 +101,8 @@ void InternalizePass::LoadFile(const char *Filename) {
|
||||||
bool InternalizePass::runOnModule(Module &M) {
|
bool InternalizePass::runOnModule(Module &M) {
|
||||||
CallGraph *CG = getAnalysisIfAvailable<CallGraph>();
|
CallGraph *CG = getAnalysisIfAvailable<CallGraph>();
|
||||||
CallGraphNode *ExternalNode = CG ? CG->getExternalCallingNode() : 0;
|
CallGraphNode *ExternalNode = CG ? CG->getExternalCallingNode() : 0;
|
||||||
|
|
||||||
|
Context = &M.getContext();
|
||||||
|
|
||||||
if (ExternalNames.empty()) {
|
if (ExternalNames.empty()) {
|
||||||
// Return if we're not in 'all but main' mode and have no external api
|
// Return if we're not in 'all but main' mode and have no external api
|
||||||
|
|
|
@ -134,6 +134,8 @@ static RegisterPass<LowerSetJmp> X("lowersetjmp", "Lower Set Jump");
|
||||||
bool LowerSetJmp::runOnModule(Module& M) {
|
bool LowerSetJmp::runOnModule(Module& M) {
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
|
|
||||||
|
Context = &M.getContext();
|
||||||
|
|
||||||
// These are what the functions are called.
|
// These are what the functions are called.
|
||||||
Function* SetJmp = M.getFunction("llvm.setjmp");
|
Function* SetJmp = M.getFunction("llvm.setjmp");
|
||||||
Function* LongJmp = M.getFunction("llvm.longjmp");
|
Function* LongJmp = M.getFunction("llvm.longjmp");
|
||||||
|
|
|
@ -615,6 +615,8 @@ static bool fold(std::vector<Function *> &FnVec, unsigned i, unsigned j) {
|
||||||
bool MergeFunctions::runOnModule(Module &M) {
|
bool MergeFunctions::runOnModule(Module &M) {
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
|
|
||||||
|
Context = &M.getContext();
|
||||||
|
|
||||||
std::map<unsigned long, std::vector<Function *> > FnMap;
|
std::map<unsigned long, std::vector<Function *> > FnMap;
|
||||||
|
|
||||||
for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
|
for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
|
||||||
|
|
|
@ -141,6 +141,8 @@ Function* PartialInliner::unswitchFunction(Function* F) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PartialInliner::runOnModule(Module& M) {
|
bool PartialInliner::runOnModule(Module& M) {
|
||||||
|
Context = &M.getContext();
|
||||||
|
|
||||||
std::vector<Function*> worklist;
|
std::vector<Function*> worklist;
|
||||||
worklist.reserve(M.size());
|
worklist.reserve(M.size());
|
||||||
for (Module::iterator FI = M.begin(), FE = M.end(); FI != FE; ++FI)
|
for (Module::iterator FI = M.begin(), FE = M.end(); FI != FE; ++FI)
|
||||||
|
|
|
@ -108,6 +108,8 @@ SpecializeFunction(Function* F,
|
||||||
|
|
||||||
|
|
||||||
bool PartSpec::runOnModule(Module &M) {
|
bool PartSpec::runOnModule(Module &M) {
|
||||||
|
Context = &M.getContext();
|
||||||
|
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
for (Module::iterator I = M.begin(); I != M.end(); ++I) {
|
for (Module::iterator I = M.begin(); I != M.end(); ++I) {
|
||||||
Function &F = *I;
|
Function &F = *I;
|
||||||
|
|
|
@ -70,6 +70,7 @@ ModulePass *llvm::createRaiseAllocationsPass() {
|
||||||
// function into the appropriate instruction.
|
// function into the appropriate instruction.
|
||||||
//
|
//
|
||||||
void RaiseAllocations::doInitialization(Module &M) {
|
void RaiseAllocations::doInitialization(Module &M) {
|
||||||
|
Context = &M.getContext();
|
||||||
|
|
||||||
// Get Malloc and free prototypes if they exist!
|
// Get Malloc and free prototypes if they exist!
|
||||||
MallocFunc = M.getFunction("malloc");
|
MallocFunc = M.getFunction("malloc");
|
||||||
|
|
|
@ -42,6 +42,7 @@ X("strip-dead-prototypes", "Strip Unused Function Prototypes");
|
||||||
|
|
||||||
bool StripDeadPrototypesPass::runOnModule(Module &M) {
|
bool StripDeadPrototypesPass::runOnModule(Module &M) {
|
||||||
bool MadeChange = false;
|
bool MadeChange = false;
|
||||||
|
Context = &M.getContext();
|
||||||
|
|
||||||
// Erase dead function prototypes.
|
// Erase dead function prototypes.
|
||||||
for (Module::iterator I = M.begin(), E = M.end(); I != E; ) {
|
for (Module::iterator I = M.begin(), E = M.end(); I != E; ) {
|
||||||
|
|
|
@ -374,6 +374,7 @@ bool StripDebugInfo(Module &M) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool StripSymbols::runOnModule(Module &M) {
|
bool StripSymbols::runOnModule(Module &M) {
|
||||||
|
Context = &M.getContext();
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
Changed |= StripDebugInfo(M);
|
Changed |= StripDebugInfo(M);
|
||||||
if (!OnlyDebugInfo)
|
if (!OnlyDebugInfo)
|
||||||
|
|
|
@ -905,6 +905,7 @@ namespace {
|
||||||
class VISIBILITY_HIDDEN ValueRanges {
|
class VISIBILITY_HIDDEN ValueRanges {
|
||||||
ValueNumbering &VN;
|
ValueNumbering &VN;
|
||||||
TargetData *TD;
|
TargetData *TD;
|
||||||
|
LLVMContext *Context;
|
||||||
|
|
||||||
class VISIBILITY_HIDDEN ScopedRange {
|
class VISIBILITY_HIDDEN ScopedRange {
|
||||||
typedef std::vector<std::pair<DomTreeDFS::Node *, ConstantRange> >
|
typedef std::vector<std::pair<DomTreeDFS::Node *, ConstantRange> >
|
||||||
|
@ -1025,7 +1026,8 @@ namespace {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ValueRanges(ValueNumbering &VN, TargetData *TD) : VN(VN), TD(TD) {}
|
ValueRanges(ValueNumbering &VN, TargetData *TD, LLVMContext *C) :
|
||||||
|
VN(VN), TD(TD), Context(C) {}
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
virtual ~ValueRanges() {}
|
virtual ~ValueRanges() {}
|
||||||
|
@ -1167,7 +1169,7 @@ namespace {
|
||||||
Value *V = VN.value(n); // XXX: redesign worklist.
|
Value *V = VN.value(n); // XXX: redesign worklist.
|
||||||
const Type *Ty = V->getType();
|
const Type *Ty = V->getType();
|
||||||
if (Ty->isInteger()) {
|
if (Ty->isInteger()) {
|
||||||
addToWorklist(V, ConstantInt::get(*I), ICmpInst::ICMP_EQ, VRP);
|
addToWorklist(V, Context->getConstantInt(*I), ICmpInst::ICMP_EQ, VRP);
|
||||||
return;
|
return;
|
||||||
} else if (const PointerType *PTy = dyn_cast<PointerType>(Ty)) {
|
} else if (const PointerType *PTy = dyn_cast<PointerType>(Ty)) {
|
||||||
assert(*I == 0 && "Pointer is null but not zero?");
|
assert(*I == 0 && "Pointer is null but not zero?");
|
||||||
|
@ -1678,7 +1680,8 @@ namespace {
|
||||||
Top(DTDFS->getNodeForBlock(TopInst->getParent())),
|
Top(DTDFS->getNodeForBlock(TopInst->getParent())),
|
||||||
TopBB(TopInst->getParent()),
|
TopBB(TopInst->getParent()),
|
||||||
TopInst(TopInst),
|
TopInst(TopInst),
|
||||||
modified(modified)
|
modified(modified),
|
||||||
|
Context(TopInst->getParent()->getContext())
|
||||||
{
|
{
|
||||||
assert(Top && "VRPSolver created for unreachable basic block.");
|
assert(Top && "VRPSolver created for unreachable basic block.");
|
||||||
assert(Top->getBlock() == TopInst->getParent() && "Context mismatch.");
|
assert(Top->getBlock() == TopInst->getParent() && "Context mismatch.");
|
||||||
|
@ -1779,7 +1782,8 @@ namespace {
|
||||||
|
|
||||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(Canonical)) {
|
if (ConstantInt *CI = dyn_cast<ConstantInt>(Canonical)) {
|
||||||
if (ConstantInt *Arg = dyn_cast<ConstantInt>(LHS)) {
|
if (ConstantInt *Arg = dyn_cast<ConstantInt>(LHS)) {
|
||||||
add(RHS, ConstantInt::get(CI->getValue() ^ Arg->getValue()),
|
add(RHS,
|
||||||
|
Context->getConstantInt(CI->getValue() ^ Arg->getValue()),
|
||||||
ICmpInst::ICMP_EQ, NewContext);
|
ICmpInst::ICMP_EQ, NewContext);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2404,7 +2408,7 @@ namespace {
|
||||||
DomTreeDFS::Node *Root = DTDFS->getRootNode();
|
DomTreeDFS::Node *Root = DTDFS->getRootNode();
|
||||||
VN = new ValueNumbering(DTDFS);
|
VN = new ValueNumbering(DTDFS);
|
||||||
IG = new InequalityGraph(*VN, Root);
|
IG = new InequalityGraph(*VN, Root);
|
||||||
VR = new ValueRanges(*VN, TD);
|
VR = new ValueRanges(*VN, TD, Context);
|
||||||
WorkList.push_back(Root);
|
WorkList.push_back(Root);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@ -2526,21 +2530,23 @@ namespace {
|
||||||
|
|
||||||
void PredicateSimplifier::Forwards::visitSExtInst(SExtInst &SI) {
|
void PredicateSimplifier::Forwards::visitSExtInst(SExtInst &SI) {
|
||||||
VRPSolver VRP(VN, IG, UB, VR, PS->DTDFS, PS->modified, &SI);
|
VRPSolver VRP(VN, IG, UB, VR, PS->DTDFS, PS->modified, &SI);
|
||||||
|
LLVMContext *Context = SI.getParent()->getContext();
|
||||||
uint32_t SrcBitWidth = cast<IntegerType>(SI.getSrcTy())->getBitWidth();
|
uint32_t SrcBitWidth = cast<IntegerType>(SI.getSrcTy())->getBitWidth();
|
||||||
uint32_t DstBitWidth = cast<IntegerType>(SI.getDestTy())->getBitWidth();
|
uint32_t DstBitWidth = cast<IntegerType>(SI.getDestTy())->getBitWidth();
|
||||||
APInt Min(APInt::getHighBitsSet(DstBitWidth, DstBitWidth-SrcBitWidth+1));
|
APInt Min(APInt::getHighBitsSet(DstBitWidth, DstBitWidth-SrcBitWidth+1));
|
||||||
APInt Max(APInt::getLowBitsSet(DstBitWidth, SrcBitWidth-1));
|
APInt Max(APInt::getLowBitsSet(DstBitWidth, SrcBitWidth-1));
|
||||||
VRP.add(ConstantInt::get(Min), &SI, ICmpInst::ICMP_SLE);
|
VRP.add(Context->getConstantInt(Min), &SI, ICmpInst::ICMP_SLE);
|
||||||
VRP.add(ConstantInt::get(Max), &SI, ICmpInst::ICMP_SGE);
|
VRP.add(Context->getConstantInt(Max), &SI, ICmpInst::ICMP_SGE);
|
||||||
VRP.solve();
|
VRP.solve();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PredicateSimplifier::Forwards::visitZExtInst(ZExtInst &ZI) {
|
void PredicateSimplifier::Forwards::visitZExtInst(ZExtInst &ZI) {
|
||||||
VRPSolver VRP(VN, IG, UB, VR, PS->DTDFS, PS->modified, &ZI);
|
VRPSolver VRP(VN, IG, UB, VR, PS->DTDFS, PS->modified, &ZI);
|
||||||
|
LLVMContext *Context = ZI.getParent()->getContext();
|
||||||
uint32_t SrcBitWidth = cast<IntegerType>(ZI.getSrcTy())->getBitWidth();
|
uint32_t SrcBitWidth = cast<IntegerType>(ZI.getSrcTy())->getBitWidth();
|
||||||
uint32_t DstBitWidth = cast<IntegerType>(ZI.getDestTy())->getBitWidth();
|
uint32_t DstBitWidth = cast<IntegerType>(ZI.getDestTy())->getBitWidth();
|
||||||
APInt Max(APInt::getLowBitsSet(DstBitWidth, SrcBitWidth));
|
APInt Max(APInt::getLowBitsSet(DstBitWidth, SrcBitWidth));
|
||||||
VRP.add(ConstantInt::get(Max), &ZI, ICmpInst::ICMP_UGE);
|
VRP.add(Context->getConstantInt(Max), &ZI, ICmpInst::ICMP_UGE);
|
||||||
VRP.solve();
|
VRP.solve();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2629,6 +2635,8 @@ namespace {
|
||||||
|
|
||||||
Pred = IC.getPredicate();
|
Pred = IC.getPredicate();
|
||||||
|
|
||||||
|
LLVMContext *Context = IC.getParent()->getContext();
|
||||||
|
|
||||||
if (ConstantInt *Op1 = dyn_cast<ConstantInt>(IC.getOperand(1))) {
|
if (ConstantInt *Op1 = dyn_cast<ConstantInt>(IC.getOperand(1))) {
|
||||||
ConstantInt *NextVal = 0;
|
ConstantInt *NextVal = 0;
|
||||||
switch (Pred) {
|
switch (Pred) {
|
||||||
|
@ -2636,12 +2644,12 @@ namespace {
|
||||||
case ICmpInst::ICMP_SLT:
|
case ICmpInst::ICMP_SLT:
|
||||||
case ICmpInst::ICMP_ULT:
|
case ICmpInst::ICMP_ULT:
|
||||||
if (Op1->getValue() != 0)
|
if (Op1->getValue() != 0)
|
||||||
NextVal = ConstantInt::get(Op1->getValue()-1);
|
NextVal = Context->getConstantInt(Op1->getValue()-1);
|
||||||
break;
|
break;
|
||||||
case ICmpInst::ICMP_SGT:
|
case ICmpInst::ICMP_SGT:
|
||||||
case ICmpInst::ICMP_UGT:
|
case ICmpInst::ICMP_UGT:
|
||||||
if (!Op1->getValue().isAllOnesValue())
|
if (!Op1->getValue().isAllOnesValue())
|
||||||
NextVal = ConstantInt::get(Op1->getValue()+1);
|
NextVal = Context->getConstantInt(Op1->getValue()+1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1662,7 +1662,10 @@ static bool AddressIsTaken(GlobalValue *GV) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IPSCCP::runOnModule(Module &M) {
|
bool IPSCCP::runOnModule(Module &M) {
|
||||||
|
Context = &M.getContext();
|
||||||
|
|
||||||
SCCPSolver Solver;
|
SCCPSolver Solver;
|
||||||
|
Solver.setContext(Context);
|
||||||
|
|
||||||
// Loop over all functions, marking arguments to those with their addresses
|
// Loop over all functions, marking arguments to those with their addresses
|
||||||
// taken or that are external as overdefined.
|
// taken or that are external as overdefined.
|
||||||
|
|
|
@ -1730,6 +1730,8 @@ void SimplifyLibCalls::setDoesNotAlias(Function &F, unsigned n) {
|
||||||
/// doInitialization - Add attributes to well-known functions.
|
/// doInitialization - Add attributes to well-known functions.
|
||||||
///
|
///
|
||||||
bool SimplifyLibCalls::doInitialization(Module &M) {
|
bool SimplifyLibCalls::doInitialization(Module &M) {
|
||||||
|
Context = &M.getContext();
|
||||||
|
|
||||||
Modified = false;
|
Modified = false;
|
||||||
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
|
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
|
||||||
Function &F = *I;
|
Function &F = *I;
|
||||||
|
|
|
@ -115,6 +115,8 @@ FunctionPass *llvm::createLowerInvokePass(const TargetLowering *TLI) {
|
||||||
// doInitialization - Make sure that there is a prototype for abort in the
|
// doInitialization - Make sure that there is a prototype for abort in the
|
||||||
// current module.
|
// current module.
|
||||||
bool LowerInvoke::doInitialization(Module &M) {
|
bool LowerInvoke::doInitialization(Module &M) {
|
||||||
|
Context = &M.getContext();
|
||||||
|
|
||||||
const Type *VoidPtrTy = Context->getPointerTypeUnqual(Type::Int8Ty);
|
const Type *VoidPtrTy = Context->getPointerTypeUnqual(Type::Int8Ty);
|
||||||
AbortMessage = 0;
|
AbortMessage = 0;
|
||||||
if (ExpensiveEHSupport) {
|
if (ExpensiveEHSupport) {
|
||||||
|
|
|
@ -190,67 +190,6 @@ ConstantInt *ConstantInt::CreateTrueFalseVals(bool WhichOne) {
|
||||||
return WhichOne ? TheTrueVal : TheFalseVal;
|
return WhichOne ? TheTrueVal : TheFalseVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
struct DenseMapAPIntKeyInfo {
|
|
||||||
struct KeyTy {
|
|
||||||
APInt val;
|
|
||||||
const Type* type;
|
|
||||||
KeyTy(const APInt& V, const Type* Ty) : val(V), type(Ty) {}
|
|
||||||
KeyTy(const KeyTy& that) : val(that.val), type(that.type) {}
|
|
||||||
bool operator==(const KeyTy& that) const {
|
|
||||||
return type == that.type && this->val == that.val;
|
|
||||||
}
|
|
||||||
bool operator!=(const KeyTy& that) const {
|
|
||||||
return !this->operator==(that);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
static inline KeyTy getEmptyKey() { return KeyTy(APInt(1,0), 0); }
|
|
||||||
static inline KeyTy getTombstoneKey() { return KeyTy(APInt(1,1), 0); }
|
|
||||||
static unsigned getHashValue(const KeyTy &Key) {
|
|
||||||
return DenseMapInfo<void*>::getHashValue(Key.type) ^
|
|
||||||
Key.val.getHashValue();
|
|
||||||
}
|
|
||||||
static bool isEqual(const KeyTy &LHS, const KeyTy &RHS) {
|
|
||||||
return LHS == RHS;
|
|
||||||
}
|
|
||||||
static bool isPod() { return false; }
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
typedef DenseMap<DenseMapAPIntKeyInfo::KeyTy, ConstantInt*,
|
|
||||||
DenseMapAPIntKeyInfo> IntMapTy;
|
|
||||||
static ManagedStatic<IntMapTy> IntConstants;
|
|
||||||
|
|
||||||
// Get a ConstantInt from an APInt. Note that the value stored in the DenseMap
|
|
||||||
// as the key, is a DenseMapAPIntKeyInfo::KeyTy which has provided the
|
|
||||||
// operator== and operator!= to ensure that the DenseMap doesn't attempt to
|
|
||||||
// compare APInt's of different widths, which would violate an APInt class
|
|
||||||
// invariant which generates an assertion.
|
|
||||||
ConstantInt *ConstantInt::get(const APInt& V) {
|
|
||||||
// Get the corresponding integer type for the bit width of the value.
|
|
||||||
const IntegerType *ITy = IntegerType::get(V.getBitWidth());
|
|
||||||
// get an existing value or the insertion position
|
|
||||||
DenseMapAPIntKeyInfo::KeyTy Key(V, ITy);
|
|
||||||
|
|
||||||
ConstantsLock->reader_acquire();
|
|
||||||
ConstantInt *&Slot = (*IntConstants)[Key];
|
|
||||||
ConstantsLock->reader_release();
|
|
||||||
|
|
||||||
if (!Slot) {
|
|
||||||
sys::SmartScopedWriter<true> Writer(*ConstantsLock);
|
|
||||||
ConstantInt *&NewSlot = (*IntConstants)[Key];
|
|
||||||
if (!Slot) {
|
|
||||||
NewSlot = new ConstantInt(ITy, V);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NewSlot;
|
|
||||||
} else {
|
|
||||||
return Slot;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// ConstantFP
|
// ConstantFP
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
|
@ -29,7 +29,7 @@ LLVMContext& llvm::getGlobalContext() {
|
||||||
return *GlobalContext;
|
return *GlobalContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
LLVMContext::LLVMContext() : pImpl(new LLVMContextImpl()) { }
|
LLVMContext::LLVMContext() : pImpl(new LLVMContextImpl(*this)) { }
|
||||||
LLVMContext::~LLVMContext() { delete pImpl; }
|
LLVMContext::~LLVMContext() { delete pImpl; }
|
||||||
|
|
||||||
// Constant accessors
|
// Constant accessors
|
||||||
|
@ -117,7 +117,7 @@ Constant *LLVMContext::getConstantIntSigned(const Type *Ty, int64_t V) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ConstantInt* LLVMContext::getConstantInt(const APInt& V) {
|
ConstantInt* LLVMContext::getConstantInt(const APInt& V) {
|
||||||
return ConstantInt::get(V);
|
return pImpl->getConstantInt(V);
|
||||||
}
|
}
|
||||||
|
|
||||||
Constant* LLVMContext::getConstantInt(const Type* Ty, const APInt& V) {
|
Constant* LLVMContext::getConstantInt(const Type* Ty, const APInt& V) {
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
//===--------------- LLVMContextImpl.cpp - Implementation ------*- C++ -*--===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file implements LLVMContextImpl, the opaque implementation
|
||||||
|
// of LLVMContext.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "LLVMContextImpl.h"
|
||||||
|
#include "llvm/Constants.h"
|
||||||
|
#include "llvm/DerivedTypes.h"
|
||||||
|
#include "llvm/LLVMContext.h"
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
|
// Get a ConstantInt from an APInt. Note that the value stored in the DenseMap
|
||||||
|
// as the key, is a DenseMapAPIntKeyInfo::KeyTy which has provided the
|
||||||
|
// operator== and operator!= to ensure that the DenseMap doesn't attempt to
|
||||||
|
// compare APInt's of different widths, which would violate an APInt class
|
||||||
|
// invariant which generates an assertion.
|
||||||
|
ConstantInt *LLVMContextImpl::getConstantInt(const APInt& V) {
|
||||||
|
// Get the corresponding integer type for the bit width of the value.
|
||||||
|
const IntegerType *ITy = Context.getIntegerType(V.getBitWidth());
|
||||||
|
// get an existing value or the insertion position
|
||||||
|
DenseMapAPIntKeyInfo::KeyTy Key(V, ITy);
|
||||||
|
|
||||||
|
ConstantsLock.reader_acquire();
|
||||||
|
ConstantInt *&Slot = IntConstants[Key];
|
||||||
|
ConstantsLock.reader_release();
|
||||||
|
|
||||||
|
if (!Slot) {
|
||||||
|
sys::SmartScopedWriter<true> Writer(ConstantsLock);
|
||||||
|
ConstantInt *&NewSlot = IntConstants[Key];
|
||||||
|
if (!Slot) {
|
||||||
|
NewSlot = new ConstantInt(ITy, V);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewSlot;
|
||||||
|
} else {
|
||||||
|
return Slot;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
//===-- llvm/SymbolTableListTraitsImpl.h - Implementation ------*- C++ -*--===//
|
//===----------------- LLVMContextImpl.h - Implementation ------*- C++ -*--===//
|
||||||
//
|
//
|
||||||
// The LLVM Compiler Infrastructure
|
// The LLVM Compiler Infrastructure
|
||||||
//
|
//
|
||||||
|
@ -15,9 +15,57 @@
|
||||||
#ifndef LLVM_LLVMCONTEXT_IMPL_H
|
#ifndef LLVM_LLVMCONTEXT_IMPL_H
|
||||||
#define LLVM_LLVMCONTEXT_IMPL_H
|
#define LLVM_LLVMCONTEXT_IMPL_H
|
||||||
|
|
||||||
namespace llvm {
|
#include "llvm/System/RWMutex.h"
|
||||||
class LLVMContextImpl {
|
#include "llvm/ADT/APInt.h"
|
||||||
|
#include "llvm/ADT/DenseMap.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
|
||||||
|
class ConstantInt;
|
||||||
|
class LLVMContext;
|
||||||
|
class Type;
|
||||||
|
|
||||||
|
struct DenseMapAPIntKeyInfo {
|
||||||
|
struct KeyTy {
|
||||||
|
APInt val;
|
||||||
|
const Type* type;
|
||||||
|
KeyTy(const APInt& V, const Type* Ty) : val(V), type(Ty) {}
|
||||||
|
KeyTy(const KeyTy& that) : val(that.val), type(that.type) {}
|
||||||
|
bool operator==(const KeyTy& that) const {
|
||||||
|
return type == that.type && this->val == that.val;
|
||||||
|
}
|
||||||
|
bool operator!=(const KeyTy& that) const {
|
||||||
|
return !this->operator==(that);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
static inline KeyTy getEmptyKey() { return KeyTy(APInt(1,0), 0); }
|
||||||
|
static inline KeyTy getTombstoneKey() { return KeyTy(APInt(1,1), 0); }
|
||||||
|
static unsigned getHashValue(const KeyTy &Key) {
|
||||||
|
return DenseMapInfo<void*>::getHashValue(Key.type) ^
|
||||||
|
Key.val.getHashValue();
|
||||||
|
}
|
||||||
|
static bool isEqual(const KeyTy &LHS, const KeyTy &RHS) {
|
||||||
|
return LHS == RHS;
|
||||||
|
}
|
||||||
|
static bool isPod() { return false; }
|
||||||
|
};
|
||||||
|
|
||||||
|
class LLVMContextImpl {
|
||||||
|
sys::SmartRWMutex<true> ConstantsLock;
|
||||||
|
|
||||||
|
typedef DenseMap<DenseMapAPIntKeyInfo::KeyTy, ConstantInt*,
|
||||||
|
DenseMapAPIntKeyInfo> IntMapTy;
|
||||||
|
IntMapTy IntConstants;
|
||||||
|
|
||||||
|
LLVMContext &Context;
|
||||||
|
LLVMContextImpl();
|
||||||
|
LLVMContextImpl(const LLVMContextImpl&);
|
||||||
|
public:
|
||||||
|
LLVMContextImpl(LLVMContext &C) : Context(C) { }
|
||||||
|
|
||||||
|
/// Return a ConstantInt with the specified value and an implied Type. The
|
||||||
|
/// type is the integer type that corresponds to the bit width of the value.
|
||||||
|
ConstantInt* getConstantInt(const APInt &V);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue