From e488da5adbef2613c08fe205db5b79b1765a4af3 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 28 Jun 2017 22:05:05 -0700 Subject: 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). --- src/passes/NameManager.cpp | 80 ---------------------------------------------- 1 file changed, 80 deletions(-) delete mode 100644 src/passes/NameManager.cpp (limited to 'src/passes/NameManager.cpp') 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 -#include - -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 -- cgit v1.2.3