From a0b7daf807d56ae40f4da65bf77d5fb77678781e Mon Sep 17 00:00:00 2001 From: vezenovm Date: Tue, 21 Feb 2023 13:51:23 -0500 Subject: [PATCH 1/3] compute witness when var from var_cache is not const during println evaluation --- .../nargo/tests/test_data/strings/src/main.nr | 3 +++ .../src/ssa/acir_gen/operations/intrinsics.rs | 25 ++++++++++++------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/crates/nargo/tests/test_data/strings/src/main.nr b/crates/nargo/tests/test_data/strings/src/main.nr index ca0d1691f86..b88e64ec889 100644 --- a/crates/nargo/tests/test_data/strings/src/main.nr +++ b/crates/nargo/tests/test_data/strings/src/main.nr @@ -21,6 +21,9 @@ fn main(message : pub str<11>, y : Field, hex_as_string : str<4>, hex_as_field : let hash = std::hash::pedersen([x]); std::println(hash); + + let mimc_hash = std::hash::mimc_bn254(array); + std::println(mimc_hash); constrain hex_as_string == "0x41"; // constrain hex_as_string != 0x41; This will fail with a type mismatch between str[4] and Field diff --git a/crates/noirc_evaluator/src/ssa/acir_gen/operations/intrinsics.rs b/crates/noirc_evaluator/src/ssa/acir_gen/operations/intrinsics.rs index a679840d32c..845cec2924c 100644 --- a/crates/noirc_evaluator/src/ssa/acir_gen/operations/intrinsics.rs +++ b/crates/noirc_evaluator/src/ssa/acir_gen/operations/intrinsics.rs @@ -289,18 +289,25 @@ fn evaluate_println( log_string = format_field_string(field); } None => { - let var = var_cache.get(&node_id).unwrap_or_else(|| { - panic!( - "invalid input for print statement: {:?}", - ctx.try_get_node(node_id).expect("node is missing from SSA") - ) - }); + let mut var = var_cache + .get(&node_id) + .unwrap_or_else(|| { + panic!( + "invalid input for print statement: {:?}", + ctx.try_get_node(node_id).expect("node is missing from SSA") + ) + }) + .clone(); if let Some(field) = var.to_const() { log_string = format_field_string(field); - } else if let Some(w) = var.cached_witness() { - log_witnesses.push(*w); + } else if let Some(w) = var.get_or_compute_witness(evaluator, false) { + // We check whether there has already been a cached witness for this node. If not, we generate a new witness and include it in the logs + // TODO we need a witness because of the directive, but we should use an expression + log_witnesses.push(w); } else { - unreachable!("array element to be logged is missing a witness"); + unreachable!( + "a witness should have been computed for the non-constant expression" + ); } } }, From 1261622dea6ffa7cb27ad2a2c374133ef517cbc9 Mon Sep 17 00:00:00 2001 From: vezenovm Date: Tue, 21 Feb 2023 14:21:08 -0500 Subject: [PATCH 2/3] move regression test for std::println to merkle_insert --- crates/nargo/tests/test_data/merkle_insert/src/main.nr | 1 + crates/nargo/tests/test_data/strings/src/main.nr | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/nargo/tests/test_data/merkle_insert/src/main.nr b/crates/nargo/tests/test_data/merkle_insert/src/main.nr index 6078bef79d6..d8d7c1b2eb0 100644 --- a/crates/nargo/tests/test_data/merkle_insert/src/main.nr +++ b/crates/nargo/tests/test_data/merkle_insert/src/main.nr @@ -16,6 +16,7 @@ fn main( constrain new_leaf_exists == 1; let h = std::hash::mimc_bn254(mimc_input); + std::println(h); constrain h == 18226366069841799622585958305961373004333097209608110160936134895615261821931; } diff --git a/crates/nargo/tests/test_data/strings/src/main.nr b/crates/nargo/tests/test_data/strings/src/main.nr index b88e64ec889..ca0d1691f86 100644 --- a/crates/nargo/tests/test_data/strings/src/main.nr +++ b/crates/nargo/tests/test_data/strings/src/main.nr @@ -21,9 +21,6 @@ fn main(message : pub str<11>, y : Field, hex_as_string : str<4>, hex_as_field : let hash = std::hash::pedersen([x]); std::println(hash); - - let mimc_hash = std::hash::mimc_bn254(array); - std::println(mimc_hash); constrain hex_as_string == "0x41"; // constrain hex_as_string != 0x41; This will fail with a type mismatch between str[4] and Field From 57e68f32bea4bdf93b0a89958585db9a71113227 Mon Sep 17 00:00:00 2001 From: vezenovm Date: Tue, 21 Feb 2023 14:23:42 -0500 Subject: [PATCH 3/3] include comment pointing to regression test PR --- crates/nargo/tests/test_data/merkle_insert/src/main.nr | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/nargo/tests/test_data/merkle_insert/src/main.nr b/crates/nargo/tests/test_data/merkle_insert/src/main.nr index d8d7c1b2eb0..a821ae800c9 100644 --- a/crates/nargo/tests/test_data/merkle_insert/src/main.nr +++ b/crates/nargo/tests/test_data/merkle_insert/src/main.nr @@ -16,6 +16,7 @@ fn main( constrain new_leaf_exists == 1; let h = std::hash::mimc_bn254(mimc_input); + // Regression test for PR #891 std::println(h); constrain h == 18226366069841799622585958305961373004333097209608110160936134895615261821931; }