From e2b0e2de687c6527cf4660374fe043d87082207d Mon Sep 17 00:00:00 2001 From: vezenovm Date: Wed, 16 Aug 2023 21:05:07 +0000 Subject: [PATCH 1/4] fix brillig radix instruction vector size --- crates/noirc_evaluator/src/brillig/brillig_ir.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/noirc_evaluator/src/brillig/brillig_ir.rs b/crates/noirc_evaluator/src/brillig/brillig_ir.rs index 047e8b7edf8..0423826a148 100644 --- a/crates/noirc_evaluator/src/brillig/brillig_ir.rs +++ b/crates/noirc_evaluator/src/brillig/brillig_ir.rs @@ -858,7 +858,11 @@ impl BrilligContext { limb_count: RegisterIndex, big_endian: bool, ) { + let loop_iter_count = self.allocate_register(); + self.mov_instruction(loop_iter_count, limb_count); self.mov_instruction(target_vector.size, limb_count); + // The full array that is returned is going to be the limb count + 1 + self.usize_op_in_place(target_vector.size, BinaryIntOp::Add, 1usize); self.allocate_array_instruction(target_vector.pointer, target_vector.size); let shifted_register = self.allocate_register(); @@ -866,7 +870,7 @@ impl BrilligContext { let modulus_register: RegisterIndex = self.allocate_register(); - self.loop_instruction(target_vector.size, |ctx, iterator_register| { + self.loop_instruction(loop_iter_count, |ctx, iterator_register| { // Compute the modulus ctx.modulo_instruction( modulus_register, From 400abc7d1ad96b145a5d6b322956c9d1d8edd221 Mon Sep 17 00:00:00 2001 From: vezenovm Date: Thu, 17 Aug 2023 02:22:29 +0000 Subject: [PATCH 2/4] fix for little endian vs big endian --- crates/noirc_evaluator/src/brillig/brillig_ir.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/noirc_evaluator/src/brillig/brillig_ir.rs b/crates/noirc_evaluator/src/brillig/brillig_ir.rs index 0423826a148..d2f1005f4f8 100644 --- a/crates/noirc_evaluator/src/brillig/brillig_ir.rs +++ b/crates/noirc_evaluator/src/brillig/brillig_ir.rs @@ -858,11 +858,11 @@ impl BrilligContext { limb_count: RegisterIndex, big_endian: bool, ) { - let loop_iter_count = self.allocate_register(); - self.mov_instruction(loop_iter_count, limb_count); self.mov_instruction(target_vector.size, limb_count); // The full array that is returned is going to be the limb count + 1 - self.usize_op_in_place(target_vector.size, BinaryIntOp::Add, 1usize); + if !big_endian { + self.usize_op_in_place(target_vector.size, BinaryIntOp::Add, 1usize); + } self.allocate_array_instruction(target_vector.pointer, target_vector.size); let shifted_register = self.allocate_register(); @@ -870,7 +870,7 @@ impl BrilligContext { let modulus_register: RegisterIndex = self.allocate_register(); - self.loop_instruction(loop_iter_count, |ctx, iterator_register| { + self.loop_instruction(target_vector.size, |ctx, iterator_register| { // Compute the modulus ctx.modulo_instruction( modulus_register, From 7eb36bf2dfcd7431c6262946f33320ba67a65efc Mon Sep 17 00:00:00 2001 From: vezenovm Date: Thu, 17 Aug 2023 13:46:53 +0000 Subject: [PATCH 3/4] remove padding for to_radix --- crates/noirc_evaluator/src/brillig/brillig_ir.rs | 4 ---- .../src/ssa/acir_gen/acir_ir/acir_variable.rs | 10 ---------- 2 files changed, 14 deletions(-) diff --git a/crates/noirc_evaluator/src/brillig/brillig_ir.rs b/crates/noirc_evaluator/src/brillig/brillig_ir.rs index d2f1005f4f8..047e8b7edf8 100644 --- a/crates/noirc_evaluator/src/brillig/brillig_ir.rs +++ b/crates/noirc_evaluator/src/brillig/brillig_ir.rs @@ -859,10 +859,6 @@ impl BrilligContext { big_endian: bool, ) { self.mov_instruction(target_vector.size, limb_count); - // The full array that is returned is going to be the limb count + 1 - if !big_endian { - self.usize_op_in_place(target_vector.size, BinaryIntOp::Add, 1usize); - } self.allocate_array_instruction(target_vector.pointer, target_vector.size); let shifted_register = self.allocate_register(); diff --git a/crates/noirc_evaluator/src/ssa/acir_gen/acir_ir/acir_variable.rs b/crates/noirc_evaluator/src/ssa/acir_gen/acir_ir/acir_variable.rs index 382d12e7c74..5d900a4598a 100644 --- a/crates/noirc_evaluator/src/ssa/acir_gen/acir_ir/acir_variable.rs +++ b/crates/noirc_evaluator/src/ssa/acir_gen/acir_ir/acir_variable.rs @@ -780,16 +780,6 @@ impl AcirContext { limb_vars.reverse(); } - // For legacy reasons (see #617) the to_radix interface supports 256 bits even though - // FieldElement::max_num_bits() is only 254 bits. Any limbs beyond the specified count - // become zero padding. - let max_decomposable_bits: u32 = 256; - let limb_count_with_padding = max_decomposable_bits / bit_size; - let zero = self.add_constant(FieldElement::zero()); - while limb_vars.len() < limb_count_with_padding as usize { - limb_vars.push(AcirValue::Var(zero, result_element_type.clone())); - } - Ok(vec![AcirValue::Array(limb_vars.into())]) } From 69f9353ed045b76896184e1f87c3b345e5221c21 Mon Sep 17 00:00:00 2001 From: vezenovm Date: Thu, 17 Aug 2023 14:02:24 +0000 Subject: [PATCH 4/4] update to_le_bytes tests --- .../brillig_to_le_bytes/src/main.nr | 15 +++++++-------- .../execution_success/to_le_bytes/src/main.nr | 15 +++++++-------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/crates/nargo_cli/tests/execution_success/brillig_to_le_bytes/src/main.nr b/crates/nargo_cli/tests/execution_success/brillig_to_le_bytes/src/main.nr index 3afa65d9eff..8817f9c4c0d 100644 --- a/crates/nargo_cli/tests/execution_success/brillig_to_le_bytes/src/main.nr +++ b/crates/nargo_cli/tests/execution_success/brillig_to_le_bytes/src/main.nr @@ -1,14 +1,13 @@ use dep::std; -unconstrained fn main(x : Field) -> pub [u8; 4] { +unconstrained fn main(x : Field) -> pub [u8; 31] { // The result of this byte array will be little-endian let byte_array = x.to_le_bytes(31); - let mut first_four_bytes = [0; 4]; - for i in 0..4 { - first_four_bytes[i] = byte_array[i]; + assert(byte_array.len() == 31); + + let mut bytes = [0; 31]; + for i in 0..31 { + bytes[i] = byte_array[i]; } - // Issue #617 fix - // We were incorrectly mapping our output array from bit decomposition functions during acir generation - first_four_bytes[3] = byte_array[31]; - first_four_bytes + bytes } diff --git a/crates/nargo_cli/tests/execution_success/to_le_bytes/src/main.nr b/crates/nargo_cli/tests/execution_success/to_le_bytes/src/main.nr index a5476ec13bf..afa665923bf 100644 --- a/crates/nargo_cli/tests/execution_success/to_le_bytes/src/main.nr +++ b/crates/nargo_cli/tests/execution_success/to_le_bytes/src/main.nr @@ -1,14 +1,13 @@ use dep::std; -fn main(x : Field) -> pub [u8; 4] { +fn main(x : Field) -> pub [u8; 31] { // The result of this byte array will be little-endian let byte_array = x.to_le_bytes(31); - let mut first_four_bytes = [0; 4]; - for i in 0..4 { - first_four_bytes[i] = byte_array[i]; + assert(byte_array.len() == 31); + + let mut bytes = [0; 31]; + for i in 0..31 { + bytes[i] = byte_array[i]; } - // Issue #617 fix - // We were incorrectly mapping our output array from bit decomposition functions during acir generation - first_four_bytes[3] = byte_array[31]; - first_four_bytes + bytes }