fix for pass manager and new pass improvements #7
@@ -99,23 +99,58 @@ public:
|
||||
}
|
||||
|
||||
void applyRemovals() {
|
||||
set<passes> to_process = { name }, processed;
|
||||
map<passes, set<passes>> to_process, processed;
|
||||
to_process[name] = {};
|
||||
|
||||
while (!to_process.empty())
|
||||
{
|
||||
set<passes> to_process_next;
|
||||
map<passes, set<passes>> 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<passes> 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<passes> 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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user