Skip to content

Mask generation optimization #15870

Open
Open
@moh-eulith

Description

@moh-eulith

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?

  1. 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 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

  2. Shifted mask generation
    53 instances of PUSH1 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    featurenice to haveWe don’t see a good reason not to have it but won’t go out of our way to implement it.optimizer

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions