diff --git a/compiler/noirc_evaluator/src/ssa/ir/function_inserter.rs b/compiler/noirc_evaluator/src/ssa/ir/function_inserter.rs index a063a7ff26..9baeb19206 100644 --- a/compiler/noirc_evaluator/src/ssa/ir/function_inserter.rs +++ b/compiler/noirc_evaluator/src/ssa/ir/function_inserter.rs @@ -1,9 +1,11 @@ use iter_extended::vecmap; +use crate::ssa::ir::types::Type; + use super::{ basic_block::BasicBlockId, dfg::{CallStack, InsertInstructionResult}, - function::Function, + function::{Function, RuntimeType}, instruction::{Instruction, InstructionId}, value::ValueId, }; @@ -16,7 +18,11 @@ pub(crate) struct FunctionInserter<'f> { pub(crate) function: &'f mut Function, values: HashMap, - const_arrays: HashMap, ValueId>, + /// Map containing repeat array constant so that we do not initialize a new + /// array unnecessarily. An extra bool is included as part of the key to + /// distinguish between Type::Array and Type::Slice, as both are valid + /// types for a Value::Array + const_arrays: HashMap<(im::Vector, bool), ValueId>, } impl<'f> FunctionInserter<'f> { @@ -37,15 +43,27 @@ impl<'f> FunctionInserter<'f> { let typ = typ.clone(); let new_array: im::Vector = array.iter().map(|id| self.resolve(*id)).collect(); - if self.const_arrays.get(&new_array) == Some(&value) { - value - } else { - let new_array_clone = new_array.clone(); - let new_id = self.function.dfg.make_array(new_array, typ); - self.values.insert(value, new_id); - self.const_arrays.insert(new_array_clone, new_id); - new_id - } + + // Flag to determine the type of the value's array list + let is_array = matches!(typ, Type::Array { .. }); + if let Some(fetched_value) = + self.const_arrays.get(&(new_array.clone(), is_array)) + { + // Arrays in ACIR are immutable, but in Brillig arrays are copy-on-write + // so for function's with a Brillig runtime we make sure to check that value + // in our constants array map matches the resolved array value id. + if matches!(self.function.runtime(), RuntimeType::Acir(_)) { + return *fetched_value; + } else if *fetched_value == value { + return value; + } + }; + + let new_array_clone = new_array.clone(); + let new_id = self.function.dfg.make_array(new_array, typ); + self.values.insert(value, new_id); + self.const_arrays.insert((new_array_clone, is_array), new_id); + new_id } _ => value, }, diff --git a/test_programs/execution_success/trait_method_mut_self/Nargo.toml b/test_programs/compile_success_empty/trait_method_mut_self/Nargo.toml similarity index 100% rename from test_programs/execution_success/trait_method_mut_self/Nargo.toml rename to test_programs/compile_success_empty/trait_method_mut_self/Nargo.toml diff --git a/test_programs/execution_success/trait_method_mut_self/Prover.toml b/test_programs/compile_success_empty/trait_method_mut_self/Prover.toml similarity index 100% rename from test_programs/execution_success/trait_method_mut_self/Prover.toml rename to test_programs/compile_success_empty/trait_method_mut_self/Prover.toml diff --git a/test_programs/execution_success/trait_method_mut_self/src/main.nr b/test_programs/compile_success_empty/trait_method_mut_self/src/main.nr similarity index 100% rename from test_programs/execution_success/trait_method_mut_self/src/main.nr rename to test_programs/compile_success_empty/trait_method_mut_self/src/main.nr diff --git a/test_programs/execution_success/turbofish_call_func_diff_types/Nargo.toml b/test_programs/compile_success_empty/turbofish_call_func_diff_types/Nargo.toml similarity index 100% rename from test_programs/execution_success/turbofish_call_func_diff_types/Nargo.toml rename to test_programs/compile_success_empty/turbofish_call_func_diff_types/Nargo.toml diff --git a/test_programs/execution_success/turbofish_call_func_diff_types/Prover.toml b/test_programs/compile_success_empty/turbofish_call_func_diff_types/Prover.toml similarity index 100% rename from test_programs/execution_success/turbofish_call_func_diff_types/Prover.toml rename to test_programs/compile_success_empty/turbofish_call_func_diff_types/Prover.toml diff --git a/test_programs/execution_success/turbofish_call_func_diff_types/src/main.nr b/test_programs/compile_success_empty/turbofish_call_func_diff_types/src/main.nr similarity index 100% rename from test_programs/execution_success/turbofish_call_func_diff_types/src/main.nr rename to test_programs/compile_success_empty/turbofish_call_func_diff_types/src/main.nr