Conversation
|
| 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% |
Compilation times of external tests
BTW, looks like 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 |
External test benchmark diffCI run on
|
| 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
a4b6084 to
b190e76
Compare
f14708d to
36f6650
Compare
36f6650 to
062e016
Compare
Related to #14406 (comment).
Do not merge. This is just a test PR to evaluate how the
single-passsequence 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.