summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-04-07 20:42:17 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-04-07 20:42:17 -0700
commit1b6a1099f857d70005380cb4f980c9defeba4b22 (patch)
tree62a83cdc122d8973980ae8f54a4e82d9db24d419
parentdb3d83e79532cd48fbd852f7ab1370d0218dfe91 (diff)
downloadbinaryen-1b6a1099f857d70005380cb4f980c9defeba4b22.tar.gz
binaryen-1b6a1099f857d70005380cb4f980c9defeba4b22.tar.bz2
binaryen-1b6a1099f857d70005380cb4f980c9defeba4b22.zip
add missing checks on nested blocks in SimplifyExpressions
-rw-r--r--src/passes/SimplifyLocals.cpp9
-rw-r--r--test/passes/simplify-locals.txt13
-rw-r--r--test/passes/simplify-locals.wast13
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)
+ )
+ )
)