summaryrefslogtreecommitdiff
path: root/src/passes/NameManager.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2017-06-28 22:05:05 -0700
committerGitHub <noreply@github.com>2017-06-28 22:05:05 -0700
commite488da5adbef2613c08fe205db5b79b1765a4af3 (patch)
treee3cab840dcbf7d8d4ccf1f47a742fbfc41e1d5ef /src/passes/NameManager.cpp
parente2c08d42ab0ffc05d980ae2d34fee0e77b201134 (diff)
downloadbinaryen-e488da5adbef2613c08fe205db5b79b1765a4af3.tar.gz
binaryen-e488da5adbef2613c08fe205db5b79b1765a4af3.tar.bz2
binaryen-e488da5adbef2613c08fe205db5b79b1765a4af3.zip
Code folding (#1076)
Adds a pass that folds code, i.e. merges it when possible. See details in comment in the pass implementation cpp. This is enabled by default in -Os and -Oz. Seems risky to enable anywhere else, as it does add branches - likely predictable ones so maybe no slowdown, but still some risk. Code size numbers: wasm-backend: 196331 + binaryen -Os (before): 182598 + binaryen -Os (with folding): 181943 asm2wasm -Os (before): 172463 asm2wasm -Os (with folding): 168774 So this reduces wasm-backend output by an additional 0.5% than it could before. Mainly this is because the wasm backend already has code folding, whereas on asm2wasm output, where we didn't have folding before, this saves over 2%. The 0.5% improvement on the wasm backend's output might be because this can fold more types of code than LLVM can (it can fold nested control flow, in particular).
Diffstat (limited to 'src/passes/NameManager.cpp')
-rw-r--r--src/passes/NameManager.cpp80
1 files changed, 0 insertions, 80 deletions
diff --git a/src/passes/NameManager.cpp b/src/passes/NameManager.cpp
deleted file mode 100644
index 035586a77..000000000
--- a/src/passes/NameManager.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2015 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.
- */
-
-//
-// NameManager
-//
-
-#include <wasm.h>
-#include <pass.h>
-
-namespace wasm {
-
-Name NameManager::getUnique(std::string prefix) {
- while (1) {
- Name curr = cashew::IString((prefix + std::to_string(counter++)).c_str(), false);
- if (names.find(curr) == names.end()) {
- names.insert(curr);
- return curr;
- }
- }
-}
-
-void NameManager::visitBlock(Block* curr) {
- names.insert(curr->name);
-}
-void NameManager::visitLoop(Loop* curr) {
- names.insert(curr->name);
-}
-void NameManager::visitBreak(Break* curr) {
- names.insert(curr->name);
-}
-void NameManager::visitSwitch(Switch* curr) {
- names.insert(curr->default_);
- for (auto& target : curr->targets) {
- names.insert(target);
- }
-}
-void NameManager::visitCall(Call* curr) {
- names.insert(curr->target);
-}
-void NameManager::visitCallImport(CallImport* curr) {
- names.insert(curr->target);
-}
-void NameManager::visitFunctionType(FunctionType* curr) {
- names.insert(curr->name);
-}
-void NameManager::visitFunction(Function* curr) {
- names.insert(curr->name);
- for (Index i = 0; i < curr->getNumLocals(); i++) {
- Name name = curr->getLocalNameOrDefault(i);
- if (name.is()) {
- names.insert(name);
- }
- }
-}
-void NameManager::visitImport(Import* curr) {
- names.insert(curr->name);
-}
-void NameManager::visitExport(Export* curr) {
- names.insert(curr->name);
-}
-
-Pass *createNameManagerPass() {
- return new NameManager();
-}
-
-} // namespace wasm