Skip to content

[seqbench] single-pass sequence#14887

Closed
cameel wants to merge 3 commits intodevelopfrom
seqbench-sequence-single-pass
Closed

[seqbench] single-pass sequence#14887
cameel wants to merge 3 commits intodevelopfrom
seqbench-sequence-single-pass

Conversation

@cameel
Copy link
Collaborator

@cameel cameel commented Feb 26, 2024

Related to #14406 (comment).

Do not merge. This is just a test PR to evaluate how the single-pass sequence would affect costs in CI.

The sequence is a very simple modification and drastically improves optimization time. It seems to generally give a bit worse optimization. I want to see how much worse it is in practice outside of the testbench.

@cameel cameel self-assigned this Feb 26, 2024
@cameel
Copy link
Collaborator Author

cameel commented Feb 26, 2024

gas_diff_stats

File name IR optimized Legacy optimized Legacy
byte_array_to_storage_cleanup.sol 26%
externalContracts/ramanujan_pi.sol 14%
array/array_storage_push_empty_length_address.sol 13%
array/create_memory_array.sol 11%
array/array_storage_index_boundary_test.sol 11%
array/delete/bytes_delete_element.sol 10%
externalContracts/base64.sol 10%
abiEncoderV2/abi_encode_v2_in_function_inherited_in_v1_contract.sol 9% +0%
externalContracts/strings.sol 7% 1%
array/copying/storage_memory_packed_dyn.sol 7%
array/copying/array_copy_cleanup_uint40.sol 6%
array/copying/bytes_storage_to_storage.sol 6%
array/array_storage_length_access.sol 5%
libraries/internal_types_in_library.sol 5%
array/array_storage_push_pop.sol 4%
array/byte_array_transitional_2.sol 4%
array/constant_var_as_array_length.sol 4% +0%
array/fixed_arrays_as_return_type.sol 3% +0%
array/push/push_no_args_bytes.sol 4%
array/copying/cleanup_during_multi_element_per_slot_copy.sol 4%
constructor/constructor_static_array_argument.sol 3%
array/array_storage_index_zeroed_test.sol 3%
array/copying/array_copy_target_leftover.sol 3% +0%
array/function_array_cross_calls.sol 3% +0%
various/erc20.sol 4% -0%
externalContracts/deposit_contract.sol 2% 1%
array/array_storage_push_empty.sol 3%
events/event_indexed_string.sol 3% +0%
array/dynamic_arrays_in_storage.sol 2%
userDefinedValueType/erc20.sol 3% -0%
various/selfdestruct_pre_cancun_redeploy.sol 2% +0%
array/pop/array_pop_uint16_transition.sol 2%
array/pop/array_pop_uint24_transition.sol 1%
externalContracts/FixedFeeRegistrar.sol 1% +0%
array/copying/array_copy_clear_storage.sol 1%
events/event_dynamic_array_storage_v2.sol 1%
events/event_dynamic_array_storage.sol 1%
array/copying/array_of_struct_memory_to_storage.sol 1%
structs/conversion/recursive_storage_memory.sol 1%
functionCall/gas_and_value_brace_syntax.sol 1%
functionCall/gas_and_value_basic.sol 1%
externalContracts/snark.sol 1%
array/copying/array_of_struct_calldata_to_storage.sol 1%
array/array_storage_index_access.sol 1%
array/pop/byte_array_pop_long_storage_empty.sol 1%
constructor/constructor_arguments_external.sol 1%
array/copying/memory_dyn_2d_bytes_to_storage.sol 1%
immutable/use_scratch.sol 1%
array/copying/storage_memory_nested_from_pointer.sol 1%
array/copying/storage_memory_nested.sol 1%
array/push/byte_array_push_transition.sol 1%
array/fixed_arrays_in_constructors.sol 1% +0%
array/copying/array_copy_storage_storage_different_base_nested.sol 1%
isoltestTesting/balance_other_contract.sol 1%
various/value_complex.sol 1%
various/value_insane.sol 1%
abiEncoderV1/struct/struct_storage_ptr.sol 1% +0%
inheritance/value_for_constructor.sol 1%
array/push/array_push.sol 1%
various/negative_stack_height.sol 1%
structs/struct_delete_storage_with_array.sol 1%
array/copying/array_copy_storage_storage_different_base.sol 1%
functionCall/failed_create.sol 1%
functionCall/mapping_array_internal_argument.sol +0%
array/copying/array_copy_including_array.sol +0%
array/copying/array_copy_storage_storage_dynamic_dynamic.sol +0%
array/copying/array_copy_different_packing.sol +0%
array/dynamic_multi_array_cleanup.sol +0%
array/copying/array_of_structs_containing_arrays_calldata_to_storage.sol +0%
array/copying/copy_byte_array_to_storage.sol +0%
structs/memory_structs_nested_load.sol +0%
array/pop/array_pop_array_transition.sol +0%
state/blockhash_basic.sol +0%
constructor_with_params_diamond_inheritance.sol +0% +0%
events/event_dynamic_nested_array_storage_v2.sol +0%
various/destructuring_assignment.sol +0%
abiEncoderV2/abi_encode_calldata_slice.sol +0%
abiEncoderV1/abi_encode_calldata_slice.sol +0%
array/arrays_complex_from_and_to_storage.sol +0%
array/push/nested_bytes_push.sol +0%
structs/struct_memory_to_storage_function_ptr.sol +0%
constructor/bytes_in_constructors_packer.sol +0% +0%
array/reusing_memory.sol +0%
array/copying/array_copy_storage_storage_struct.sol +0%
constructor_with_params_inheritance.sol +0% +0%
array/copying/array_copy_target_simple.sol +0%
array/copying/array_copy_storage_to_memory_nested.sol +0%
various/selfdestruct_pre_cancun.sol +0%
array/push/array_push_struct.sol +0%
array/pop/byte_array_pop_long_storage_empty_garbage_ref.sol +0%
structs/copy_struct_array_from_storage.sol +0%
structs/struct_copy_via_local.sol +0%
array/copying/nested_array_element_storage_to_storage.sol +0%
array/push/array_push_struct_from_calldata.sol +0% +0%
libraries/using_library_mappings_return.sol +0%
constructor_with_params.sol +0%
smoke/constructor.sol +0%
array/fixed_array_cleanup.sol +0%
array/copying/copy_function_internal_storage_array.sol +0%
array/push/array_push_nested_from_calldata.sol +0%
array/copying/array_of_function_external_storage_to_storage_dynamic_different_mutability.sol +0%
structs/calldata/calldata_struct_with_nested_array_to_storage.sol +0% +0%
array/copying/function_type_array_to_storage.sol +0%
array/copying/array_nested_memory_to_storage.sol +0%
array/dynamic_array_cleanup.sol +0%
constructor_inheritance_init_order_2.sol +0%
constructor_inheritance_init_order.sol +0%
viaYul/copy_struct_invalid_ir_bug.sol +0%
array/copying/storage_memory_nested_struct.sol +0%
array/copying/array_of_structs_containing_arrays_memory_to_storage.sol +0%
array/copying/array_elements_to_mapping.sol +0%
array/copying/array_nested_calldata_to_storage.sol +0%
array/copying/copy_byte_array_in_struct_to_storage.sol +0% +0%
externalContracts/prbmath_unsigned.sol +0%
array/copying/copying_bytes_multiassign.sol +0%
structs/copy_substructures_to_mapping.sol +0% +0%
various/senders_balance.sol +0%
abiEncoderV2/abi_encode_v2.sol +0% -0%
functionCall/creation_function_call_with_args.sol +0%
functionCall/creation_function_call_with_salt.sol +0%
array/copying/elements_of_nested_array_of_structs_memory_to_storage.sol +0%
structs/copy_to_mapping.sol +0% +0%
array/copying/array_copy_target_simple_2.sol +0%
userDefinedValueType/calldata.sol +0%
structs/struct_copy.sol +0%
array/copying/elements_of_nested_array_of_structs_calldata_to_storage.sol +0%
array/copying/array_of_function_external_storage_to_storage_dynamic.sol +0% -0%
structs/copy_from_mapping.sol +0% +0%
structs/copy_substructures_from_mapping.sol +0% +0%
array/copying/nested_array_of_structs_storage_to_storage.sol +0%
libraries/using_library_mappings_public.sol +0%
various/selfdestruct_pre_cancun_multiple_beneficiaries.sol +0%
array/copying/nested_dynamic_array_element_calldata_to_storage.sol +0%
types/mapping/copy_from_mapping_to_mapping.sol +0% +0%
array/copying/array_copy_storage_storage_static_dynamic.sol +0%
immutable/multi_creation.sol +0%
libraries/using_library_structs.sol +0%
array/copying/nested_array_of_structs_calldata_to_storage.sol +0%
array/copying/array_copy_nested_array.sol +0%
array/copying/nested_array_of_structs_memory_to_storage.sol +0%
storage/packed_storage_structs_bytes.sol +0%
constructor/arrays_in_constructors.sol +0% +0%
array/copying/array_to_mapping.sol +0%
abiEncoderV1/abi_decode_v2_storage.sol +0%
array/copying/array_copy_storage_storage_dyn_dyn.sol +0%
array/copying/array_copy_calldata_storage.sol +0%
array/copying/calldata_array_to_mapping.sol +0%
various/skip_dynamic_types_for_structs.sol +0% +0%
array/push/push_no_args_2d.sol +0%
array/copying/array_copy_storage_storage_static_static.sol +0%
array/copying/calldata_array_dynamic_to_storage.sol +0%
array/copying/bytes_inside_mappings.sol +0%
array/invalid_encoding_for_storage_byte_array.sol +0%
structs/struct_containing_bytes_copy_and_delete.sol +0%
abiencodedecode/abi_decode_simple_storage.sol +0%
structs/structs.sol +0%
array/bytes_length_member.sol +0%
array/copying/storage_memory_nested_bytes.sol +0%
calldata/copy_from_calldata_removes_bytes_data.sol +0%
array/copying/copy_removes_bytes_data.sol +0%
array/copying/array_storage_multi_items_per_slot.sol +0%
array/array_memory_index_access.sol +0%
abiEncoderV2/calldata_overlapped_dynamic_arrays.sol +0%
abiEncoderV2/storage_array_encoding.sol +0% +0%
abiEncoderV2/calldata_array.sol +0%
salted_create/salted_create.sol +0%
storage/empty_nonempty_empty.sol -0%
events/event_emit_from_other_contract.sol -0%
array/pop/byte_array_pop_masking_long.sol -0%
salted_create/salted_create_with_value.sol -0%
constructor/bytes_in_constructors_unpacker.sol -1%
various/create_calldata.sol -1%
externalContracts/prbmath_signed.sol -1%
various/address_code.sol -1%
functionCall/external_call_to_nonexisting_debugstrings.sol -2%
functionCall/external_call_to_nonexisting.sol -3%

@cameel
Copy link
Collaborator Author

cameel commented Feb 26, 2024

Compilation times of external tests

Test develop this PR Change
t_native_test_ext_zeppelin 4:18 3:31 -18%
t_native_test_ext_yield_liquidator 0:35 0:30 -17%
t_native_test_ext_uniswap 1:29 0:48 -46%
t_native_test_ext_perpetual_pools 1:12 0:59 -18%
t_native_test_ext_ens 0:42 0:35 -17%
t_native_test_ext_elementfi 3:18 2:15 -32%
t_native_test_ext_brink 0:05 0:06 +20%
t_ems_compile_ext_colony 1:41 1:40 -1%

BTW, looks like t_native_test_ext_prb_math does not print timing info now that it has been rewritten in Python so I cannot compare its compilation time.

IIRC with Colony there was some issue with migration and I'm not sure the numbers I'm getting are really for IR. I don't think it's worth looking into for now, I'd just ignored it.

Overall this looks promising. 17-46% improvement if we ignore brink where running time it's so short that the difference is likely just noise.

@cameel
Copy link
Collaborator Author

cameel commented Feb 26, 2024

External test benchmark diff

CI run on develop vs CI run on seqbench-sequence-single-pass

ir-no-optimize

project bytecode_size deployment_gas method_gas
brink 0%
colony 0%
elementfi 0%
ens 0%
perpetual-pools 0% +0% +0.02% ❌
uniswap 0% -0% -0%
yield_liquidator 0% 0% 0%
zeppelin

ir-optimize-evm+yul

project bytecode_size deployment_gas method_gas
brink +1.32% ❌
colony +0.22% ❌
elementfi -3.59% ✅
ens +4.55% ❌ -1.45% ✅ +0.13% ❌
perpetual-pools -0.79% ✅ -1.08% ✅ +0.48% ❌
uniswap +1.18% ❌ +1.18% ❌ +0.12% ❌
yield_liquidator +1.67% ❌ +1.2% ❌ +0.34% ❌
zeppelin +0.54% ❌ -0.32% ✅ +0.15% ❌

ir-optimize-evm-only

project bytecode_size deployment_gas method_gas
brink 0%
colony 0%
elementfi 0%
ens 0% 0% 0%
perpetual-pools 0% +0% +0.01% ❌
uniswap 0% -0% -0%
yield_liquidator 0% +0% 0%
zeppelin 0%

legacy-no-optimize

project bytecode_size deployment_gas method_gas
brink 0%
colony 0%
elementfi 0%
ens 0%
perpetual-pools 0% -0% +0.03% ❌
uniswap 0% -0% -0%
yield_liquidator 0% +0% +0%
zeppelin 0% -0% -0.02% ✅

legacy-optimize-evm+yul

project bytecode_size deployment_gas method_gas
brink 0%
colony +0.22% ❌
elementfi +0.17% ❌
ens +0.09% ❌ -0.31% ✅ +0%
perpetual-pools +0.05% ❌ +0.05% ❌ +0.16% ❌
uniswap +0.1% ❌ +0.09% ❌ +0.09% ❌
yield_liquidator +0.29% ❌ +0.27% ❌ +0.01% ❌
zeppelin +0.02% ❌ +0.02% ❌ +0.07% ❌

legacy-optimize-evm-only

project bytecode_size deployment_gas method_gas
brink 0%
colony 0%
elementfi 0%
ens 0% -0% 0%
perpetual-pools 0% -0% -0%
uniswap 0% -0% +0%
yield_liquidator 0% -0% +0%
zeppelin 0% -0% +0.02% ❌

!V = version mismatch
!B = no value in the "before" version
!A = no value in the "after" version
!T = one or both values were not numeric and could not be compared
-0 = very small negative value rounded to zero
+0 = very small positive value rounded to zero

@cameel cameel force-pushed the seqbench-sequence-single-pass branch from a4b6084 to b190e76 Compare February 26, 2024 19:48
@cameel cameel force-pushed the seqbench-sequence-single-pass branch 2 times, most recently from f14708d to 36f6650 Compare February 26, 2024 20:44
@cameel cameel force-pushed the seqbench-sequence-single-pass branch from 36f6650 to 062e016 Compare February 26, 2024 21:06
@cameel cameel closed this Feb 26, 2024
@cameel cameel deleted the seqbench-sequence-single-pass branch February 26, 2024 21:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant