summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-05-16 16:30:32 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-05-16 16:42:44 -0700
commit017440afd21551a0ea4d01490e7e0bb963ef53f9 (patch)
tree347f71e22e3676e9cd4a60a0f94ce10a40ecdcae /src
parenta39994f434a3cb7ce0b05987365e3ad550f03d71 (diff)
downloadbinaryen-017440afd21551a0ea4d01490e7e0bb963ef53f9.tar.gz
binaryen-017440afd21551a0ea4d01490e7e0bb963ef53f9.tar.bz2
binaryen-017440afd21551a0ea4d01490e7e0bb963ef53f9.zip
remove dead get_locals in vacuum
Diffstat (limited to 'src')
-rw-r--r--src/passes/Vacuum.cpp31
1 files changed, 29 insertions, 2 deletions
diff --git a/src/passes/Vacuum.cpp b/src/passes/Vacuum.cpp
index f9aba7051..10d04f160 100644
--- a/src/passes/Vacuum.cpp
+++ b/src/passes/Vacuum.cpp
@@ -28,14 +28,24 @@ namespace wasm {
struct Vacuum : public WalkerPass<PostWalker<Vacuum, Visitor<Vacuum>>> {
bool isFunctionParallel() { return true; }
+ std::vector<Expression*> expressionStack;
+
+ bool isDead(Expression* curr, bool resultMayBeUsed) {
+ if (curr->is<Nop>()) return true;
+ // dead get_locals may be generated from coalesce-locals
+ if (curr->is<GetLocal>() && (!resultMayBeUsed || !ExpressionAnalyzer::isResultUsed(expressionStack, getFunction()))) return true;
+ // TODO: more dead code
+ return false;
+ }
+
void visitBlock(Block *curr) {
- // compress out nops
+ // compress out nops and other dead code
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>()) {
+ if (isDead(list[z], z == size - 1)) {
skip++;
needResize = true;
} else {
@@ -82,6 +92,23 @@ struct Vacuum : public WalkerPass<PostWalker<Vacuum, Visitor<Vacuum>>> {
}
}
}
+
+ static void visitPre(Vacuum* self, Expression** currp) {
+ self->expressionStack.push_back(*currp);
+ }
+
+ static void visitPost(Vacuum* self, Expression** currp) {
+ self->expressionStack.pop_back();
+ }
+
+ // override scan to add a pre and a post check task to all nodes
+ static void scan(Vacuum* self, Expression** currp) {
+ self->pushTask(visitPost, currp);
+
+ WalkerPass<PostWalker<Vacuum, Visitor<Vacuum>>>::scan(self, currp);
+
+ self->pushTask(visitPre, currp);
+ }
};
static RegisterPass<Vacuum> registerPass("vacuum", "removes obviously unneeded code");