From 70b2a26109b879d6c0c3532fa1c67f1df5c6707f Mon Sep 17 00:00:00 2001 From: guipublic Date: Wed, 22 May 2024 16:05:33 +0000 Subject: [PATCH] Generates memory block for return_data --- acvm-repo/acir/src/circuit/opcodes.rs | 6 ++++++ acvm-repo/acvm/src/compiler/optimizers/unused_memory.rs | 5 +++-- compiler/noirc_evaluator/src/ssa/acir_gen/mod.rs | 4 +++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/acvm-repo/acir/src/circuit/opcodes.rs b/acvm-repo/acir/src/circuit/opcodes.rs index e6dc11dac78..6043196dfff 100644 --- a/acvm-repo/acir/src/circuit/opcodes.rs +++ b/acvm-repo/acir/src/circuit/opcodes.rs @@ -18,6 +18,12 @@ pub enum BlockType { ReturnData, } +impl BlockType { + pub fn is_databus(&self) -> bool { + matches!(self, BlockType::CallData | BlockType::ReturnData) + } +} + #[allow(clippy::large_enum_variant)] #[derive(Clone, PartialEq, Eq, Serialize, Deserialize)] pub enum Opcode { diff --git a/acvm-repo/acvm/src/compiler/optimizers/unused_memory.rs b/acvm-repo/acvm/src/compiler/optimizers/unused_memory.rs index 18eefa79ac2..5fdcf54a492 100644 --- a/acvm-repo/acvm/src/compiler/optimizers/unused_memory.rs +++ b/acvm-repo/acvm/src/compiler/optimizers/unused_memory.rs @@ -44,8 +44,9 @@ impl UnusedMemoryOptimizer { let mut optimized_opcodes = Vec::with_capacity(self.circuit.opcodes.len()); for (idx, opcode) in self.circuit.opcodes.into_iter().enumerate() { match opcode { - Opcode::MemoryInit { block_id, .. } - if self.unused_memory_initializations.contains(&block_id) => + Opcode::MemoryInit { block_id, block_type, .. } + if !block_type.is_databus() + && self.unused_memory_initializations.contains(&block_id) => { // Drop opcode } diff --git a/compiler/noirc_evaluator/src/ssa/acir_gen/mod.rs b/compiler/noirc_evaluator/src/ssa/acir_gen/mod.rs index fefe5f6f8e6..30fd83d7704 100644 --- a/compiler/noirc_evaluator/src/ssa/acir_gen/mod.rs +++ b/compiler/noirc_evaluator/src/ssa/acir_gen/mod.rs @@ -1728,7 +1728,7 @@ impl<'a> Context<'a> { &mut self, terminator: &TerminatorInstruction, dfg: &DataFlowGraph, - ) -> Result, InternalError> { + ) -> Result, RuntimeError> { let (return_values, call_stack) = match terminator { TerminatorInstruction::Return { return_values, call_stack } => { (return_values, call_stack) @@ -1750,6 +1750,8 @@ impl<'a> Context<'a> { if !is_databus { // We do not return value for the data bus. self.acir_context.return_var(acir_var)?; + } else { + self.check_array_is_initialized(self.data_bus.return_data.unwrap(), dfg)?; } } Ok(warnings)