diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-04-24 09:57:25 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-04-24 09:57:25 -0700 |
commit | f885aad48c55a0e293c5387f88b82c581a5e5c7e (patch) | |
tree | 21198adc85ef67e92c71529e00603af6d61e9e70 /src/passes/Vacuum.cpp | |
parent | 2cc2b8288f0179b8e506d420dd27fada5652e0c3 (diff) | |
parent | 186765307f12e6c7628ad6da11b332c2bfbcaa07 (diff) | |
download | binaryen-f885aad48c55a0e293c5387f88b82c581a5e5c7e.tar.gz binaryen-f885aad48c55a0e293c5387f88b82c581a5e5c7e.tar.bz2 binaryen-f885aad48c55a0e293c5387f88b82c581a5e5c7e.zip |
Merge pull request #386 from WebAssembly/improve-remove-brs
Improve RemoveBrs
Diffstat (limited to 'src/passes/Vacuum.cpp')
-rw-r--r-- | src/passes/Vacuum.cpp | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/src/passes/Vacuum.cpp b/src/passes/Vacuum.cpp index 863d78f14..dd88fa0eb 100644 --- a/src/passes/Vacuum.cpp +++ b/src/passes/Vacuum.cpp @@ -21,6 +21,7 @@ #include <wasm.h> #include <pass.h> #include <ast_utils.h> +#include <wasm-builder.h> namespace wasm { @@ -32,14 +33,26 @@ struct Vacuum : public WalkerPass<PostWalker<Vacuum, Visitor<Vacuum>>> { int skip = 0; auto& list = curr->list; size_t size = list.size(); + bool needResize = false; for (size_t z = 0; z < size; z++) { if (list[z]->is<Nop>()) { skip++; - } else if (skip > 0) { - list[z - skip] = list[z]; + needResize = true; + } else { + if (skip > 0) { + list[z - skip] = list[z]; + } + // if this is an unconditional br, the rest is dead code + Break* br = list[z - skip]->dynCast<Break>(); + Switch* sw = list[z - skip]->dynCast<Switch>(); + if ((br && !br->condition) || sw) { + list.resize(z - skip + 1); + needResize = false; + break; + } } } - if (skip > 0) { + if (needResize) { list.resize(size - skip); } if (!curr->name.is()) { @@ -50,6 +63,25 @@ struct Vacuum : public WalkerPass<PostWalker<Vacuum, Visitor<Vacuum>>> { } } } + + void visitIf(If* curr) { + if (curr->ifFalse) { + if (curr->ifFalse->is<Nop>()) { + curr->ifFalse = nullptr; + } else if (curr->ifTrue->is<Nop>()) { + curr->ifTrue = curr->ifFalse; + curr->ifFalse = nullptr; + curr->condition = Builder(*getModule()).makeUnary(EqZ, curr->condition, curr->condition->type); + } + } + if (!curr->ifFalse) { + // no else + if (curr->ifTrue->is<Nop>()) { + // no nothing + replaceCurrent(curr->condition); + } + } + } }; static RegisterPass<Vacuum> registerPass("vacuum", "removes obviously unneeded code"); |