wasmi icon indicating copy to clipboard operation
wasmi copied to clipboard

Optimization: Fuse transitive copies

Open Robbepop opened this issue 1 year ago • 1 comments

There are cases where 2 transitive copies are generated such as:

Instruction::copy(2, 0)
Instruction::copy(1, 2)

In this case it is possible to generate a single

Instruction::copy(1, 0)

instead.

An example input where this is currently happening with https://github.com/wasmi-labs/wasmi/pull/945 being merged is:

(module
    (func (param i32) (result i32)
        (local.get 0)
        (block (param i32) (result i32)
            (br 0)
        )
    )
)

Which results in the following Wasmi bytecode:

[
    Instruction::copy(2, 0),
    Instruction::copy(1, 2),
    Instruction::branch(BranchOffset::from(1)),
    Instruction::return_reg(1),
]

This issue wants to optimize the above Wasmi bytecode to the following:

[
    Instruction::copy(1, 0),
    Instruction::branch(BranchOffset::from(1)),
    Instruction::return_reg(1),
]

Note

  1. For reasons of observability this optimization can only be applied if the intermediate result is not the register of a local variable.
  2. The same kind of optimization can and should be applied to copy2 instructions with its two input and result values. An example Wasm input that, together with the previous copy optimization, produces two transitive copy2 instructions:
(func (param i32 i64) (result i32)
    (local.get 0)
    (local.get 1)
    (block (param i32 i64) (result i32 i64)
        (br 0)
    )
    (drop)
)

Robbepop avatar Mar 03 '24 18:03 Robbepop

This issue was accidentally/automatically closed when merging #969.

Robbepop avatar Apr 24 '24 17:04 Robbepop

I think this can be closed since the example .wat test cases no longer generate transitive copy instructions which could be fused since #1484 has been merged. Please re-open this issue if you think this is not true.

Robbepop avatar Aug 11 '25 12:08 Robbepop