summaryrefslogtreecommitdiff
path: root/test/passes/code-pushing.wast
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-10-26 20:24:09 -0700
committerGitHub <noreply@github.com>2016-10-26 20:24:09 -0700
commit7047ed25b3ca34aeddb67d0082a998fec0841372 (patch)
tree13be5c1c8bcc780347480f373c88cd1c3f2eb34b /test/passes/code-pushing.wast
parentcf80d22442549707fb748e81028f41c88d41cb87 (diff)
downloadbinaryen-7047ed25b3ca34aeddb67d0082a998fec0841372.tar.gz
binaryen-7047ed25b3ca34aeddb67d0082a998fec0841372.tar.bz2
binaryen-7047ed25b3ca34aeddb67d0082a998fec0841372.zip
Code pushing (#807)
Push code forward, potentially letting it not execute
Diffstat (limited to 'test/passes/code-pushing.wast')
-rw-r--r--test/passes/code-pushing.wast218
1 files changed, 218 insertions, 0 deletions
diff --git a/test/passes/code-pushing.wast b/test/passes/code-pushing.wast
new file mode 100644
index 000000000..ca973e182
--- /dev/null
+++ b/test/passes/code-pushing.wast
@@ -0,0 +1,218 @@
+(module
+ (func $push1
+ (local $x i32)
+ (block $out
+ (set_local $x (i32.const 1))
+ (br_if $out (i32.const 2))
+ (drop (get_local $x))
+ )
+ )
+ (func $push2
+ (local $x i32)
+ (local $y i32)
+ (block $out
+ (set_local $x (i32.const 1))
+ (set_local $y (i32.const 3))
+ (br_if $out (i32.const 2))
+ (drop (get_local $x))
+ (drop (get_local $y))
+ )
+ )
+ (func $push1-twice
+ (local $x i32)
+ (block $out
+ (set_local $x (i32.const 1))
+ (br_if $out (i32.const 2))
+ (br_if $out (i32.const 3))
+ (drop (get_local $x))
+ )
+ )
+ (func $push1-twiceb
+ (local $x i32)
+ (block $out
+ (set_local $x (i32.const 1))
+ (br_if $out (i32.const 2))
+ (nop)
+ (br_if $out (i32.const 3))
+ (drop (get_local $x))
+ )
+ )
+ (func $push2-twice
+ (local $x i32)
+ (local $y i32)
+ (block $out
+ (set_local $x (i32.const 1))
+ (set_local $y (i32.const 3))
+ (br_if $out (i32.const 2))
+ (br_if $out (i32.const 2))
+ (drop (get_local $x))
+ (drop (get_local $y))
+ )
+ )
+ (func $ignore-last
+ (local $x i32)
+ (block $out
+ (set_local $x (i32.const 1))
+ (br_if $out (i32.const 2))
+ )
+ )
+ (func $ignore-last2
+ (local $x i32)
+ (block $out
+ (set_local $x (i32.const 1))
+ (nop)
+ (nop)
+ (br_if $out (i32.const 2))
+ )
+ )
+ (func $push-if
+ (local $x i32)
+ (block $out
+ (set_local $x (i32.const 1))
+ (if (i32.const 2) (nop))
+ (drop (get_local $x))
+ )
+ )
+ (func $push-dropped (result i32)
+ (local $x i32)
+ (block $out i32
+ (set_local $x (i32.const 1))
+ (drop (br_if $out (i32.const 2) (i32.const 3)))
+ (drop (get_local $x))
+ (i32.const 4)
+ )
+ )
+ (func $push-past-stuff
+ (local $x i32)
+ (block $out
+ (set_local $x (i32.const 1))
+ (call $push-past-stuff)
+ (drop (i32.const 1))
+ (br_if $out (i32.const 2))
+ (drop (get_local $x))
+ )
+ )
+ (func $fail-then-push
+ (local $x i32)
+ (local $y i32)
+ (block $out
+ (set_local $x (i32.const 1))
+ (drop (get_local $x))
+ (br_if $out (i32.const 2))
+ (set_local $y (i32.const 1))
+ (br_if $out (i32.const 3))
+ (drop (get_local $x))
+ (drop (get_local $y))
+ )
+ )
+ ;; and now for stuff that should *not* be pushed
+ (func $used
+ (local $x i32)
+ (block $out
+ (set_local $x (i32.const 1))
+ (br_if $out (get_local $x))
+ (drop (get_local $x))
+ )
+ )
+ (func $not-sfa
+ (local $x i32)
+ (set_local $x (i32.const 1))
+ (block $out
+ (set_local $x (i32.const 1))
+ (br_if $out (i32.const 2))
+ (drop (get_local $x))
+ )
+ )
+ (func $not-sfa2
+ (local $x i32)
+ (drop (get_local $x))
+ (block $out
+ (set_local $x (i32.const 1))
+ (br_if $out (i32.const 2))
+ (drop (get_local $x))
+ )
+ )
+ (func $used-out
+ (local $x i32)
+ (block $out
+ (set_local $x (i32.const 1))
+ (br_if $out (i32.const 2))
+ (drop (get_local $x))
+ )
+ (drop (get_local $x))
+ )
+ (func $value-might-interfere ;; but doesn't
+ (local $x i32)
+ (block $out
+ (set_local $x (i32.load (i32.const 0)))
+ (br_if $out (i32.const 2))
+ (drop (get_local $x))
+ )
+ )
+ (func $value-interferes
+ (local $x i32)
+ (block $out
+ (set_local $x (i32.load (i32.const 0)))
+ (i32.store (i32.const 1) (i32.const 3))
+ (br_if $out (i32.const 2))
+ (drop (get_local $x))
+ )
+ )
+ (func $value-interferes-accumulation
+ (local $x i32)
+ (block $out
+ (set_local $x (i32.load (i32.const 0)))
+ (nop)
+ (i32.store (i32.const 1) (i32.const 3))
+ (nop)
+ (br_if $out (i32.const 2))
+ (drop (get_local $x))
+ )
+ )
+ (func $value-interferes-in-pushpoint
+ (local $x i32)
+ (block $out
+ (set_local $x (i32.load (i32.const 0)))
+ (if (i32.const 1)
+ (call $value-interferes)
+ )
+ (drop (get_local $x))
+ )
+ )
+ (func $values-might-interfere ;; but don't, as we keep the order
+ (local $x i32)
+ (local $y i32)
+ (block $out
+ (set_local $x (call $push-dropped))
+ (set_local $y (call $push-dropped))
+ (br_if $out (i32.const 2))
+ (drop (get_local $x))
+ (drop (get_local $y))
+ )
+ )
+ (func $unpushed-interferes
+ (local $x i32)
+ (local $y i32)
+ (block $out
+ (set_local $x (call $push-dropped))
+ (set_local $y (call $push-dropped))
+ (br_if $out (i32.const 2))
+ (drop (get_local $x))
+ (drop (get_local $y))
+ )
+ (drop (get_local $y)) ;; $y can't be pushed, so x can't be
+ )
+ (func $unpushed-ignorable
+ (local $x i32)
+ (local $y i32)
+ (block $out
+ (set_local $x (call $push-dropped))
+ (set_local $y (call $push-dropped))
+ (br_if $out (i32.const 2))
+ (drop (get_local $x))
+ (drop (get_local $y))
+ )
+ (drop (get_local $x)) ;; $x can't be pushed, but y doesn't care
+ )
+)
+