[Beignet] [PATCH 3/6] Android: erase the stl in iterator loop, must update the iterator.

Yang Rong rong.r.yang at intel.com
Mon Nov 9 18:40:14 PST 2015


Otherwize, may cause crash in android.

Signed-off-by: Yang Rong <rong.r.yang at intel.com>
---
 backend/src/backend/gen_reg_allocation.cpp |  8 ++++----
 backend/src/llvm/llvm_gen_backend.cpp      | 16 ++++++++++------
 2 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/backend/src/backend/gen_reg_allocation.cpp b/backend/src/backend/gen_reg_allocation.cpp
index a9338c5..1cf7ad5 100644
--- a/backend/src/backend/gen_reg_allocation.cpp
+++ b/backend/src/backend/gen_reg_allocation.cpp
@@ -701,15 +701,15 @@ namespace gbe
       set<const ir::BasicBlock *> liveOutSet01;
       set<const ir::BasicBlock *> workSet(liveInSet01.begin(), liveInSet01.end());
       while(workSet.size()) {
-        for(auto bb : workSet) {
-          for(auto predBB : bb->getPredecessorSet()) {
+        for (auto bb = workSet.begin(); bb != workSet.end(); ) {
+          for(auto predBB : (*bb)->getPredecessorSet()) {
             liveOutSet01.insert(predBB);
-            if (liveInSet01.contains(predBB))
+            if (liveInSet01.find(predBB) != liveInSet01.end())
               continue;
             liveInSet01.insert(predBB);
             workSet.insert(predBB);
           }
-          workSet.erase(bb);
+          bb = workSet.erase(bb);
         }
       }
       int32_t maxID = 0;
diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp
index 39665b8..e847d4e 100644
--- a/backend/src/llvm/llvm_gen_backend.cpp
+++ b/backend/src/llvm/llvm_gen_backend.cpp
@@ -2322,13 +2322,16 @@ namespace gbe
     // Do multi pass redundant phi copy elimination based on the global interfering information.
     // FIXME, we don't need to re-compute the whole DAG for each pass.
     while (curRedundant->size() > 0) {
-      for (auto &pair : *curRedundant) {
-        auto phiCopySrc = pair.first;
-        auto phiCopy = pair.second;
+      //for (auto &pair = *curRedundant) {
+      for (auto pair = curRedundant->begin(); pair != curRedundant->end(); ) {
+        auto phiCopySrc = pair->first;
+        auto phiCopy = pair->second;
         if (replacedRegs.find(phiCopy) != replacedRegs.end() ||
             revReplacedRegs.find(phiCopy) != revReplacedRegs.end() ||
-            revReplacedRegs.find(phiCopySrc) != revReplacedRegs.end())
+            revReplacedRegs.find(phiCopySrc) != revReplacedRegs.end()) {
+          pair++;
           continue;
+        }
         if (!dag->interfere(liveness, phiCopySrc, phiCopy)) {
           const ir::DefSet *phiCopySrcDef = dag->getRegDef(phiCopySrc);
           const ir::UseSet *phiCopySrcUse = dag->getRegUse(phiCopySrc);
@@ -2344,8 +2347,9 @@ namespace gbe
 
           replacedRegs.insert(std::make_pair(phiCopySrc, phiCopy));
           revReplacedRegs.insert(std::make_pair(phiCopy, phiCopySrc));
-          curRedundant->erase(phiCopySrc);
-        }
+          curRedundant->erase(pair++);
+        } else
+          pair++;
       }
 
       if (replacedRegs.size() != 0) {
-- 
2.1.4



More information about the Beignet mailing list