diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-05-23 17:20:33 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-05-23 17:20:33 -0700 |
commit | 57ec2122cf0971d7869e56699b768026268745ea (patch) | |
tree | d436e2b89a296b9bec6878950204aa2eb7d9d8e4 /src/passes/RemoveUnusedBrs.cpp | |
parent | a78daa409853b106228d0cca0c5564222c489e04 (diff) | |
parent | 9a59635c2148511cb72cbd9e1f9cf1026b4a1f3a (diff) | |
download | binaryen-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.cpp | 18 |
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); + } } }; |