Skip to content

fix: modify ref count recursively for nested arrays#9341

Closed
guipublic wants to merge 1 commit intomasterfrom
gd/issue_9270
Closed

fix: modify ref count recursively for nested arrays#9341
guipublic wants to merge 1 commit intomasterfrom
gd/issue_9270

Conversation

@guipublic
Copy link
Contributor

Description

Problem*

Resolves #9270

Summary*

The ref count for Brillig array or slices is now modified recursively also on the inner arrays for nested arrays

Additional Context

This is a draft, because it is missing a test and I also want to update array-copy which also modifies the ref count, but not recursively yet.

Documentation*

Check one:

  • No documentation needed.
  • Documentation included in this PR.
  • [For Experimental Features] Documentation to be submitted in a separate PR.

PR Checklist*

  • I have tested the changes locally.
  • I have formatted the changes with Prettier and/or cargo fmt on default settings.

@github-actions
Copy link
Contributor

Changes to Brillig bytecode sizes

Generated at commit: 83fd30efc0a474985b5d35e014438552189a2723, compared to commit: 2282832950b553ded6ab3924300d8ef3a2e625bf

🧾 Summary (10% most significant diffs)

Program Brillig opcodes (+/-) %
bench_2_to_17_inliner_min +9,812 ❌ +2955.42%
fold_2_to_17_inliner_zero +9,332 ❌ +2862.58%
fold_2_to_17_inliner_min +9,332 ❌ +2636.16%
lambda_from_array_inliner_max +9,888 ❌ +398.07%
lambda_from_array_inliner_min +9,888 ❌ +398.07%
lambda_from_array_inliner_zero +9,888 ❌ +398.07%
unrolling_regression_8333_inliner_max +276 ❌ +313.64%
unrolling_regression_8333_inliner_min +276 ❌ +313.64%
unrolling_regression_8333_inliner_zero +276 ❌ +313.64%
reference_counts_slices_inliner_0_inliner_max +2,194 ❌ +302.62%
reference_counts_inliner_max_inliner_max +2,084 ❌ +299.43%
reference_counts_inliner_0_inliner_max +2,084 ❌ +299.43%
reference_counts_inliner_min_inliner_max +2,084 ❌ +299.43%
slice_regex_inliner_zero +3,847 ❌ +241.19%
slice_regex_inliner_min +3,886 ❌ +210.74%
slice_regex_inliner_max +4,031 ❌ +188.19%
nested_array_dynamic_inliner_min +1,944 ❌ +136.13%
nested_array_dynamic_inliner_zero +1,944 ❌ +136.13%
nested_fmtstr_inliner_max +2,464 ❌ +118.58%
nested_fmtstr_inliner_min +2,464 ❌ +118.58%
nested_fmtstr_inliner_zero +2,464 ❌ +118.58%
regression_5252_inliner_zero +3,782 ❌ +117.09%
nested_array_dynamic_inliner_max +1,992 ❌ +115.55%
to_le_bytes_inliner_max +128 ❌ +107.56%
to_le_bytes_inliner_zero +128 ❌ +107.56%
brillig_nested_arrays_inliner_min +172 ❌ +100.58%
brillig_nested_arrays_inliner_zero +172 ❌ +100.58%
to_le_bytes_inliner_min +128 ❌ +100.00%
strings_inliner_max +848 ❌ +92.48%
strings_inliner_zero +800 ❌ +89.59%

Full diff report 👇
Program Brillig opcodes (+/-) %
bench_2_to_17_inliner_min 10,144 (+9,812) +2955.42%
fold_2_to_17_inliner_zero 9,658 (+9,332) +2862.58%
fold_2_to_17_inliner_min 9,686 (+9,332) +2636.16%
lambda_from_array_inliner_max 12,372 (+9,888) +398.07%
lambda_from_array_inliner_min 12,372 (+9,888) +398.07%
lambda_from_array_inliner_zero 12,372 (+9,888) +398.07%
unrolling_regression_8333_inliner_max 364 (+276) +313.64%
unrolling_regression_8333_inliner_min 364 (+276) +313.64%
unrolling_regression_8333_inliner_zero 364 (+276) +313.64%
reference_counts_slices_inliner_0_inliner_max 2,919 (+2,194) +302.62%
reference_counts_inliner_max_inliner_max 2,780 (+2,084) +299.43%
reference_counts_inliner_0_inliner_max 2,780 (+2,084) +299.43%
reference_counts_inliner_min_inliner_max 2,780 (+2,084) +299.43%
slice_regex_inliner_zero 5,442 (+3,847) +241.19%
slice_regex_inliner_min 5,730 (+3,886) +210.74%
slice_regex_inliner_max 6,173 (+4,031) +188.19%
nested_array_dynamic_inliner_min 3,372 (+1,944) +136.13%
nested_array_dynamic_inliner_zero 3,372 (+1,944) +136.13%
nested_fmtstr_inliner_max 4,542 (+2,464) +118.58%
nested_fmtstr_inliner_min 4,542 (+2,464) +118.58%
nested_fmtstr_inliner_zero 4,542 (+2,464) +118.58%
regression_5252_inliner_zero 7,012 (+3,782) +117.09%
nested_array_dynamic_inliner_max 3,716 (+1,992) +115.55%
to_le_bytes_inliner_max 247 (+128) +107.56%
to_le_bytes_inliner_zero 247 (+128) +107.56%
brillig_nested_arrays_inliner_min 343 (+172) +100.58%
brillig_nested_arrays_inliner_zero 343 (+172) +100.58%
to_le_bytes_inliner_min 256 (+128) +100.00%
strings_inliner_max 1,765 (+848) +92.48%
strings_inliner_zero 1,693 (+800) +89.59%
strings_inliner_min 1,703 (+800) +88.59%
empty_strings_in_composite_arrays_inliner_max 690 (+320) +86.49%
debug_logs_inliner_max 9,308 (+4,192) +81.94%
brillig_cow_inliner_zero 435 (+192) +79.01%
array_eq_inliner_max 153 (+66) +75.86%
array_eq_inliner_zero 153 (+66) +75.86%
debug_logs_inliner_min 9,329 (+4,012) +75.46%
debug_logs_inliner_zero 9,329 (+4,012) +75.46%
poseidonsponge_x5_254_inliner_zero 5,078 (+2,180) +75.22%
array_neq_inliner_max 155 (+66) +74.16%
array_neq_inliner_zero 155 (+66) +74.16%
poseidonsponge_x5_254_inliner_min 5,199 (+2,180) +72.21%
hashmap_inliner_max 29,969 (+12,538) +71.93%
brillig_cow_inliner_max 603 (+252) +71.79%
regression_5252_inliner_min 5,738 (+2,354) +69.56%
regression_11294_inliner_min 486 (+198) +68.75%
array_eq_inliner_min 163 (+66) +68.04%
array_neq_inliner_min 165 (+66) +66.67%
hashmap_inliner_zero 12,527 (+4,797) +62.06%
brillig_cow_inliner_min 537 (+204) +61.26%
regression_11294_inliner_max 353 (+132) +59.73%
regression_11294_inliner_zero 353 (+132) +59.73%
global_slice_rc_regression_8259_inliner_max 302 (+112) +58.95%
global_slice_rc_regression_8259_inliner_zero 302 (+112) +58.95%
hashmap_inliner_min 13,904 (+5,111) +58.13%
a_6_inliner_max 213 (+78) +57.78%
a_6_inliner_zero 213 (+78) +57.78%
aes128_encrypt_inliner_max 636 (+230) +56.65%
reference_counts_slices_inliner_0_inliner_zero 1,569 (+564) +56.12%
a_6_inliner_min 223 (+78) +53.79%
reference_counts_inliner_min_inliner_zero 1,370 (+474) +52.90%
reference_counts_inliner_0_inliner_zero 1,370 (+474) +52.90%
reference_counts_inliner_max_inliner_zero 1,370 (+474) +52.90%
array_dynamic_blackbox_input_inliner_max 567 (+196) +52.83%
array_dynamic_blackbox_input_inliner_zero 567 (+196) +52.83%
last_uses_regression_8935_inliner_max 451 (+154) +51.85%
last_uses_regression_8935_inliner_zero 451 (+154) +51.85%
aes128_encrypt_inliner_zero 575 (+196) +51.72%
aes128_encrypt_inliner_min 584 (+196) +50.52%
blake3_inliner_max 198 (+66) +50.00%
a_7_inliner_max 198 (+66) +50.00%
brillig_blake2s_inliner_max 198 (+66) +50.00%
array_dynamic_blackbox_input_inliner_min 588 (+196) +50.00%
blake3_inliner_zero 198 (+66) +50.00%
a_7_inliner_zero 198 (+66) +50.00%
brillig_blake2s_inliner_zero 198 (+66) +50.00%
global_slice_rc_regression_8259_inliner_min 337 (+112) +49.78%
array_to_slice_inliner_max 761 (+252) +49.51%
array_dedup_regression_inliner_max 387 (+128) +49.42%
array_dedup_regression_inliner_min 387 (+128) +49.42%
array_dedup_regression_inliner_zero 387 (+128) +49.42%
blake3_inliner_min 208 (+66) +46.48%
a_7_inliner_min 208 (+66) +46.48%
brillig_blake2s_inliner_min 208 (+66) +46.48%
reference_cancelling_inliner_max 121 (+38) +45.78%
reference_cancelling_inliner_min 121 (+38) +45.78%
reference_cancelling_inliner_zero 121 (+38) +45.78%
slice_dynamic_index_inliner_max 3,037 (+949) +45.45%
slice_dynamic_index_inliner_zero 3,037 (+949) +45.45%
slices_inliner_zero 2,381 (+728) +44.04%
while_loop_break_regression_8521_inliner_max 252 (+76) +43.18%
while_loop_break_regression_8521_inliner_min 252 (+76) +43.18%
while_loop_break_regression_8521_inliner_zero 252 (+76) +43.18%
comptime_variable_at_runtime_inliner_max 113 (+34) +43.04%
comptime_variable_at_runtime_inliner_min 113 (+34) +43.04%
comptime_variable_at_runtime_inliner_zero 113 (+34) +43.04%
array_to_slice_inliner_zero 973 (+291) +42.67%
slice_dynamic_index_inliner_min 3,178 (+949) +42.58%
global_consts_inliner_max 290 (+86) +42.16%
global_consts_inliner_zero 290 (+86) +42.16%
uhashmap_inliner_max 16,449 (+4,803) +41.24%
slices_inliner_min 3,046 (+875) +40.30%
uhashmap_inliner_zero 9,631 (+2,756) +40.09%
slice_loop_inliner_max 326 (+92) +39.32%
slices_inliner_max 2,357 (+663) +39.14%
uhashmap_inliner_min 10,084 (+2,794) +38.33%
conditional_regression_short_circuit_inliner_max 286 (+78) +37.50%
conditional_regression_short_circuit_inliner_zero 286 (+78) +37.50%
global_consts_inliner_min 316 (+86) +37.39%
loop_break_regression_8319_inliner_min 285 (+76) +36.36%
brillig_cow_assign_inliner_max 169 (+44) +35.20%
brillig_cow_assign_inliner_min 169 (+44) +35.20%
brillig_cow_assign_inliner_zero 169 (+44) +35.20%
struct_inputs_inliner_max 346 (+90) +35.16%
regression_1144_1169_2399_6609_inliner_max 1,203 (+312) +35.02%
regression_1144_1169_2399_6609_inliner_zero 1,203 (+312) +35.02%
lambda_from_dynamic_if_inliner_zero 588 (+152) +34.86%
reference_counts_inliner_max_inliner_min 1,412 (+364) +34.73%
reference_counts_inliner_0_inliner_min 1,412 (+364) +34.73%
reference_counts_inliner_min_inliner_min 1,412 (+364) +34.73%
reference_counts_slices_inliner_0_inliner_min 1,636 (+420) +34.54%
lambda_from_dynamic_if_inliner_min 596 (+152) +34.23%
to_be_bytes_inliner_max 254 (+64) +33.68%
to_be_bytes_inliner_zero 254 (+64) +33.68%
regression_4449_inliner_max 263 (+66) +33.50%
regression_4449_inliner_zero 263 (+66) +33.50%
conditional_regression_short_circuit_inliner_min 313 (+78) +33.19%
derive_inliner_zero 358 (+88) +32.59%
array_len_inliner_max 147 (+36) +32.43%
array_len_inliner_min 147 (+36) +32.43%
nested_array_in_slice_inliner_min 1,078 (+264) +32.43%
array_len_inliner_zero 147 (+36) +32.43%
nested_array_in_slice_inliner_zero 1,078 (+264) +32.43%
array_to_slice_inliner_min 1,179 (+288) +32.32%
to_be_bytes_inliner_min 263 (+64) +32.16%
hint_black_box_inliner_max 411 (+100) +32.15%
regression_4449_inliner_min 273 (+66) +31.88%
regression_6674_3_inliner_max 624 (+150) +31.65%
regression_6674_3_inliner_zero 624 (+150) +31.65%
fold_numeric_generic_poseidon_inliner_min 759 (+182) +31.54%
no_predicates_numeric_generic_poseidon_inliner_min 759 (+182) +31.54%
regression_1144_1169_2399_6609_inliner_min 1,304 (+312) +31.45%
struct_inputs_inliner_zero 327 (+78) +31.33%
brillig_cow_regression_inliner_max 1,578 (+376) +31.28%
brillig_cow_regression_inliner_zero 1,578 (+376) +31.28%
brillig_cow_regression_inliner_min 1,588 (+376) +31.02%
lambda_from_dynamic_if_inliner_max 642 (+152) +31.02%
slice_loop_inliner_zero 389 (+92) +30.98%
derive_inliner_min 451 (+106) +30.72%
slice_loop_inliner_min 399 (+92) +29.97%
struct_inputs_inliner_min 346 (+78) +29.10%
hint_black_box_inliner_zero 399 (+87) +27.88%
higher_order_functions_inliner_max 700 (+152) +27.74%
fold_complex_outputs_inliner_zero 555 (+120) +27.59%
hint_black_box_inliner_min 409 (+87) +27.02%
mutate_array_copy_inliner_zero 115 (+24) +26.37%
array_rc_regression_7842_inliner_zero 115 (+24) +26.37%
poseidon_bn254_hash_width_3_inliner_min 5,876 (+1,134) +23.91%
array_dynamic_nested_blackbox_input_inliner_max 392 (+74) +23.27%
array_dynamic_nested_blackbox_input_inliner_zero 392 (+74) +23.27%
array_dynamic_nested_blackbox_input_inliner_min 402 (+74) +22.56%
regression_6674_3_inliner_min 825 (+151) +22.40%
fold_numeric_generic_poseidon_inliner_max 777 (+142) +22.36%
no_predicates_numeric_generic_poseidon_inliner_max 777 (+142) +22.36%
array_sort_inliner_max 512 (+91) +21.62%
array_sort_inliner_zero 512 (+91) +21.62%
simple_2d_array_inliner_min 169 (+30) +21.58%
fold_complex_outputs_inliner_min 614 (+108) +21.34%
merkle_insert_inliner_max 655 (+110) +20.18%
array_sort_inliner_min 546 (+91) +20.00%
higher_order_functions_inliner_zero 779 (+128) +19.66%
nested_dyn_array_regression_5782_inliner_max 186 (+30) +19.23%
nested_dyn_array_regression_5782_inliner_min 186 (+30) +19.23%
nested_dyn_array_regression_5782_inliner_zero 186 (+30) +19.23%
no_predicates_numeric_generic_poseidon_inliner_zero 597 (+94) +18.69%
fold_numeric_generic_poseidon_inliner_zero 597 (+94) +18.69%
regression_5252_inliner_max 4,670 (+698) +17.57%
poseidon_bn254_hash_width_3_inliner_zero 5,213 (+768) +17.28%
regression_6674_2_inliner_zero 215 (+30) +16.22%
regression_6674_1_inliner_zero 215 (+30) +16.22%
global_array_rc_regression_8259_inliner_max 115 (+16) +16.16%
global_array_rc_regression_8259_inliner_min 115 (+16) +16.16%
global_array_rc_regression_8259_inliner_zero 115 (+16) +16.16%
a_7_function_inliner_max 610 (+84) +15.97%
regression_8729_inliner_max 147 (+20) +15.75%
regression_8729_inliner_min 147 (+20) +15.75%
regression_8729_inliner_zero 147 (+20) +15.75%
higher_order_functions_inliner_min 1,298 (+176) +15.69%
regression_8174_inliner_max 210 (+28) +15.38%
regression_8174_inliner_min 210 (+28) +15.38%
regression_8174_inliner_zero 210 (+28) +15.38%
brillig_arrays_inliner_max 130 (+16) +14.04%
brillig_arrays_inliner_zero 130 (+16) +14.04%
side_effects_constrain_array_inliner_min 131 (+16) +13.91%
side_effects_constrain_array_inliner_zero 131 (+16) +13.91%
poseidonsponge_x5_254_inliner_max 4,195 (+508) +13.78%
regression_6674_1_inliner_max 248 (+30) +13.76%
regression_6674_2_inliner_max 248 (+30) +13.76%
regression_6674_1_inliner_min 251 (+30) +13.57%
a_7_function_inliner_zero 502 (+60) +13.57%
a_7_function_inliner_min 512 (+60) +13.27%
regression_7062_inliner_max 111 (+13) +13.27%
regression_7062_inliner_min 111 (+13) +13.27%
regression_7062_inliner_zero 111 (+13) +13.27%
mutate_array_copy_inliner_min 156 (+18) +13.04%
array_rc_regression_7842_inliner_min 157 (+18) +12.95%
tuple_inputs_inliner_max 354 (+40) +12.74%
brillig_rc_regression_6123_inliner_min 161 (+18) +12.59%
regression_9312_inliner_max 233 (+26) +12.56%
regression_9312_inliner_min 233 (+26) +12.56%
regression_9312_inliner_zero 233 (+26) +12.56%
regression_6674_2_inliner_min 274 (+30) +12.30%
brillig_arrays_inliner_min 152 (+16) +11.76%
merkle_insert_inliner_zero 427 (+42) +10.91%
regression_8926_inliner_max 82 (+8) +10.81%
regression_8926_inliner_min 82 (+8) +10.81%
regression_8926_inliner_zero 82 (+8) +10.81%
a_6_array_inliner_max 377 (+36) +10.56%
a_6_array_inliner_min 377 (+36) +10.56%
a_6_array_inliner_zero 377 (+36) +10.56%
nested_if_then_block_same_cond_inliner_max 127 (+12) +10.43%
nested_if_then_block_same_cond_inliner_min 127 (+12) +10.43%
nested_if_then_block_same_cond_inliner_zero 127 (+12) +10.43%
embedded_curve_ops_inliner_max 235 (+22) +10.33%
embedded_curve_ops_inliner_zero 235 (+22) +10.33%
regression_9160_inliner_max 401 (+37) +10.16%
regression_9160_inliner_min 401 (+37) +10.16%
regression_9160_inliner_zero 401 (+37) +10.16%
generics_inliner_zero 176 (+16) +10.00%
fold_complex_outputs_inliner_max 397 (+36) +9.97%
generics_inliner_min 186 (+16) +9.41%
simple_shield_inliner_max 740 (+62) +9.14%
simple_shield_inliner_zero 740 (+62) +9.14%
empty_strings_in_composite_arrays_inliner_min 461 (+38) +8.98%
empty_strings_in_composite_arrays_inliner_zero 461 (+38) +8.98%
regression_9037_inliner_max 204 (+16) +8.51%
regression_9037_inliner_min 204 (+16) +8.51%
regression_9037_inliner_zero 204 (+16) +8.51%
fold_2_to_17_inliner_max 518 (+40) +8.37%
regression_struct_array_conditional_inliner_max 416 (+32) +8.33%
regression_struct_array_conditional_inliner_min 416 (+32) +8.33%
regression_struct_array_conditional_inliner_zero 416 (+32) +8.33%
tuple_inputs_inliner_min 314 (+24) +8.28%
tuple_inputs_inliner_zero 314 (+24) +8.28%
brillig_calls_array_inliner_max 106 (+8) +8.16%
brillig_calls_array_inliner_zero 106 (+8) +8.16%
poseidon_bn254_hash_width_3_inliner_max 5,242 (+384) +7.90%
embedded_curve_ops_inliner_min 302 (+22) +7.86%
regression_9116_inliner_max 227 (+16) +7.58%
regression_9116_inliner_zero 227 (+16) +7.58%
encrypted_log_regression_inliner_max 288 (+20) +7.46%
encrypted_log_regression_inliner_zero 288 (+20) +7.46%
bench_2_to_17_inliner_max 296 (+20) +7.25%
regression_9116_inliner_min 237 (+16) +7.24%
brillig_calls_array_inliner_min 120 (+8) +7.14%
encrypted_log_regression_inliner_min 301 (+20) +7.12%
regression_capacity_tracker_inliner_max 230 (+13) +5.99%
regression_capacity_tracker_inliner_min 230 (+13) +5.99%
regression_capacity_tracker_inliner_zero 230 (+13) +5.99%
brillig_pedersen_inliner_max 428 (+22) +5.42%
pedersen_check_inliner_max 428 (+22) +5.42%
brillig_pedersen_inliner_min 428 (+22) +5.42%
pedersen_check_inliner_min 428 (+22) +5.42%
brillig_pedersen_inliner_zero 428 (+22) +5.42%
pedersen_check_inliner_zero 428 (+22) +5.42%
nested_arrays_from_brillig_inliner_min 159 (+8) +5.30%
references_inliner_min 242 (+12) +5.22%
nested_array_in_slice_inliner_max 920 (+40) +4.55%
slice_coercion_inliner_max 348 (+15) +4.50%
slice_coercion_inliner_min 348 (+15) +4.50%
slice_coercion_inliner_zero 348 (+15) +4.50%
bench_2_to_17_inliner_zero 268 (+10) +3.88%
wildcard_type_inliner_max 271 (+6) +2.26%
wildcard_type_inliner_zero 271 (+6) +2.26%
wildcard_type_inliner_min 281 (+6) +2.18%
merkle_insert_inliner_min 387 (+8) +2.11%
conditional_1_inliner_min 492 (+10) +2.07%
conditional_1_inliner_zero 492 (+10) +2.07%
simple_shield_inliner_min 712 (+14) +2.01%
conditional_1_inliner_max 532 (+10) +1.92%
last_uses_regression_8935_inliner_min 467 (+8) +1.74%
array_oob_regression_7965_inliner_max 265 (+4) +1.53%
array_oob_regression_7965_inliner_min 265 (+4) +1.53%
array_oob_regression_7965_inliner_zero 265 (+4) +1.53%
modulus_inliner_min 1,723 (+13) +0.76%

@jfecher
Copy link
Contributor

jfecher commented Jul 28, 2025

Looks like we may need optimizations or explore alternate ways of fixing this. These brillig regressions seem prohibitive

@guipublic
Copy link
Contributor Author

I will close this PR once #9347 is merged.

@guipublic
Copy link
Contributor Author

closing because it is superseded by #9347

@guipublic guipublic closed this Aug 8, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ACIR != Brillig: Brillig modifies global array

2 participants