summaryrefslogtreecommitdiff
path: root/src/passes/SimplifyLocals.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-04-07 19:16:37 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-04-07 19:19:40 -0700
commite444aefddd6e491e193e5eb53beae0c3f9252422 (patch)
tree4b03449ed3bf0764c5ea5eca910d74414604063b /src/passes/SimplifyLocals.cpp
parent0a03aacd4ea32476714066eebe0cded77c87ca66 (diff)
downloadbinaryen-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.cpp27
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");