From 6f7884838fc0fdab2a1864f0d701bccf79d3e359 Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Tue, 25 Feb 2025 12:20:40 +0000 Subject: [PATCH] feat: optimize out range checks on limiting cases (#7510) --- .../noirc_evaluator/src/ssa/ir/instruction.rs | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/src/ssa/ir/instruction.rs b/compiler/noirc_evaluator/src/ssa/ir/instruction.rs index edca7781968..63172d07d82 100644 --- a/compiler/noirc_evaluator/src/ssa/ir/instruction.rs +++ b/compiler/noirc_evaluator/src/ssa/ir/instruction.rs @@ -1036,7 +1036,7 @@ impl Instruction { Instruction::DecrementRc { .. } => None, Instruction::RangeCheck { value, max_bit_size, .. } => { let max_potential_bits = dfg.get_value_max_num_bits(*value); - if max_potential_bits < *max_bit_size { + if max_potential_bits <= *max_bit_size { Remove } else { None @@ -1472,3 +1472,32 @@ impl SimplifyResult { } } } + +#[cfg(test)] +mod tests { + use crate::ssa::{opt::assert_normalized_ssa_equals, ssa_gen::Ssa}; + + #[test] + fn removes_range_constraints_on_constants() { + let src = " + acir(inline) fn main f0 { + b0(v0: Field): + range_check Field 0 to 1 bits + range_check Field 1 to 1 bits + range_check Field 255 to 8 bits + range_check Field 256 to 8 bits + return + } + "; + let ssa = Ssa::from_str_simplifying(src).unwrap(); + + let expected = " + acir(inline) fn main f0 { + b0(v0: Field): + range_check Field 256 to 8 bits + return + } + "; + assert_normalized_ssa_equals(ssa, expected); + } +}