Skip to content

Commit 5928201

Browse files
authored
Add mutations to remove local usage (#1402)
* Add rewrite rule to `wasm-mutate` to remove `local.set` * Add rules for `wasm-mutate` to remove `local.tee` * Add tests locals can be removed
1 parent 97b226f commit 5928201

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

crates/wasm-mutate/src/mutators/peephole.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1586,6 +1586,24 @@ mod tests {
15861586
);
15871587
}
15881588

1589+
#[test]
1590+
fn remove_local_set() {
1591+
test_default_peephole_mutator(
1592+
"(module (func (local i32) (local.set 0 (i32.const 0))))",
1593+
"(module (func (local i32) nop))",
1594+
4,
1595+
);
1596+
}
1597+
1598+
#[test]
1599+
fn remove_local_tee() {
1600+
test_default_peephole_mutator(
1601+
"(module (func (local i32) (local.tee 0 (i32.const 0)) drop))",
1602+
"(module (func (local i32) (i32.const 0) drop))",
1603+
4,
1604+
);
1605+
}
1606+
15891607
fn test_peephole_mutator(
15901608
original: &str,
15911609
rules: &[Rewrite<super::Lang, PeepholeMutationAnalysis>],
@@ -1599,4 +1617,17 @@ mod tests {
15991617
let mutator = PeepholeMutator::new_with_rules(3, rules.to_vec());
16001618
config.match_mutation(original, mutator, expected);
16011619
}
1620+
1621+
fn test_default_peephole_mutator(original: &str, expected: &str, seed: u64) {
1622+
let original_wasm = wat::parse_str(original).unwrap();
1623+
let mut config = WasmMutate::default();
1624+
config.fuel(10000);
1625+
config.seed(seed);
1626+
config.info = Some(ModuleInfo::new(&original_wasm).unwrap());
1627+
1628+
let mut mutator = PeepholeMutator::new(3);
1629+
let rules = mutator.get_rules(&config);
1630+
mutator.rules = Some(rules);
1631+
config.match_mutation(original, mutator, expected);
1632+
}
16021633
}

crates/wasm-mutate/src/mutators/peephole/rules.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,16 @@ impl PeepholeMutator {
594594
if self.is_type("?x", PrimitiveTypeInfo::I64)
595595
);
596596
}
597+
598+
for i in 0..20 {
599+
let name = format!("remove-local.set{i}");
600+
let lhs = format!("(local.set.{i} ?x)");
601+
self.add_rewrite(&mut rules, &name, &lhs, "nop", &[]);
602+
603+
let name = format!("remove-local.tee{i}");
604+
let lhs = format!("(local.tee.{i} ?x)");
605+
self.add_rewrite(&mut rules, &name, &lhs, "?x", &[]);
606+
}
597607
}
598608

599609
rules

0 commit comments

Comments
 (0)