diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-08-16 18:25:12 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-09-07 09:55:00 -0700 |
commit | ada1e2671ac3095e62f52932d3358489fdf195f0 (patch) | |
tree | 4e4e3f4603e4eaf65846bd0af32b0e4ba741c35f /src | |
parent | 15a264ee9c67816693d92a5454ad7469f1f255ff (diff) | |
download | binaryen-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.h | 8 |
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) { |