Optimize generated code via the CLI by default (#973)

* Optimize generated code via the CLI by default

This commit updates the behavior of the CLI and adds a new flag. It
first enables the `--optimize` flag by default, ensuring that usage of
the `wasmtime` CLI will enable cranelift optimizations by default. Next
it also adds a `--opt-level` flag which is similar to Rust's
`-Copt-level` where it takes a string argument of how to optimize. This
is updates to support 0/1/2/s, where 1 is currently the same as 2 but
added for consistency with other compilers. The default setting is
`--opt-level=2`.

When the `-O` flag is not passed the `--opt-level` flag is used,
otherwise `-O` takes precedent in the sense that it implies
`--opt-level=2` which is the highest optimization level. The thinking is
that these flags will in general select the highest optimization level
specified as the final optimization level.

* Add inline docs

* fix a test
This commit is contained in:
Alex Crichton
2020-02-24 15:18:09 -06:00
committed by GitHub
parent 13523e6312
commit d4fcd32cdc
4 changed files with 43 additions and 9 deletions

View File

@@ -75,7 +75,7 @@ impl WasmToObjCommand {
self.target.as_ref(), self.target.as_ref(),
strategy, strategy,
self.common.enable_simd, self.common.enable_simd,
self.common.optimize, self.common.opt_level(),
self.common.debug_info, self.common.debug_info,
self.output.clone(), self.output.clone(),
&cache_config, &cache_config,

View File

@@ -132,9 +132,18 @@ struct CommonOptions {
#[structopt(long)] #[structopt(long)]
jitdump: bool, jitdump: bool,
/// Run optimization passes on translated functions /// Run optimization passes on translated functions, on by default
#[structopt(short = "O", long)] #[structopt(short = "O", long)]
optimize: bool, optimize: bool,
/// Optimization level for generated functions (0 (none), 1, 2 (most), or s
/// (size))
#[structopt(
long,
parse(try_from_str = parse_opt_level),
default_value = "2",
)]
opt_level: wasmtime::OptLevel,
} }
impl CommonOptions { impl CommonOptions {
@@ -148,11 +157,9 @@ impl CommonOptions {
.wasm_reference_types(self.enable_reference_types || self.enable_all) .wasm_reference_types(self.enable_reference_types || self.enable_all)
.wasm_multi_value(self.enable_multi_value || self.enable_all) .wasm_multi_value(self.enable_multi_value || self.enable_all)
.wasm_threads(self.enable_threads || self.enable_all) .wasm_threads(self.enable_threads || self.enable_all)
.cranelift_opt_level(self.opt_level())
.strategy(pick_compilation_strategy(self.cranelift, self.lightbeam)?)? .strategy(pick_compilation_strategy(self.cranelift, self.lightbeam)?)?
.profiler(pick_profiling_strategy(self.jitdump)?)?; .profiler(pick_profiling_strategy(self.jitdump)?)?;
if self.optimize {
config.cranelift_opt_level(wasmtime::OptLevel::Speed);
}
if !self.disable_cache { if !self.disable_cache {
match &self.config { match &self.config {
Some(path) => { Some(path) => {
@@ -165,4 +172,24 @@ impl CommonOptions {
} }
Ok(config) Ok(config)
} }
fn opt_level(&self) -> wasmtime::OptLevel {
match (self.optimize, self.opt_level.clone()) {
(true, _) => wasmtime::OptLevel::Speed,
(false, other) => other,
}
}
}
fn parse_opt_level(opt_level: &str) -> Result<wasmtime::OptLevel> {
match opt_level {
"s" => Ok(wasmtime::OptLevel::SpeedAndSize),
"0" => Ok(wasmtime::OptLevel::None),
"1" => Ok(wasmtime::OptLevel::Speed),
"2" => Ok(wasmtime::OptLevel::Speed),
other => bail!(
"unknown optimization level `{}`, only 0,1,2,s accepted",
other
),
}
} }

View File

@@ -19,7 +19,7 @@ pub fn compile_to_obj(
target: Option<&Triple>, target: Option<&Triple>,
strategy: Strategy, strategy: Strategy,
enable_simd: bool, enable_simd: bool,
optimize: bool, opt_level: wasmtime::OptLevel,
debug_info: bool, debug_info: bool,
artifact_name: String, artifact_name: String,
cache_config: &CacheConfig, cache_config: &CacheConfig,
@@ -38,8 +38,15 @@ pub fn compile_to_obj(
flag_builder.enable("enable_simd").unwrap(); flag_builder.enable("enable_simd").unwrap();
} }
if optimize { match opt_level {
flag_builder.set("opt_level", "speed").unwrap(); wasmtime::OptLevel::None => {}
wasmtime::OptLevel::Speed => {
flag_builder.set("opt_level", "speed").unwrap();
}
wasmtime::OptLevel::SpeedAndSize => {
flag_builder.set("opt_level", "speed_and_size").unwrap();
}
other => bail!("unknown optimization level {:?}", other),
} }
let isa = isa_builder.finish(settings::Flags::new(flag_builder)); let isa = isa_builder.finish(settings::Flags::new(flag_builder));

View File

@@ -16,7 +16,7 @@ pub fn compile_cranelift(
target.as_ref(), target.as_ref(),
Strategy::Cranelift, Strategy::Cranelift,
false, false,
false, wasmtime::OptLevel::None,
true, true,
output output
.as_ref() .as_ref()