diff --git a/compiler/noirc_evaluator/src/ssa/ir/instruction.rs b/compiler/noirc_evaluator/src/ssa/ir/instruction.rs index 6e25469f43c..27c060cb1b5 100644 --- a/compiler/noirc_evaluator/src/ssa/ir/instruction.rs +++ b/compiler/noirc_evaluator/src/ssa/ir/instruction.rs @@ -605,7 +605,7 @@ impl Instruction { BinaryOp::Div | BinaryOp::Mod => { // Div and Mod require a predicate if the RHS may be zero. dfg.get_numeric_constant(binary.rhs) - .map(|rhs| !rhs.is_zero()) + .map(|rhs| rhs.is_zero()) .unwrap_or(true) } BinaryOp::Add { unchecked: true } diff --git a/compiler/noirc_evaluator/src/ssa/opt/constant_folding.rs b/compiler/noirc_evaluator/src/ssa/opt/constant_folding.rs index fe2c0d35f73..05bd48b8830 100644 --- a/compiler/noirc_evaluator/src/ssa/opt/constant_folding.rs +++ b/compiler/noirc_evaluator/src/ssa/opt/constant_folding.rs @@ -1785,4 +1785,55 @@ mod test { let ssa = ssa.fold_constants(); assert_normalized_ssa_equals(ssa, src); } + + #[test] + fn does_not_deduplicate_unsigned_division_by_zero_constant() { + // Regression test for https://github.com/noir-lang/noir/issues/7283 + let src = " + acir(inline) fn main f0 { + b0(v0: u32, v1: u32, v2: u1): + enable_side_effects v2 + v4 = div v1, u32 0 + v5 = not v2 + enable_side_effects v5 + v6 = div v1, u32 0 + return + } + "; + + let ssa = Ssa::from_str(src).unwrap(); + let ssa = ssa.fold_constants(); + assert_normalized_ssa_equals(ssa, src); + } + + #[test] + fn does_duplicate_unsigned_division_by_non_zero_constant() { + // Regression test for https://github.com/noir-lang/noir/issues/7283 + let src = " + acir(inline) fn main f0 { + b0(v0: u32, v1: u32, v2: u1): + enable_side_effects v2 + v4 = div v1, u32 2 + v5 = not v2 + enable_side_effects v5 + v6 = div v1, u32 2 + return + } + "; + + let ssa = Ssa::from_str(src).unwrap(); + let ssa = ssa.fold_constants(); + + let expected = " + acir(inline) fn main f0 { + b0(v0: u32, v1: u32, v2: u1): + enable_side_effects v2 + v4 = div v1, u32 2 + v5 = not v2 + enable_side_effects v5 + return + } + "; + assert_normalized_ssa_equals(ssa, expected); + } }