pub mod arg_demotion;
pub use arg_demotion::*;
pub mod arg_mutability_tagger;
pub use arg_mutability_tagger::*;
pub mod const_demotion;
pub use const_demotion::*;
pub mod constants;
pub use constants::*;
pub mod conditional_constprop;
pub use conditional_constprop::*;
pub mod cse;
pub use cse::*;
pub mod dce;
pub use dce::*;
pub mod inline;
pub use inline::*;
pub mod mem2reg;
pub use mem2reg::*;
pub mod memcpyopt;
pub use memcpyopt::*;
pub mod misc_demotion;
pub use misc_demotion::*;
pub mod ret_demotion;
pub use ret_demotion::*;
pub mod simplify_cfg;
pub use simplify_cfg::*;
pub mod sroa;
pub use sroa::*;
pub mod fn_dedup;
pub use fn_dedup::*;
pub mod init_aggr_lowering;
pub use init_aggr_lowering::*;
mod target_fuel;
#[cfg(test)]
pub mod tests {
use crate::{Backtrace, PassGroup, PassManager};
use sway_features::ExperimentalFeatures;
use sway_types::SourceEngine;
pub(crate) fn assert_optimization<'a>(
passes: &[&'static str],
body: &str,
expected: Option<impl IntoIterator<Item = &'a str>>,
) {
let source_engine = SourceEngine::default();
let mut context = crate::parse(
&format!(
"script {{
{body}
}}
!0 = \"a.sw\"
"
),
&source_engine,
ExperimentalFeatures::default(),
Backtrace::default(),
)
.unwrap();
let mut pass_manager = PassManager::default();
crate::register_known_passes(&mut pass_manager);
let mut group = PassGroup::default();
for pass in passes {
group.append_pass(pass);
}
let before = context.to_string();
let modified = pass_manager.run(&mut context, &group).unwrap();
let after = context.to_string();
if std::env::args().any(|x| x == "--nocapture") {
println!("{}", prettydiff::diff_lines(&before, &after));
}
assert_eq!(expected.is_some(), modified);
let Some(expected) = expected else {
return;
};
let actual = context
.to_string()
.lines()
.filter_map(|x| {
if x.contains(", !") {
Some(format!("{}\n", x.trim()))
} else {
None
}
})
.collect::<Vec<String>>();
assert!(!actual.is_empty());
let mut expected_matches = actual.len();
for (actual, expected) in actual.iter().zip(expected) {
if !actual.contains(expected) {
panic!("Actual: {actual:?} does not contains expected: {expected:?}. (Run with --nocapture to see a diff)");
} else {
expected_matches -= 1;
}
}
assert_eq!(expected_matches, 0);
}
}