Reorganise optimisation level settings, and make the insn shrink pass optional (#1044)

This patch:

* removes the "default" opt level, on the basis that it has no definition and
  is referred to nowhere in the compiler.

* renames the "fastest" level to "none".  The resulting set of transformations
  is unchanged.

* renames the "best" level to "speed_and_size".  The resulting set of
  transformations is unchanged.

* adds a new level, "speed".  This is the same as "speed_and_size" except that
  it omits transformations aimed only at reducing code size.  Currently it
  omits only the insn shrinking pass.
This commit is contained in:
julian-seward1
2019-09-19 18:51:25 +02:00
committed by GitHub
parent 59139c6c46
commit 9e088e4164
27 changed files with 46 additions and 39 deletions

View File

@@ -132,18 +132,18 @@ impl Context {
self.verify_if(isa)?;
debug!("Compiling:\n{}", self.func.display(isa));
let opt_level = isa.flags().opt_level();
self.compute_cfg();
if isa.flags().opt_level() != OptLevel::Fastest {
if opt_level != OptLevel::None {
self.preopt(isa)?;
}
if isa.flags().enable_nan_canonicalization() {
self.canonicalize_nans(isa)?;
}
self.legalize(isa)?;
if isa.flags().opt_level() != OptLevel::Fastest {
if opt_level != OptLevel::None {
self.postopt(isa)?;
}
if isa.flags().opt_level() == OptLevel::Best {
self.compute_domtree();
self.compute_loop_analysis();
self.licm(isa)?;
@@ -151,13 +151,15 @@ impl Context {
}
self.compute_domtree();
self.eliminate_unreachable_code(isa)?;
if isa.flags().opt_level() != OptLevel::Fastest {
if opt_level != OptLevel::None {
self.dce(isa)?;
}
self.regalloc(isa)?;
self.prologue_epilogue(isa)?;
if isa.flags().opt_level() == OptLevel::Best {
if opt_level == OptLevel::Speed || opt_level == OptLevel::SpeedAndSize {
self.redundant_reload_remover(isa)?;
}
if opt_level == OptLevel::SpeedAndSize {
self.shrink_instructions(isa)?;
}
let result = self.relax_branches(isa);

View File

@@ -14,10 +14,10 @@
//! use cranelift_codegen::settings::{self, Configurable};
//!
//! let mut b = settings::builder();
//! b.set("opt_level", "fastest");
//! b.set("opt_level", "speed_and_size");
//!
//! let f = settings::Flags::new(b);
//! assert_eq!(f.opt_level(), settings::OptLevel::Fastest);
//! assert_eq!(f.opt_level(), settings::OptLevel::SpeedAndSize);
//! ```
use crate::constant_hash::{probe, simple_hash};
@@ -378,7 +378,7 @@ mod tests {
assert_eq!(
f.to_string(),
"[shared]\n\
opt_level = \"default\"\n\
opt_level = \"none\"\n\
libcall_call_conv = \"isa_default\"\n\
baldrdash_prologue_words = 0\n\
probestack_size_log2 = 12\n\
@@ -398,7 +398,7 @@ mod tests {
probestack_func_adjusts_sp = false\n\
jump_tables_enabled = true\n"
);
assert_eq!(f.opt_level(), super::OptLevel::Default);
assert_eq!(f.opt_level(), super::OptLevel::None);
assert_eq!(f.enable_simd(), false);
assert_eq!(f.baldrdash_prologue_words(), 0);
}
@@ -428,13 +428,15 @@ mod tests {
);
assert_eq!(
b.set("opt_level", "true"),
Err(BadValue("any among default, best, fastest".to_string()))
Err(BadValue(
"any among none, speed, speed_and_size".to_string()
))
);
assert_eq!(b.set("opt_level", "best"), Ok(()));
assert_eq!(b.set("opt_level", "speed"), Ok(()));
assert_eq!(b.set("enable_simd", "0"), Ok(()));
let f = Flags::new(b);
assert_eq!(f.enable_simd(), false);
assert_eq!(f.opt_level(), super::OptLevel::Best);
assert_eq!(f.opt_level(), super::OptLevel::Speed);
}
}