summaryrefslogtreecommitdiff
path: root/test/passes/asyncify.wast
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2020-06-23 09:20:50 -0700
committerGitHub <noreply@github.com>2020-06-23 09:20:50 -0700
commit92423bebfc267373b28f5cf8c28e5711767adb4c (patch)
tree8676095dabcaeda54da8dc9c01871e525f5ba5ce /test/passes/asyncify.wast
parent63e580f737352d877fb90b4efca2eee89d780755 (diff)
downloadbinaryen-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.wast53
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))
+ )
+)