X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FVMCore%2FiMemory.cpp;h=4ec9e26fbe2a83990273a5e9f92d77f6141ba4fb;hb=1a143aef993a95e1caef2c8196d0b2f3f5f52c63;hp=87b5095b0f60317f6b0946f86973337512b98cbd;hpb=fe8041ae397ebbcc311469aa39dfb79f8191b412;p=oota-llvm.git diff --git a/lib/VMCore/iMemory.cpp b/lib/VMCore/iMemory.cpp index 87b5095b0f6..4ec9e26fbe2 100644 --- a/lib/VMCore/iMemory.cpp +++ b/lib/VMCore/iMemory.cpp @@ -38,58 +38,13 @@ const Type *AllocationInst::getAllocatedType() const { } -//===----------------------------------------------------------------------===// -// MemAccessInst Implementation -//===----------------------------------------------------------------------===// - -// getIndexedType - Returns the type of the element that would be loaded with -// a load instruction with the specified parameters. -// -// A null type is returned if the indices are invalid for the specified -// pointer type. -// -const Type* MemAccessInst::getIndexedType(const Type *Ptr, - const std::vector &Idx, - bool AllowCompositeLeaf) { - if (!isa(Ptr)) return 0; // Type isn't a pointer type! - - // Handle the special case of the empty set index set... - if (Idx.empty()) return cast(Ptr)->getElementType(); - - unsigned CurIDX = 0; - while (const CompositeType *CT = dyn_cast(Ptr)) { - if (Idx.size() == CurIDX) { - if (AllowCompositeLeaf || CT->isFirstClassType()) return Ptr; - return 0; // Can't load a whole structure or array!?!? - } - - Value *Index = Idx[CurIDX++]; - if (!CT->indexValid(Index)) return 0; - Ptr = CT->getTypeAtIndex(Index); - } - return CurIDX == Idx.size() ? Ptr : 0; -} - - //===----------------------------------------------------------------------===// // LoadInst Implementation //===----------------------------------------------------------------------===// -LoadInst::LoadInst(Value *Ptr, const std::vector &Idx, - const std::string &Name) - : MemAccessInst(checkType(getIndexedType(Ptr->getType(), Idx)), Load, Name) { - assert(getIndexedType(Ptr->getType(), Idx) && "Load operands invalid!"); - Operands.reserve(1+Idx.size()); - Operands.push_back(Use(Ptr, this)); - - for (unsigned i = 0, E = Idx.size(); i != E; ++i) - Operands.push_back(Use(Idx[i], this)); - -} - LoadInst::LoadInst(Value *Ptr, const std::string &Name) - : MemAccessInst(cast(Ptr->getType())->getElementType(), - Load, Name) { + : Instruction(cast(Ptr->getType())->getElementType(), + Load, Name) { Operands.reserve(1); Operands.push_back(Use(Ptr, this)); } @@ -99,20 +54,8 @@ LoadInst::LoadInst(Value *Ptr, const std::string &Name) // StoreInst Implementation //===----------------------------------------------------------------------===// -StoreInst::StoreInst(Value *Val, Value *Ptr, const std::vector &Idx) - : MemAccessInst(Type::VoidTy, Store, "") { - assert(getIndexedType(Ptr->getType(), Idx) && "Store operands invalid!"); - - Operands.reserve(2+Idx.size()); - Operands.push_back(Use(Val, this)); - Operands.push_back(Use(Ptr, this)); - - for (unsigned i = 0, E = Idx.size(); i != E; ++i) - Operands.push_back(Use(Idx[i], this)); -} - StoreInst::StoreInst(Value *Val, Value *Ptr) - : MemAccessInst(Type::VoidTy, Store, "") { + : Instruction(Type::VoidTy, Store, "") { Operands.reserve(2); Operands.push_back(Use(Val, this)); @@ -126,7 +69,7 @@ StoreInst::StoreInst(Value *Val, Value *Ptr) GetElementPtrInst::GetElementPtrInst(Value *Ptr, const std::vector &Idx, const std::string &Name) - : MemAccessInst(PointerType::get(checkType(getIndexedType(Ptr->getType(), + : Instruction(PointerType::get(checkType(getIndexedType(Ptr->getType(), Idx, true))), GetElementPtr, Name) { assert(getIndexedType(Ptr->getType(), Idx, true) && "gep operands invalid!"); @@ -137,6 +80,34 @@ GetElementPtrInst::GetElementPtrInst(Value *Ptr, const std::vector &Idx, Operands.push_back(Use(Idx[i], this)); } +// getIndexedType - Returns the type of the element that would be loaded with +// a load instruction with the specified parameters. +// +// A null type is returned if the indices are invalid for the specified +// pointer type. +// +const Type* GetElementPtrInst::getIndexedType(const Type *Ptr, + const std::vector &Idx, + bool AllowCompositeLeaf) { + if (!isa(Ptr)) return 0; // Type isn't a pointer type! + + // Handle the special case of the empty set index set... + if (Idx.empty()) return cast(Ptr)->getElementType(); + + unsigned CurIDX = 0; + while (const CompositeType *CT = dyn_cast(Ptr)) { + if (Idx.size() == CurIDX) { + if (AllowCompositeLeaf || CT->isFirstClassType()) return Ptr; + return 0; // Can't load a whole structure or array!?!? + } + + Value *Index = Idx[CurIDX++]; + if (!CT->indexValid(Index)) return 0; + Ptr = CT->getTypeAtIndex(Index); + } + return CurIDX == Idx.size() ? Ptr : 0; +} + //===----------------------------------------------------------------------===// // FreeInst Implementation