From f96b40047b92f167c1ff85e2d86d4d0b656aabc8 Mon Sep 17 00:00:00 2001 From: Tom French Date: Sat, 5 Aug 2023 11:50:48 +0100 Subject: [PATCH 1/3] feat: perform any sorting of constant arrays at compile-time --- .../tests/test_data/comptime_sort/Nargo.toml | 7 +++++++ .../tests/test_data/comptime_sort/src/main.nr | 7 +++++++ .../src/ssa/ir/instruction/call.rs | 20 ++++++++++++++++++- 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 crates/nargo_cli/tests/test_data/comptime_sort/Nargo.toml create mode 100644 crates/nargo_cli/tests/test_data/comptime_sort/src/main.nr diff --git a/crates/nargo_cli/tests/test_data/comptime_sort/Nargo.toml b/crates/nargo_cli/tests/test_data/comptime_sort/Nargo.toml new file mode 100644 index 00000000000..15221af78c8 --- /dev/null +++ b/crates/nargo_cli/tests/test_data/comptime_sort/Nargo.toml @@ -0,0 +1,7 @@ +[package] +name = "comptime_sort" +type = "bin" +authors = [""] +compiler_version = "0.6.0" + +[dependencies] diff --git a/crates/nargo_cli/tests/test_data/comptime_sort/src/main.nr b/crates/nargo_cli/tests/test_data/comptime_sort/src/main.nr new file mode 100644 index 00000000000..72b05044331 --- /dev/null +++ b/crates/nargo_cli/tests/test_data/comptime_sort/src/main.nr @@ -0,0 +1,7 @@ +fn main() { + let unsorted: [u8; 3] = [3,1,2]; + let sorted = unsorted.sort(); + assert(sorted[0] == 1); + assert(sorted[1] == 2); + assert(sorted[2] == 3); +} diff --git a/crates/noirc_evaluator/src/ssa/ir/instruction/call.rs b/crates/noirc_evaluator/src/ssa/ir/instruction/call.rs index d5925080870..5cddb947981 100644 --- a/crates/noirc_evaluator/src/ssa/ir/instruction/call.rs +++ b/crates/noirc_evaluator/src/ssa/ir/instruction/call.rs @@ -166,7 +166,8 @@ pub(super) fn simplify_call( } } Intrinsic::BlackBox(bb_func) => simplify_black_box_func(bb_func, arguments, dfg), - Intrinsic::Println | Intrinsic::Sort => SimplifyResult::None, + Intrinsic::Sort => simplify_sort(dfg, arguments), + Intrinsic::Println => SimplifyResult::None, } } @@ -366,3 +367,20 @@ fn simplify_signature( _ => SimplifyResult::None, } } + +fn simplify_sort(dfg: &mut DataFlowGraph, arguments: &[ValueId]) -> SimplifyResult { + match dfg.get_array_constant(arguments[0]) { + Some((input, _)) if array_is_constant(dfg, &input) => { + let (_, element_type) = dfg.get_numeric_constant_with_type(input[0]).unwrap(); + + let mut sorted_inputs: Vec = vecmap(input, |id| { + dfg.get_numeric_constant(id).expect("value id from array should point at constant") + }); + sorted_inputs.sort_unstable(); + + let result_array = make_constant_array(dfg, sorted_inputs, element_type); + SimplifyResult::SimplifiedTo(result_array) + } + _ => SimplifyResult::None, + } +} From 0a8a33ee0c4fba7ba9c1bf3feb53801f277c93a4 Mon Sep 17 00:00:00 2001 From: Tom French Date: Sat, 5 Aug 2023 11:50:59 +0100 Subject: [PATCH 2/3] chore: rebuild artifacts --- .../array_dynamic/target/array_dynamic.json | 2 +- .../test_data/array_dynamic/target/witness.tr | Bin 581 -> 511 bytes .../comptime_sort/target/comptime_sort.json | 1 + .../test_data/comptime_sort/target/witness.tr | Bin 0 -> 23 bytes 4 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 crates/nargo_cli/tests/test_data/comptime_sort/target/comptime_sort.json create mode 100644 crates/nargo_cli/tests/test_data/comptime_sort/target/witness.tr diff --git a/crates/nargo_cli/tests/test_data/array_dynamic/target/array_dynamic.json b/crates/nargo_cli/tests/test_data/array_dynamic/target/array_dynamic.json index 687a56bcafd..23fd96f294a 100644 --- a/crates/nargo_cli/tests/test_data/array_dynamic/target/array_dynamic.json +++ b/crates/nargo_cli/tests/test_data/array_dynamic/target/array_dynamic.json @@ -1 +1 @@ -{"backend":"acvm-backend-barretenberg","abi":{"parameters":[{"name":"x","type":{"kind":"array","length":5,"type":{"kind":"integer","sign":"unsigned","width":32}},"visibility":"private"},{"name":"z","type":{"kind":"integer","sign":"unsigned","width":32},"visibility":"private"},{"name":"t","type":{"kind":"integer","sign":"unsigned","width":32},"visibility":"private"},{"name":"index","type":{"kind":"array","length":5,"type":{"kind":"field"}},"visibility":"private"},{"name":"index2","type":{"kind":"array","length":5,"type":{"kind":"field"}},"visibility":"private"},{"name":"offset","type":{"kind":"field"},"visibility":"private"},{"name":"sublen","type":{"kind":"field"},"visibility":"private"}],"param_witnesses":{"index":[8,9,10,11,12],"index2":[13,14,15,16,17],"offset":[18],"sublen":[19],"t":[7],"x":[1,2,3,4,5],"z":[6]},"return_type":null,"return_witnesses":[]},"bytecode":"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","proving_key":null,"verification_key":null} \ No newline at end of file +{"backend":"acvm-backend-barretenberg","abi":{"parameters":[{"name":"x","type":{"kind":"array","length":5,"type":{"kind":"integer","sign":"unsigned","width":32}},"visibility":"private"},{"name":"z","type":{"kind":"integer","sign":"unsigned","width":32},"visibility":"private"},{"name":"t","type":{"kind":"integer","sign":"unsigned","width":32},"visibility":"private"},{"name":"index","type":{"kind":"array","length":5,"type":{"kind":"field"}},"visibility":"private"},{"name":"index2","type":{"kind":"array","length":5,"type":{"kind":"field"}},"visibility":"private"},{"name":"offset","type":{"kind":"field"},"visibility":"private"},{"name":"sublen","type":{"kind":"field"},"visibility":"private"}],"param_witnesses":{"index":[8,9,10,11,12],"index2":[13,14,15,16,17],"offset":[18],"sublen":[19],"t":[7],"x":[1,2,3,4,5],"z":[6]},"return_type":null,"return_witnesses":[]},"bytecode":"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","proving_key":null,"verification_key":null} \ No newline at end of file diff --git a/crates/nargo_cli/tests/test_data/array_dynamic/target/witness.tr b/crates/nargo_cli/tests/test_data/array_dynamic/target/witness.tr index 756e5de17403cefa6c1393de0c6542e7984857ff..e2ef1e6b213ed43b2f7a2fc0919991ee554f44cd 100644 GIT binary patch literal 511 zcmViRxcWtNJ*(tiXyE|=Xi#s6@uO|u1au! zRe|r0YH&}~fUH{3`#O+S51vgLK))J6Rukw~GstQIYitF3s14NB4zfBx?>j+O7g%FA z$m#)W>;-l8f$xrfP?rI)g7|Vxupb4Oqs8gcA<%mpoVO+DR~W2OfoER_oZSb&xnmI2 zH3U8v`Zv7BHIV+ms(V|m5` z=e=44y!4p7V2+!ht}QUfZ7|0jFvnf6#yv2{eK5xZu*O3$ z$0IPuV^G%#nBys!qYLKffqwa5jv8b|DVC5r_`?!f3Cq-4N~M$|wdb0CIO+&fc&=}I zmU4s=Ds~e!qo$`E!}g>M3mI6kpO3b$&%krxImo&IXVFXWym|$)uE81R24vlWHQs@& zdvJd}fUHN5^#rn>LGNF{|9r1tjc?#Lg%65lI`$`~OB-LDF8vL9{{x-Esl1FN005Ey B^~wMM literal 581 zcmV-L0=oSliwFP!00002|E<`?j@(cbgyAqVGc(%PW49fgFf()7c00_>42lv37J1%` zG+AVy&r(ZX{i;({7u?_b^gexie%*iHqyKucyq{yG{T-_s09gYas~N;tNjaFYqV^ES ziiSE?Jj}7eaK}nUI9At4==~_@{b=a@80h_2=>0h8*LdjH1lWm*ZqEsmpkI?6tC#|H zO@;lM2G5S^uoE*NYbNx57G%wacau5Luep#l5BfD9>RJHrmIi(n@f!~K2EPFKAFdcP6g0lJ}Io8XL_;T>QLJZrbYJHR%mYdhR0cEI(x6Lw-3?EP-o z`#o^Ry|DNDV88am-XDOv4#M6ag1tWsJ8=Zgcod##$Dpp`(61A4ZJ&g?PC?dbIO7?{ zYO=G8RW#=qD@5lRtBfu<@AHe$`!-~iFvkk!Si>AUFvkY^bqVHp8S1(MbG!<3yasc; z4rjapbG!+2yai{x4RgE$bG!?6-Ge#ahdDlgIX;AbJ%TwthO8%w6|(y2KdeyaA&Kic z%kn%gvbt=?RjX5kIF#)wEt9+mdB}TSI&mj1^CC*iENg|VNus1otNIzd7e0rq7w}v3 zCA_b`f~?o@8|DpUy@fNrgRJ+kUmqarBV>Jotk2N% diff --git a/crates/nargo_cli/tests/test_data/comptime_sort/target/comptime_sort.json b/crates/nargo_cli/tests/test_data/comptime_sort/target/comptime_sort.json new file mode 100644 index 00000000000..4c3bb072cb3 --- /dev/null +++ b/crates/nargo_cli/tests/test_data/comptime_sort/target/comptime_sort.json @@ -0,0 +1 @@ +{"backend":"acvm-backend-barretenberg","abi":{"parameters":[],"param_witnesses":{},"return_type":null,"return_witnesses":[]},"bytecode":"H4sIAAAAAAAA/2NkIAwAQGbG/yQAAAA=","proving_key":null,"verification_key":null} \ No newline at end of file diff --git a/crates/nargo_cli/tests/test_data/comptime_sort/target/witness.tr b/crates/nargo_cli/tests/test_data/comptime_sort/target/witness.tr new file mode 100644 index 0000000000000000000000000000000000000000..4e90289d5e1eafa19edb881b1256718356260d8b GIT binary patch literal 23 Zcmb2|=3oE;rvJ$a4GavK_mxsX0suJI1kL~e literal 0 HcmV?d00001 From cbf3912b07580292cd58898297e4af75bff39611 Mon Sep 17 00:00:00 2001 From: Tom French Date: Mon, 7 Aug 2023 15:48:31 +0100 Subject: [PATCH 3/3] chore: avoid double check for array elements being constants --- crates/noirc_evaluator/src/ssa/ir/instruction/call.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/noirc_evaluator/src/ssa/ir/instruction/call.rs b/crates/noirc_evaluator/src/ssa/ir/instruction/call.rs index 5cddb947981..a28f2d88bcb 100644 --- a/crates/noirc_evaluator/src/ssa/ir/instruction/call.rs +++ b/crates/noirc_evaluator/src/ssa/ir/instruction/call.rs @@ -370,14 +370,14 @@ fn simplify_signature( fn simplify_sort(dfg: &mut DataFlowGraph, arguments: &[ValueId]) -> SimplifyResult { match dfg.get_array_constant(arguments[0]) { - Some((input, _)) if array_is_constant(dfg, &input) => { - let (_, element_type) = dfg.get_numeric_constant_with_type(input[0]).unwrap(); + Some((input, _)) => { + let inputs: Option> = + input.iter().map(|id| dfg.get_numeric_constant(*id)).collect(); - let mut sorted_inputs: Vec = vecmap(input, |id| { - dfg.get_numeric_constant(id).expect("value id from array should point at constant") - }); + let Some(mut sorted_inputs) = inputs else { return SimplifyResult::None }; sorted_inputs.sort_unstable(); + let (_, element_type) = dfg.get_numeric_constant_with_type(input[0]).unwrap(); let result_array = make_constant_array(dfg, sorted_inputs, element_type); SimplifyResult::SimplifiedTo(result_array) }