Private variables allocated on the stack should be aligned according to OCL 
spec.

Signed-off-by: Ruiling Song <[email protected]>
---
 backend/src/llvm/llvm_gen_backend.cpp |   19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/backend/src/llvm/llvm_gen_backend.cpp 
b/backend/src/llvm/llvm_gen_backend.cpp
index cb3511f..d620d44 100644
--- a/backend/src/llvm/llvm_gen_backend.cpp
+++ b/backend/src/llvm/llvm_gen_backend.cpp
@@ -2674,7 +2674,24 @@ namespace gbe
     const ir::Register stack = ir::ocl::stackptr;
     const ir::Register reg = ctx.reg(pointerFamily);
     const ir::Immediate imm = ctx.getImmediate(immIndex);
-
+    uint32_t align = getAlignmentByte(unit, elemType);
+    // below code assume align is power of 2
+    GBE_ASSERT(align && (align & (align-1)) == 0);
+
+    // align the stack pointer according to data alignment
+    if(align > 1) {
+      // (ptr + (align-1)) & ~(align-1)
+      ir::ImmediateIndex immAlign;
+      immAlign = ctx.newIntegerImmediate(align-1, ir::TYPE_U32);
+      ir::Register alignReg = ctx.reg(ctx.getPointerFamily());
+      ctx.LOADI(ir::TYPE_S32, alignReg, immAlign);
+      ctx.ADD(ir::TYPE_U32, stack, stack, alignReg);
+
+      alignReg = ctx.reg(ctx.getPointerFamily());
+      immAlign = ctx.newIntegerImmediate(~(align-1), ir::TYPE_U32);
+      ctx.LOADI(ir::TYPE_S32, alignReg, immAlign);
+      ctx.AND(ir::TYPE_U32, stack, stack, alignReg);
+    }
     // Set the destination register properly
     ctx.MOV(imm.type, dst, stack);
 
-- 
1.7.9.5

_______________________________________________
Beignet mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/beignet

Reply via email to