diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-10-26 20:24:09 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-10-26 20:24:09 -0700 |
commit | 7047ed25b3ca34aeddb67d0082a998fec0841372 (patch) | |
tree | 13be5c1c8bcc780347480f373c88cd1c3f2eb34b /test/passes/code-pushing.wast | |
parent | cf80d22442549707fb748e81028f41c88d41cb87 (diff) | |
download | binaryen-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.wast | 218 |
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 + ) +) + |