In binaryen optimized dart2wasm code I often encounter extremely redudant pop+pushes. See pop_push_issue.tar.gz:
(func $Sub1 (param $var0 i64) (result (ref $Base))
(local $var1 (ref $_DefaultMap&_HashFieldBase&MapMixin))
(local $var2 (ref $_DefaultMap&_HashFieldBase&MapMixin))
(local $var3 (ref $_DefaultMap&_HashFieldBase&MapMixin))
(local $var4 (ref null $#Top))
(local $var5 (ref $<Sub1.-constructor-context>))
(local $var6 (ref $Base))
i32.const 108
i32.const 0
i32.const 36
i32.const 0
local.get $var0
struct.new $<Sub1.-constructor-context>
local.tee $var5
global.get $global2
global.get $"C333 _FunctionType"
struct.new $#Closure-0-0
call $"new Base (initializer)"
local.set $var4
local.set $var3
local.set $var2
local.tee $var1
local.get $var2
local.get $var3
local.get $var4
struct.new $Base
global.get $"C347 \"Sub1(\""
i32.const 68
local.get $var5
struct.get $<Sub1.-constructor-context> $field0
struct.new $BoxedInt
global.get $"C17 \")\""
call $JSStringImpl._interpolate3
call $print
)
The $var[1-4]s are assigned once and loaded once and poped in one order and pushed in reverse, i.e. leaving the stack unchanged. So I'd assume this
call $"new Base (initializer)"
local.set $var4
local.set $var3
local.set $var2
local.tee $var1
local.get $var2
local.get $var3
local.get $var4
struct.new $Base
could be optimized to
call $"new Base (initializer)"
struct.new $Base
(if I don't misunderstand something entirely here)
The optimization was done via
% wasm-opt \
--enable-gc --enable-reference-types --enable-multivalue --enable-exception-handling \
--enable-nontrapping-float-to-int --enable-sign-ext --enable-bulk-memory --enable-threads \
--enable-simd '--no-inline=*<noInline>*' --traps-never-happen \
-g -Os -Os -Os -Os test.wasm -o test.OsOsOsOs.wasm
In binaryen optimized dart2wasm code I often encounter extremely redudant pop+pushes. See pop_push_issue.tar.gz:
The
$var[1-4]s are assigned once and loaded once and poped in one order and pushed in reverse, i.e. leaving the stack unchanged. So I'd assume thiscould be optimized to
(if I don't misunderstand something entirely here)
The optimization was done via