Skip to content

Commit b2eeec6

Browse files
authored
Merge 35083f8 into 34cb23f
2 parents 34cb23f + 35083f8 commit b2eeec6

File tree

7 files changed

+115
-65
lines changed

7 files changed

+115
-65
lines changed

.aztec-sync-commit

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
f5bbb89b489bc85f286bcc5ed45c30f38032810c
1+
249e50efafd306fa8cd9005972636adbddbca81e

aztec_macros/src/transforms/events.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ fn generate_fn_get_event_type_id(
230230
let function_source = format!(
231231
"
232232
fn get_event_type_id() -> dep::aztec::protocol_types::abis::event_selector::EventSelector {{
233-
dep::aztec::protocol_types::abis::event_selector::EventSelector::from_signature(\"{event_type}({from_signature_input})\")
233+
comptime {{ dep::aztec::protocol_types::abis::event_selector::EventSelector::from_signature(\"{event_type}({from_signature_input})\") }}
234234
}}
235235
",
236236
)
@@ -260,8 +260,8 @@ fn generate_fn_private_to_be_bytes(
260260
fn private_to_be_bytes(self: {event_type}, randomness: Field) -> [u8; {byte_length}] {{
261261
let mut buffer: [u8; {byte_length}] = [0; {byte_length}];
262262
263-
let randomness_bytes = randomness.to_be_bytes(32);
264-
let event_type_id_bytes = {event_type}::get_event_type_id().to_field().to_be_bytes(32);
263+
let randomness_bytes: [u8; 32] = randomness.to_be_bytes();
264+
let event_type_id_bytes: [u8; 32] = {event_type}::get_event_type_id().to_field().to_be_bytes();
265265
266266
for i in 0..32 {{
267267
buffer[i] = randomness_bytes[i];
@@ -271,7 +271,7 @@ fn generate_fn_private_to_be_bytes(
271271
let serialized_event = self.serialize();
272272
273273
for i in 0..serialized_event.len() {{
274-
let bytes = serialized_event[i].to_be_bytes(32);
274+
let bytes: [u8; 32] = serialized_event[i].to_be_bytes();
275275
for j in 0..32 {{
276276
buffer[64 + i * 32 + j] = bytes[j];
277277
}}
@@ -308,7 +308,7 @@ fn generate_fn_to_be_bytes(
308308
fn to_be_bytes(self: {event_type}) -> [u8; {byte_length_without_randomness}] {{
309309
let mut buffer: [u8; {byte_length_without_randomness}] = [0; {byte_length_without_randomness}];
310310
311-
let event_type_id_bytes = {event_type}::get_event_type_id().to_field().to_be_bytes(32);
311+
let event_type_id_bytes: [u8; 32] = {event_type}::get_event_type_id().to_field().to_be_bytes();
312312
313313
for i in 0..32 {{
314314
buffer[i] = event_type_id_bytes[i];
@@ -317,7 +317,7 @@ fn generate_fn_to_be_bytes(
317317
let serialized_event = self.serialize();
318318
319319
for i in 0..serialized_event.len() {{
320-
let bytes = serialized_event[i].to_be_bytes(32);
320+
let bytes: [u8; 32] = serialized_event[i].to_be_bytes();
321321
for j in 0..32 {{
322322
buffer[32 + i * 32 + j] = bytes[j];
323323
}}

aztec_macros/src/transforms/note_interface.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -244,16 +244,16 @@ fn generate_note_to_be_bytes(
244244
245245
let mut buffer: [u8; {0}] = [0; {0}];
246246
247-
let storage_slot_bytes = storage_slot.to_be_bytes(32);
248-
let note_type_id_bytes = {1}::get_note_type_id().to_be_bytes(32);
247+
let storage_slot_bytes: [u8; 32] = storage_slot.to_be_bytes();
248+
let note_type_id_bytes: [u8; 32] = {1}::get_note_type_id().to_be_bytes();
249249
250250
for i in 0..32 {{
251251
buffer[i] = storage_slot_bytes[i];
252252
buffer[32 + i] = note_type_id_bytes[i];
253253
}}
254254
255255
for i in 0..serialized_note.len() {{
256-
let bytes = serialized_note[i].to_be_bytes(32);
256+
let bytes: [u8; 32] = serialized_note[i].to_be_bytes();
257257
for j in 0..32 {{
258258
buffer[64 + i * 32 + j] = bytes[j];
259259
}}

compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_black_box.rs

+54-13
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ pub(crate) fn convert_black_box_call<F: AcirField + DebugToString, Registers: Re
2929
message: message_vector.to_heap_vector(),
3030
output: result_array.to_heap_array(),
3131
});
32+
deallocate_converted_vector(brillig_context, message, message_vector, bb_func);
3233
} else {
3334
unreachable!("ICE: SHA256 expects one array argument and one array result")
3435
}
@@ -42,6 +43,7 @@ pub(crate) fn convert_black_box_call<F: AcirField + DebugToString, Registers: Re
4243
message: message_vector.to_heap_vector(),
4344
output: result_array.to_heap_array(),
4445
});
46+
deallocate_converted_vector(brillig_context, message, message_vector, bb_func);
4547
} else {
4648
unreachable!("ICE: Blake2s expects one array argument and one array result")
4749
}
@@ -55,6 +57,7 @@ pub(crate) fn convert_black_box_call<F: AcirField + DebugToString, Registers: Re
5557
message: message_vector.to_heap_vector(),
5658
output: result_array.to_heap_array(),
5759
});
60+
deallocate_converted_vector(brillig_context, message, message_vector, bb_func);
5861
} else {
5962
unreachable!("ICE: Blake3 expects one array argument and one array result")
6063
}
@@ -78,6 +81,7 @@ pub(crate) fn convert_black_box_call<F: AcirField + DebugToString, Registers: Re
7881
output: result_array.to_heap_array(),
7982
});
8083
brillig_context.deallocate_single_addr(message_size_as_usize);
84+
deallocate_converted_vector(brillig_context, message, message_vector, bb_func);
8185
} else {
8286
unreachable!("ICE: Keccak256 expects message, message size and result array")
8387
}
@@ -92,6 +96,7 @@ pub(crate) fn convert_black_box_call<F: AcirField + DebugToString, Registers: Re
9296
message: state_vector.to_heap_vector(),
9397
output: result_array.to_heap_array(),
9498
});
99+
deallocate_converted_vector(brillig_context, message, state_vector, bb_func);
95100
} else {
96101
unreachable!("ICE: Keccakf1600 expects one array argument and one array result")
97102
}
@@ -111,6 +116,7 @@ pub(crate) fn convert_black_box_call<F: AcirField + DebugToString, Registers: Re
111116
signature: signature.to_heap_array(),
112117
result: result_register.address,
113118
});
119+
deallocate_converted_vector(brillig_context, message, message_hash_vector, bb_func);
114120
} else {
115121
unreachable!(
116122
"ICE: EcdsaSecp256k1 expects four array arguments and one register result"
@@ -132,6 +138,7 @@ pub(crate) fn convert_black_box_call<F: AcirField + DebugToString, Registers: Re
132138
signature: signature.to_heap_array(),
133139
result: result_register.address,
134140
});
141+
deallocate_converted_vector(brillig_context, message, message_hash_vector, bb_func);
135142
} else {
136143
unreachable!(
137144
"ICE: EcdsaSecp256r1 expects four array arguments and one register result"
@@ -151,6 +158,7 @@ pub(crate) fn convert_black_box_call<F: AcirField + DebugToString, Registers: Re
151158
domain_separator: domain_separator.address,
152159
output: result_array.to_heap_array(),
153160
});
161+
deallocate_converted_vector(brillig_context, message, message_vector, bb_func);
154162
} else {
155163
unreachable!("ICE: Pedersen expects one array argument, a register for the domain separator, and one array result")
156164
}
@@ -167,6 +175,7 @@ pub(crate) fn convert_black_box_call<F: AcirField + DebugToString, Registers: Re
167175
domain_separator: domain_separator.address,
168176
output: result.address,
169177
});
178+
deallocate_converted_vector(brillig_context, message, message_vector, bb_func);
170179
} else {
171180
unreachable!("ICE: Pedersen hash expects one array argument, a register for the domain separator, and one register result")
172181
}
@@ -178,14 +187,16 @@ pub(crate) fn convert_black_box_call<F: AcirField + DebugToString, Registers: Re
178187
) = (function_arguments, function_results)
179188
{
180189
let message_hash = convert_array_or_vector(brillig_context, message, bb_func);
181-
let signature = brillig_context.array_to_vector_instruction(signature);
190+
let signature_vector = brillig_context.array_to_vector_instruction(signature);
182191
brillig_context.black_box_op_instruction(BlackBoxOp::SchnorrVerify {
183192
public_key_x: public_key_x.address,
184193
public_key_y: public_key_y.address,
185194
message: message_hash.to_heap_vector(),
186-
signature: signature.to_heap_vector(),
195+
signature: signature_vector.to_heap_vector(),
187196
result: result_register.address,
188197
});
198+
deallocate_converted_vector(brillig_context, message, message_hash, bb_func);
199+
brillig_context.deallocate_register(signature_vector.size);
189200
} else {
190201
unreachable!("ICE: Schnorr verify expects two registers for the public key, an array for signature, an array for the message hash and one result register")
191202
}
@@ -194,13 +205,15 @@ pub(crate) fn convert_black_box_call<F: AcirField + DebugToString, Registers: Re
194205
if let ([points, scalars], [BrilligVariable::BrilligArray(outputs)]) =
195206
(function_arguments, function_results)
196207
{
197-
let points = convert_array_or_vector(brillig_context, points, bb_func);
198-
let scalars = convert_array_or_vector(brillig_context, scalars, bb_func);
208+
let points_vector = convert_array_or_vector(brillig_context, points, bb_func);
209+
let scalars_vector = convert_array_or_vector(brillig_context, scalars, bb_func);
199210
brillig_context.black_box_op_instruction(BlackBoxOp::MultiScalarMul {
200-
points: points.to_heap_vector(),
201-
scalars: scalars.to_heap_vector(),
211+
points: points_vector.to_heap_vector(),
212+
scalars: scalars_vector.to_heap_vector(),
202213
outputs: outputs.to_heap_array(),
203214
});
215+
deallocate_converted_vector(brillig_context, points, points_vector, bb_func);
216+
deallocate_converted_vector(brillig_context, scalars, scalars_vector, bb_func);
204217
} else {
205218
unreachable!(
206219
"ICE: MultiScalarMul expects two register arguments and one array result"
@@ -319,6 +332,8 @@ pub(crate) fn convert_black_box_call<F: AcirField + DebugToString, Registers: Re
319332
modulus: modulus_vector.to_heap_vector(),
320333
output: output.address,
321334
});
335+
deallocate_converted_vector(brillig_context, inputs, inputs_vector, bb_func);
336+
deallocate_converted_vector(brillig_context, modulus, modulus_vector, bb_func);
322337
} else {
323338
unreachable!(
324339
"ICE: BigIntFromLeBytes expects a register and an array as arguments and two result registers"
@@ -336,6 +351,7 @@ pub(crate) fn convert_black_box_call<F: AcirField + DebugToString, Registers: Re
336351
input: input.address,
337352
output: output.to_heap_vector(),
338353
});
354+
deallocate_converted_vector(brillig_context, result_array, output, bb_func);
339355
} else {
340356
unreachable!(
341357
"ICE: BigIntToLeBytes expects two register arguments and one array result"
@@ -354,6 +370,7 @@ pub(crate) fn convert_black_box_call<F: AcirField + DebugToString, Registers: Re
354370
output: result_array.to_heap_array(),
355371
len: state_len.address,
356372
});
373+
deallocate_converted_vector(brillig_context, message, message_vector, bb_func);
357374
} else {
358375
unreachable!("ICE: Poseidon2Permutation expects one array argument, a length and one array result")
359376
}
@@ -369,6 +386,8 @@ pub(crate) fn convert_black_box_call<F: AcirField + DebugToString, Registers: Re
369386
hash_values: hash_vector.to_heap_vector(),
370387
output: result_array.to_heap_array(),
371388
});
389+
deallocate_converted_vector(brillig_context, message, message_vector, bb_func);
390+
deallocate_converted_vector(brillig_context, hash_values, hash_vector, bb_func);
372391
} else {
373392
unreachable!("ICE: Sha256Compression expects two array argument, one array result")
374393
}
@@ -379,18 +398,19 @@ pub(crate) fn convert_black_box_call<F: AcirField + DebugToString, Registers: Re
379398
[BrilligVariable::SingleAddr(out_len), outputs],
380399
) = (function_arguments, function_results)
381400
{
382-
let inputs = convert_array_or_vector(brillig_context, inputs, bb_func);
383-
let outputs = convert_array_or_vector(brillig_context, outputs, bb_func);
384-
let output_vec = outputs.to_heap_vector();
401+
let inputs_vector = convert_array_or_vector(brillig_context, inputs, bb_func);
402+
let outputs_vector = convert_array_or_vector(brillig_context, outputs, bb_func);
385403
brillig_context.black_box_op_instruction(BlackBoxOp::AES128Encrypt {
386-
inputs: inputs.to_heap_vector(),
404+
inputs: inputs_vector.to_heap_vector(),
387405
iv: iv.to_heap_array(),
388406
key: key.to_heap_array(),
389-
outputs: output_vec,
407+
outputs: outputs_vector.to_heap_vector(),
390408
});
391-
brillig_context.mov_instruction(out_len.address, output_vec.size);
409+
brillig_context.mov_instruction(out_len.address, outputs_vector.size);
392410
// Returns slice, so we need to allocate memory for it after the fact
393-
brillig_context.increase_free_memory_pointer_instruction(output_vec.size);
411+
brillig_context.increase_free_memory_pointer_instruction(outputs_vector.size);
412+
deallocate_converted_vector(brillig_context, inputs, inputs_vector, bb_func);
413+
deallocate_converted_vector(brillig_context, outputs, outputs_vector, bb_func);
394414
} else {
395415
unreachable!("ICE: AES128Encrypt expects three array arguments, one array result")
396416
}
@@ -413,3 +433,24 @@ fn convert_array_or_vector<F: AcirField + DebugToString, Registers: RegisterAllo
413433
),
414434
}
415435
}
436+
437+
/// Deallocates any new register allocated by the function above.
438+
/// Concretely, the only allocated register between array and vector is the size register if the array was converted to a vector.
439+
fn deallocate_converted_vector<F: AcirField + DebugToString, Registers: RegisterAllocator>(
440+
brillig_context: &mut BrilligContext<F, Registers>,
441+
original_array_or_vector: &BrilligVariable,
442+
converted_vector: BrilligVector,
443+
bb_func: &BlackBoxFunc,
444+
) {
445+
match original_array_or_vector {
446+
BrilligVariable::BrilligArray(_) => {
447+
brillig_context.deallocate_register(converted_vector.size);
448+
}
449+
BrilligVariable::BrilligVector(_) => {}
450+
_ => unreachable!(
451+
"ICE: {} expected an array or a vector, but got {:?}",
452+
bb_func.name(),
453+
original_array_or_vector
454+
),
455+
}
456+
}

compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs

+37-32
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,12 @@ impl<'block> BrilligBlock<'block> {
767767
// puts the returns into the returned_registers and restores saved_registers
768768
self.brillig_context
769769
.codegen_post_call_prep_returns_load_registers(&returned_registers, &saved_registers);
770+
771+
// Reset the register state to the one needed to hold the current available variables
772+
let variables = self.variables.get_available_variables(self.function_context);
773+
let registers =
774+
variables.into_iter().flat_map(|variable| variable.extract_registers()).collect();
775+
self.brillig_context.set_allocated_registers(registers);
770776
}
771777

772778
fn validate_array_index(
@@ -1751,7 +1757,7 @@ impl<'block> BrilligBlock<'block> {
17511757
dfg,
17521758
);
17531759
let array = variable.extract_array();
1754-
self.allocate_nested_array(typ, Some(array));
1760+
self.allocate_foreign_call_result_array(typ, array);
17551761

17561762
variable
17571763
}
@@ -1778,40 +1784,39 @@ impl<'block> BrilligBlock<'block> {
17781784
}
17791785
}
17801786

1781-
fn allocate_nested_array(
1782-
&mut self,
1783-
typ: &Type,
1784-
array: Option<BrilligArray>,
1785-
) -> BrilligVariable {
1786-
match typ {
1787-
Type::Array(types, size) => {
1788-
let array = array.unwrap_or(BrilligArray {
1789-
pointer: self.brillig_context.allocate_register(),
1790-
size: *size,
1791-
rc: self.brillig_context.allocate_register(),
1792-
});
1793-
self.brillig_context.codegen_allocate_fixed_length_array(array.pointer, array.size);
1794-
self.brillig_context.usize_const_instruction(array.rc, 1_usize.into());
1795-
1796-
let mut index = 0_usize;
1797-
for _ in 0..*size {
1798-
for element_type in types.iter() {
1799-
match element_type {
1800-
Type::Array(_, _) => {
1801-
let inner_array = self.allocate_nested_array(element_type, None);
1802-
let idx =
1803-
self.brillig_context.make_usize_constant_instruction(index.into());
1804-
self.brillig_context.codegen_store_variable_in_array(array.pointer, idx, inner_array);
1805-
}
1806-
Type::Slice(_) => unreachable!("ICE: unsupported slice type in allocate_nested_array(), expects an array or a numeric type"),
1807-
_ => (),
1808-
}
1809-
index += 1;
1787+
fn allocate_foreign_call_result_array(&mut self, typ: &Type, array: BrilligArray) {
1788+
let Type::Array(types, size) = typ else {
1789+
unreachable!("ICE: allocate_foreign_call_array() expects an array, got {typ:?}")
1790+
};
1791+
1792+
self.brillig_context.codegen_allocate_fixed_length_array(array.pointer, array.size);
1793+
self.brillig_context.usize_const_instruction(array.rc, 1_usize.into());
1794+
1795+
let mut index = 0_usize;
1796+
for _ in 0..*size {
1797+
for element_type in types.iter() {
1798+
match element_type {
1799+
Type::Array(_, nested_size) => {
1800+
let inner_array = BrilligArray {
1801+
pointer: self.brillig_context.allocate_register(),
1802+
rc: self.brillig_context.allocate_register(),
1803+
size: *nested_size,
1804+
};
1805+
self.allocate_foreign_call_result_array(element_type, inner_array);
1806+
1807+
let idx =
1808+
self.brillig_context.make_usize_constant_instruction(index.into());
1809+
self.brillig_context.codegen_store_variable_in_array(array.pointer, idx, BrilligVariable::BrilligArray(inner_array));
1810+
1811+
self.brillig_context.deallocate_single_addr(idx);
1812+
self.brillig_context.deallocate_register(inner_array.pointer);
1813+
self.brillig_context.deallocate_register(inner_array.rc);
18101814
}
1815+
Type::Slice(_) => unreachable!("ICE: unsupported slice type in allocate_nested_array(), expects an array or a numeric type"),
1816+
_ => (),
18111817
}
1812-
BrilligVariable::BrilligArray(array)
1818+
index += 1;
18131819
}
1814-
_ => unreachable!("ICE: allocate_nested_array() expects an array, got {typ:?}"),
18151820
}
18161821
}
18171822

0 commit comments

Comments
 (0)