From: Pan Xiuli <[email protected]> Pointer is not as like as array or vector, we should handle it in a standalone path to fit furture change about PointerType inheritance.
Signed-off-by: Pan Xiuli <[email protected]> --- backend/src/llvm/llvm_gen_backend.cpp | 6 +++--- backend/src/llvm/llvm_gen_backend.hpp | 5 ++++- backend/src/llvm/llvm_passes.cpp | 35 +++++++++++++++++++++++------------ 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp index 8c04664..742c947 100644 --- a/backend/src/llvm/llvm_gen_backend.cpp +++ b/backend/src/llvm/llvm_gen_backend.cpp @@ -1503,15 +1503,15 @@ namespace gbe Value *pointer = expr->getOperand(0); if (expr->getOpcode() == Instruction::GetElementPtr) { uint32_t constantOffset = 0; - CompositeType* CompTy = cast<CompositeType>(pointer->getType()); + Type* EltTy = pointer->getType(); for(uint32_t op=1; op<expr->getNumOperands(); ++op) { int32_t TypeIndex; ConstantInt* ConstOP = dyn_cast<ConstantInt>(expr->getOperand(op)); GBE_ASSERTM(ConstOP != NULL, "must be constant index"); TypeIndex = ConstOP->getZExtValue(); GBE_ASSERT(TypeIndex >= 0); - constantOffset += getGEPConstOffset(unit, CompTy, TypeIndex); - CompTy = dyn_cast<CompositeType>(CompTy->getTypeAtIndex(TypeIndex)); + constantOffset += getGEPConstOffset(unit, pointer->getType(), TypeIndex); + EltTy = getEltType(EltTy, TypeIndex); } ir::Constant cc = unit.getConstantSet().getConstant(pointer->getName()); diff --git a/backend/src/llvm/llvm_gen_backend.hpp b/backend/src/llvm/llvm_gen_backend.hpp index 1ab77c9..eea050b 100644 --- a/backend/src/llvm/llvm_gen_backend.hpp +++ b/backend/src/llvm/llvm_gen_backend.hpp @@ -118,7 +118,10 @@ namespace gbe uint32_t getTypeByteSize(const ir::Unit &unit, llvm::Type* Ty); /*! Get GEP constant offset for the specified operand.*/ - int32_t getGEPConstOffset(const ir::Unit &unit, llvm::CompositeType *CompTy, int32_t TypeIndex); + int32_t getGEPConstOffset(const ir::Unit &unit, llvm::Type *eltTy, int32_t TypeIndex); + + /*! Get element type for a type.*/ + llvm::Type* getEltType(llvm::Type *eltTy, uint32_t index = 0); /*! whether this is a kernel function */ bool isKernelFunction(const llvm::Function &f); diff --git a/backend/src/llvm/llvm_passes.cpp b/backend/src/llvm/llvm_passes.cpp index c5f3ffe..8f5bcc9 100644 --- a/backend/src/llvm/llvm_passes.cpp +++ b/backend/src/llvm/llvm_passes.cpp @@ -180,12 +180,23 @@ namespace gbe return size_bit/8; } - int32_t getGEPConstOffset(const ir::Unit &unit, CompositeType *CompTy, int32_t TypeIndex) { + Type* getEltType(Type* eltTy, uint32_t index) { + Type *elementType = NULL; + if (PointerType* ptrType = dyn_cast<PointerType>(eltTy)) + elementType = ptrType->getElementType(); + else if(SequentialType * seqType = dyn_cast<SequentialType>(eltTy)) + elementType = seqType->getElementType(); + else if(CompositeType * compTy= dyn_cast<CompositeType>(eltTy)) + elementType = compTy->getTypeAtIndex(index); + GBE_ASSERT(elementType); + return elementType; + } + + int32_t getGEPConstOffset(const ir::Unit &unit, Type *eltTy, int32_t TypeIndex) { int32_t offset = 0; - SequentialType * seqType = dyn_cast<SequentialType>(CompTy); - if (seqType != NULL) { + if (!eltTy->isStructTy()) { if (TypeIndex != 0) { - Type *elementType = seqType->getElementType(); + Type *elementType = getEltType(eltTy); uint32_t elementSize = getTypeByteSize(unit, elementType); uint32_t align = getAlignmentByte(unit, elementType); elementSize += getPadding(elementSize, align); @@ -193,17 +204,16 @@ namespace gbe } } else { int32_t step = TypeIndex > 0 ? 1 : -1; - GBE_ASSERT(CompTy->isStructTy()); for(int32_t ty_i=0; ty_i != TypeIndex; ty_i += step) { - Type* elementType = CompTy->getTypeAtIndex(ty_i); + Type* elementType = getEltType(eltTy, ty_i); uint32_t align = getAlignmentByte(unit, elementType); offset += getPadding(offset, align * step); offset += getTypeByteSize(unit, elementType) * step; } //add getPaddingding for accessed type - const uint32_t align = getAlignmentByte(unit, CompTy->getTypeAtIndex(TypeIndex)); + const uint32_t align = getAlignmentByte(unit, getEltType(eltTy ,TypeIndex)); offset += getPadding(offset, align * step); } return offset; @@ -247,8 +257,8 @@ namespace gbe { const uint32_t ptrSize = unit.getPointerSize(); Value* parentPointer = GEPInst->getOperand(0); - CompositeType* CompTy = parentPointer ? cast<CompositeType>(parentPointer->getType()) : NULL; - if(!CompTy) + Type* eltTy = parentPointer ? parentPointer->getType() : NULL; + if(!eltTy) return false; Value* currentAddrInst = @@ -262,14 +272,15 @@ namespace gbe ConstantInt* ConstOP = dyn_cast<ConstantInt>(GEPInst->getOperand(op)); if (ConstOP != NULL) { TypeIndex = ConstOP->getZExtValue(); - constantOffset += getGEPConstOffset(unit, CompTy, TypeIndex); + constantOffset += getGEPConstOffset(unit, eltTy, TypeIndex); } else { // we only have array/vectors here, // therefore all elements have the same size TypeIndex = 0; - Type* elementType = CompTy->getTypeAtIndex(TypeIndex); + Type* elementType = getEltType(eltTy); + uint32_t size = getTypeByteSize(unit, elementType); //add padding @@ -326,7 +337,7 @@ namespace gbe } //step down in type hirachy - CompTy = dyn_cast<CompositeType>(CompTy->getTypeAtIndex(TypeIndex)); + eltTy = getEltType(eltTy, TypeIndex); } //insert addition of new offset before GEPInst when it is not zero -- 2.7.4 _______________________________________________ Beignet mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/beignet
