[Beignet] [PATCH 4/7] Backend: Refine GEP lowering code
Xiuli Pan
xiuli.pan at intel.com
Fri Mar 17 06:16:00 UTC 2017
From: Pan Xiuli <xiuli.pan at intel.com>
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 <xiuli.pan at intel.com>
---
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
More information about the Beignet
mailing list