diff --git a/crates/nargo_cli/tests/compile_success/comptime_sort/Nargo.toml b/crates/nargo_cli/tests/compile_success/comptime_sort/Nargo.toml new file mode 100644 index 00000000000..15221af78c8 --- /dev/null +++ b/crates/nargo_cli/tests/compile_success/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/compile_success/comptime_sort/src/main.nr b/crates/nargo_cli/tests/compile_success/comptime_sort/src/main.nr new file mode 100644 index 00000000000..72b05044331 --- /dev/null +++ b/crates/nargo_cli/tests/compile_success/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/nargo_cli/tests/test_data b/crates/nargo_cli/tests/test_data index 27727832076..ce80163f960 120000 --- a/crates/nargo_cli/tests/test_data +++ b/crates/nargo_cli/tests/test_data @@ -1 +1 @@ -execution_success/ \ No newline at end of file +execution_success \ No newline at end of file diff --git a/crates/noirc_evaluator/src/ssa/ir/instruction/call.rs b/crates/noirc_evaluator/src/ssa/ir/instruction/call.rs index d5925080870..a28f2d88bcb 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, _)) => { + let inputs: Option> = + input.iter().map(|id| dfg.get_numeric_constant(*id)).collect(); + + 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) + } + _ => SimplifyResult::None, + } +}