From c50bb82a48cdb6548434f503176c977070bb9323 Mon Sep 17 00:00:00 2001 From: mkoch Date: Tue, 26 Sep 2023 20:48:41 +0300 Subject: [PATCH] fix applyRemovals for pass manager --- .../Sapfor_2017/_src/Utils/PassManager.h | 53 +++++++++++++++---- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h index c02e607..b83997c 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h @@ -99,23 +99,58 @@ public: } void applyRemovals() { - set to_process = { name }, processed; + map> to_process, processed; + to_process[name] = {}; while (!to_process.empty()) { - set to_process_next; + map> to_process_next; for (const auto& pass : to_process) { - if (processed.insert(pass).second) { - auto removals_it = passRemovals.find(pass); - auto deps_it = passDeps->find(pass); + auto processed_it = processed.find(pass.first); + auto& done_removals = processed_it != processed.end() ? processed_it->second : processed[pass.first]; + + set removals_to_do; + bool process_pass = false; + + if (processed_it == processed.end()) { + removals_to_do = done_removals = pass.second; + process_pass = true; + } + else { + const auto& needed_removals = pass.second; + + set_difference(needed_removals.begin(), needed_removals.end(), done_removals.begin(), done_removals.end(), + inserter(removals_to_do, removals_to_do.begin())); + process_pass = needed_removals.size() != 0; + + done_removals.insert(removals_to_do.begin(), removals_to_do.end()); + } + + if (process_pass) { + processed[pass.first] = pass.second; + + auto removals_it = passRemovals.find(pass.first); - if (removals_it != passRemovals.end() && deps_it != passDeps->end()) { - auto& removals = removals_it->second; + if (removals_it != passRemovals.end()) { + auto& removals_saved = removals_it->second; + + set add; + set_difference(removals_saved.begin(), removals_saved.end(), done_removals.begin(), done_removals.end(), + inserter(add, add.begin())); + + done_removals.insert(add.begin(), add.end()); + removals_to_do.insert(add.begin(), add.end()); + } + + auto deps_it = passDeps->find(pass.first); + + if (deps_it != passDeps->end()) { auto& deps = deps_it->second; + for (auto dep_it = deps.begin(); dep_it != deps.end();) { - if (removals.find(*dep_it) == removals.end()) - to_process_next.insert(*(dep_it++)); + if (removals_to_do.find(*dep_it) == removals_to_do.end()) + to_process_next[*(dep_it++)].insert(removals_to_do.begin(), removals_to_do.end()); else dep_it = deps.erase(dep_it); }