diff options
author | Yang Rong <rong.r.yang@intel.com> | 2015-11-04 14:22:16 +0800 |
---|---|---|
committer | Yang Rong <rong.r.yang@intel.com> | 2016-05-27 10:10:34 +0800 |
commit | a072cca6c23b4eec4facda05668d27479a4ac442 (patch) | |
tree | 0faf15dd8d8f29697cd59295145ccf45f8fe9b19 /backend | |
parent | 114c1064aae7047032a61ed175fad9926039fa85 (diff) | |
download | beignet-a072cca6c23b4eec4facda05668d27479a4ac442.tar.gz |
Android: erase the stl in iterator loop, must update the iterator.
Otherwize, may cause crash in android.
Signed-off-by: Yang Rong <rong.r.yang@intel.com>
Reviewed-by: Zhigang Gong <zhigang.gong@intel.com>
Diffstat (limited to 'backend')
-rw-r--r-- | backend/src/backend/gen_reg_allocation.cpp | 8 | ||||
-rw-r--r-- | 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 1aaac588..26a010d3 100644 --- a/backend/src/backend/gen_reg_allocation.cpp +++ b/backend/src/backend/gen_reg_allocation.cpp @@ -704,15 +704,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 77f640e7..acad1b26 100644 --- a/backend/src/llvm/llvm_gen_backend.cpp +++ b/backend/src/llvm/llvm_gen_backend.cpp @@ -2450,13 +2450,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); @@ -2472,8 +2475,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) { |