Optimization: Fuse transitive copies
Robbepop opened this issue · 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 #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
- For reasons of observability this optimization can only be applied if the intermediate result is not the register of a local variable.
- 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 previouscopy
optimization, produces two transitivecopy2
instructions:
(func (param i32 i64) (result i32)
(local.get 0)
(local.get 1)
(block (param i32 i64) (result i32 i64)
(br 0)
)
(drop)
)
This issue was accidentally/automatically closed when merging #969.