Mask generation optimization #15870
Labels
feature
nice to have
We don’t see a good reason not to have it but won’t go out of our way to implement it.
optimizer
Abstract
I have a large contract compiled with
--via-ir --optimize --optimize-runs 2
Looking at the generated opcodes I see the following mask generation patterns that can be optimized:
I've implemented a change to the constant optimizer for this here: develop...moh-eulith:solidity:mask_generation
May I create a PR from the above?
Mask generation
15 instances of
PUSH1 0x1 PUSH1 0x1 PUSH1 0x[0-9A-F]* SHL SUB NOT
(sub case of the next one)
->
PUSH0 NOT PUSH1 $bits SHL
(saves 4 bytes)247 instances of
PUSH1 0x1 PUSH1 0x1 PUSH1 0x[0-9A-F]* SHL SUB
, saves 3*247 bytesPUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB
: 8 bytes, 3 + 3 + 3 + 3 + 3 = 15 gas->
PUSH0 NOT PUSH1 0xC0 SHR
: 5 bytes, 2 + 3 + 3 + 3 = 11 gasShifted mask generation
53 instances of
PUSH1 0x1 PUSH1 0x[0-9A-F]* SHL PUSH1 0x1 PUSH1 0x[0-9A-F]* SHL SUB
: saves 3*53PUSH1 0x1 PUSH1 0x40 SHL PUSH1 0x1 PUSH1 0x80 SHL SUB
: 11 opcodes->
PUSH0 NOT PUSH1 0xC0 SHR PUSH1 0x40 SHL
: 8 opcodesMotivation
Reduce both binary size and gas.
Specification
just an optimizer change, so no spec changes.
Backwards Compatibility
just an optimizer change, so backwards compatible.
The text was updated successfully, but these errors were encountered: