From bea3af3908752204aaab7684314ce65e68755911 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 18:44:51 +0000 Subject: [PATCH] class v5 shadow rule test: the synthetic rotate cases follow the census arm (two rotl by one amount merge, a rotl and a rotr do not, two rotr by one register merge) Co-Authored-By: Claude Fable 5.1 --- igneum-pow/src/generator.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/igneum-pow/src/generator.rs b/igneum-pow/src/generator.rs index ac4048d17..46955d6c0 100644 --- a/igneum-pow/src/generator.rs +++ b/igneum-pow/src/generator.rs @@ -2017,8 +2017,12 @@ mod tests { assert_eq!(shadow_removable_count(&pair), 1, "the known-failed case: an xor-cancel pair"); let broken = vec![mk(Op::Xor, 1, 2), mk(Op::Add, 2, 3), mk(Op::Xor, 1, 2)]; assert_eq!(shadow_removable_count(&broken), 0, "the source moved between the two"); - let rot = vec![mk(Op::Rotl, 4, 0), mk(Op::Rotr, 4, 5)]; - assert_eq!(shadow_removable_count(&rot), 1, "two rotates merge"); + let rot = vec![mk(Op::Rotl, 4, 0), mk(Op::Rotl, 4, 0)]; + assert_eq!(shadow_removable_count(&rot), 1, "two rotl by one amount merge"); + let mixed = vec![mk(Op::Rotl, 4, 0), mk(Op::Rotr, 4, 5)]; + assert_eq!(shadow_removable_count(&mixed), 0, "a rotl and a rotr are two sources: not the census's merge"); + let rotr = vec![mk(Op::Rotr, 4, 5), mk(Op::Rotr, 4, 5)]; + assert_eq!(shadow_removable_count(&rotr), 1, "two rotr by one register merge"); let sum = vec![mk(Op::Add, 6, 7), mk(Op::Sub, 6, 7)]; assert_eq!(shadow_removable_count(&sum), 1, "sum-cancel"); let mut bad = Vec::new();