[Beignet] [Patch V2] Fix a random assert caused by scalarize pass.

Yang Rong rong.r.yang at intel.com
Fri May 31 00:19:09 PDT 2013


Revome the dead values in unit.valueMap at each begin of pass to avoid
the new value have some address.
Also fix a typo

Signed-off-by: Yang Rong <rong.r.yang at intel.com>
---
 backend/src/ir/unit.cpp               |   10 +++++++++-
 backend/src/ir/unit.hpp               |    2 ++
 backend/src/llvm/llvm_gen_backend.cpp |    1 +
 backend/src/llvm/llvm_scalarize.cpp   |   12 ++++++------
 4 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/backend/src/ir/unit.cpp b/backend/src/ir/unit.cpp
index 1e98afa..44cec3c 100644
--- a/backend/src/ir/unit.cpp
+++ b/backend/src/ir/unit.cpp
@@ -21,6 +21,7 @@
  * \file unit.cpp
  * \author Benjamin Segovia <benjamin.segovia at intel.com>
  */
+#include "llvm/Instructions.h"
 #include "ir/unit.hpp"
 #include "ir/function.hpp"
 
@@ -53,10 +54,17 @@ namespace ir {
     constantSet.append(data, name, size, alignment);
   }
 
+  void Unit::removeDeadValues()
+  {
+    for(auto &it : valueMap) {
+      llvm::Instruction* I = llvm::dyn_cast<llvm::Instruction>(it.first.first);  //fake value
+      if((I == NULL) || (I->getParent() == NULL))
+        valueMap.erase(it.first);
+    }
+  }
   std::ostream &operator<< (std::ostream &out, const Unit &unit) {
     unit.apply([&out] (const Function &fn) { out << fn << std::endl; });
     return out;
   }
 } /* namespace ir */
 } /* namespace gbe */
-
diff --git a/backend/src/ir/unit.hpp b/backend/src/ir/unit.hpp
index 3b293f5..f19fd7e 100644
--- a/backend/src/ir/unit.hpp
+++ b/backend/src/ir/unit.hpp
@@ -88,6 +88,8 @@ namespace ir {
       GBE_ASSERT(valueMap.find(key) == valueMap.end()); // Do not insert twice
       valueMap[key] = value;
     }
+    /* remove fake values that removed by other pass */
+    void removeDeadValues(void);
     /*! Return the value map */
     const map<ValueIndex, ValueIndex>& getValueMap(void) const { return valueMap; }
   private:
diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp
index 3fe0cbf..131d7a6 100644
--- a/backend/src/llvm/llvm_gen_backend.cpp
+++ b/backend/src/llvm/llvm_gen_backend.cpp
@@ -1140,6 +1140,7 @@ namespace gbe
     }
 
     ctx.startFunction(F.getName());
+    unit.removeDeadValues();
     this->regTranslator.clear();
     this->regTranslator.initValueMap(unit.getValueMap());
     this->labelMap.clear();
diff --git a/backend/src/llvm/llvm_scalarize.cpp b/backend/src/llvm/llvm_scalarize.cpp
index bc66549..c24e575 100644
--- a/backend/src/llvm/llvm_scalarize.cpp
+++ b/backend/src/llvm/llvm_scalarize.cpp
@@ -182,7 +182,7 @@ namespace gbe {
     bool IsPerComponentOp(const Value* value);
 
     //these function used to add extract and insert instructions when load/store etc.
-    void extractFromeVector(Value* insn);
+    void extractFromVector(Value* insn);
     Value* InsertToVector(Value* insn, Value* vecValue);
 
     Type* GetBasicType(Value* value) {
@@ -581,7 +581,7 @@ namespace gbe {
     return true;
   }
 
-  void Scalarize::extractFromeVector(Value* insn) {
+  void Scalarize::extractFromVector(Value* insn) {
     VectorValues& vVals = vectorVals[insn];
 
     for (int i = 0; i < GetComponentCount(insn); ++i) {
@@ -645,7 +645,7 @@ namespace gbe {
           case GEN_OCL_GET_IMAGE_WIDTH:
           case GEN_OCL_GET_IMAGE_HEIGHT:
           {
-            extractFromeVector(call);
+            extractFromVector(call);
             break;
           }
           case GEN_OCL_WRITE_IMAGE10:
@@ -673,7 +673,7 @@ namespace gbe {
 
   bool Scalarize::scalarizeLoad(LoadInst* ld)
   {
-    extractFromeVector(ld);
+    extractFromVector(ld);
     return false;
   }
 
@@ -738,7 +738,7 @@ namespace gbe {
       Type *type = I->getType();
 
       if(type->isVectorTy())
-        extractFromeVector(I);
+        extractFromVector(I);
     }
     return;
   }
@@ -758,9 +758,9 @@ namespace gbe {
     intTy = IntegerType::get(module->getContext(), 32);
     floatTy = Type::getFloatTy(module->getContext());
     builder = new IRBuilder<>(module->getContext());
+    unit.removeDeadValues();
 
     scalarizeArgs(F);
-
     typedef ReversePostOrderTraversal<Function*> RPOTType;
     RPOTType rpot(&F);
     for (RPOTType::rpo_iterator bbI = rpot.begin(), bbE = rpot.end(); bbI != bbE; ++bbI) {
-- 
1.7.9.5



More information about the Beignet mailing list