diff --git a/cranelift/codegen/meta/src/shared/settings.rs b/cranelift/codegen/meta/src/shared/settings.rs index 7f41895411..0f344d25e9 100644 --- a/cranelift/codegen/meta/src/shared/settings.rs +++ b/cranelift/codegen/meta/src/shared/settings.rs @@ -31,6 +31,16 @@ pub(crate) fn define() -> SettingGroup { vec!["none", "speed", "speed_and_size"], ); + settings.add_bool( + "enable_alias_analysis", + "Do redundant-load optimizations with alias analysis.", + r#" + This enables the use of a simple alias analysis to optimize away redundant loads. + Only effective when `opt_level` is `speed` or `speed_and_size`. + "#, + true, + ); + settings.add_bool( "enable_verifier", "Run the Cranelift IR verifier at strategic times during compilation.", diff --git a/cranelift/codegen/src/context.rs b/cranelift/codegen/src/context.rs index c97cfd305d..9216de8d1d 100644 --- a/cranelift/codegen/src/context.rs +++ b/cranelift/codegen/src/context.rs @@ -163,7 +163,7 @@ impl Context { self.remove_constant_phis(isa)?; - if opt_level != OptLevel::None { + if opt_level != OptLevel::None && isa.flags().enable_alias_analysis() { self.replace_redundant_loads()?; self.simple_gvn(isa)?; } diff --git a/cranelift/codegen/src/settings.rs b/cranelift/codegen/src/settings.rs index 99bd8ec267..e21eceda27 100644 --- a/cranelift/codegen/src/settings.rs +++ b/cranelift/codegen/src/settings.rs @@ -516,6 +516,7 @@ libcall_call_conv = "isa_default" baldrdash_prologue_words = 0 probestack_size_log2 = 12 regalloc_checker = false +enable_alias_analysis = true enable_verifier = true is_pic = false use_colocated_libcalls = false diff --git a/crates/wasmtime/src/engine.rs b/crates/wasmtime/src/engine.rs index 299e0fea22..9dd637e714 100644 --- a/crates/wasmtime/src/engine.rs +++ b/crates/wasmtime/src/engine.rs @@ -384,6 +384,7 @@ impl Engine { | "machine_code_cfg_info" | "tls_model" // wasmtime doesn't use tls right now | "opt_level" // opt level doesn't change semantics + | "enable_alias_analysis" // alias analysis-based opts don't change semantics | "probestack_func_adjusts_sp" // probestack above asserted disabled | "probestack_size_log2" // probestack above asserted disabled | "regalloc" // shouldn't change semantics