summaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
authorYang Rong <rong.r.yang@intel.com>2015-11-04 14:22:16 +0800
committerYang Rong <rong.r.yang@intel.com>2016-05-27 10:10:34 +0800
commita072cca6c23b4eec4facda05668d27479a4ac442 (patch)
tree0faf15dd8d8f29697cd59295145ccf45f8fe9b19 /backend
parent114c1064aae7047032a61ed175fad9926039fa85 (diff)
downloadbeignet-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.cpp8
-rw-r--r--backend/src/llvm/llvm_gen_backend.cpp16
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) {