mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-01 03:33:42 +00:00
[opaque pointer type] Explicitly store the pointee type of the result of a GEP
Alternatively, this type could be derived on-demand whenever getResultElementType is called - if someone thinks that's the better choice (simple time/space tradeoff), I'm happy to give it a go. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238716 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
dd2e39c453
commit
d84c8ef1be
@ -810,6 +810,7 @@ inline Type *checkGEPType(Type *Ty) {
|
||||
///
|
||||
class GetElementPtrInst : public Instruction {
|
||||
Type *SourceElementType;
|
||||
Type *ResultElementType;
|
||||
|
||||
GetElementPtrInst(const GetElementPtrInst &GEPI);
|
||||
void init(Value *Ptr, ArrayRef<Value *> IdxList, const Twine &NameStr);
|
||||
@ -903,9 +904,12 @@ public:
|
||||
Type *getSourceElementType() const { return SourceElementType; }
|
||||
|
||||
void setSourceElementType(Type *Ty) { SourceElementType = Ty; }
|
||||
void setResultElementType(Type *Ty) { ResultElementType = Ty; }
|
||||
|
||||
Type *getResultElementType() const {
|
||||
return cast<PointerType>(getType()->getScalarType())->getElementType();
|
||||
assert(ResultElementType ==
|
||||
cast<PointerType>(getType()->getScalarType())->getElementType());
|
||||
return ResultElementType;
|
||||
}
|
||||
|
||||
/// \brief Returns the address space of this instruction's pointer type.
|
||||
@ -1028,7 +1032,10 @@ GetElementPtrInst::GetElementPtrInst(Type *PointeeType, Value *Ptr,
|
||||
: Instruction(getGEPReturnType(PointeeType, Ptr, IdxList), GetElementPtr,
|
||||
OperandTraits<GetElementPtrInst>::op_end(this) - Values,
|
||||
Values, InsertBefore),
|
||||
SourceElementType(PointeeType) {
|
||||
SourceElementType(PointeeType),
|
||||
ResultElementType(getIndexedType(PointeeType, IdxList)) {
|
||||
assert(ResultElementType ==
|
||||
cast<PointerType>(getType()->getScalarType())->getElementType());
|
||||
init(Ptr, IdxList, NameStr);
|
||||
}
|
||||
GetElementPtrInst::GetElementPtrInst(Type *PointeeType, Value *Ptr,
|
||||
@ -1038,7 +1045,10 @@ GetElementPtrInst::GetElementPtrInst(Type *PointeeType, Value *Ptr,
|
||||
: Instruction(getGEPReturnType(PointeeType, Ptr, IdxList), GetElementPtr,
|
||||
OperandTraits<GetElementPtrInst>::op_end(this) - Values,
|
||||
Values, InsertAtEnd),
|
||||
SourceElementType(PointeeType) {
|
||||
SourceElementType(PointeeType),
|
||||
ResultElementType(getIndexedType(PointeeType, IdxList)) {
|
||||
assert(ResultElementType ==
|
||||
cast<PointerType>(getType()->getScalarType())->getElementType());
|
||||
init(Ptr, IdxList, NameStr);
|
||||
}
|
||||
|
||||
|
@ -1249,7 +1249,8 @@ GetElementPtrInst::GetElementPtrInst(const GetElementPtrInst &GEPI)
|
||||
OperandTraits<GetElementPtrInst>::op_end(this) -
|
||||
GEPI.getNumOperands(),
|
||||
GEPI.getNumOperands()),
|
||||
SourceElementType(GEPI.SourceElementType) {
|
||||
SourceElementType(GEPI.SourceElementType),
|
||||
ResultElementType(GEPI.ResultElementType) {
|
||||
std::copy(GEPI.op_begin(), GEPI.op_end(), op_begin());
|
||||
SubclassOptionalData = GEPI.SubclassOptionalData;
|
||||
}
|
||||
|
@ -400,8 +400,11 @@ void llvm::RemapInstruction(Instruction *I, ValueToValueMapTy &VMap,
|
||||
}
|
||||
if (auto *AI = dyn_cast<AllocaInst>(I))
|
||||
AI->setAllocatedType(TypeMapper->remapType(AI->getAllocatedType()));
|
||||
if (auto *GEP = dyn_cast<GetElementPtrInst>(I))
|
||||
if (auto *GEP = dyn_cast<GetElementPtrInst>(I)) {
|
||||
GEP->setSourceElementType(
|
||||
TypeMapper->remapType(GEP->getSourceElementType()));
|
||||
GEP->setResultElementType(
|
||||
TypeMapper->remapType(GEP->getResultElementType()));
|
||||
}
|
||||
I->mutateType(TypeMapper->remapType(I->getType()));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user