SIMD add not being optimized away
The i64x2.add in the following WAT isn't being optimized at all (build/bin/wasm-opt --enable-simd -O3 -S -o - test.wat):
(module
(export "v128-add" (func $v128-add))
(export "i64-add" (func $i64-add))
(func $v128-add (param v128) (result v128)
(i64x2.add (local.get 0) (v128.const i64x2 0 0))
)
(func $i64-add (param i64) (result i64)
(i64.add (local.get 0) (i64.const 0))
)
)
It outputs:
(module
(type $v128_=>_v128 (func (param v128) (result v128)))
(type $i64_=>_i64 (func (param i64) (result i64)))
(export "v128-add" (func $v128-add))
(export "i64-add" (func $i64-add))
(func $v128-add (; has Stack IR ;) (param $0 v128) (result v128)
(i64x2.add
(local.get $0)
(v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000)
)
)
(func $i64-add (; has Stack IR ;) (param $0 i64) (result i64)
(local.get $0)
)
)
I'd have expected that add to be optimized away into (local.get $0). How do I get that to work?
Binaryen's precompute and peephole optimization passes generally don't optimize SIMD very much, so I don't think there's anything you can do today to get this to work. There's no reason we shouldn't perform simple optimizations like this, though.
If someone wants to work on this, the right place is likely OptimizeInstructions, to add new peephole optimizations for those patterns. optimizeAddedConstants() is what does this for i32 and i64 today, and could maybe be generalized for SIMD.