Description
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 ofPUSH1 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 ofPUSH1 0x1 PUSH1 0x1 PUSH1 0x[0-9A-F]* SHL SUB
, saves 3*247 bytes
PUSH1 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 gas -
Shifted mask generation
53 instances ofPUSH1 0x1 PUSH1 0x[0-9A-F]* SHL PUSH1 0x1 PUSH1 0x[0-9A-F]* SHL SUB
: saves 3*53
PUSH1 0x1 PUSH1 0x40 SHL PUSH1 0x1 PUSH1 0x80 SHL SUB
: 11 opcodes
->PUSH0 NOT PUSH1 0xC0 SHR PUSH1 0x40 SHL
: 8 opcodes
Motivation
Reduce both binary size and gas.
Specification
just an optimizer change, so no spec changes.
Backwards Compatibility
just an optimizer change, so backwards compatible.