summaryrefslogtreecommitdiff
path: root/test/lit/passes/vacuum-eh.wast
diff options
context:
space:
mode:
Diffstat (limited to 'test/lit/passes/vacuum-eh.wast')
-rw-r--r--test/lit/passes/vacuum-eh.wast235
1 files changed, 235 insertions, 0 deletions
diff --git a/test/lit/passes/vacuum-eh.wast b/test/lit/passes/vacuum-eh.wast
new file mode 100644
index 000000000..ec62f3c58
--- /dev/null
+++ b/test/lit/passes/vacuum-eh.wast
@@ -0,0 +1,235 @@
+;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited.
+;; RUN: wasm-opt %s --vacuum -all -S -o - | filecheck %s
+
+(module
+ ;; CHECK: (type $void (func))
+ (type $void (func))
+
+ ;; CHECK: (table $t 0 funcref)
+ (table $t 0 funcref)
+
+ ;; CHECK: (tag $e (param i32))
+ (tag $e (param i32))
+ ;; CHECK: (tag $e2 (param i32))
+ (tag $e2 (param i32))
+
+ ;; CHECK: (func $try_table-test (type $void)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: )
+ (func $try_table-test
+ ;; When try_table body does not throw, the try_table can be replaced with
+ ;; its body
+ (block $tryend
+ (drop
+ (block $catch (result i32)
+ (try_table (catch $e $catch)
+ (drop (i32.const 0))
+ )
+ (br $tryend)
+ )
+ )
+ )
+ )
+
+ ;; CHECK: (func $inner-try_table-catch_all-test (type $2) (result i32)
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $inner-catch
+ ;; CHECK-NEXT: (try_table (catch_all $inner-catch)
+ ;; CHECK-NEXT: (throw $e
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: )
+ (func $inner-try_table-catch_all-test (result i32)
+ (local $0 i32)
+ ;; The exception thrown in the inner try_table is caught by the inner
+ ;; catch_all, so the outer try_table body does not throw and the outer
+ ;; try_table can be removed
+ (block $outer-tryend
+ (drop
+ (block $outer-catch (result i32)
+ (try_table (catch $e $outer-catch)
+ (block $inner-catch
+ (try_table (catch_all $inner-catch)
+ (throw $e (i32.const 0))
+ )
+ (unreachable)
+ )
+ (return (i32.const 1))
+ )
+ (br $outer-tryend)
+ )
+ )
+ )
+ (i32.const 2)
+ )
+
+ ;; CHECK: (func $inner-try_table-catch-test (type $void)
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (block $outer-tryend
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (block $outer-catch (result i32)
+ ;; CHECK-NEXT: (try_table (catch $e $outer-catch)
+ ;; CHECK-NEXT: (block $inner-tryend
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (block $inner-catch (result i32)
+ ;; CHECK-NEXT: (try_table (catch $e $inner-catch)
+ ;; CHECK-NEXT: (throw $e2
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $0
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (br $outer-tryend)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $inner-try_table-catch-test (local $0 i32)
+ ;; The exception thrown in the inner try_table will not be caught by the
+ ;; inner catch, so the outer try_table cannot be removed.
+ (block $outer-tryend
+ (drop
+ (block $outer-catch (result i32)
+ (try_table (catch $e $outer-catch)
+ (block $inner-tryend
+ (drop
+ (block $inner-catch (result i32)
+ (try_table (catch $e $inner-catch)
+ (throw $e2 (i32.const 0))
+ )
+ (br $inner-tryend)
+ )
+ )
+ (local.set $0 (i32.const 1))
+ )
+ )
+ (br $outer-tryend)
+ )
+ )
+ )
+ )
+
+ ;; CHECK: (func $trivial-catch-all-of-throw (type $void)
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (block $catch
+ ;; CHECK-NEXT: (try_table (catch_all $catch)
+ ;; CHECK-NEXT: (throw $e
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block $catch0
+ ;; CHECK-NEXT: (try_table (catch_all $catch0)
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (local.get $0)
+ ;; CHECK-NEXT: (then
+ ;; CHECK-NEXT: (throw $e
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (else
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $trivial-catch-all-of-throw (local $0 i32)
+ ;; This try_table's body throws, but the catch_all catches it, so the entire
+ ;; try_table could be optimized out. We do this for `try` but not yet for
+ ;; `try_table`.
+ (block $catch
+ (try_table (catch_all $catch)
+ (throw $e (i32.const 0))
+ )
+ )
+ ;; Here we also have a possible trap, so we can't do it.
+ (block $catch
+ (try_table (catch_all $catch)
+ (if
+ (local.get $0)
+ (then
+ (throw $e (i32.const 0))
+ )
+ (else
+ (unreachable)
+ )
+ )
+ )
+ )
+ )
+
+ ;; CHECK: (func $throw (type $void)
+ ;; CHECK-NEXT: (throw $e
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $throw
+ ;; Helper for the tail call tests below.
+ (throw $e
+ (i32.const 0)
+ )
+ )
+
+ ;; CHECK: (func $return-call-catch (type $void)
+ ;; CHECK-NEXT: (return_call $throw)
+ ;; CHECK-NEXT: )
+ (func $return-call-catch
+ (block $catch
+ (try_table (catch_all $catch)
+ ;; This returns before it throws, so we can optimize out the surrounding
+ ;; try_table.
+ (return_call $throw)
+ )
+ )
+ )
+
+ ;; CHECK: (func $return-call-indirect-catch (type $void)
+ ;; CHECK-NEXT: (return_call_indirect $t (type $void)
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $return-call-indirect-catch
+ (block $catch
+ (try_table (catch_all $catch)
+ ;; This returns before it throws, so we can optimize out the surrounding
+ ;; try_table.
+ (return_call_indirect
+ (i32.const 0)
+ )
+ )
+ )
+ )
+
+ ;; CHECK: (func $return-call-ref-catch (type $void)
+ ;; CHECK-NEXT: (return_call_ref $void
+ ;; CHECK-NEXT: (ref.func $throw)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $return-call-ref-catch
+ (block $catch
+ (try_table (catch_all $catch)
+ ;; This returns before it throws, so we can optimize out the surrounding
+ ;; try_table.
+ (return_call_ref $void
+ (ref.func $throw)
+ )
+ )
+ )
+ )
+)