The first index of GEP instruction is to step over the pointer[0] to the index. We just need to calculate the *pointer's size, and step over *pointer's size * Index to reach the position of the data strucutre. Then we start to iterate the composite data type.
Signed-off-by: Zhigang Gong <[email protected]> --- backend/src/llvm/llvm_gen_backend.cpp | 26 ++++++++++++++++++-------- backend/src/llvm/llvm_passes.cpp | 28 +++++++++++++++++++--------- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp index 8130882..a7d5e7a 100644 --- a/backend/src/llvm/llvm_gen_backend.cpp +++ b/backend/src/llvm/llvm_gen_backend.cpp @@ -933,17 +933,27 @@ namespace gbe ConstantInt* ConstOP = dyn_cast<ConstantInt>(ce->getOperand(op)); GBE_ASSERT(ConstOP); TypeIndex = ConstOP->getZExtValue(); - for(uint32_t ty_i=0; ty_i<TypeIndex; ty_i++) - { - Type* elementType = CompTy->getTypeAtIndex(ty_i); - uint32_t align = getAlignmentByte(unit, elementType); + if (op == 1) { + if (TypeIndex != 0) { + Type *elementType = CompTy->getTypeAtIndex(TypeIndex); + uint32_t elementSize = getTypeByteSize(unit, elementType); + uint32_t align = getAlignmentByte(unit, elementType); + elementSize += getPadding(elementSize, align); + offset += elementSize * TypeIndex; + } + } else { + for(uint32_t ty_i=0; ty_i<TypeIndex; ty_i++) + { + Type* elementType = CompTy->getTypeAtIndex(ty_i); + uint32_t align = getAlignmentByte(unit, elementType); + offset += getPadding(offset, align); + offset += getTypeByteSize(unit, elementType); + } + + const uint32_t align = getAlignmentByte(unit, CompTy->getTypeAtIndex(TypeIndex)); offset += getPadding(offset, align); - offset += getTypeByteSize(unit, elementType); } - const uint32_t align = getAlignmentByte(unit, CompTy->getTypeAtIndex(TypeIndex)); - offset += getPadding(offset, align); - constantOffset += offset; CompTy = dyn_cast<CompositeType>(CompTy->getTypeAtIndex(TypeIndex)); } diff --git a/backend/src/llvm/llvm_passes.cpp b/backend/src/llvm/llvm_passes.cpp index d31f07e..25c6748 100644 --- a/backend/src/llvm/llvm_passes.cpp +++ b/backend/src/llvm/llvm_passes.cpp @@ -274,18 +274,28 @@ namespace gbe { uint32_t offset = 0; TypeIndex = ConstOP->getZExtValue(); - for(uint32_t ty_i=0; ty_i<TypeIndex; ty_i++) - { - Type* elementType = CompTy->getTypeAtIndex(ty_i); - uint32_t align = getAlignmentByte(unit, elementType); + if (op == 1) { + if (TypeIndex != 0) { + Type *elementType = CompTy->getTypeAtIndex(TypeIndex); + uint32_t elementSize = getTypeByteSize(unit, elementType); + uint32_t align = getAlignmentByte(unit, elementType); + elementSize += getPadding(elementSize, align); + offset += elementSize * TypeIndex; + } + } else { + for(uint32_t ty_i=0; ty_i<TypeIndex; ty_i++) + { + Type* elementType = CompTy->getTypeAtIndex(ty_i); + uint32_t align = getAlignmentByte(unit, elementType); + offset += getPadding(offset, align); + offset += getTypeByteSize(unit, elementType); + } + + //add getPaddingding for accessed type + const uint32_t align = getAlignmentByte(unit, CompTy->getTypeAtIndex(TypeIndex)); offset += getPadding(offset, align); - offset += getTypeByteSize(unit, elementType); } - //add getPaddingding for accessed type - const uint32_t align = getAlignmentByte(unit, CompTy->getTypeAtIndex(TypeIndex)); - offset += getPadding(offset, align); - constantOffset += offset; } // none constant index (=> only array/verctor allowed) -- 1.7.9.5 _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
