diff --git a/cranelift/codegen/meta/src/shared/settings.rs b/cranelift/codegen/meta/src/shared/settings.rs index 63c5d3c01a..43fe357ab7 100644 --- a/cranelift/codegen/meta/src/shared/settings.rs +++ b/cranelift/codegen/meta/src/shared/settings.rs @@ -8,11 +8,12 @@ pub fn define() -> SettingGroup { r#" Optimization level: - - default: Very profitable optimizations enabled, none slow. - - best: Enable all optimizations - - fastest: Optimize for compile time by disabling most optimizations. + - none: Minimise compile time by disabling most optimizations. + - speed: Generate the fastest possible code + - speed_and_size: like "speed", but also perform transformations + aimed at reducing code size. "#, - vec!["default", "best", "fastest"], + vec!["none", "speed", "speed_and_size"], ); settings.add_bool( diff --git a/cranelift/codegen/src/context.rs b/cranelift/codegen/src/context.rs index 0f4e9ad420..8bbe2893de 100644 --- a/cranelift/codegen/src/context.rs +++ b/cranelift/codegen/src/context.rs @@ -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); diff --git a/cranelift/codegen/src/settings.rs b/cranelift/codegen/src/settings.rs index 99d3647cbd..c310972170 100644 --- a/cranelift/codegen/src/settings.rs +++ b/cranelift/codegen/src/settings.rs @@ -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); } } diff --git a/cranelift/filetests/filetests/isa/x86/allones_funcaddrs32.clif b/cranelift/filetests/filetests/isa/x86/allones_funcaddrs32.clif index b6d7542fc3..5a6a5b9708 100644 --- a/cranelift/filetests/filetests/isa/x86/allones_funcaddrs32.clif +++ b/cranelift/filetests/filetests/isa/x86/allones_funcaddrs32.clif @@ -1,6 +1,6 @@ ; binary emission of 32-bit code. test binemit -set opt_level=best +set opt_level=speed_and_size set allones_funcaddrs target i686 haswell diff --git a/cranelift/filetests/filetests/isa/x86/allones_funcaddrs64.clif b/cranelift/filetests/filetests/isa/x86/allones_funcaddrs64.clif index 06ab24ed80..617db5a445 100644 --- a/cranelift/filetests/filetests/isa/x86/allones_funcaddrs64.clif +++ b/cranelift/filetests/filetests/isa/x86/allones_funcaddrs64.clif @@ -1,6 +1,6 @@ ; binary emission of 64-bit code. test binemit -set opt_level=best +set opt_level=speed_and_size set allones_funcaddrs target x86_64 haswell diff --git a/cranelift/filetests/filetests/isa/x86/baseline_clz_ctz_popcount_encoding.clif b/cranelift/filetests/filetests/isa/x86/baseline_clz_ctz_popcount_encoding.clif index b2a0c9617f..31c4016dc0 100644 --- a/cranelift/filetests/filetests/isa/x86/baseline_clz_ctz_popcount_encoding.clif +++ b/cranelift/filetests/filetests/isa/x86/baseline_clz_ctz_popcount_encoding.clif @@ -1,5 +1,5 @@ test binemit -set opt_level=best +set opt_level=speed_and_size target x86_64 baseline ; The binary encodings can be verified with the command: diff --git a/cranelift/filetests/filetests/isa/x86/binary32.clif b/cranelift/filetests/filetests/isa/x86/binary32.clif index aa50cf5335..cc8f638014 100644 --- a/cranelift/filetests/filetests/isa/x86/binary32.clif +++ b/cranelift/filetests/filetests/isa/x86/binary32.clif @@ -1,6 +1,6 @@ ; binary emission of x86-32 code. test binemit -set opt_level=best +set opt_level=speed_and_size target i686 haswell ; The binary encodings can be verified with the command: diff --git a/cranelift/filetests/filetests/isa/x86/binary64-float.clif b/cranelift/filetests/filetests/isa/x86/binary64-float.clif index 831079070d..171a3db7c9 100644 --- a/cranelift/filetests/filetests/isa/x86/binary64-float.clif +++ b/cranelift/filetests/filetests/isa/x86/binary64-float.clif @@ -1,6 +1,6 @@ ; Binary emission of 64-bit floating point code. test binemit -set opt_level=best +set opt_level=speed_and_size target x86_64 haswell ; The binary encodings can be verified with the command: diff --git a/cranelift/filetests/filetests/isa/x86/binary64-pic.clif b/cranelift/filetests/filetests/isa/x86/binary64-pic.clif index adda09da70..3f3d86288c 100644 --- a/cranelift/filetests/filetests/isa/x86/binary64-pic.clif +++ b/cranelift/filetests/filetests/isa/x86/binary64-pic.clif @@ -1,6 +1,6 @@ ; binary emission of 64-bit code. test binemit -set opt_level=best +set opt_level=speed_and_size set is_pic target x86_64 haswell diff --git a/cranelift/filetests/filetests/isa/x86/binary64.clif b/cranelift/filetests/filetests/isa/x86/binary64.clif index 9b1f86beff..0430cd78a5 100644 --- a/cranelift/filetests/filetests/isa/x86/binary64.clif +++ b/cranelift/filetests/filetests/isa/x86/binary64.clif @@ -1,6 +1,6 @@ ; binary emission of x86-64 code. test binemit -set opt_level=best +set opt_level=speed_and_size target x86_64 haswell ; The binary encodings can be verified with the command: diff --git a/cranelift/filetests/filetests/isa/x86/isub_imm-i8.clif b/cranelift/filetests/filetests/isa/x86/isub_imm-i8.clif index 1ca70ebbbe..35698c9abc 100644 --- a/cranelift/filetests/filetests/isa/x86/isub_imm-i8.clif +++ b/cranelift/filetests/filetests/isa/x86/isub_imm-i8.clif @@ -1,4 +1,5 @@ test compile +set opt_level=speed_and_size target x86_64 function u0:0(i8) -> i8 fast { diff --git a/cranelift/filetests/filetests/isa/x86/legalize-br-table.clif b/cranelift/filetests/filetests/isa/x86/legalize-br-table.clif index 63c24b0240..51ab2d08d5 100644 --- a/cranelift/filetests/filetests/isa/x86/legalize-br-table.clif +++ b/cranelift/filetests/filetests/isa/x86/legalize-br-table.clif @@ -1,4 +1,5 @@ test compile +set opt_level=speed_and_size target x86_64 feature !"basic-blocks" ; regex: V=v\d+ diff --git a/cranelift/filetests/filetests/isa/x86/legalize-call.clif b/cranelift/filetests/filetests/isa/x86/legalize-call.clif index b66e7e3a53..240b075374 100644 --- a/cranelift/filetests/filetests/isa/x86/legalize-call.clif +++ b/cranelift/filetests/filetests/isa/x86/legalize-call.clif @@ -1,6 +1,6 @@ ; Test legalization of a non-colocated call in 64-bit non-PIC mode. test legalizer -set opt_level=best +set opt_level=speed_and_size target x86_64 haswell function %call() { diff --git a/cranelift/filetests/filetests/isa/x86/optimized-zero-constants-32bit.clif b/cranelift/filetests/filetests/isa/x86/optimized-zero-constants-32bit.clif index 21f936c4b9..7dbbcc86e0 100644 --- a/cranelift/filetests/filetests/isa/x86/optimized-zero-constants-32bit.clif +++ b/cranelift/filetests/filetests/isa/x86/optimized-zero-constants-32bit.clif @@ -1,6 +1,6 @@ ; Check that floating-point and integer constants equal to zero are optimized correctly. test binemit -set opt_level=best +set opt_level=speed_and_size target i686 function %foo() -> f32 fast { diff --git a/cranelift/filetests/filetests/isa/x86/optimized-zero-constants.clif b/cranelift/filetests/filetests/isa/x86/optimized-zero-constants.clif index 4a1ad00ff4..807466e84c 100644 --- a/cranelift/filetests/filetests/isa/x86/optimized-zero-constants.clif +++ b/cranelift/filetests/filetests/isa/x86/optimized-zero-constants.clif @@ -1,6 +1,6 @@ ; Check that floating-point constants equal to zero are optimized correctly. test binemit -set opt_level=best +set opt_level=speed_and_size target x86_64 function %zero_const_32bit_no_rex() -> f32 fast { diff --git a/cranelift/filetests/filetests/isa/x86/pinned-reg.clif b/cranelift/filetests/filetests/isa/x86/pinned-reg.clif index b8a16d4eb4..2a447a6d9d 100644 --- a/cranelift/filetests/filetests/isa/x86/pinned-reg.clif +++ b/cranelift/filetests/filetests/isa/x86/pinned-reg.clif @@ -2,7 +2,7 @@ test compile set enable_pinned_reg=true set use_pinned_reg_as_heap_base=true -set opt_level=best +set opt_level=speed_and_size target x86_64 diff --git a/cranelift/filetests/filetests/isa/x86/prologue-epilogue.clif b/cranelift/filetests/filetests/isa/x86/prologue-epilogue.clif index ec67358804..f2fd3c68ee 100644 --- a/cranelift/filetests/filetests/isa/x86/prologue-epilogue.clif +++ b/cranelift/filetests/filetests/isa/x86/prologue-epilogue.clif @@ -1,5 +1,5 @@ test compile -set opt_level=best +set opt_level=speed_and_size set is_pic target x86_64 haswell diff --git a/cranelift/filetests/filetests/isa/x86/relax_branch.clif b/cranelift/filetests/filetests/isa/x86/relax_branch.clif index 7b86aef0e0..15c7e876a3 100644 --- a/cranelift/filetests/filetests/isa/x86/relax_branch.clif +++ b/cranelift/filetests/filetests/isa/x86/relax_branch.clif @@ -1,5 +1,5 @@ test binemit -set opt_level=best +set opt_level=speed_and_size set avoid_div_traps set baldrdash_prologue_words=3 set allones_funcaddrs diff --git a/cranelift/filetests/filetests/isa/x86/scalar_to_vector-binemit.clif b/cranelift/filetests/filetests/isa/x86/scalar_to_vector-binemit.clif index b26f3d2e6b..149d54b03f 100644 --- a/cranelift/filetests/filetests/isa/x86/scalar_to_vector-binemit.clif +++ b/cranelift/filetests/filetests/isa/x86/scalar_to_vector-binemit.clif @@ -1,5 +1,5 @@ test binemit -set opt_level=best +set opt_level=speed_and_size set enable_simd target x86_64 diff --git a/cranelift/filetests/filetests/isa/x86/scalar_to_vector-compile.clif b/cranelift/filetests/filetests/isa/x86/scalar_to_vector-compile.clif index 2d2ab331f7..6db3d12f40 100644 --- a/cranelift/filetests/filetests/isa/x86/scalar_to_vector-compile.clif +++ b/cranelift/filetests/filetests/isa/x86/scalar_to_vector-compile.clif @@ -1,5 +1,5 @@ test compile -set opt_level=best +set opt_level=speed_and_size set probestack_enabled=false set enable_simd target x86_64 diff --git a/cranelift/filetests/filetests/isa/x86/shrink-multiple-uses.clif b/cranelift/filetests/filetests/isa/x86/shrink-multiple-uses.clif index c0a34f2ecc..358d098a6a 100644 --- a/cranelift/filetests/filetests/isa/x86/shrink-multiple-uses.clif +++ b/cranelift/filetests/filetests/isa/x86/shrink-multiple-uses.clif @@ -1,5 +1,5 @@ test shrink -set opt_level=best +set opt_level=speed_and_size target x86_64 function %test_multiple_uses(i32 [%rdi]) -> i32 { diff --git a/cranelift/filetests/filetests/isa/x86/shrink.clif b/cranelift/filetests/filetests/isa/x86/shrink.clif index f0d78af226..b0d3174ece 100644 --- a/cranelift/filetests/filetests/isa/x86/shrink.clif +++ b/cranelift/filetests/filetests/isa/x86/shrink.clif @@ -1,5 +1,5 @@ test binemit -set opt_level=best +set opt_level=speed_and_size target x86_64 ; Test that instruction shrinking eliminates REX prefixes when possible. diff --git a/cranelift/filetests/filetests/isa/x86/stack-addr64.clif b/cranelift/filetests/filetests/isa/x86/stack-addr64.clif index a333f2cd5d..c80d190907 100644 --- a/cranelift/filetests/filetests/isa/x86/stack-addr64.clif +++ b/cranelift/filetests/filetests/isa/x86/stack-addr64.clif @@ -1,6 +1,6 @@ ; binary emission of stack address instructions on x86-64. test binemit -set opt_level=fastest +set opt_level=none target x86_64 haswell ; The binary encodings can be verified with the command: diff --git a/cranelift/filetests/filetests/isa/x86/stack-load-store64.clif b/cranelift/filetests/filetests/isa/x86/stack-load-store64.clif index c1854e623a..3c0e2c8c0e 100644 --- a/cranelift/filetests/filetests/isa/x86/stack-load-store64.clif +++ b/cranelift/filetests/filetests/isa/x86/stack-load-store64.clif @@ -1,6 +1,6 @@ ; legalization of stack load and store instructions on x86-64. test legalizer -set opt_level=fastest +set opt_level=none target x86_64 haswell function %stack_load_and_store() { diff --git a/cranelift/filetests/filetests/isa/x86/vconst-binemit.clif b/cranelift/filetests/filetests/isa/x86/vconst-binemit.clif index f7b9ce4627..b07dc0fd4e 100644 --- a/cranelift/filetests/filetests/isa/x86/vconst-binemit.clif +++ b/cranelift/filetests/filetests/isa/x86/vconst-binemit.clif @@ -1,5 +1,5 @@ test binemit -set opt_level=best +set opt_level=speed_and_size set enable_simd target x86_64 diff --git a/cranelift/filetests/filetests/isa/x86/windows_fastcall_x64.clif b/cranelift/filetests/filetests/isa/x86/windows_fastcall_x64.clif index 14b46e579f..a621abfe9f 100644 --- a/cranelift/filetests/filetests/isa/x86/windows_fastcall_x64.clif +++ b/cranelift/filetests/filetests/isa/x86/windows_fastcall_x64.clif @@ -1,5 +1,5 @@ test compile -set opt_level=best +set opt_level=speed_and_size set is_pic target x86_64 haswell diff --git a/cranelift/filetests/src/test_binemit.rs b/cranelift/filetests/src/test_binemit.rs index 75bd86008f..b291f61446 100644 --- a/cranelift/filetests/src/test_binemit.rs +++ b/cranelift/filetests/src/test_binemit.rs @@ -162,7 +162,7 @@ impl SubTest for TestBinEmit { recipe_constraints.satisfied(inst, &divert, &func) }); - if opt_level == OptLevel::Best { + if opt_level == OptLevel::SpeedAndSize { // Get the smallest legal encoding legal_encodings .min_by_key(|&e| encinfo.byte_size(e, inst, &divert, &func))