diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-05-23 19:59:06 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-05-23 19:59:06 -0700 |
commit | 3a993f98daefc9a851824f5099b76b4a427f81ed (patch) | |
tree | 045fdedd5b5fab72f5ae5de135297b3fe2faa39f /src | |
parent | 57ec2122cf0971d7869e56699b768026268745ea (diff) | |
download | binaryen-3a993f98daefc9a851824f5099b76b4a427f81ed.tar.gz binaryen-3a993f98daefc9a851824f5099b76b4a427f81ed.tar.bz2 binaryen-3a993f98daefc9a851824f5099b76b4a427f81ed.zip |
add a pass to drop return values in set_local and store (#539)
Diffstat (limited to 'src')
-rw-r--r-- | src/passes/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/passes/DropReturnValues.cpp | 79 |
2 files changed, 80 insertions, 0 deletions
diff --git a/src/passes/CMakeLists.txt b/src/passes/CMakeLists.txt index 1c2a63da4..2b70fb9d4 100644 --- a/src/passes/CMakeLists.txt +++ b/src/passes/CMakeLists.txt @@ -2,6 +2,7 @@ SET(passes_SOURCES pass.cpp CoalesceLocals.cpp DeadCodeElimination.cpp + DropReturnValues.cpp LowerIfElse.cpp MergeBlocks.cpp Metrics.cpp diff --git a/src/passes/DropReturnValues.cpp b/src/passes/DropReturnValues.cpp new file mode 100644 index 000000000..b89de3011 --- /dev/null +++ b/src/passes/DropReturnValues.cpp @@ -0,0 +1,79 @@ +/* + * Copyright 2016 WebAssembly Community Group participants + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// +// Stops using return values from set_local and store nodes. +// + +#include <wasm.h> +#include <pass.h> +#include <ast_utils.h> +#include <wasm-builder.h> + +namespace wasm { + +struct DropReturnValues : public WalkerPass<PostWalker<DropReturnValues, Visitor<DropReturnValues>>> { + bool isFunctionParallel() { return true; } + + std::vector<Expression*> expressionStack; + + void visitSetLocal(SetLocal* curr) { + if (ExpressionAnalyzer::isResultUsed(expressionStack, getFunction())) { + Builder builder(*getModule()); + replaceCurrent(builder.makeSequence( + curr, + builder.makeGetLocal(curr->index, curr->type) + )); + } + } + + void visitStore(Store* curr) { + if (ExpressionAnalyzer::isResultUsed(expressionStack, getFunction())) { + Index index = getFunction()->getNumLocals(); + getFunction()->vars.emplace_back(curr->type); + Builder builder(*getModule()); + replaceCurrent(builder.makeSequence( + builder.makeSequence( + builder.makeSetLocal(index, curr->value), + curr + ), + builder.makeGetLocal(index, curr->type) + )); + curr->value = builder.makeGetLocal(index, curr->type); + } + } + + static void visitPre(DropReturnValues* self, Expression** currp) { + self->expressionStack.push_back(*currp); + } + + static void visitPost(DropReturnValues* self, Expression** currp) { + self->expressionStack.pop_back(); + } + + static void scan(DropReturnValues* self, Expression** currp) { + self->pushTask(visitPost, currp); + + WalkerPass<PostWalker<DropReturnValues, Visitor<DropReturnValues>>>::scan(self, currp); + + self->pushTask(visitPre, currp); + } +}; + +static RegisterPass<DropReturnValues> registerPass("drop-return-values", "stops relying on return values from set_local and store"); + +} // namespace wasm + |