diff options
Diffstat (limited to 'src/passes/SimplifyLocals.cpp')
-rw-r--r-- | src/passes/SimplifyLocals.cpp | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/src/passes/SimplifyLocals.cpp b/src/passes/SimplifyLocals.cpp index cd6cb2ca7..5368701d7 100644 --- a/src/passes/SimplifyLocals.cpp +++ b/src/passes/SimplifyLocals.cpp @@ -79,6 +79,7 @@ struct SimplifyLocals : public WalkerPass<FastExecutionWalker<SimplifyLocals>> { } void checkInvalidations(EffectAnalyzer& effects) { + // TODO: this is O(bad) std::vector<Name> invalidated; for (auto& sinkable : sinkables) { if (effects.invalidates(sinkable.second.effects)) { @@ -90,23 +91,29 @@ struct SimplifyLocals : public WalkerPass<FastExecutionWalker<SimplifyLocals>> { } } - void walk(Expression*& curr) override { - if (!curr) return; - + void checkPre(Expression* curr) { EffectAnalyzer effects; - if (effects.checkPre(curr)) { checkInvalidations(effects); } + } - FastExecutionWalker::walk(curr); - - // TODO: this is O(n^2) in sinkables - + void checkPost(Expression* curr) { + EffectAnalyzer effects; if (effects.checkPost(curr)) { checkInvalidations(effects); } } + + void walk(Expression*& curr) override { + if (!curr) return; + + checkPre(curr); + + FastExecutionWalker::walk(curr); + + checkPost(curr); + } }; static RegisterPass<SimplifyLocals> registerPass("simplify-locals", "miscellaneous locals-related optimizations"); |