summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-01-08 15:11:34 -0800
committerAlon Zakai <alonzakai@gmail.com>2016-01-08 15:11:34 -0800
commit02910f3defc1be94ee1d4af6d43ec05b1c37d18d (patch)
tree9b128fe5a1aa8334561018ede7d1694f00f23b58 /src
parent382ea607d99c73a6e893f4f92b0b63bde698e487 (diff)
downloadbinaryen-02910f3defc1be94ee1d4af6d43ec05b1c37d18d.tar.gz
binaryen-02910f3defc1be94ee1d4af6d43ec05b1c37d18d.tar.bz2
binaryen-02910f3defc1be94ee1d4af6d43ec05b1c37d18d.zip
RemoveUnneededBrs: remove all code in a block after a break
Diffstat (limited to 'src')
-rw-r--r--src/passes/RemoveUnusedBrs.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/passes/RemoveUnusedBrs.cpp b/src/passes/RemoveUnusedBrs.cpp
index a89c69312..395b0f1ba 100644
--- a/src/passes/RemoveUnusedBrs.cpp
+++ b/src/passes/RemoveUnusedBrs.cpp
@@ -66,6 +66,13 @@ struct RemoveUnusedBrs : public Pass {
void visitBlock(Block *curr) override {
if (curr->name.isNull()) return;
if (curr->list.size() == 0) return;
+ // preparation - remove all code after a break, since it can't execute, and it might confuse us (we look at the last)
+ for (size_t i = 0; i < curr->list.size()-1; i++) {
+ if (curr->list[i]->is<Break>()) {
+ curr->list.resize(i+1);
+ break;
+ }
+ }
Expression* last = curr->list.back();
if (Break* br = last->dyn_cast<Break>()) {
if (br->condition) return;