diff options
author | Alon Zakai <azakai@google.com> | 2020-06-23 09:20:50 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-23 09:20:50 -0700 |
commit | 92423bebfc267373b28f5cf8c28e5711767adb4c (patch) | |
tree | 8676095dabcaeda54da8dc9c01871e525f5ba5ce /test/passes/asyncify.wast | |
parent | 63e580f737352d877fb90b4efca2eee89d780755 (diff) | |
download | binaryen-92423bebfc267373b28f5cf8c28e5711767adb4c.tar.gz binaryen-92423bebfc267373b28f5cf8c28e5711767adb4c.tar.bz2 binaryen-92423bebfc267373b28f5cf8c28e5711767adb4c.zip |
Asyncify liveness analysis (#2890)
This finds out which locals are live at call sites that might pause/resume,
which is the set of locals we need to actually save/load. That is, if a local
is not alive at any call site in the function, then it's value doesn't need to
stay alive while sleeping.
This saves about 10% of locals that are saved/loaded, and about 1.5%
in final code size.
Diffstat (limited to 'test/passes/asyncify.wast')
-rw-r--r-- | test/passes/asyncify.wast | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/test/passes/asyncify.wast b/test/passes/asyncify.wast new file mode 100644 index 000000000..281934aea --- /dev/null +++ b/test/passes/asyncify.wast @@ -0,0 +1,53 @@ +(module + (type $f (func (param i32))) + (memory 1 2) + (import "env" "import" (func $import)) + (import "env" "import2" (func $import2 (param i32))) + (table 1 1) + (func $liveness1 (param $live0 i32) (param $dead0 i32) + (local $live1 i32) + (local $dead1 i32) + (drop (local.get $dead0)) + (drop (local.get $dead1)) + (call $import) + (drop (local.get $live0)) + (drop (local.get $live1)) + ) + (func $liveness2 (param $live0 i32) (param $dead0 i32) + (local $live1 i32) + (local $dead1 i32) + (drop (local.get $dead0)) + (drop (local.get $dead1)) + (call $import) + (drop (local.get $live0)) + (drop (local.get $live1)) + ) + (func $liveness3 (param $live0 i32) (param $dead0 i32) + (local $live1 i32) + (local $dead1 i32) + (call $import) + (drop (local.get $live0)) + (call $import) + (drop (local.get $live1)) + ) + (func $liveness4 (param $live0 i32) (param $dead0 i32) + (if (i32.const 0) + (call $import) + ) + (drop (local.get $live0)) + ) + (func $liveness5 (param $dead0 i32) + (drop (local.get $dead0)) + (if (i32.const 0) + (call $import) ;; live before and after call, but not during + ) + (local.set $dead0 (i32.const 1)) + (drop (local.get $dead0)) + ) + (func $liveness-call-kills (param $live i32) + (call $import2 (local.get $live)) + ) + (func $liveness-indirect-kills (param $live0 i32) (param $live1 i32) + (call_indirect (type $f) (local.get $live0) (local.get $live1)) + ) +) |