diff --git a/crates/noirc_evaluator/src/ssa/acir_gen/acir_ir/generated_acir.rs b/crates/noirc_evaluator/src/ssa/acir_gen/acir_ir/generated_acir.rs index d2edd596503..f76afa031e0 100644 --- a/crates/noirc_evaluator/src/ssa/acir_gen/acir_ir/generated_acir.rs +++ b/crates/noirc_evaluator/src/ssa/acir_gen/acir_ir/generated_acir.rs @@ -491,12 +491,18 @@ impl GeneratedAcir { let (q_witness, r_witness) = self.brillig_quotient(lhs.clone(), rhs.clone(), predicate.clone(), max_bit_size + 1); - // Apply range constraints to injected witness values. - // Constrains `q` to be 0 <= q < 2^{q_max_bits}, etc. + // Constrain `q < 2^{max_q_bits}`. self.range_constraint(q_witness, max_q_bits)?; + + // Constrain `r < 2^{max_rhs_bits}`. + // + // If `rhs` is a power of 2, then is just a looser version of the following bound constraint. + // In the case where `rhs` isn't a power of 2 then this range constraint is required + // as the bound constraint creates a new witness. + // This opcode will be optimized out if it is redundant so we always add it for safety. self.range_constraint(r_witness, max_rhs_bits)?; - // Constrain r < rhs + // Constrain `r < rhs`. self.bound_constraint_with_offset(&r_witness.into(), rhs, predicate, max_rhs_bits)?; // a * predicate == (b * q + r) * predicate