diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-04-07 11:13:41 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-04-07 11:21:37 -0700 |
commit | 2bf63aadfbf30494455ac31c2fe90bdbc6774d71 (patch) | |
tree | c659e45a7d32ae4b6900d0f1b1445749d79626b8 | |
parent | 5d7631a655926f57f824c31505694adac1f44c39 (diff) | |
download | binaryen-2bf63aadfbf30494455ac31c2fe90bdbc6774d71.tar.gz binaryen-2bf63aadfbf30494455ac31c2fe90bdbc6774d71.tar.bz2 binaryen-2bf63aadfbf30494455ac31c2fe90bdbc6774d71.zip |
add vacuum pass
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/asm2wasm.h | 1 | ||||
-rw-r--r-- | src/binaryen-shell.cpp | 3 | ||||
-rw-r--r-- | src/passes/Vacuum.cpp | 48 | ||||
-rw-r--r-- | test/passes/vacuum.txt | 8 | ||||
-rw-r--r-- | test/passes/vacuum.wast | 12 |
6 files changed, 73 insertions, 1 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index e0ee31f11..a529410b6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -92,6 +92,7 @@ SET(binaryen-shell_SOURCES src/passes/RemoveUnusedNames.cpp src/passes/SimplifyLocals.cpp src/passes/ReorderLocals.cpp + src/passes/Vacuum.cpp src/passes/Metrics.cpp ) ADD_EXECUTABLE(binaryen-shell @@ -112,6 +113,7 @@ SET(asm2wasm_SOURCES src/passes/RemoveUnusedNames.cpp src/passes/SimplifyLocals.cpp src/passes/ReorderLocals.cpp + src/passes/Vacuum.cpp src/emscripten-optimizer/parser.cpp src/emscripten-optimizer/simple_ast.cpp src/emscripten-optimizer/optimizer-shared.cpp diff --git a/src/asm2wasm.h b/src/asm2wasm.h index 2f18b98f1..910134024 100644 --- a/src/asm2wasm.h +++ b/src/asm2wasm.h @@ -1606,6 +1606,7 @@ void Asm2WasmBuilder::optimize() { passRunner.add("optimize-instructions"); passRunner.add("simplify-locals"); passRunner.add("reorder-locals"); + passRunner.add("vacuum"); if (maxGlobal < 1024) { passRunner.add("post-emscripten"); } diff --git a/src/binaryen-shell.cpp b/src/binaryen-shell.cpp index 14cc66406..7f5b3077e 100644 --- a/src/binaryen-shell.cpp +++ b/src/binaryen-shell.cpp @@ -177,7 +177,8 @@ int main(int argc, const char* argv[]) { static const char* default_passes[] = {"remove-unused-brs", "remove-unused-names", "merge-blocks", "optimize-instructions", - "simplify-locals", "reorder-locals"}; + "simplify-locals", "reorder-locals", + "vacuum"}; Options options("binaryen-shell", "Execute .wast files"); options diff --git a/src/passes/Vacuum.cpp b/src/passes/Vacuum.cpp new file mode 100644 index 000000000..f9704ed8d --- /dev/null +++ b/src/passes/Vacuum.cpp @@ -0,0 +1,48 @@ +/* + * 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. + */ + +// +// Removes obviously unneeded code +// + +#include <wasm.h> +#include <pass.h> + +namespace wasm { + +struct Vacuum : public WalkerPass<WasmWalker<Vacuum>> { + void visitBlock(Block *curr) { + // compress out nops + int skip = 0; + auto& list = curr->list; + size_t size = list.size(); + for (size_t z = 0; z < size; z++) { + if (list[z]->is<Nop>()) { + skip++; + } else if (skip > 0) { + list[z - skip] = list[z]; + } + } + if (skip > 0) { + list.resize(size - skip); + } + } +}; + +static RegisterPass<Vacuum> registerPass("vacuum", "removes obviously unneeded code"); + +} // namespace wasm + diff --git a/test/passes/vacuum.txt b/test/passes/vacuum.txt new file mode 100644 index 000000000..bb76b2d82 --- /dev/null +++ b/test/passes/vacuum.txt @@ -0,0 +1,8 @@ +(module + (memory 256 256) + (func $b + (i32.const 50) + (i32.const 51) + (i32.const 52) + ) +) diff --git a/test/passes/vacuum.wast b/test/passes/vacuum.wast new file mode 100644 index 000000000..24dc32bcb --- /dev/null +++ b/test/passes/vacuum.wast @@ -0,0 +1,12 @@ +(module + (memory 256 256) + (func $b + (i32.const 50) + (nop) + (i32.const 51) + (nop) + (nop) + (i32.const 52) + ) +) + |