From f77c4e10e2ac2843ccb5e954e8d8d9bee2a5a263 Mon Sep 17 00:00:00 2001 From: Ary Borenszweig Date: Mon, 9 Jun 2025 09:32:47 -0300 Subject: [PATCH 1/2] fix: (SSA interpreter) to_le_bits returns [u1; _], not [u8; _] --- .../src/ssa/interpreter/intrinsics.rs | 16 ++++---- .../src/ssa/interpreter/tests/intrinstics.rs | 38 +++++++++++++++++++ .../src/ssa/interpreter/tests/mod.rs | 1 + 3 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 compiler/noirc_evaluator/src/ssa/interpreter/tests/intrinstics.rs diff --git a/compiler/noirc_evaluator/src/ssa/interpreter/intrinsics.rs b/compiler/noirc_evaluator/src/ssa/interpreter/intrinsics.rs index 1bf4bfaed75..8b064626d59 100644 --- a/compiler/noirc_evaluator/src/ssa/interpreter/intrinsics.rs +++ b/compiler/noirc_evaluator/src/ssa/interpreter/intrinsics.rs @@ -78,13 +78,15 @@ impl Interpreter<'_> { Intrinsic::ToBits(endian) => { check_argument_count(args, 1, intrinsic)?; let field = self.lookup_field(args[0], "call to to_bits")?; - self.to_radix(endian, args[0], field, 2, results[0]) + let element_type = NumericType::bool(); + self.to_radix(endian, element_type, args[0], field, 2, results[0]) } Intrinsic::ToRadix(endian) => { check_argument_count(args, 2, intrinsic)?; - let field = self.lookup_field(args[0], "call to to_bits")?; - let radix = self.lookup_u32(args[1], "call to to_bits")?; - self.to_radix(endian, args[0], field, radix, results[0]) + let field = self.lookup_field(args[0], "call to to_radix")?; + let radix = self.lookup_u32(args[1], "call to to_radix")?; + let element_type = NumericType::Unsigned { bit_size: 8 }; + self.to_radix(endian, element_type, args[0], field, radix, results[0]) } Intrinsic::BlackBox(black_box_func) => match black_box_func { acvm::acir::BlackBoxFunc::AES128Encrypt => { @@ -425,6 +427,7 @@ impl Interpreter<'_> { fn to_radix( &self, endian: Endian, + element_type: NumericType, field_id: ValueId, field: FieldElement, radix: u32, @@ -444,9 +447,8 @@ impl Interpreter<'_> { return Err(InterpreterError::ToRadixFailed { field_id, field, radix }); }; - let elements = - try_vecmap(limbs, |limb| Value::from_constant(limb, NumericType::unsigned(8)))?; - Ok(vec![Value::array(elements, vec![Type::unsigned(8)])]) + let elements = try_vecmap(limbs, |limb| Value::from_constant(limb, element_type))?; + Ok(vec![Value::array(elements, vec![Type::Numeric(element_type)])]) } /// (length, slice, elem...) -> (length, slice) diff --git a/compiler/noirc_evaluator/src/ssa/interpreter/tests/intrinstics.rs b/compiler/noirc_evaluator/src/ssa/interpreter/tests/intrinstics.rs new file mode 100644 index 00000000000..9a82f238ede --- /dev/null +++ b/compiler/noirc_evaluator/src/ssa/interpreter/tests/intrinstics.rs @@ -0,0 +1,38 @@ +use crate::ssa::interpreter::{ + tests::expect_value, + value::{NumericValue, Value}, +}; + +#[test] +fn to_le_bits() { + let value = expect_value( + " + acir(inline) fn main f0 { + b0(): + v0 = add Field 0, Field 0 + v1 = call to_le_bits(v0) -> [u1; 2] + v2 = array_get v1, index u32 0 -> u1 + v3 = not v2 + return v3 + } + ", + ); + assert_eq!(value, Value::Numeric(NumericValue::U1(true))); +} + +#[test] +fn to_le_radix() { + let value = expect_value( + " + acir(inline) fn main f0 { + b0(): + v0 = add Field 0, Field 0 + v1 = call to_le_radix(v0, u32 2) -> [u8; 32] + v2 = array_get v1, index u32 0 -> u8 + v3 = not v2 + return v3 + } + ", + ); + assert_eq!(value, Value::Numeric(NumericValue::U8(255))); +} diff --git a/compiler/noirc_evaluator/src/ssa/interpreter/tests/mod.rs b/compiler/noirc_evaluator/src/ssa/interpreter/tests/mod.rs index bd817871376..17ee343873e 100644 --- a/compiler/noirc_evaluator/src/ssa/interpreter/tests/mod.rs +++ b/compiler/noirc_evaluator/src/ssa/interpreter/tests/mod.rs @@ -13,6 +13,7 @@ use super::{InterpreterError, Ssa, Value}; mod black_box; mod instructions; +mod intrinstics; #[track_caller] fn executes_with_no_errors(src: &str) { From 5f2a9c2dd7d382bd4fa571315bb1b6fadf86d71c Mon Sep 17 00:00:00 2001 From: Ary Borenszweig Date: Mon, 9 Jun 2025 11:34:46 -0300 Subject: [PATCH 2/2] Fix typo --- .../src/ssa/interpreter/tests/{intrinstics.rs => intrinsics.rs} | 0 compiler/noirc_evaluator/src/ssa/interpreter/tests/mod.rs | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename compiler/noirc_evaluator/src/ssa/interpreter/tests/{intrinstics.rs => intrinsics.rs} (100%) diff --git a/compiler/noirc_evaluator/src/ssa/interpreter/tests/intrinstics.rs b/compiler/noirc_evaluator/src/ssa/interpreter/tests/intrinsics.rs similarity index 100% rename from compiler/noirc_evaluator/src/ssa/interpreter/tests/intrinstics.rs rename to compiler/noirc_evaluator/src/ssa/interpreter/tests/intrinsics.rs diff --git a/compiler/noirc_evaluator/src/ssa/interpreter/tests/mod.rs b/compiler/noirc_evaluator/src/ssa/interpreter/tests/mod.rs index 17ee343873e..21fb0f88602 100644 --- a/compiler/noirc_evaluator/src/ssa/interpreter/tests/mod.rs +++ b/compiler/noirc_evaluator/src/ssa/interpreter/tests/mod.rs @@ -13,7 +13,7 @@ use super::{InterpreterError, Ssa, Value}; mod black_box; mod instructions; -mod intrinstics; +mod intrinsics; #[track_caller] fn executes_with_no_errors(src: &str) {