diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-04-07 19:04:29 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-04-07 19:04:29 -0700 |
commit | e98b5a7d1866a9f29c5bf06a9b231894222ad30b (patch) | |
tree | 1b775d9f30b9ced7a7250668dde8e1f020f0123d /src/passes/SimplifyLocals.cpp | |
parent | 0d267afdf948de326055e58a94e5f48d9310a52a (diff) | |
download | binaryen-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/passes/SimplifyLocals.cpp')
-rw-r--r-- | src/passes/SimplifyLocals.cpp | 4 |
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)) { |