summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-08-16 18:25:12 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-09-07 09:55:00 -0700
commitada1e2671ac3095e62f52932d3358489fdf195f0 (patch)
tree4e4e3f4603e4eaf65846bd0af32b0e4ba741c35f /src
parent15a264ee9c67816693d92a5454ad7469f1f255ff (diff)
downloadbinaryen-ada1e2671ac3095e62f52932d3358489fdf195f0.tar.gz
binaryen-ada1e2671ac3095e62f52932d3358489fdf195f0.tar.bz2
binaryen-ada1e2671ac3095e62f52932d3358489fdf195f0.zip
add a drop for final elements in blocks if they are not used
Diffstat (limited to 'src')
-rw-r--r--src/ast_utils.h8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/ast_utils.h b/src/ast_utils.h
index 30e1d9a36..ea27c640f 100644
--- a/src/ast_utils.h
+++ b/src/ast_utils.h
@@ -789,7 +789,7 @@ struct ExpressionAnalyzer {
// Adds drop() operations where necessary. This lets you not worry about adding drop when
// generating code.
-struct AutoDrop : public WalkerPass<PostWalker<AutoDrop, Visitor<AutoDrop>>> {
+struct AutoDrop : public WalkerPass<ExpressionStackWalker<AutoDrop, Visitor<AutoDrop>>> {
bool isFunctionParallel() override { return true; }
Pass* create() override { return new AutoDrop; }
@@ -802,6 +802,12 @@ struct AutoDrop : public WalkerPass<PostWalker<AutoDrop, Visitor<AutoDrop>>> {
curr->list[i] = Builder(*getModule()).makeDrop(child);
}
}
+ auto* last = curr->list.back();
+ expressionStack.push_back(last);
+ if (isConcreteWasmType(last->type) && !ExpressionAnalyzer::isResultUsed(expressionStack, getFunction())) {
+ curr->list.back() = Builder(*getModule()).makeDrop(last);
+ }
+ expressionStack.pop_back();
}
void visitFunction(Function* curr) {