Skip to content

fix: do "Brillig Array Gets" optimization during brillig gen#8532

Closed
asterite wants to merge 2 commits intomasterfrom
ab/brillig-array-get-optimization-not-an-ssa-optimization
Closed

fix: do "Brillig Array Gets" optimization during brillig gen#8532
asterite wants to merge 2 commits intomasterfrom
ab/brillig-array-get-optimization-not-an-ssa-optimization

Conversation

@asterite
Copy link
Collaborator

Description

Problem

Resolves #8462

Summary

If this optimization is done as an SSA optimization then there's no way the SSA interpreter can run on the code with indexes having shifted.

Additional Context

For this program:

unconstrained fn main(x: [Field; 3]) -> pub Field {
    x[0]
}

The old brillig was:

GlobalInit(Id(0)):
  RETURN
Function(Id(0), None):
  CALL Procedure(CheckMaxStackDepth)
Function(Id(0), Some(Id(0))):
  CONST S2 = 1
  S4 = S1 + S2
  LOAD S3 = *S4
  MOV S1, S3
  RETURN

The new brillig is:

GlobalInit(Id(0)):
  RETURN
Function(Id(0), None):
  CALL Procedure(CheckMaxStackDepth)
Function(Id(0), Some(Id(0))):
  CONST S2 = 0
  CONST S4 = 1
  S5 = S1 + S4
  LOAD S3 = *S5
  MOV S1, S3
  RETURN

I understand that now we need a new constant for the offset (S4 now, previously S2) though I don't understand where the CONST S2 = 0 comes from 🤔

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: 2bce10ef5bca1dae6665348c6c9f30cc9dce2ecb, compared to commit: e2a52b793ebcfbb3b0b39ec4978918179b3d33f7

🧾 Summary (10% most significant diffs)

Program Brillig opcodes (+/-) %
nested_arrays_from_brillig_inliner_min +13 ❌ +8.78%
brillig_calls_array_inliner_zero +13 ❌ +7.74%
brillig_calls_array_inliner_min +13 ❌ +6.67%
nested_arrays_from_brillig_inliner_max +4 ❌ +6.35%
nested_arrays_from_brillig_inliner_zero +4 ❌ +6.35%
simple_2d_array_inliner_max +6 ❌ +5.88%
simple_2d_array_inliner_zero +6 ❌ +5.88%
simple_2d_array_inliner_min +8 ❌ +5.76%
regression_5045_inliner_min +9 ❌ +5.45%
regression_7744_inliner_max +3 ❌ +5.36%
regression_7744_inliner_zero +3 ❌ +5.36%
inline_decompose_hint_brillig_call_inliner_min +9 ❌ +5.08%
fold_complex_outputs_inliner_min +26 ❌ +5.08%
integer_array_indexing_inliner_max +3 ❌ +5.00%
integer_array_indexing_inliner_min +3 ❌ +5.00%
integer_array_indexing_inliner_zero +3 ❌ +5.00%
embedded_curve_ops_inliner_min +21 ❌ +4.93%
regression_unsafe_no_predicates_inliner_min +4 ❌ +4.60%
to_bytes_integration_inliner_min +8 ❌ +4.55%
array_rc_regression_7842_inliner_zero +4 ❌ +4.40%
mutate_array_copy_inliner_zero +4 ❌ +4.40%
assign_mutation_in_lvalue_inliner_min +4 ❌ +4.30%
brillig_calls_array_inliner_max +4 ❌ +4.08%
simple_radix_inliner_max +3 ❌ +4.00%
regression_7744_inliner_min +3 ❌ +4.00%
simple_radix_inliner_min +3 ❌ +4.00%
simple_radix_inliner_zero +3 ❌ +4.00%

Full diff report 👇
Program Brillig opcodes (+/-) %
nested_arrays_from_brillig_inliner_min 161 (+13) +8.78%
brillig_calls_array_inliner_zero 181 (+13) +7.74%
brillig_calls_array_inliner_min 208 (+13) +6.67%
nested_arrays_from_brillig_inliner_max 67 (+4) +6.35%
nested_arrays_from_brillig_inliner_zero 67 (+4) +6.35%
simple_2d_array_inliner_max 108 (+6) +5.88%
simple_2d_array_inliner_zero 108 (+6) +5.88%
simple_2d_array_inliner_min 147 (+8) +5.76%
regression_5045_inliner_min 174 (+9) +5.45%
regression_7744_inliner_max 59 (+3) +5.36%
regression_7744_inliner_zero 59 (+3) +5.36%
inline_decompose_hint_brillig_call_inliner_min 186 (+9) +5.08%
fold_complex_outputs_inliner_min 538 (+26) +5.08%
integer_array_indexing_inliner_max 63 (+3) +5.00%
integer_array_indexing_inliner_min 63 (+3) +5.00%
integer_array_indexing_inliner_zero 63 (+3) +5.00%
embedded_curve_ops_inliner_min 447 (+21) +4.93%
regression_unsafe_no_predicates_inliner_min 91 (+4) +4.60%
to_bytes_integration_inliner_min 184 (+8) +4.55%
array_rc_regression_7842_inliner_zero 95 (+4) +4.40%
mutate_array_copy_inliner_zero 95 (+4) +4.40%
assign_mutation_in_lvalue_inliner_min 97 (+4) +4.30%
brillig_calls_array_inliner_max 102 (+4) +4.08%
simple_radix_inliner_max 78 (+3) +4.00%
regression_7744_inliner_min 78 (+3) +4.00%
simple_radix_inliner_min 78 (+3) +4.00%
simple_radix_inliner_zero 78 (+3) +4.00%
struct_array_inputs_inliner_max 53 (+2) +3.92%
struct_array_inputs_inliner_min 53 (+2) +3.92%
struct_array_inputs_inliner_zero 53 (+2) +3.92%
brillig_constant_reference_regression_inliner_max 82 (+3) +3.80%
brillig_constant_reference_regression_inliner_min 82 (+3) +3.80%
brillig_constant_reference_regression_inliner_zero 82 (+3) +3.80%
brillig_arrays_inliner_min 143 (+5) +3.62%
brillig_cow_regression_inliner_min 1,317 (+45) +3.54%
brillig_arrays_inliner_max 120 (+4) +3.45%
brillig_arrays_inliner_zero 120 (+4) +3.45%
brillig_cow_regression_inliner_max 1,248 (+41) +3.40%
brillig_cow_regression_inliner_zero 1,248 (+41) +3.40%
embedded_curve_ops_inliner_max 246 (+8) +3.36%
embedded_curve_ops_inliner_zero 246 (+8) +3.36%
to_bytes_integration_inliner_max 94 (+3) +3.30%
to_bytes_integration_inliner_zero 94 (+3) +3.30%
main_bool_arg_inliner_max 65 (+2) +3.17%
main_bool_arg_inliner_min 65 (+2) +3.17%
main_bool_arg_inliner_zero 65 (+2) +3.17%
multi_scalar_mul_inliner_max 299 (+9) +3.10%
multi_scalar_mul_inliner_zero 299 (+9) +3.10%
fold_complex_outputs_inliner_max 366 (+11) +3.10%
if_else_chain_inliner_max 103 (+3) +3.00%
if_else_chain_inliner_min 103 (+3) +3.00%
if_else_chain_inliner_zero 103 (+3) +3.00%
fold_complex_outputs_inliner_zero 454 (+13) +2.95%
trait_impl_base_type_inliner_min 236 (+6) +2.61%
import_inliner_min 123 (+3) +2.50%
global_consts_inliner_max 209 (+5) +2.45%
global_consts_inliner_zero 209 (+5) +2.45%
conditional_regression_421_inliner_max 85 (+2) +2.41%
conditional_regression_421_inliner_min 85 (+2) +2.41%
conditional_regression_421_inliner_zero 85 (+2) +2.41%
brillig_calls_conditionals_inliner_min 128 (+3) +2.40%
brillig_calls_conditionals_inliner_zero 128 (+3) +2.40%
brillig_calls_conditionals_inliner_max 131 (+3) +2.34%
regression_5045_inliner_max 89 (+2) +2.30%
regression_5045_inliner_zero 89 (+2) +2.30%
struct_inputs_inliner_min 274 (+6) +2.24%
mutate_array_copy_inliner_min 143 (+3) +2.14%
array_rc_regression_7842_inliner_min 144 (+3) +2.13%
to_be_bytes_inliner_max 195 (+4) +2.09%
to_be_bytes_inliner_zero 195 (+4) +2.09%
global_consts_inliner_min 244 (+5) +2.09%
simple_array_param_inliner_max 49 (+1) +2.08%
simple_array_param_inliner_min 49 (+1) +2.08%
simple_array_param_inliner_zero 49 (+1) +2.08%
regression_7062_inliner_max 100 (+2) +2.04%
pedersen_commitment_inliner_min 150 (+3) +2.04%
regression_7062_inliner_min 100 (+2) +2.04%
regression_7062_inliner_zero 100 (+2) +2.04%
conditional_regression_661_inliner_zero 151 (+3) +2.03%
pedersen_check_inliner_min 474 (+9) +1.94%
brillig_pedersen_inliner_min 474 (+9) +1.94%
nested_dyn_array_regression_5782_inliner_max 159 (+3) +1.92%
nested_dyn_array_regression_5782_inliner_min 159 (+3) +1.92%
regression_4088_inliner_min 53 (+1) +1.92%
nested_dyn_array_regression_5782_inliner_zero 159 (+3) +1.92%
to_be_bytes_inliner_min 214 (+4) +1.90%
regression_mem_op_predicate_inliner_max 110 (+2) +1.85%
regression_mem_op_predicate_inliner_min 110 (+2) +1.85%
regression_mem_op_predicate_inliner_zero 110 (+2) +1.85%
simple_shield_inliner_min 726 (+13) +1.82%
conditional_2_inliner_max 112 (+2) +1.82%
conditional_2_inliner_zero 112 (+2) +1.82%
regression_11294_inliner_max 225 (+4) +1.81%
regression_11294_inliner_zero 225 (+4) +1.81%
regression_7143_inliner_max 59 (+1) +1.72%
type_aliases_inliner_max 59 (+1) +1.72%
regression_7143_inliner_min 59 (+1) +1.72%
type_aliases_inliner_min 59 (+1) +1.72%
regression_7143_inliner_zero 59 (+1) +1.72%
type_aliases_inliner_zero 59 (+1) +1.72%
conditional_regression_661_inliner_max 120 (+2) +1.69%
conditional_1_inliner_min 545 (+9) +1.68%
conditional_1_inliner_zero 545 (+9) +1.68%
multi_scalar_mul_inliner_min 309 (+5) +1.64%
array_to_slice_inliner_max 497 (+8) +1.64%
conditional_1_inliner_max 571 (+9) +1.60%
brillig_cow_assign_inliner_max 127 (+2) +1.60%
brillig_cow_assign_inliner_min 127 (+2) +1.60%
brillig_cow_assign_inliner_zero 127 (+2) +1.60%
slice_dynamic_index_inliner_max 2,099 (+30) +1.45%
slice_dynamic_index_inliner_zero 2,099 (+30) +1.45%
nested_array_dynamic_inliner_min 1,426 (+20) +1.42%
nested_array_dynamic_inliner_zero 1,426 (+20) +1.42%
array_to_slice_inliner_min 915 (+12) +1.33%
slices_inliner_zero 1,680 (+22) +1.33%
slice_dynamic_index_inliner_min 2,303 (+30) +1.32%
conditional_2_inliner_min 155 (+2) +1.31%
conditional_regression_661_inliner_min 156 (+2) +1.30%
slices_inliner_max 1,718 (+22) +1.30%
nested_array_dynamic_inliner_max 1,724 (+22) +1.29%
generics_inliner_zero 162 (+2) +1.25%
pedersen_commitment_inliner_max 165 (+2) +1.23%
pedersen_commitment_inliner_zero 165 (+2) +1.23%
regression_8236_inliner_max 83 (+1) +1.22%
regression_8236_inliner_min 83 (+1) +1.22%
regression_8236_inliner_zero 83 (+1) +1.22%
struct_inputs_inliner_zero 252 (+3) +1.20%
brillig_pedersen_inliner_zero 428 (+5) +1.18%
pedersen_check_inliner_zero 428 (+5) +1.18%
struct_inputs_inliner_max 259 (+3) +1.17%
slices_inliner_min 2,246 (+25) +1.13%
regression_7612_inliner_max 90 (+1) +1.12%
regression_7612_inliner_min 90 (+1) +1.12%
regression_7612_inliner_zero 90 (+1) +1.12%
7_function_inliner_zero 463 (+5) +1.09%
fold_distinct_return_inliner_min 95 (+1) +1.06%
regression_11294_inliner_min 383 (+4) +1.06%
regression_bignum_inliner_max 294 (+3) +1.03%
regression_bignum_inliner_zero 294 (+3) +1.03%
7_function_inliner_min 616 (+6) +0.98%
pedersen_check_inliner_max 415 (+4) +0.97%
brillig_pedersen_inliner_max 415 (+4) +0.97%
simple_shield_inliner_zero 627 (+6) +0.97%
derive_inliner_zero 324 (+3) +0.93%
regression_bignum_inliner_min 330 (+3) +0.92%
array_to_slice_inliner_zero 669 (+6) +0.90%
array_len_inliner_max 112 (+1) +0.90%
array_len_inliner_zero 112 (+1) +0.90%
simple_shield_inliner_max 689 (+6) +0.88%
nested_if_then_block_same_cond_inliner_max 116 (+1) +0.87%
nested_if_then_block_same_cond_inliner_min 116 (+1) +0.87%
nested_if_then_block_same_cond_inliner_zero 116 (+1) +0.87%
generics_inliner_min 241 (+2) +0.84%
array_len_inliner_min 122 (+1) +0.83%
array_if_cond_simple_inliner_max 131 (+1) +0.77%
array_if_cond_simple_inliner_min 131 (+1) +0.77%
array_if_cond_simple_inliner_zero 131 (+1) +0.77%
7_function_inliner_max 531 (+4) +0.76%
references_inliner_min 404 (+3) +0.75%
encrypted_log_regression_inliner_max 270 (+2) +0.75%
encrypted_log_regression_inliner_zero 270 (+2) +0.75%
array_sort_inliner_max 421 (+3) +0.72%
array_sort_inliner_zero 421 (+3) +0.72%
brillig_entry_points_regression_8069_inliner_max 141 (+1) +0.71%
brillig_entry_points_regression_8069_inliner_min 141 (+1) +0.71%
brillig_entry_points_regression_8069_inliner_zero 141 (+1) +0.71%
encrypted_log_regression_inliner_min 283 (+2) +0.71%
array_dynamic_inliner_max 289 (+2) +0.70%
array_dynamic_inliner_zero 289 (+2) +0.70%
regression_1144_1169_2399_6609_inliner_max 897 (+6) +0.67%
array_dynamic_inliner_min 300 (+2) +0.67%
regression_1144_1169_2399_6609_inliner_zero 932 (+6) +0.65%
array_sort_inliner_min 488 (+3) +0.62%
databus_composite_calldata_inliner_max 342 (+2) +0.59%
databus_composite_calldata_inliner_min 342 (+2) +0.59%
databus_composite_calldata_inliner_zero 342 (+2) +0.59%
6_array_inliner_max 343 (+2) +0.59%
derive_inliner_min 529 (+3) +0.57%
regression_1144_1169_2399_6609_inliner_min 1,062 (+6) +0.57%
fold_2_to_17_inliner_zero 358 (+2) +0.56%
reference_counts_slices_inliner_0_inliner_min 1,075 (+6) +0.56%
brillig_block_parameter_liveness_inliner_max 903 (+5) +0.56%
brillig_block_parameter_liveness_inliner_min 903 (+5) +0.56%
brillig_block_parameter_liveness_inliner_zero 903 (+5) +0.56%
higher_order_functions_inliner_max 551 (+3) +0.55%
reference_counts_inliner_max_inliner_min 939 (+5) +0.54%
reference_counts_inliner_0_inliner_min 939 (+5) +0.54%
reference_counts_inliner_min_inliner_min 939 (+5) +0.54%
6_array_inliner_zero 386 (+2) +0.52%
reference_counts_slices_inliner_0_inliner_zero 967 (+5) +0.52%
databus_two_calldata_inliner_max 194 (+1) +0.52%
databus_two_calldata_inliner_min 194 (+1) +0.52%
databus_two_calldata_inliner_zero 194 (+1) +0.52%
conditional_regression_short_circuit_inliner_max 205 (+1) +0.49%
6_array_inliner_min 419 (+2) +0.48%
regression_6674_3_inliner_zero 421 (+2) +0.48%
conditional_regression_short_circuit_inliner_zero 212 (+1) +0.47%
fold_numeric_generic_poseidon_inliner_max 641 (+3) +0.47%
no_predicates_numeric_generic_poseidon_inliner_max 641 (+3) +0.47%
reference_counts_inliner_0_inliner_zero 855 (+4) +0.47%
reference_counts_inliner_max_inliner_zero 855 (+4) +0.47%
reference_counts_inliner_min_inliner_zero 855 (+4) +0.47%
regression_capacity_tracker_inliner_max 217 (+1) +0.46%
regression_capacity_tracker_inliner_min 217 (+1) +0.46%
regression_capacity_tracker_inliner_zero 217 (+1) +0.46%
higher_order_functions_inliner_zero 709 (+3) +0.42%
conditional_regression_short_circuit_inliner_min 239 (+1) +0.42%
reference_only_used_as_alias_inliner_min 240 (+1) +0.42%
fold_2_to_17_inliner_max 482 (+2) +0.42%
regression_6674_3_inliner_max 482 (+2) +0.42%
fold_numeric_generic_poseidon_inliner_zero 507 (+2) +0.40%
no_predicates_numeric_generic_poseidon_inliner_zero 507 (+2) +0.40%
higher_order_functions_inliner_min 1,274 (+5) +0.39%
bench_2_to_17_inliner_zero 260 (+1) +0.39%
array_oob_regression_7965_inliner_max 262 (+1) +0.38%
array_oob_regression_7965_inliner_min 262 (+1) +0.38%
array_oob_regression_7965_inliner_zero 262 (+1) +0.38%
wildcard_type_inliner_max 266 (+1) +0.38%
wildcard_type_inliner_zero 266 (+1) +0.38%
pedersen_hash_inliner_max 269 (+1) +0.37%
pedersen_hash_inliner_zero 269 (+1) +0.37%
wildcard_type_inliner_min 276 (+1) +0.36%
bench_2_to_17_inliner_max 278 (+1) +0.36%
merkle_insert_inliner_max 557 (+2) +0.36%
no_predicates_numeric_generic_poseidon_inliner_min 581 (+2) +0.35%
pedersen_hash_inliner_min 293 (+1) +0.34%
uhashmap_inliner_max 11,625 (+39) +0.34%
fold_numeric_generic_poseidon_inliner_min 601 (+2) +0.33%
hashmap_inliner_max 17,347 (+57) +0.33%
bench_2_to_17_inliner_min 334 (+1) +0.30%
fold_2_to_17_inliner_min 365 (+1) +0.27%
nested_array_in_slice_inliner_min 733 (+2) +0.27%
nested_array_in_slice_inliner_zero 733 (+2) +0.27%
regression_struct_array_conditional_inliner_max 387 (+1) +0.26%
regression_struct_array_conditional_inliner_min 387 (+1) +0.26%
regression_struct_array_conditional_inliner_zero 387 (+1) +0.26%
merkle_insert_inliner_zero 391 (+1) +0.26%
merkle_insert_inliner_min 409 (+1) +0.25%
strings_inliner_min 1,047 (+2) +0.19%
slice_regex_inliner_zero 1,647 (+3) +0.18%
uhashmap_inliner_zero 6,909 (+11) +0.16%
uhashmap_inliner_min 7,574 (+12) +0.16%
poseidon_bn254_hash_width_3_inliner_zero 4,456 (+7) +0.16%
slice_regex_inliner_min 2,016 (+3) +0.15%
poseidon_bn254_hash_width_3_inliner_min 4,763 (+7) +0.15%
poseidon_bn254_hash_width_3_inliner_max 4,869 (+7) +0.14%
nested_array_in_slice_inliner_max 763 (+1) +0.13%
regression_5252_inliner_max 3,978 (+5) +0.13%
hashmap_inliner_zero 7,838 (+9) +0.11%
hashmap_inliner_min 8,852 (+10) +0.11%
poseidonsponge_x5_254_inliner_max 3,690 (+4) +0.11%
regression_5252_inliner_zero 3,227 (+3) +0.09%
poseidonsponge_x5_254_inliner_zero 2,892 (+2) +0.07%
regression_5252_inliner_min 3,396 (+2) +0.06%
poseidonsponge_x5_254_inliner_min 3,018 (+1) +0.03%

@github-actions
Copy link
Contributor

Changes to number of Brillig opcodes executed

Generated at commit: 2bce10ef5bca1dae6665348c6c9f30cc9dce2ecb, compared to commit: e2a52b793ebcfbb3b0b39ec4978918179b3d33f7

🧾 Summary (10% most significant diffs)

Program Brillig opcodes (+/-) %
brillig_calls_array_inliner_zero +16 ❌ +8.04%
array_rc_regression_7842_inliner_zero +8 ❌ +7.21%
mutate_array_copy_inliner_zero +8 ❌ +7.21%
multi_scalar_mul_inliner_max +2,634 ❌ +7.15%
multi_scalar_mul_inliner_zero +2,634 ❌ +7.15%
nested_arrays_from_brillig_inliner_min +13 ❌ +6.88%
brillig_calls_array_inliner_min +16 ❌ +6.72%
multi_scalar_mul_inliner_min +4,390 ❌ +5.88%
embedded_curve_ops_inliner_min +26 ❌ +5.36%
simple_2d_array_inliner_max +6 ❌ +4.96%
simple_2d_array_inliner_zero +6 ❌ +4.96%
simple_2d_array_inliner_min +8 ❌ +4.88%
inline_decompose_hint_brillig_call_inliner_min +9 ❌ +4.81%
simple_radix_inliner_max +3 ❌ +4.29%
simple_radix_inliner_min +3 ❌ +4.29%
simple_radix_inliner_zero +3 ❌ +4.29%
brillig_calls_array_inliner_max +4 ❌ +4.17%
nested_arrays_from_brillig_inliner_max +4 ❌ +4.17%
nested_arrays_from_brillig_inliner_zero +4 ❌ +4.17%
fold_complex_outputs_inliner_min +30 ❌ +4.14%
integer_array_indexing_inliner_max +3 ❌ +4.05%
integer_array_indexing_inliner_min +3 ❌ +4.05%
integer_array_indexing_inliner_zero +3 ❌ +4.05%
assign_mutation_in_lvalue_inliner_min +4 ❌ +3.96%
brillig_constant_reference_regression_inliner_max +3 ❌ +3.80%
brillig_constant_reference_regression_inliner_min +3 ❌ +3.80%
brillig_constant_reference_regression_inliner_zero +3 ❌ +3.80%

Full diff report 👇
Program Brillig opcodes (+/-) %
brillig_calls_array_inliner_zero 215 (+16) +8.04%
array_rc_regression_7842_inliner_zero 119 (+8) +7.21%
mutate_array_copy_inliner_zero 119 (+8) +7.21%
multi_scalar_mul_inliner_max 39,462 (+2,634) +7.15%
multi_scalar_mul_inliner_zero 39,462 (+2,634) +7.15%
nested_arrays_from_brillig_inliner_min 202 (+13) +6.88%
brillig_calls_array_inliner_min 254 (+16) +6.72%
multi_scalar_mul_inliner_min 79,014 (+4,390) +5.88%
embedded_curve_ops_inliner_min 511 (+26) +5.36%
simple_2d_array_inliner_max 127 (+6) +4.96%
simple_2d_array_inliner_zero 127 (+6) +4.96%
simple_2d_array_inliner_min 172 (+8) +4.88%
inline_decompose_hint_brillig_call_inliner_min 196 (+9) +4.81%
simple_radix_inliner_max 73 (+3) +4.29%
simple_radix_inliner_min 73 (+3) +4.29%
simple_radix_inliner_zero 73 (+3) +4.29%
brillig_calls_array_inliner_max 100 (+4) +4.17%
nested_arrays_from_brillig_inliner_max 100 (+4) +4.17%
nested_arrays_from_brillig_inliner_zero 100 (+4) +4.17%
fold_complex_outputs_inliner_min 754 (+30) +4.14%
integer_array_indexing_inliner_max 77 (+3) +4.05%
integer_array_indexing_inliner_min 77 (+3) +4.05%
integer_array_indexing_inliner_zero 77 (+3) +4.05%
assign_mutation_in_lvalue_inliner_min 105 (+4) +3.96%
brillig_constant_reference_regression_inliner_max 82 (+3) +3.80%
brillig_constant_reference_regression_inliner_min 82 (+3) +3.80%
brillig_constant_reference_regression_inliner_zero 82 (+3) +3.80%
embedded_curve_ops_inliner_max 228 (+8) +3.64%
embedded_curve_ops_inliner_zero 228 (+8) +3.64%
mutate_array_copy_inliner_min 184 (+6) +3.37%
array_rc_regression_7842_inliner_min 185 (+6) +3.35%
if_else_chain_inliner_max 100 (+3) +3.09%
if_else_chain_inliner_min 100 (+3) +3.09%
if_else_chain_inliner_zero 100 (+3) +3.09%
main_bool_arg_inliner_max 68 (+2) +3.03%
main_bool_arg_inliner_min 68 (+2) +3.03%
main_bool_arg_inliner_zero 68 (+2) +3.03%
brillig_arrays_inliner_min 174 (+5) +2.96%
regression_7062_inliner_max 72 (+2) +2.86%
regression_7062_inliner_min 72 (+2) +2.86%
regression_7062_inliner_zero 72 (+2) +2.86%
brillig_arrays_inliner_max 145 (+4) +2.84%
brillig_arrays_inliner_zero 145 (+4) +2.84%
generics_inliner_zero 228 (+6) +2.70%
brillig_calls_conditionals_inliner_max 115 (+3) +2.68%
fold_complex_outputs_inliner_zero 668 (+17) +2.61%
fold_complex_outputs_inliner_max 457 (+11) +2.47%
import_inliner_min 129 (+3) +2.38%
trait_impl_base_type_inliner_min 259 (+6) +2.37%
nested_dyn_array_regression_5782_inliner_max 131 (+3) +2.34%
nested_dyn_array_regression_5782_inliner_min 131 (+3) +2.34%
nested_dyn_array_regression_5782_inliner_zero 131 (+3) +2.34%
struct_array_inputs_inliner_max 88 (+2) +2.33%
struct_array_inputs_inliner_min 88 (+2) +2.33%
struct_array_inputs_inliner_zero 88 (+2) +2.33%
conditional_regression_421_inliner_max 91 (+2) +2.25%
conditional_regression_421_inliner_min 91 (+2) +2.25%
conditional_regression_421_inliner_zero 91 (+2) +2.25%
brillig_calls_conditionals_inliner_min 184 (+4) +2.22%
brillig_calls_conditionals_inliner_zero 184 (+4) +2.22%
generics_inliner_min 327 (+6) +1.87%
regression_7143_inliner_max 55 (+1) +1.85%
regression_7143_inliner_min 55 (+1) +1.85%
regression_7143_inliner_zero 55 (+1) +1.85%
simple_array_param_inliner_max 56 (+1) +1.82%
simple_array_param_inliner_min 56 (+1) +1.82%
simple_array_param_inliner_zero 56 (+1) +1.82%
regression_4088_inliner_min 57 (+1) +1.79%
conditional_regression_661_inliner_max 116 (+2) +1.75%
type_aliases_inliner_max 62 (+1) +1.64%
type_aliases_inliner_min 62 (+1) +1.64%
type_aliases_inliner_zero 62 (+1) +1.64%
brillig_pedersen_inliner_min 808 (+13) +1.64%
pedersen_check_inliner_min 808 (+13) +1.64%
pedersen_commitment_inliner_min 187 (+3) +1.63%
conditional_regression_661_inliner_zero 145 (+2) +1.40%
fold_distinct_return_inliner_min 75 (+1) +1.35%
conditional_regression_661_inliner_min 160 (+2) +1.27%
regression_mem_op_predicate_inliner_max 95 (+1) +1.06%
regression_mem_op_predicate_inliner_min 95 (+1) +1.06%
regression_mem_op_predicate_inliner_zero 95 (+1) +1.06%
pedersen_commitment_inliner_max 195 (+2) +1.04%
pedersen_commitment_inliner_zero 195 (+2) +1.04%
regression_8236_inliner_max 106 (+1) +0.95%
regression_8236_inliner_min 106 (+1) +0.95%
regression_8236_inliner_zero 106 (+1) +0.95%
brillig_entry_points_regression_8069_inliner_max 3,528 (+31) +0.89%
brillig_entry_points_regression_8069_inliner_min 3,528 (+31) +0.89%
brillig_entry_points_regression_8069_inliner_zero 3,528 (+31) +0.89%
struct_inputs_inliner_min 570 (+5) +0.88%
slices_inliner_max 2,518 (+22) +0.88%
conditional_2_inliner_max 115 (+1) +0.88%
conditional_2_inliner_zero 115 (+1) +0.88%
simple_shield_inliner_min 2,205 (+19) +0.87%
array_to_slice_inliner_max 955 (+8) +0.84%
nested_array_dynamic_inliner_max 2,661 (+22) +0.83%
slices_inliner_zero 2,803 (+22) +0.79%
brillig_pedersen_inliner_zero 643 (+5) +0.78%
pedersen_check_inliner_zero 643 (+5) +0.78%
regression_bignum_inliner_max 425 (+3) +0.71%
regression_bignum_inliner_zero 425 (+3) +0.71%
nested_array_dynamic_inliner_min 2,887 (+20) +0.70%
nested_array_dynamic_inliner_zero 2,887 (+20) +0.70%
brillig_pedersen_inliner_max 597 (+4) +0.67%
pedersen_check_inliner_max 597 (+4) +0.67%
conditional_2_inliner_min 150 (+1) +0.67%
slice_dynamic_index_inliner_max 4,644 (+30) +0.65%
slice_dynamic_index_inliner_zero 4,644 (+30) +0.65%
slices_inliner_min 3,905 (+25) +0.64%
regression_bignum_inliner_min 477 (+3) +0.63%
slice_dynamic_index_inliner_min 4,884 (+30) +0.62%
array_to_slice_inliner_min 1,974 (+12) +0.61%
struct_inputs_inliner_max 515 (+3) +0.59%
nested_if_then_block_same_cond_inliner_max 178 (+1) +0.56%
nested_if_then_block_same_cond_inliner_min 178 (+1) +0.56%
nested_if_then_block_same_cond_inliner_zero 178 (+1) +0.56%
brillig_block_parameter_liveness_inliner_max 931 (+5) +0.54%
brillig_block_parameter_liveness_inliner_min 931 (+5) +0.54%
brillig_block_parameter_liveness_inliner_zero 931 (+5) +0.54%
7_function_inliner_zero 2,172 (+11) +0.51%
7_function_inliner_min 2,385 (+12) +0.51%
array_dynamic_inliner_max 406 (+2) +0.50%
array_len_inliner_max 203 (+1) +0.50%
array_dynamic_inliner_zero 406 (+2) +0.50%
array_len_inliner_zero 203 (+1) +0.50%
references_inliner_min 618 (+3) +0.49%
array_dynamic_inliner_min 421 (+2) +0.48%
slice_regex_inliner_zero 4,009 (+19) +0.48%
array_len_inliner_min 217 (+1) +0.46%
conditional_1_inliner_max 1,892 (+8) +0.42%
conditional_1_inliner_min 1,932 (+8) +0.42%
conditional_1_inliner_zero 1,932 (+8) +0.42%
brillig_cow_assign_inliner_max 485 (+2) +0.41%
brillig_cow_assign_inliner_min 485 (+2) +0.41%
brillig_cow_assign_inliner_zero 485 (+2) +0.41%
regression_5252_inliner_max 754,180 (+3,003) +0.40%
poseidonsponge_x5_254_inliner_max 151,729 (+600) +0.40%
array_sort_inliner_min 1,068 (+4) +0.38%
simple_shield_inliner_max 2,140 (+8) +0.38%
reference_only_used_as_alias_inliner_min 271 (+1) +0.37%
simple_shield_inliner_zero 2,172 (+8) +0.37%
struct_inputs_inliner_zero 544 (+2) +0.37%
global_consts_inliner_max 1,383 (+5) +0.36%
global_consts_inliner_zero 1,383 (+5) +0.36%
higher_order_functions_inliner_max 847 (+3) +0.36%
regression_11294_inliner_max 1,130 (+4) +0.36%
regression_11294_inliner_zero 1,130 (+4) +0.36%
global_consts_inliner_min 1,434 (+5) +0.35%
poseidon_bn254_hash_width_3_inliner_max 136,687 (+474) +0.35%
databus_composite_calldata_inliner_max 582 (+2) +0.34%
databus_composite_calldata_inliner_min 582 (+2) +0.34%
databus_composite_calldata_inliner_zero 582 (+2) +0.34%
array_sort_inliner_max 898 (+3) +0.34%
array_sort_inliner_zero 898 (+3) +0.34%
to_bytes_integration_inliner_min 2,395 (+8) +0.34%
regression_5252_inliner_zero 906,876 (+3,003) +0.33%
array_to_slice_inliner_zero 1,818 (+6) +0.33%
poseidonsponge_x5_254_inliner_zero 182,167 (+600) +0.33%
regression_5252_inliner_min 918,786 (+3,000) +0.33%
poseidonsponge_x5_254_inliner_min 184,083 (+599) +0.33%
array_if_cond_simple_inliner_max 311 (+1) +0.32%
array_if_cond_simple_inliner_min 311 (+1) +0.32%
array_if_cond_simple_inliner_zero 311 (+1) +0.32%
array_oob_regression_7965_inliner_max 315 (+1) +0.32%
array_oob_regression_7965_inliner_min 315 (+1) +0.32%
array_oob_regression_7965_inliner_zero 315 (+1) +0.32%
poseidon_bn254_hash_width_3_inliner_zero 167,099 (+474) +0.28%
poseidon_bn254_hash_width_3_inliner_min 168,338 (+474) +0.28%
databus_two_calldata_inliner_max 366 (+1) +0.27%
databus_two_calldata_inliner_min 366 (+1) +0.27%
databus_two_calldata_inliner_zero 366 (+1) +0.27%
regression_1144_1169_2399_6609_inliner_max 2,263 (+6) +0.27%
regression_1144_1169_2399_6609_inliner_zero 2,305 (+6) +0.26%
wildcard_type_inliner_max 394 (+1) +0.25%
wildcard_type_inliner_zero 394 (+1) +0.25%
pedersen_hash_inliner_max 403 (+1) +0.25%
pedersen_hash_inliner_zero 403 (+1) +0.25%
regression_11294_inliner_min 1,629 (+4) +0.25%
wildcard_type_inliner_min 408 (+1) +0.25%
higher_order_functions_inliner_zero 1,228 (+3) +0.24%
higher_order_functions_inliner_min 2,103 (+5) +0.24%
encrypted_log_regression_inliner_max 849 (+2) +0.24%
encrypted_log_regression_inliner_zero 849 (+2) +0.24%
encrypted_log_regression_inliner_min 866 (+2) +0.23%
slice_regex_inliner_min 8,244 (+19) +0.23%
regression_1144_1169_2399_6609_inliner_min 2,628 (+6) +0.23%
pedersen_hash_inliner_min 468 (+1) +0.21%
to_be_bytes_inliner_max 1,880 (+4) +0.21%
to_be_bytes_inliner_zero 1,880 (+4) +0.21%
to_be_bytes_inliner_min 1,907 (+4) +0.21%
merkle_insert_inliner_min 2,884 (+6) +0.21%
merkle_insert_inliner_max 2,984 (+6) +0.20%
7_function_inliner_max 2,065 (+4) +0.19%
merkle_insert_inliner_zero 3,120 (+6) +0.19%
regression_capacity_tracker_inliner_max 570 (+1) +0.18%
regression_capacity_tracker_inliner_min 570 (+1) +0.18%
regression_capacity_tracker_inliner_zero 570 (+1) +0.18%
regression_6674_3_inliner_zero 1,157 (+2) +0.17%
hashmap_inliner_max 51,603 (+87) +0.17%
regression_6674_3_inliner_max 1,214 (+2) +0.17%
nested_array_in_slice_inliner_min 1,253 (+2) +0.16%
nested_array_in_slice_inliner_zero 1,253 (+2) +0.16%
to_bytes_integration_inliner_max 2,071 (+3) +0.15%
to_bytes_integration_inliner_zero 2,071 (+3) +0.15%
6_array_inliner_max 1,429 (+2) +0.14%
hashmap_inliner_zero 72,371 (+87) +0.12%
conditional_regression_short_circuit_inliner_max 935 (+1) +0.11%
conditional_regression_short_circuit_inliner_zero 935 (+1) +0.11%
6_array_inliner_zero 1,897 (+2) +0.11%
nested_array_in_slice_inliner_max 963 (+1) +0.10%
conditional_regression_short_circuit_inliner_min 974 (+1) +0.10%
hashmap_inliner_min 87,026 (+88) +0.10%
uhashmap_inliner_max 144,561 (+139) +0.10%
regression_struct_array_conditional_inliner_max 1,137 (+1) +0.09%
regression_struct_array_conditional_inliner_min 1,137 (+1) +0.09%
regression_struct_array_conditional_inliner_zero 1,137 (+1) +0.09%
strings_inliner_min 2,465 (+2) +0.08%
6_array_inliner_min 2,482 (+2) +0.08%
fold_numeric_generic_poseidon_inliner_max 3,778 (+3) +0.08%
no_predicates_numeric_generic_poseidon_inliner_max 3,778 (+3) +0.08%
uhashmap_inliner_zero 177,019 (+140) +0.08%
uhashmap_inliner_min 195,400 (+141) +0.07%
fold_numeric_generic_poseidon_inliner_zero 4,466 (+3) +0.07%
no_predicates_numeric_generic_poseidon_inliner_zero 4,466 (+3) +0.07%
no_predicates_numeric_generic_poseidon_inliner_min 4,706 (+3) +0.06%
fold_numeric_generic_poseidon_inliner_min 4,734 (+3) +0.06%
brillig_cow_regression_inliner_min 197,076 (+45) +0.02%
brillig_cow_regression_inliner_max 194,391 (+41) +0.02%
brillig_cow_regression_inliner_zero 194,391 (+41) +0.02%
fold_2_to_17_inliner_max 792,415 (+2) +0.00%
bench_2_to_17_inliner_max 431,327 (+1) +0.00%
bench_2_to_17_inliner_zero 470,542 (+1) +0.00%
fold_2_to_17_inliner_zero 1,034,762 (+2) +0.00%
fold_2_to_17_inliner_min 1,072,184 (+2) +0.00%
bench_2_to_17_inliner_min 563,700 (+1) +0.00%
derive_inliner_zero 345 (-2) -0.58%

@asterite asterite requested a review from vezenovm May 15, 2025 16:16
@asterite
Copy link
Collaborator Author

@vezenovm Mainly asking a review from you in case you know why the regressions or happenning, or why there's a const S2 = 0 that's unused.

Looking at brillig-gen, I see that convert_ssa_value will check if the value is a numeric constant, and if so check if we already have an allocation for that value. That's based on ValueId but I wonder if it could be based on F for numeric constants, then multiple values with the same constant would end up with the same allocation... (I guess we'd need to track that separately from the dictionary that tracks by ValueId). But I don't know if this is what would revert the performance regression here.

@vezenovm
Copy link
Contributor

vezenovm commented May 15, 2025

Mainly asking a review from you in case you know why the regressions or happenning, or why there's a const S2 = 0 that's unused.

My suspicion is that we perform constant allocation analysis before generating Brillig (see brillig_gen/constant_allocation.rs). We see that the zero is used according to constant analysis so we initialize the constant according to the ConstantAllocation struct we build before generating the Brillig blocks. However, we actually do not ever use the zero as we simply increment it and use the incremented value. That way to determine constants for allocation was part of what motivated making this optimization an SSA pass originally.

@asterite
Copy link
Collaborator Author

Thank you!

Closing this as this is probably not the right approach for this. I'll try adding a flag to ArrayGet so that it knows it has been offseted.

@asterite asterite closed this May 15, 2025
@asterite asterite deleted the ab/brillig-array-get-optimization-not-an-ssa-optimization branch May 15, 2025 16:52
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.

SSA Interpreter error: "index out of bounds" after "Brillig Array Get Optimizations:"

2 participants