diff options
Diffstat (limited to 'src/tools/optimization-options.h')
-rw-r--r-- | src/tools/optimization-options.h | 230 |
1 files changed, 135 insertions, 95 deletions
diff --git a/src/tools/optimization-options.h b/src/tools/optimization-options.h index cf7c612ea..6fa9aac36 100644 --- a/src/tools/optimization-options.h +++ b/src/tools/optimization-options.h @@ -14,6 +14,9 @@ * limitations under the License. */ +#ifndef wasm_tools_optimization_options_h +#define wasm_tools_optimization_options_h + #include "tool-options.h" // @@ -27,101 +30,137 @@ struct OptimizationOptions : public ToolOptions { std::vector<std::string> passes; - OptimizationOptions(const std::string& command, const std::string& description) : ToolOptions(command, description) { - (*this).add("", "-O", "execute default optimization passes", - Options::Arguments::Zero, - [this](Options*, const std::string&) { - passOptions.setDefaultOptimizationOptions(); - passes.push_back(DEFAULT_OPT_PASSES); - }) - .add("", "-O0", "execute no optimization passes", - Options::Arguments::Zero, - [this](Options*, const std::string&) { - passOptions.optimizeLevel = 0; - passOptions.shrinkLevel = 0; - }) - .add("", "-O1", "execute -O1 optimization passes (quick&useful opts, useful for iteration builds)", - Options::Arguments::Zero, - [this](Options*, const std::string&) { - passOptions.optimizeLevel = 1; - passOptions.shrinkLevel = 0; - passes.push_back(DEFAULT_OPT_PASSES); - }) - .add("", "-O2", "execute -O2 optimization passes (most opts, generally gets most perf)", - Options::Arguments::Zero, - [this](Options*, const std::string&) { - passOptions.optimizeLevel = 2; - passOptions.shrinkLevel = 0; - passes.push_back(DEFAULT_OPT_PASSES); - }) - .add("", "-O3", "execute -O3 optimization passes (spends potentially a lot of time optimizing)", - Options::Arguments::Zero, - [this](Options*, const std::string&) { - passOptions.optimizeLevel = 3; - passOptions.shrinkLevel = 0; - passes.push_back(DEFAULT_OPT_PASSES); - }) - .add("", "-O4", "execute -O4 optimization passes (also flatten the IR, which can take a lot more time and memory, but is useful on more nested / complex / less-optimized input)", - Options::Arguments::Zero, - [this](Options*, const std::string&) { - passOptions.optimizeLevel = 4; - passOptions.shrinkLevel = 0; - passes.push_back(DEFAULT_OPT_PASSES); - }) - .add("", "-Os", "execute default optimization passes, focusing on code size", - Options::Arguments::Zero, - [this](Options*, const std::string&) { - passOptions.optimizeLevel = 2; - passOptions.shrinkLevel = 1; - passes.push_back(DEFAULT_OPT_PASSES); - }) - .add("", "-Oz", "execute default optimization passes, super-focusing on code size", - Options::Arguments::Zero, - [this](Options*, const std::string&) { - passOptions.optimizeLevel = 2; - passOptions.shrinkLevel = 2; - passes.push_back(DEFAULT_OPT_PASSES); - }) - .add("--optimize-level", "-ol", "How much to focus on optimizing code", - Options::Arguments::One, - [this](Options* o, const std::string& argument) { - passOptions.optimizeLevel = atoi(argument.c_str()); - }) - .add("--shrink-level", "-s", "How much to focus on shrinking code size", - Options::Arguments::One, - [this](Options* o, const std::string& argument) { - passOptions.shrinkLevel = atoi(argument.c_str()); - }) - .add("--ignore-implicit-traps", "-iit", "Optimize under the helpful assumption that no surprising traps occur (from load, div/mod, etc.)", - Options::Arguments::Zero, - [this](Options*, const std::string&) { - passOptions.ignoreImplicitTraps = true; - }) - .add("--low-memory-unused", "-lmu", "Optimize under the helpful assumption that the low 1K of memory is not used by the application", - Options::Arguments::Zero, - [this](Options*, const std::string&) { - passOptions.lowMemoryUnused = true; - }) - .add("--pass-arg", "-pa", "An argument passed along to optimization passes being run. Must be in the form KEY:VALUE", - Options::Arguments::N, - [this](Options*, const std::string& argument) { - auto colon = argument.find(':'); - if (colon == std::string::npos) { - Fatal() << "--pass-arg value must be in the form of KEY:VALUE"; - } - auto key = argument.substr(0, colon); - auto value = argument.substr(colon + 1); - passOptions.arguments[key] = value; - }); + OptimizationOptions(const std::string& command, + const std::string& description) + : ToolOptions(command, description) { + (*this) + .add("", + "-O", + "execute default optimization passes", + Options::Arguments::Zero, + [this](Options*, const std::string&) { + passOptions.setDefaultOptimizationOptions(); + passes.push_back(DEFAULT_OPT_PASSES); + }) + .add("", + "-O0", + "execute no optimization passes", + Options::Arguments::Zero, + [this](Options*, const std::string&) { + passOptions.optimizeLevel = 0; + passOptions.shrinkLevel = 0; + }) + .add("", + "-O1", + "execute -O1 optimization passes (quick&useful opts, useful for " + "iteration builds)", + Options::Arguments::Zero, + [this](Options*, const std::string&) { + passOptions.optimizeLevel = 1; + passOptions.shrinkLevel = 0; + passes.push_back(DEFAULT_OPT_PASSES); + }) + .add( + "", + "-O2", + "execute -O2 optimization passes (most opts, generally gets most perf)", + Options::Arguments::Zero, + [this](Options*, const std::string&) { + passOptions.optimizeLevel = 2; + passOptions.shrinkLevel = 0; + passes.push_back(DEFAULT_OPT_PASSES); + }) + .add("", + "-O3", + "execute -O3 optimization passes (spends potentially a lot of time " + "optimizing)", + Options::Arguments::Zero, + [this](Options*, const std::string&) { + passOptions.optimizeLevel = 3; + passOptions.shrinkLevel = 0; + passes.push_back(DEFAULT_OPT_PASSES); + }) + .add("", + "-O4", + "execute -O4 optimization passes (also flatten the IR, which can " + "take a lot more time and memory, but is useful on more nested / " + "complex / less-optimized input)", + Options::Arguments::Zero, + [this](Options*, const std::string&) { + passOptions.optimizeLevel = 4; + passOptions.shrinkLevel = 0; + passes.push_back(DEFAULT_OPT_PASSES); + }) + .add("", + "-Os", + "execute default optimization passes, focusing on code size", + Options::Arguments::Zero, + [this](Options*, const std::string&) { + passOptions.optimizeLevel = 2; + passOptions.shrinkLevel = 1; + passes.push_back(DEFAULT_OPT_PASSES); + }) + .add("", + "-Oz", + "execute default optimization passes, super-focusing on code size", + Options::Arguments::Zero, + [this](Options*, const std::string&) { + passOptions.optimizeLevel = 2; + passOptions.shrinkLevel = 2; + passes.push_back(DEFAULT_OPT_PASSES); + }) + .add("--optimize-level", + "-ol", + "How much to focus on optimizing code", + Options::Arguments::One, + [this](Options* o, const std::string& argument) { + passOptions.optimizeLevel = atoi(argument.c_str()); + }) + .add("--shrink-level", + "-s", + "How much to focus on shrinking code size", + Options::Arguments::One, + [this](Options* o, const std::string& argument) { + passOptions.shrinkLevel = atoi(argument.c_str()); + }) + .add("--ignore-implicit-traps", + "-iit", + "Optimize under the helpful assumption that no surprising traps " + "occur (from load, div/mod, etc.)", + Options::Arguments::Zero, + [this](Options*, const std::string&) { + passOptions.ignoreImplicitTraps = true; + }) + .add("--low-memory-unused", + "-lmu", + "Optimize under the helpful assumption that the low 1K of memory is " + "not used by the application", + Options::Arguments::Zero, + [this](Options*, const std::string&) { + passOptions.lowMemoryUnused = true; + }) + .add("--pass-arg", + "-pa", + "An argument passed along to optimization passes being run. Must be " + "in the form KEY:VALUE", + Options::Arguments::N, + [this](Options*, const std::string& argument) { + auto colon = argument.find(':'); + if (colon == std::string::npos) { + Fatal() << "--pass-arg value must be in the form of KEY:VALUE"; + } + auto key = argument.substr(0, colon); + auto value = argument.substr(colon + 1); + passOptions.arguments[key] = value; + }); // add passes in registry for (const auto& p : PassRegistry::get()->getRegisteredNames()) { (*this).add( - std::string("--") + p, "", PassRegistry::get()->getPassDescription(p), + std::string("--") + p, + "", + PassRegistry::get()->getPassDescription(p), Options::Arguments::Zero, - [this, p](Options*, const std::string&) { - passes.push_back(p); - } - ); + [this, p](Options*, const std::string&) { passes.push_back(p); }); } } @@ -134,13 +173,12 @@ struct OptimizationOptions : public ToolOptions { return false; } - bool runningPasses() { - return passes.size() > 0; - } + bool runningPasses() { return passes.size() > 0; } void runPasses(Module& wasm) { PassRunner passRunner(&wasm, passOptions); - if (debug) passRunner.setDebug(true); + if (debug) + passRunner.setDebug(true); for (auto& pass : passes) { if (pass == DEFAULT_OPT_PASSES) { passRunner.addDefaultOptimizationPasses(); @@ -153,3 +191,5 @@ struct OptimizationOptions : public ToolOptions { }; } // namespace wasm + +#endif |