summaryrefslogtreecommitdiff
path: root/src/passes/SimplifyGlobals.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/passes/SimplifyGlobals.cpp')
-rw-r--r--src/passes/SimplifyGlobals.cpp23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/passes/SimplifyGlobals.cpp b/src/passes/SimplifyGlobals.cpp
index 71aafa491..a8012aa44 100644
--- a/src/passes/SimplifyGlobals.cpp
+++ b/src/passes/SimplifyGlobals.cpp
@@ -167,20 +167,35 @@ private:
};
struct GlobalSetRemover : public WalkerPass<PostWalker<GlobalSetRemover>> {
- GlobalSetRemover(NameSet* toRemove) : toRemove(toRemove) {}
+ GlobalSetRemover(const NameSet* toRemove, bool optimize)
+ : toRemove(toRemove), optimize(optimize) {}
bool isFunctionParallel() override { return true; }
- GlobalSetRemover* create() override { return new GlobalSetRemover(toRemove); }
+ GlobalSetRemover* create() override {
+ return new GlobalSetRemover(toRemove, optimize);
+ }
void visitGlobalSet(GlobalSet* curr) {
if (toRemove->count(curr->name) != 0) {
ExpressionManipulator::nop(curr);
+ nopped = true;
+ }
+ }
+
+ void visitFunction(Function* curr) {
+ if (nopped && optimize) {
+ PassRunner runner(getModule(), getPassRunner()->options);
+ runner.setIsNested(true);
+ runner.addDefaultFunctionOptimizationPasses();
+ runner.runOnFunction(curr);
}
}
private:
- NameSet* toRemove;
+ const NameSet* toRemove;
+ bool optimize;
+ bool nopped = false;
};
} // anonymous namespace
@@ -247,7 +262,7 @@ struct SimplifyGlobals : public Pass {
info.written = false;
}
}
- GlobalSetRemover(&unreadGlobals).run(runner, module);
+ GlobalSetRemover(&unreadGlobals, optimize).run(runner, module);
}
void preferEarlierImports() {