diff options
-rw-r--r-- | src/passes/SimplifyLocals.cpp | 9 | ||||
-rw-r--r-- | test/passes/simplify-locals.txt | 13 | ||||
-rw-r--r-- | test/passes/simplify-locals.wast | 13 |
3 files changed, 33 insertions, 2 deletions
diff --git a/src/passes/SimplifyLocals.cpp b/src/passes/SimplifyLocals.cpp index 5368701d7..0d59b8759 100644 --- a/src/passes/SimplifyLocals.cpp +++ b/src/passes/SimplifyLocals.cpp @@ -45,14 +45,19 @@ struct SimplifyLocals : public WalkerPass<FastExecutionWalker<SimplifyLocals>> { void visitBlock(Block *curr) { // note locals, we can sink them from here TODO sink from elsewhere? - derecurseBlocks(curr, [&](Block* block) {}, [&](Block* block, Expression*& child) { + derecurseBlocks(curr, [&](Block* block) { + // curr was already checked by walk() + if (block != curr) checkPre(block); + }, [&](Block* block, Expression*& child) { walk(child); if (child->is<SetLocal>()) { Name name = child->cast<SetLocal>()->name; assert(sinkables.count(name) == 0); sinkables.emplace(std::make_pair(name, SinkableInfo(&child))); } - }, [&](Block* block) {}); + }, [&](Block* block) { + if (block != curr) checkPost(block); + }); } void visitGetLocal(GetLocal *curr) { diff --git a/test/passes/simplify-locals.txt b/test/passes/simplify-locals.txt index 880639f79..95b714eb9 100644 --- a/test/passes/simplify-locals.txt +++ b/test/passes/simplify-locals.txt @@ -253,4 +253,17 @@ (get_local $a) ) ) + (func $Ia (param $a i32) (result i32) + (local $b i32) + (block $switch$0 + (block $switch-default$6 + (set_local $b + (i32.const 60) + ) + ) + ) + (return + (get_local $b) + ) + ) ) diff --git a/test/passes/simplify-locals.wast b/test/passes/simplify-locals.wast index db17c5533..24f8476d2 100644 --- a/test/passes/simplify-locals.wast +++ b/test/passes/simplify-locals.wast @@ -145,5 +145,18 @@ (get_local $a) ) ) + (func $Ia (param $a i32) (result i32) + (local $b i32) + (block $switch$0 + (block $switch-default$6 + (set_local $b + (i32.const 60) + ) + ) + ) + (return + (get_local $b) + ) + ) ) |