summaryrefslogtreecommitdiff
path: root/src/passes/RemoveUnusedBrs.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-05-23 17:20:33 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-05-23 17:20:33 -0700
commit57ec2122cf0971d7869e56699b768026268745ea (patch)
treed436e2b89a296b9bec6878950204aa2eb7d9d8e4 /src/passes/RemoveUnusedBrs.cpp
parenta78daa409853b106228d0cca0c5564222c489e04 (diff)
parent9a59635c2148511cb72cbd9e1f9cf1026b4a1f3a (diff)
downloadbinaryen-57ec2122cf0971d7869e56699b768026268745ea.tar.gz
binaryen-57ec2122cf0971d7869e56699b768026268745ea.tar.bz2
binaryen-57ec2122cf0971d7869e56699b768026268745ea.zip
Merge pull request #538 from WebAssembly/asm2wasm-validation
More validation
Diffstat (limited to 'src/passes/RemoveUnusedBrs.cpp')
-rw-r--r--src/passes/RemoveUnusedBrs.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/passes/RemoveUnusedBrs.cpp b/src/passes/RemoveUnusedBrs.cpp
index 570e14b38..785e09570 100644
--- a/src/passes/RemoveUnusedBrs.cpp
+++ b/src/passes/RemoveUnusedBrs.cpp
@@ -156,6 +156,7 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs, Visitor<R
void walk(Expression*& root) {
// multiple cycles may be needed
+ bool worked = false;
do {
anotherCycle = false;
WalkerPass<PostWalker<RemoveUnusedBrs, Visitor<RemoveUnusedBrs>>>::walk(root);
@@ -174,6 +175,7 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs, Visitor<R
}
}
flows.clear();
+ if (anotherCycle) worked = true;
} while (anotherCycle);
// finally, we may have simplified ifs enough to turn them into selects
struct Selectifier : public WalkerPass<PostWalker<Selectifier, Visitor<Selectifier>>> {
@@ -202,6 +204,22 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs, Visitor<R
Selectifier selectifier;
selectifier.setModule(getModule());
selectifier.walk(root);
+ if (worked) {
+ // Our work may alter block and if types, they may now return
+ struct TypeUpdater : public WalkerPass<PostWalker<TypeUpdater, Visitor<TypeUpdater>>> {
+ void visitBlock(Block* curr) {
+ curr->finalize();
+ }
+ void visitLoop(Loop* curr) {
+ curr->finalize();
+ }
+ void visitIf(If* curr) {
+ curr->finalize();
+ }
+ };
+ TypeUpdater typeUpdater;
+ typeUpdater.walk(root);
+ }
}
};