From 2d8a9240101016fc3c2c5f5ae5d43b1a4f1de2a8 Mon Sep 17 00:00:00 2001 From: Kaya Gokalp Date: Tue, 12 Dec 2023 14:04:40 -0800 Subject: [PATCH] feat: implement o flags for disabling optimizations --- forc-pkg/src/manifest.rs | 3 ++ forc-pkg/src/pkg.rs | 3 +- sway-core/src/build_config.rs | 9 +++++ sway-core/src/lib.rs | 74 ++++++++++++++++++----------------- 4 files changed, 52 insertions(+), 37 deletions(-) diff --git a/forc-pkg/src/manifest.rs b/forc-pkg/src/manifest.rs index d4c35607a1d..c3876c30372 100644 --- a/forc-pkg/src/manifest.rs +++ b/forc-pkg/src/manifest.rs @@ -233,6 +233,7 @@ pub struct BuildProfile { #[serde(default)] pub error_on_warnings: bool, pub reverse_results: bool, + pub optimization_level: usize, } impl DependencyDetails { @@ -718,6 +719,7 @@ impl BuildProfile { json_abi_with_callpaths: false, error_on_warnings: false, reverse_results: false, + optimization_level: 0, } } @@ -736,6 +738,7 @@ impl BuildProfile { json_abi_with_callpaths: false, error_on_warnings: false, reverse_results: false, + optimization_level: 1, } } } diff --git a/forc-pkg/src/pkg.rs b/forc-pkg/src/pkg.rs index b8865133fa3..9923c733afc 100644 --- a/forc-pkg/src/pkg.rs +++ b/forc-pkg/src/pkg.rs @@ -1558,7 +1558,8 @@ pub fn sway_build_config( .print_ir(build_profile.print_ir) .include_tests(build_profile.include_tests) .time_phases(build_profile.time_phases) - .metrics(build_profile.metrics_outfile.clone()); + .metrics(build_profile.metrics_outfile.clone()) + .optimization_level(build_profile.optimization_level); Ok(build_config) } diff --git a/sway-core/src/build_config.rs b/sway-core/src/build_config.rs index 5dd49b661c5..373155dc79c 100644 --- a/sway-core/src/build_config.rs +++ b/sway-core/src/build_config.rs @@ -46,6 +46,7 @@ pub struct BuildConfig { pub(crate) print_finalized_asm: bool, pub(crate) print_ir: bool, pub(crate) include_tests: bool, + pub(crate) optimization_level: usize, pub time_phases: bool, pub metrics_outfile: Option, } @@ -92,6 +93,7 @@ impl BuildConfig { include_tests: false, time_phases: false, metrics_outfile: None, + optimization_level: 0, } } @@ -144,6 +146,13 @@ impl BuildConfig { } } + pub fn optimization_level(self, optimization_level: usize) -> Self { + Self { + optimization_level, + ..self + } + } + /// Whether or not to include test functions in parsing, type-checking and codegen. /// /// This should be set to `true` by invocations like `forc test` or `forc check --tests`. diff --git a/sway-core/src/lib.rs b/sway-core/src/lib.rs index d390800cd56..0487544fc9e 100644 --- a/sway-core/src/lib.rs +++ b/sway-core/src/lib.rs @@ -768,44 +768,46 @@ pub(crate) fn compile_ast_to_ir_to_asm( // Initialize the pass manager and register known passes. let mut pass_mgr = PassManager::default(); register_known_passes(&mut pass_mgr); - let mut pass_group = create_o1_pass_group(); - - // Target specific transforms should be moved into something more configured. - if build_config.build_target == BuildTarget::Fuel { - // FuelVM target specific transforms. - // - // Demote large by-value constants, arguments and return values to by-reference values - // using temporaries. - pass_group.append_pass(CONSTDEMOTION_NAME); - pass_group.append_pass(ARGDEMOTION_NAME); - pass_group.append_pass(RETDEMOTION_NAME); - pass_group.append_pass(MISCDEMOTION_NAME); - - // Convert loads and stores to mem_copys where possible. - pass_group.append_pass(MEMCPYOPT_NAME); - - // Run a DCE and simplify-cfg to clean up any obsolete instructions. - pass_group.append_pass(DCE_NAME); - pass_group.append_pass(SIMPLIFYCFG_NAME); - pass_group.append_pass(SROA_NAME); - pass_group.append_pass(MEM2REG_NAME); - pass_group.append_pass(DCE_NAME); - } + if build_config.optimization_level != 0 { + let mut pass_group = create_o1_pass_group(); + + // Target specific transforms should be moved into something more configured. + if build_config.build_target == BuildTarget::Fuel { + // FuelVM target specific transforms. + // + // Demote large by-value constants, arguments and return values to by-reference values + // using temporaries. + pass_group.append_pass(CONSTDEMOTION_NAME); + pass_group.append_pass(ARGDEMOTION_NAME); + pass_group.append_pass(RETDEMOTION_NAME); + pass_group.append_pass(MISCDEMOTION_NAME); + + // Convert loads and stores to mem_copys where possible. + pass_group.append_pass(MEMCPYOPT_NAME); + + // Run a DCE and simplify-cfg to clean up any obsolete instructions. + pass_group.append_pass(DCE_NAME); + pass_group.append_pass(SIMPLIFYCFG_NAME); + pass_group.append_pass(SROA_NAME); + pass_group.append_pass(MEM2REG_NAME); + pass_group.append_pass(DCE_NAME); + } - if build_config.print_ir { - pass_group.append_pass(MODULEPRINTER_NAME); - } + if build_config.print_ir { + pass_group.append_pass(MODULEPRINTER_NAME); + } - // Run the passes. - let res = if let Err(ir_error) = pass_mgr.run(&mut ir, &pass_group) { - Err(handler.emit_err(CompileError::InternalOwned( - ir_error.to_string(), - span::Span::dummy(), - ))) - } else { - Ok(()) - }; - res?; + // Run the passes. + let res = if let Err(ir_error) = pass_mgr.run(&mut ir, &pass_group) { + Err(handler.emit_err(CompileError::InternalOwned( + ir_error.to_string(), + span::Span::dummy(), + ))) + } else { + Ok(()) + }; + res?; + } let final_asm = compile_ir_to_asm(handler, &ir, Some(build_config))?;