[Beignet] [PATCH] GBE: adjust instruction order for load/function call for vector.

Zhigang Gong zhigang.gong at intel.com
Tue Dec 17 22:37:10 PST 2013


The previous implementation generates code as below:

  %33 = extractelement <4 x i8> %32, i32 0
  %34 = extractelement <4 x i8> %32, i32 1
  %35 = extractelement <4 x i8> %32, i32 2
  %36 = extractelement <4 x i8> %32, i32 3
  %32 = load <4 x i8> addrspace(1)* %31, align 4, !tbaa !3

It may bring some potential problems in the consequent optimization pass.
Now fix adjust the extractelement instruction after the load instruction.
  %32 = load <4 x i8> addrspace(1)* %31, align 4, !tbaa !3
  %33 = extractelement <4 x i8> %32, i32 0
  %34 = extractelement <4 x i8> %32, i32 1
  %35 = extractelement <4 x i8> %32, i32 2
  %36 = extractelement <4 x i8> %32, i32 3

Signed-off-by: Zhigang Gong <zhigang.gong at intel.com>
---
 backend/src/llvm/llvm_scalarize.cpp |    9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/backend/src/llvm/llvm_scalarize.cpp b/backend/src/llvm/llvm_scalarize.cpp
index 6394909..8e06328 100644
--- a/backend/src/llvm/llvm_scalarize.cpp
+++ b/backend/src/llvm/llvm_scalarize.cpp
@@ -222,6 +222,12 @@ namespace gbe {
       return GetComponentCount(value->getType());
     }
 
+    /* set to insert new instructions after the specified instruction.*/
+    void setAppendPoint(Instruction *insn)  {
+      BasicBlock::iterator next(insn);
+      builder->SetInsertPoint(++next);
+    }
+
     DenseMap<Value*, VectorValues> vectorVals;
     Module* module;
     IRBuilder<>* builder;
@@ -632,6 +638,7 @@ namespace gbe {
         CallSite CS(call);
         CallSite::arg_iterator CI = CS.arg_begin() + 3;
 
+        setAppendPoint(call);
         switch (it->second) {
           default: break;
           case GEN_OCL_READ_IMAGE0:
@@ -677,6 +684,7 @@ namespace gbe {
 
   bool Scalarize::scalarizeBitCast(BitCastInst* bt)
   {
+    setAppendPoint(bt);
     if(bt->getOperand(0)->getType()->isVectorTy())
       bt->setOperand(0, InsertToVector(bt, bt->getOperand(0)));
     if(bt->getType()->isVectorTy())
@@ -686,6 +694,7 @@ namespace gbe {
 
   bool Scalarize::scalarizeLoad(LoadInst* ld)
   {
+    setAppendPoint(ld);
     extractFromVector(ld);
     return false;
   }
-- 
1.7.9.5



More information about the Beignet mailing list