summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-04-07 19:04:29 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-04-07 19:04:29 -0700
commite98b5a7d1866a9f29c5bf06a9b231894222ad30b (patch)
tree1b775d9f30b9ced7a7250668dde8e1f020f0123d /src
parent0d267afdf948de326055e58a94e5f48d9310a52a (diff)
downloadbinaryen-e98b5a7d1866a9f29c5bf06a9b231894222ad30b.tar.gz
binaryen-e98b5a7d1866a9f29c5bf06a9b231894222ad30b.tar.bz2
binaryen-e98b5a7d1866a9f29c5bf06a9b231894222ad30b.zip
fix invalidation logic in SimplifyLocals, visit each node as we hit it, do not walk it to look for invalidating elements that are children, we already saw them
Diffstat (limited to 'src')
-rw-r--r--src/passes/SimplifyLocals.cpp4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/passes/SimplifyLocals.cpp b/src/passes/SimplifyLocals.cpp
index 5c7b7475a..a0f843bbd 100644
--- a/src/passes/SimplifyLocals.cpp
+++ b/src/passes/SimplifyLocals.cpp
@@ -79,11 +79,13 @@ 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.walk(curr); // TODO: this, accumulated, is O(n * nesting) <= O(n^2)
+ effects.visit(curr);
std::vector<Name> invalidated;
for (auto& sinkable : sinkables) {
if (effects.invalidates(sinkable.second.effects)) {