Skip to content

Commit f92c3f2

Browse files
authored
SROA: Do not generate GEPs when direct address is available (#7457)
Fixes #7433
1 parent 00b9d02 commit f92c3f2

File tree

26 files changed

+255
-110
lines changed

26 files changed

+255
-110
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,7 @@ jobs:
432432
run: |
433433
fuel-core run --db-type in-memory --debug &
434434
sleep 5 &&
435-
cargo run --locked --release --bin test -- --locked --release
435+
cargo run --locked --release --bin test -- --locked --release --verify-ir all
436436
437437
# TODO: Remove this upon merging std tests with the rest of the E2E tests.
438438
cargo-test-lib-std:

forc-pkg/src/manifest/build_profile.rs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use serde::{Deserialize, Serialize};
2-
use sway_core::{Backtrace, OptLevel, PrintAsm, PrintIr};
2+
use sway_core::{Backtrace, IrCli, OptLevel, PrintAsm};
33

44
use crate::DumpOpts;
55

@@ -15,7 +15,9 @@ pub struct BuildProfile {
1515
pub print_dca_graph_url_format: Option<String>,
1616
pub dump: DumpOpts,
1717
#[serde(default)]
18-
pub print_ir: PrintIr,
18+
pub print_ir: IrCli,
19+
#[serde(default)]
20+
pub verify_ir: IrCli,
1921
#[serde(default)]
2022
pub print_asm: PrintAsm,
2123
#[serde(default)]
@@ -54,7 +56,8 @@ impl BuildProfile {
5456
print_ast: false,
5557
print_dca_graph: None,
5658
print_dca_graph_url_format: None,
57-
print_ir: PrintIr::default(),
59+
print_ir: IrCli::default(),
60+
verify_ir: IrCli::default(),
5861
print_asm: PrintAsm::default(),
5962
print_bytecode: false,
6063
print_bytecode_spans: false,
@@ -77,7 +80,8 @@ impl BuildProfile {
7780
print_ast: false,
7881
print_dca_graph: None,
7982
print_dca_graph_url_format: None,
80-
print_ir: PrintIr::default(),
83+
print_ir: IrCli::default(),
84+
verify_ir: IrCli::default(),
8185
print_asm: PrintAsm::default(),
8286
print_bytecode: false,
8387
print_bytecode_spans: false,
@@ -107,7 +111,7 @@ impl Default for BuildProfile {
107111
#[cfg(test)]
108112
mod tests {
109113
use crate::{BuildProfile, DumpOpts, PackageManifest};
110-
use sway_core::{Backtrace, OptLevel, PrintAsm, PrintIr};
114+
use sway_core::{Backtrace, IrCli, OptLevel, PrintAsm};
111115

112116
#[test]
113117
fn test_build_profiles() {
@@ -132,7 +136,7 @@ mod tests {
132136
// Profile based on debug profile with adjusted IR printing options.
133137
let expected = BuildProfile {
134138
name: "".into(),
135-
print_ir: PrintIr {
139+
print_ir: IrCli {
136140
initial: true,
137141
r#final: false,
138142
modified_only: true,
@@ -163,7 +167,8 @@ mod tests {
163167
print_ast: true,
164168
print_dca_graph: Some("dca_graph".into()),
165169
print_dca_graph_url_format: Some("print_dca_graph_url_format".into()),
166-
print_ir: PrintIr::r#final(),
170+
print_ir: IrCli::r#final(),
171+
verify_ir: IrCli::none(),
167172
print_asm: PrintAsm::all(),
168173
print_bytecode: true,
169174
print_bytecode_spans: false,

forc-pkg/src/pkg.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ use sway_core::{
4747
write_dwarf, BuildTarget, Engines, FinalizedEntry, LspConfig,
4848
};
4949
use sway_core::{namespace::Package, Observer};
50-
use sway_core::{set_bytecode_configurables_offset, DbgGeneration, PrintAsm, PrintIr};
50+
use sway_core::{set_bytecode_configurables_offset, DbgGeneration, IrCli, PrintAsm};
5151
use sway_error::{error::CompileError, handler::Handler, warning::CompileWarning};
5252
use sway_features::ExperimentalFeatures;
5353
use sway_types::{Ident, ProgramId, Span, Spanned};
@@ -261,7 +261,7 @@ pub struct PrintOpts {
261261
/// Print the original source code together with bytecode.
262262
pub bytecode_spans: bool,
263263
/// Print the generated Sway IR (Intermediate Representation).
264-
pub ir: PrintIr,
264+
pub ir: IrCli,
265265
/// Output build errors and warnings in reverse order.
266266
pub reverse_order: bool,
267267
}
@@ -290,6 +290,7 @@ pub struct DumpOpts {
290290
pub struct BuildOpts {
291291
pub pkg: PkgOpts,
292292
pub print: PrintOpts,
293+
pub verify_ir: IrCli,
293294
pub minify: MinifyOpts,
294295
pub dump: DumpOpts,
295296
/// If set, generates a JSON file containing the hex-encoded script binary.
@@ -1581,6 +1582,7 @@ pub fn sway_build_config(
15811582
build_profile.print_bytecode_spans,
15821583
)
15831584
.with_print_ir(build_profile.print_ir.clone())
1585+
.with_verify_ir(build_profile.verify_ir.clone())
15841586
.with_include_tests(build_profile.include_tests)
15851587
.with_time_phases(build_profile.time_phases)
15861588
.with_profile(build_profile.profile)
@@ -2119,6 +2121,7 @@ fn build_profile_from_opts(
21192121
let BuildOpts {
21202122
pkg,
21212123
print,
2124+
verify_ir,
21222125
time_phases,
21232126
profile: profile_opt,
21242127
build_profile,
@@ -2158,6 +2161,7 @@ fn build_profile_from_opts(
21582161
.clone_from(&print.dca_graph_url_format);
21592162
}
21602163
profile.print_ir |= print.ir.clone();
2164+
profile.verify_ir |= verify_ir.clone();
21612165
profile.print_asm |= print.asm;
21622166
profile.print_bytecode |= print.bytecode;
21632167
profile.print_bytecode_spans |= print.bytecode_spans;

forc-plugins/forc-client/src/cmd/deploy.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::NodeTarget;
22
use clap::Parser;
3+
use forc::cli::shared::IrCliOpt;
34
pub use forc::cli::shared::{BuildOutput, Minify, Pkg, Print};
45
use forc_pkg::BuildProfile;
56
pub use forc_tx::{Gas, Maturity};
@@ -23,6 +24,8 @@ pub struct Command {
2324
pub minify: Minify,
2425
#[clap(flatten)]
2526
pub print: Print,
27+
#[arg(long, value_parser = clap::builder::PossibleValuesParser::new(IrCliOpt::cli_options()))]
28+
pub verify_ir: Option<Vec<String>>,
2629
#[clap(flatten)]
2730
pub gas: Gas,
2831
#[clap(flatten)]

forc-plugins/forc-client/src/cmd/run.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::NodeTarget;
22
use clap::Parser;
3+
use forc::cli::shared::IrCliOpt;
34
use fuel_crypto::SecretKey;
45

56
pub use super::submit::Network;
@@ -15,6 +16,8 @@ pub struct Command {
1516
pub pkg: Pkg,
1617
#[clap(flatten)]
1718
pub minify: Minify,
19+
#[arg(long, value_parser = clap::builder::PossibleValuesParser::new(IrCliOpt::cli_options()))]
20+
pub verify_ir: Option<Vec<String>>,
1821
#[clap(flatten)]
1922
pub print: Print,
2023
#[clap(flatten)]

forc-plugins/forc-client/src/op/deploy.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use crate::{
1212
},
1313
};
1414
use anyhow::{bail, Context, Result};
15+
use forc::cli::shared::IrCliOpt;
1516
use forc_pkg::{self as pkg, DumpOpts, PackageManifestFile};
1617
use forc_pkg::{manifest::GenericManifestFile, MemberFilter};
1718
use forc_tracing::{println_action_green, println_warning};
@@ -43,7 +44,7 @@ use std::{
4344
sync::Arc,
4445
time::Duration,
4546
};
46-
use sway_core::{asm_generation::ProgramABI, language::parsed::TreeType, BuildTarget};
47+
use sway_core::{asm_generation::ProgramABI, language::parsed::TreeType, BuildTarget, IrCli};
4748

4849
/// Default maximum contract size allowed for a single contract. If the target
4950
/// contract size is bigger than this amount, forc-deploy will automatically
@@ -848,6 +849,10 @@ fn build_opts_from_cmd(cmd: &cmd::Deploy, member_filter: pkg::MemberFilter) -> p
848849
ir: cmd.print.ir(),
849850
reverse_order: cmd.print.reverse_order,
850851
},
852+
verify_ir: cmd
853+
.verify_ir
854+
.as_ref()
855+
.map_or(IrCli::default(), |opts| IrCliOpt::from(opts).0),
851856
dump: DumpOpts::default(),
852857
time_phases: cmd.print.time_phases,
853858
profile: cmd.print.profile,

forc-plugins/forc-client/src/op/run/mod.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::{
88
},
99
};
1010
use anyhow::{anyhow, bail, Context, Result};
11+
use forc::cli::shared::IrCliOpt;
1112
use forc_pkg::{self as pkg, fuel_core_not_running, DumpOpts, PackageManifestFile};
1213
use forc_tracing::println_warning;
1314
use forc_util::tx_utils::format_log_receipts;
@@ -25,8 +26,8 @@ use fuels_accounts::{provider::Provider, Account, ViewOnlyAccount};
2526
use pkg::BuiltPackage;
2627
use std::time::Duration;
2728
use std::{path::PathBuf, str::FromStr};
28-
use sway_core::language::parsed::TreeType;
2929
use sway_core::BuildTarget;
30+
use sway_core::{language::parsed::TreeType, IrCli};
3031
use tokio::time::timeout;
3132
use tracing::info;
3233

@@ -320,6 +321,10 @@ fn build_opts_from_cmd(cmd: &cmd::Run) -> pkg::BuildOpts {
320321
ir: cmd.print.ir(),
321322
reverse_order: cmd.print.reverse_order,
322323
},
324+
verify_ir: cmd
325+
.verify_ir
326+
.as_ref()
327+
.map_or(IrCli::default(), |opts| IrCliOpt::from(opts).0),
323328
minify: pkg::MinifyOpts {
324329
json_abi: cmd.minify.json_abi,
325330
json_storage_slots: cmd.minify.json_storage_slots,

forc-test/src/lib.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use pkg::{Built, BuiltPackage};
1919
use rand::{Rng, SeedableRng};
2020
use rayon::prelude::*;
2121
use std::{collections::HashMap, fs, path::PathBuf, sync::Arc};
22-
use sway_core::BuildTarget;
22+
use sway_core::{BuildTarget, IrCli};
2323
use sway_types::Span;
2424
use tx::consensus_parameters::ConsensusParametersV1;
2525
use tx::{ConsensusParameters, ContractParameters, ScriptParameters, TxParameters};
@@ -136,6 +136,7 @@ pub enum PackageWithDeploymentToTest {
136136
pub struct TestOpts {
137137
pub pkg: pkg::PkgOpts,
138138
pub print: pkg::PrintOpts,
139+
pub verify_ir: IrCli,
139140
pub minify: pkg::MinifyOpts,
140141
/// If set, outputs a binary file representing the script bytes.
141142
pub binary_outfile: Option<String>,
@@ -454,6 +455,7 @@ impl From<TestOpts> for pkg::BuildOpts {
454455
pkg::BuildOpts {
455456
pkg: val.pkg,
456457
print: val.print,
458+
verify_ir: val.verify_ir,
457459
minify: val.minify,
458460
dump: DumpOpts::default(),
459461
binary_outfile: val.binary_outfile,
@@ -481,6 +483,7 @@ impl TestOpts {
481483
pkg::BuildOpts {
482484
pkg: self.pkg,
483485
print: self.print,
486+
verify_ir: self.verify_ir,
484487
minify: self.minify,
485488
dump: DumpOpts::default(),
486489
binary_outfile: self.binary_outfile,

forc/src/cli/commands/contract_id.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::{
2-
cli::shared::{BuildOutput, BuildProfile, Minify, Pkg, Print},
2+
cli::shared::{BuildOutput, BuildProfile, IrCliOpt, Minify, Pkg, Print},
33
ops::forc_contract_id,
44
};
55
use clap::Parser;
@@ -22,6 +22,8 @@ pub struct Command {
2222
pub minify: Minify,
2323
#[clap(flatten)]
2424
pub print: Print,
25+
#[arg(long, value_parser = clap::builder::PossibleValuesParser::new(IrCliOpt::cli_options()))]
26+
pub verify_ir: Option<Vec<String>>,
2527
#[clap(flatten)]
2628
pub build_output: BuildOutput,
2729
#[clap(flatten)]

forc/src/cli/commands/predicate_root.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use clap::Parser;
22
use forc_util::ForcResult;
33

44
pub use crate::cli::shared::{BuildOutput, BuildProfile, Minify, Pkg, Print};
5-
use crate::ops::forc_predicate_root;
5+
use crate::{cli::shared::IrCliOpt, ops::forc_predicate_root};
66

77
forc_util::cli_examples! {
88
crate::cli::Opt {
@@ -21,6 +21,8 @@ pub struct Command {
2121
pub minify: Minify,
2222
#[clap(flatten)]
2323
pub print: Print,
24+
#[arg(long, value_parser = clap::builder::PossibleValuesParser::new(IrCliOpt::cli_options()))]
25+
pub verify_ir: Option<Vec<String>>,
2426
#[clap(flatten)]
2527
pub build_output: BuildOutput,
2628
#[clap(flatten)]

0 commit comments

Comments
 (0)