[Beignet] [PATCH] GBE: handle the first index of GEP correctly.

Zhigang Gong zhigang.gong at intel.com
Mon Jan 6 20:18:00 PST 2014


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 <zhigang.gong at intel.com>
---
 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



More information about the Beignet mailing list