diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-04-07 19:16:37 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-04-07 19:19:40 -0700 |
commit | e444aefddd6e491e193e5eb53beae0c3f9252422 (patch) | |
tree | 4b03449ed3bf0764c5ea5eca910d74414604063b /src/passes/SimplifyLocals.cpp | |
parent | 0a03aacd4ea32476714066eebe0cded77c87ca66 (diff) | |
download | binaryen-e444aefddd6e491e193e5eb53beae0c3f9252422.tar.gz binaryen-e444aefddd6e491e193e5eb53beae0c3f9252422.tar.bz2 binaryen-e444aefddd6e491e193e5eb53beae0c3f9252422.zip |
handle loops in effect analyzer
Diffstat (limited to 'src/passes/SimplifyLocals.cpp')
-rw-r--r-- | src/passes/SimplifyLocals.cpp | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/src/passes/SimplifyLocals.cpp b/src/passes/SimplifyLocals.cpp index a0f843bbd..cd6cb2ca7 100644 --- a/src/passes/SimplifyLocals.cpp +++ b/src/passes/SimplifyLocals.cpp @@ -78,14 +78,7 @@ struct SimplifyLocals : public WalkerPass<FastExecutionWalker<SimplifyLocals>> { } } - void walk(Expression*& curr) override { - if (!curr) return; - - FastExecutionWalker::walk(curr); - - // invalidations TODO: this is O(n^2) in sinkables - EffectAnalyzer effects; - effects.visit(curr); + void checkInvalidations(EffectAnalyzer& effects) { std::vector<Name> invalidated; for (auto& sinkable : sinkables) { if (effects.invalidates(sinkable.second.effects)) { @@ -96,6 +89,24 @@ struct SimplifyLocals : public WalkerPass<FastExecutionWalker<SimplifyLocals>> { sinkables.erase(name); } } + + void walk(Expression*& curr) override { + if (!curr) return; + + EffectAnalyzer effects; + + if (effects.checkPre(curr)) { + checkInvalidations(effects); + } + + FastExecutionWalker::walk(curr); + + // TODO: this is O(n^2) in sinkables + + if (effects.checkPost(curr)) { + checkInvalidations(effects); + } + } }; static RegisterPass<SimplifyLocals> registerPass("simplify-locals", "miscellaneous locals-related optimizations"); |