In the following module, $f always returns 1.
(module
(import "binaryen-intrinsics" "call.without.effects" (func $call-without-effects (param funcref) (result i32)))
(func $g (result i32)
(i32.const 1)
)
(func $f (result i32)
(return_call $call-without-effects (ref.func $g))
(unreachable)
)
)
But when optimized with bin/wasm-opt -all --vacuum a.wat -S -o - (from the current main), we end up with the following module which returns 0:
(module
(type $0 (func (result i32)))
(type $1 (func (param funcref) (result i32)))
(import "binaryen-intrinsics" "call.without.effects" (func $call-without-effects (type $1) (param funcref) (result i32)))
(func $g (type $0) (result i32)
(i32.const 1)
)
(func $f (type $0) (result i32)
(i32.const 0)
)
)
The problem is that call.without.effects doesn't set a branchesOut effect. Although call.without.effects assumes that the call body has no effects, the return_call does have the effect of branching out which isn't reflected correctly here.
In the following module,
$falways returns1.But when optimized with
bin/wasm-opt -all --vacuum a.wat -S -o -(from the current main), we end up with the following module which returns 0:The problem is that call.without.effects doesn't set a branchesOut effect. Although call.without.effects assumes that the call body has no effects, the return_call does have the effect of branching out which isn't reflected correctly here.