mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-23 17:24:48 +00:00
Eliminated the MemAccessInst class, folding contents into GEP class.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3487 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -38,39 +38,6 @@ 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<Value*> &Idx,
|
||||
bool AllowCompositeLeaf) {
|
||||
if (!isa<PointerType>(Ptr)) return 0; // Type isn't a pointer type!
|
||||
|
||||
// Handle the special case of the empty set index set...
|
||||
if (Idx.empty()) return cast<PointerType>(Ptr)->getElementType();
|
||||
|
||||
unsigned CurIDX = 0;
|
||||
while (const CompositeType *CT = dyn_cast<CompositeType>(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
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -102,7 +69,7 @@ StoreInst::StoreInst(Value *Val, Value *Ptr)
|
||||
|
||||
GetElementPtrInst::GetElementPtrInst(Value *Ptr, const std::vector<Value*> &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!");
|
||||
@ -113,6 +80,34 @@ GetElementPtrInst::GetElementPtrInst(Value *Ptr, const std::vector<Value*> &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<Value*> &Idx,
|
||||
bool AllowCompositeLeaf) {
|
||||
if (!isa<PointerType>(Ptr)) return 0; // Type isn't a pointer type!
|
||||
|
||||
// Handle the special case of the empty set index set...
|
||||
if (Idx.empty()) return cast<PointerType>(Ptr)->getElementType();
|
||||
|
||||
unsigned CurIDX = 0;
|
||||
while (const CompositeType *CT = dyn_cast<CompositeType>(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
|
||||
|
Reference in New Issue
Block a user