summaryrefslogtreecommitdiff
path: root/test/passes/code-pushing_all-features.wast
diff options
context:
space:
mode:
Diffstat (limited to 'test/passes/code-pushing_all-features.wast')
-rw-r--r--test/passes/code-pushing_all-features.wast63
1 files changed, 63 insertions, 0 deletions
diff --git a/test/passes/code-pushing_all-features.wast b/test/passes/code-pushing_all-features.wast
new file mode 100644
index 000000000..f24456c6d
--- /dev/null
+++ b/test/passes/code-pushing_all-features.wast
@@ -0,0 +1,63 @@
+(module
+ (event $e (attr 0) (param i32))
+
+ (func $cant-push-past-call
+ (local $x i32)
+ (block $out
+ ;; This local.set cannot be pushed down, because the call below can throw
+ (local.set $x (i32.const 1))
+ (call $cant-push-past-call)
+ (drop (i32.const 1))
+ (br_if $out (i32.const 2))
+ (drop (local.get $x))
+ )
+ )
+
+ (func $cant-push-past-throw
+ (local $x i32)
+ (block $out
+ ;; This local.set cannot be pushed down, because there is 'throw' below
+ (local.set $x (i32.const 1))
+ (throw $e (i32.const 0))
+ (drop (i32.const 1))
+ (br_if $out (i32.const 2))
+ (drop (local.get $x))
+ )
+ )
+
+ (func $can-push-past-throw-within-try
+ (local $x i32)
+ (block $out
+ ;; This local.set can be pushed down, because the 'throw' below is going
+ ;; to be caught by the inner catch
+ (local.set $x (i32.const 1))
+ (try
+ (throw $e (i32.const 0))
+ (catch
+ (drop (exnref.pop))
+ )
+ )
+ (drop (i32.const 1))
+ (br_if $out (i32.const 2))
+ (drop (local.get $x))
+ )
+ )
+
+ (func $cant-push-past-rethrow-within-catch
+ (local $x i32)
+ (block $out
+ ;; This local.set cannot be pushed down, because there is 'rethrow' within
+ ;; the inner catch
+ (local.set $x (i32.const 1))
+ (try
+ (throw $e (i32.const 0))
+ (catch
+ (rethrow (exnref.pop))
+ )
+ )
+ (drop (i32.const 1))
+ (br_if $out (i32.const 2))
+ (drop (local.get $x))
+ )
+ )
+)