diff options
author | Heejin Ahn <aheejin@gmail.com> | 2024-01-31 17:17:07 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-31 17:17:07 -0800 |
commit | 19fb1f44ccf91cf8d7268a047eb33b11b25fc1f0 (patch) | |
tree | ef09db7c2383ebfd9557d0a8ae73e7b5758771a5 | |
parent | b5938499432a1251d94e8e7b534f14919fdaf81c (diff) | |
download | binaryen-19fb1f44ccf91cf8d7268a047eb33b11b25fc1f0.tar.gz binaryen-19fb1f44ccf91cf8d7268a047eb33b11b25fc1f0.tar.bz2 binaryen-19fb1f44ccf91cf8d7268a047eb33b11b25fc1f0.zip |
[EH] Test StackIR's local2stack on translator output (#6264)
This adds `STACKIR-OPT` filecheck lines to `translate-to-new-eh.wast`
to see if StackIR's `local2stack` optimization successfully removes some
of unnecessary `local.set`/`local.get`s.
While supporting the whole Binayren optimization pipeline for the new EH
instructions is not the goal for the very near-term future, StackIR's
`local2stack` optimization can help with a very common pattern generated
by this translator, which is:
```wast
(try $l
(do ... )
(catch_all
(call $destructor)
(rethrow $l)
)
)
```
is translated to
```wast
(block $outer
(local.set $exn ;; can be optimized away
(block $catch_all (result exnref)
(try_table (catch_all_ref $catch_all)
...
)
(br $outer)
)
)
(call $destructor)
(throw_ref
(local.get $exn) ;; can be optimized away
)
)
```
Here we don't really need `local.set $exn` and `local.get $exn`, and
these can be optimized away using StackIR's local2stack. After
optimizing them away in Stack IR, the code can be like
```wast
block $outer
block $catch_all (result exnref)
try_table (catch_all_ref $catch_all)
...
end
br $outer
end
call $destructor
throw_ref
end
```
This optimization alone reduces the code size increased caused by
translating significantly. For Adobe Photoshop, the code size increase
goes down from 4.2% to 2.8%, and for Binaryen, it goes down from 3.8% to
2.0%.
-rw-r--r-- | test/lit/passes/translate-to-new-eh.wast | 649 |
1 files changed, 649 insertions, 0 deletions
diff --git a/test/lit/passes/translate-to-new-eh.wast b/test/lit/passes/translate-to-new-eh.wast index da429bea4..3837ebf28 100644 --- a/test/lit/passes/translate-to-new-eh.wast +++ b/test/lit/passes/translate-to-new-eh.wast @@ -1,5 +1,7 @@ ;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. ;; RUN: wasm-opt %s -all --translate-to-new-eh -S -o - | filecheck %s +;; RUN: wasm-opt %s -all --translate-to-new-eh -S -o %t +;; RUN: wasm-opt %t -all --optimize-level=3 --generate-stack-ir --optimize-stack-ir --print-stack-ir | filecheck %s --check-prefix STACKIR-OPT (module ;; CHECK: (type $0 (func (result i32 i64))) @@ -17,23 +19,46 @@ ;; CHECK: (type $6 (func (param i32 i64))) ;; CHECK: (tag $e-empty) + ;; STACKIR-OPT: (type $0 (func (result i32 i64))) + + ;; STACKIR-OPT: (type $1 (func)) + + ;; STACKIR-OPT: (type $2 (func (result i32))) + + ;; STACKIR-OPT: (type $3 (func (result i32 exnref))) + + ;; STACKIR-OPT: (type $4 (func (result i32 i64 exnref))) + + ;; STACKIR-OPT: (type $5 (func (param i32))) + + ;; STACKIR-OPT: (type $6 (func (param i32 i64))) + + ;; STACKIR-OPT: (tag $e-empty) (tag $e-empty) ;; CHECK: (tag $e-i32 (param i32)) + ;; STACKIR-OPT: (tag $e-i32 (param i32)) (tag $e-i32 (param i32)) ;; CHECK: (tag $e-i32-i64 (param i32 i64)) + ;; STACKIR-OPT: (tag $e-i32-i64 (param i32 i64)) (tag $e-i32-i64 (param i32 i64)) ;; CHECK: (func $foo (type $1) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $foo (type $1) + ;; STACKIR-OPT-NEXT: ) (func $foo) ;; CHECK: (func $bar (type $1) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $bar (type $1) + ;; STACKIR-OPT-NEXT: ) (func $bar) ;; CHECK: (func $baz (type $1) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $baz (type $1) + ;; STACKIR-OPT-NEXT: ) (func $baz) ;; --------------------------------------------------------------------------- @@ -56,6 +81,21 @@ ;; CHECK-NEXT: (call $bar) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-none-tag-none (type $1) + ;; STACKIR-OPT-NEXT: block $outer0 + ;; STACKIR-OPT-NEXT: block $catch_all2 + ;; STACKIR-OPT-NEXT: block $catch1 + ;; STACKIR-OPT-NEXT: try_table (catch $e-empty $catch1) (catch_all $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: call $bar + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-none-tag-none ;; try's type is none and catch's tag type is none (try $l0 @@ -94,6 +134,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-none-tag-none-with-rethrow (type $1) + ;; STACKIR-OPT-NEXT: (local $0 exnref) + ;; STACKIR-OPT-NEXT: block $outer0 + ;; STACKIR-OPT-NEXT: block $catch_all2 (result exnref) + ;; STACKIR-OPT-NEXT: block $catch1 (result exnref) + ;; STACKIR-OPT-NEXT: try_table (catch_ref $e-empty $catch1) (catch_all_ref $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-none-tag-none-with-rethrow ;; try's type is none and catch's tag type is none, and there are rethrows (try $l0 @@ -129,6 +184,22 @@ ;; CHECK-NEXT: (call $bar) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-none-tag-single (type $1) + ;; STACKIR-OPT-NEXT: (local $0 i32) + ;; STACKIR-OPT-NEXT: block $outer0 + ;; STACKIR-OPT-NEXT: block $catch_all2 + ;; STACKIR-OPT-NEXT: block $catch1 (result i32) + ;; STACKIR-OPT-NEXT: try_table (catch $e-i32 $catch1) (catch_all $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: drop + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: call $bar + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-none-tag-single ;; try's type is none and catch's tag type is single (try $l0 @@ -186,6 +257,31 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-none-tag-single-with-rethrow (type $1) + ;; STACKIR-OPT-NEXT: (local $0 exnref) + ;; STACKIR-OPT-NEXT: (local $1 i32) + ;; STACKIR-OPT-NEXT: (local $2 (tuple i32 exnref)) + ;; STACKIR-OPT-NEXT: block $outer0 + ;; STACKIR-OPT-NEXT: block $catch_all2 (result exnref) + ;; STACKIR-OPT-NEXT: block $catch1 (type $3) (result i32 exnref) + ;; STACKIR-OPT-NEXT: try_table (catch_ref $e-i32 $catch1) (catch_all_ref $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: local.set $2 + ;; STACKIR-OPT-NEXT: local.get $2 + ;; STACKIR-OPT-NEXT: tuple.extract 2 0 + ;; STACKIR-OPT-NEXT: local.get $2 + ;; STACKIR-OPT-NEXT: tuple.extract 2 1 + ;; STACKIR-OPT-NEXT: local.set $0 + ;; STACKIR-OPT-NEXT: drop + ;; STACKIR-OPT-NEXT: local.get $0 + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-none-tag-single-with-rethrow ;; try's type is none and catch's tag type is single, and there are rethrows (try $l0 @@ -224,6 +320,24 @@ ;; CHECK-NEXT: (call $bar) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-none-tag-tuple (type $1) + ;; STACKIR-OPT-NEXT: (local $0 (tuple i32 i64)) + ;; STACKIR-OPT-NEXT: block $outer0 + ;; STACKIR-OPT-NEXT: block $catch_all2 + ;; STACKIR-OPT-NEXT: block $catch1 (type $0) (result i32 i64) + ;; STACKIR-OPT-NEXT: try_table (catch $e-i32-i64 $catch1) (catch_all $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: local.set $0 + ;; STACKIR-OPT-NEXT: local.get $0 + ;; STACKIR-OPT-NEXT: tuple.drop 2 + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: call $bar + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-none-tag-tuple ;; try's type is none and catch's tag type is tuple (try $l0 @@ -286,6 +400,34 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-none-tag-tuple-with-rethrow (type $1) + ;; STACKIR-OPT-NEXT: (local $0 exnref) + ;; STACKIR-OPT-NEXT: (local $1 (tuple i32 i64)) + ;; STACKIR-OPT-NEXT: (local $2 (tuple i32 i64 exnref)) + ;; STACKIR-OPT-NEXT: block $outer0 + ;; STACKIR-OPT-NEXT: block $catch_all2 (result exnref) + ;; STACKIR-OPT-NEXT: block $catch1 (type $4) (result i32 i64 exnref) + ;; STACKIR-OPT-NEXT: try_table (catch_ref $e-i32-i64 $catch1) (catch_all_ref $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: local.set $2 + ;; STACKIR-OPT-NEXT: local.get $2 + ;; STACKIR-OPT-NEXT: tuple.extract 3 0 + ;; STACKIR-OPT-NEXT: local.get $2 + ;; STACKIR-OPT-NEXT: tuple.extract 3 1 + ;; STACKIR-OPT-NEXT: tuple.make 2 + ;; STACKIR-OPT-NEXT: local.set $1 + ;; STACKIR-OPT-NEXT: local.get $2 + ;; STACKIR-OPT-NEXT: tuple.extract 3 2 + ;; STACKIR-OPT-NEXT: local.get $1 + ;; STACKIR-OPT-NEXT: tuple.drop 2 + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-none-tag-tuple-with-rethrow ;; try's type is none and catch's tag type is tuple, and there are rethrows (try $l0 @@ -322,6 +464,22 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-single-tag-none (type $2) (result i32) + ;; STACKIR-OPT-NEXT: block $outer0 (result i32) + ;; STACKIR-OPT-NEXT: block $catch_all2 + ;; STACKIR-OPT-NEXT: block $catch1 + ;; STACKIR-OPT-NEXT: try_table (result i32) (catch $e-empty $catch1) (catch_all $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: i32.const 0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: i32.const 1 + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: i32.const 2 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-single-tag-none (result i32) ;; try's type is single and catch's tag type is none (try $l0 (result i32) @@ -363,6 +521,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-single-tag-none-with-rethrow (type $2) (result i32) + ;; STACKIR-OPT-NEXT: (local $0 exnref) + ;; STACKIR-OPT-NEXT: block $outer0 (result i32) + ;; STACKIR-OPT-NEXT: block $catch_all2 (result exnref) + ;; STACKIR-OPT-NEXT: block $catch1 (result exnref) + ;; STACKIR-OPT-NEXT: try_table (result i32) (catch_ref $e-empty $catch1) (catch_all_ref $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: i32.const 0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-single-tag-none-with-rethrow (result i32) ;; try's type is single and catch's tag type is none, and there are rethrows (try $l0 (result i32) @@ -400,6 +574,22 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-single-tag-single (type $2) (result i32) + ;; STACKIR-OPT-NEXT: (local $0 i32) + ;; STACKIR-OPT-NEXT: block $outer0 (result i32) + ;; STACKIR-OPT-NEXT: block $catch_all2 + ;; STACKIR-OPT-NEXT: block $catch1 (result i32) + ;; STACKIR-OPT-NEXT: try_table (result i32) (catch $e-i32 $catch1) (catch_all $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: i32.const 0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: i32.const 2 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-single-tag-single (result i32) ;; try's type is single and catch's tag type is single (try $l0 (result i32) @@ -460,6 +650,32 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-single-tag-single-with-rethrow (type $2) (result i32) + ;; STACKIR-OPT-NEXT: (local $0 exnref) + ;; STACKIR-OPT-NEXT: (local $1 i32) + ;; STACKIR-OPT-NEXT: (local $2 (tuple i32 exnref)) + ;; STACKIR-OPT-NEXT: block $outer0 (result i32) + ;; STACKIR-OPT-NEXT: block $catch_all2 (result exnref) + ;; STACKIR-OPT-NEXT: block $catch1 (type $3) (result i32 exnref) + ;; STACKIR-OPT-NEXT: try_table (result i32) (catch_ref $e-i32 $catch1) (catch_all_ref $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: i32.const 0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: local.set $2 + ;; STACKIR-OPT-NEXT: local.get $2 + ;; STACKIR-OPT-NEXT: tuple.extract 2 0 + ;; STACKIR-OPT-NEXT: local.get $2 + ;; STACKIR-OPT-NEXT: tuple.extract 2 1 + ;; STACKIR-OPT-NEXT: local.set $0 + ;; STACKIR-OPT-NEXT: drop + ;; STACKIR-OPT-NEXT: local.get $0 + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-single-tag-single-with-rethrow (result i32) ;; try's type is single and catch's tag type is single, and there are ;; rethrows @@ -506,6 +722,26 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-single-tag-tuple (type $2) (result i32) + ;; STACKIR-OPT-NEXT: (local $0 (tuple i32 i64)) + ;; STACKIR-OPT-NEXT: block $outer0 (result i32) + ;; STACKIR-OPT-NEXT: block $catch_all2 + ;; STACKIR-OPT-NEXT: block $catch1 (type $0) (result i32 i64) + ;; STACKIR-OPT-NEXT: try_table (result i32) (catch $e-i32-i64 $catch1) (catch_all $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: i32.const 0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: local.set $0 + ;; STACKIR-OPT-NEXT: local.get $0 + ;; STACKIR-OPT-NEXT: tuple.drop 2 + ;; STACKIR-OPT-NEXT: i32.const 1 + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: i32.const 2 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-single-tag-tuple (result i32) ;; try's type is single and catch's tag type is tuple (try $l0 (result i32) @@ -574,6 +810,35 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-single-tag-tuple-with-rethrow (type $2) (result i32) + ;; STACKIR-OPT-NEXT: (local $0 exnref) + ;; STACKIR-OPT-NEXT: (local $1 (tuple i32 i64)) + ;; STACKIR-OPT-NEXT: (local $2 (tuple i32 i64 exnref)) + ;; STACKIR-OPT-NEXT: block $outer0 (result i32) + ;; STACKIR-OPT-NEXT: block $catch_all2 (result exnref) + ;; STACKIR-OPT-NEXT: block $catch1 (type $4) (result i32 i64 exnref) + ;; STACKIR-OPT-NEXT: try_table (result i32) (catch_ref $e-i32-i64 $catch1) (catch_all_ref $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: i32.const 0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: local.set $2 + ;; STACKIR-OPT-NEXT: local.get $2 + ;; STACKIR-OPT-NEXT: tuple.extract 3 0 + ;; STACKIR-OPT-NEXT: local.get $2 + ;; STACKIR-OPT-NEXT: tuple.extract 3 1 + ;; STACKIR-OPT-NEXT: tuple.make 2 + ;; STACKIR-OPT-NEXT: local.set $1 + ;; STACKIR-OPT-NEXT: local.get $2 + ;; STACKIR-OPT-NEXT: tuple.extract 3 2 + ;; STACKIR-OPT-NEXT: local.get $1 + ;; STACKIR-OPT-NEXT: tuple.drop 2 + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-single-tag-tuple-with-rethrow (result i32) ;; try's type is single and catch's tag type is tuple, and there are ;; rethrows @@ -621,6 +886,28 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-tuple-tag-none (type $0) (result i32 i64) + ;; STACKIR-OPT-NEXT: block $outer0 (type $0) (result i32 i64) + ;; STACKIR-OPT-NEXT: block $catch_all2 + ;; STACKIR-OPT-NEXT: block $catch1 + ;; STACKIR-OPT-NEXT: try_table (type $0) (result i32 i64) (catch $e-empty $catch1) (catch_all $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: i32.const 0 + ;; STACKIR-OPT-NEXT: i64.const 0 + ;; STACKIR-OPT-NEXT: tuple.make 2 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: i32.const 1 + ;; STACKIR-OPT-NEXT: i64.const 1 + ;; STACKIR-OPT-NEXT: tuple.make 2 + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: i32.const 2 + ;; STACKIR-OPT-NEXT: i64.const 0 + ;; STACKIR-OPT-NEXT: tuple.make 2 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-tuple-tag-none (result i32 i64) ;; try's type is tuple and catch's tag type is none (try $l0 (result i32 i64) @@ -674,6 +961,24 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-tuple-tag-none-with-rethrow (type $0) (result i32 i64) + ;; STACKIR-OPT-NEXT: (local $0 exnref) + ;; STACKIR-OPT-NEXT: block $outer0 (type $0) (result i32 i64) + ;; STACKIR-OPT-NEXT: block $catch_all2 (result exnref) + ;; STACKIR-OPT-NEXT: block $catch1 (result exnref) + ;; STACKIR-OPT-NEXT: try_table (type $0) (result i32 i64) (catch_ref $e-empty $catch1) (catch_all_ref $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: i32.const 0 + ;; STACKIR-OPT-NEXT: i64.const 0 + ;; STACKIR-OPT-NEXT: tuple.make 2 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-tuple-tag-none-with-rethrow (result i32 i64) ;; try's type is tuple and catch's tag type is none, and there are rethrows (try $l0 (result i32 i64) @@ -723,6 +1028,28 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-tuple-tag-single (type $0) (result i32 i64) + ;; STACKIR-OPT-NEXT: (local $0 i32) + ;; STACKIR-OPT-NEXT: block $outer0 (type $0) (result i32 i64) + ;; STACKIR-OPT-NEXT: block $catch_all2 + ;; STACKIR-OPT-NEXT: block $catch1 (result i32) + ;; STACKIR-OPT-NEXT: try_table (type $0) (result i32 i64) (catch $e-i32 $catch1) (catch_all $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: i32.const 0 + ;; STACKIR-OPT-NEXT: i64.const 0 + ;; STACKIR-OPT-NEXT: tuple.make 2 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: i64.const 0 + ;; STACKIR-OPT-NEXT: tuple.make 2 + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: i32.const 2 + ;; STACKIR-OPT-NEXT: i64.const 2 + ;; STACKIR-OPT-NEXT: tuple.make 2 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-tuple-tag-single (result i32 i64) ;; try's type is tuple and catch's tag type is single (try $l0 (result i32 i64) @@ -795,6 +1122,34 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-tuple-tag-single-with-rethrow (type $0) (result i32 i64) + ;; STACKIR-OPT-NEXT: (local $0 exnref) + ;; STACKIR-OPT-NEXT: (local $1 i32) + ;; STACKIR-OPT-NEXT: (local $2 (tuple i32 exnref)) + ;; STACKIR-OPT-NEXT: block $outer0 (type $0) (result i32 i64) + ;; STACKIR-OPT-NEXT: block $catch_all2 (result exnref) + ;; STACKIR-OPT-NEXT: block $catch1 (type $3) (result i32 exnref) + ;; STACKIR-OPT-NEXT: try_table (type $0) (result i32 i64) (catch_ref $e-i32 $catch1) (catch_all_ref $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: i32.const 0 + ;; STACKIR-OPT-NEXT: i64.const 0 + ;; STACKIR-OPT-NEXT: tuple.make 2 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: local.set $2 + ;; STACKIR-OPT-NEXT: local.get $2 + ;; STACKIR-OPT-NEXT: tuple.extract 2 0 + ;; STACKIR-OPT-NEXT: local.get $2 + ;; STACKIR-OPT-NEXT: tuple.extract 2 1 + ;; STACKIR-OPT-NEXT: local.set $0 + ;; STACKIR-OPT-NEXT: drop + ;; STACKIR-OPT-NEXT: local.get $0 + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-tuple-tag-single-with-rethrow (result i32 i64) ;; try's type is tuple and catch's tag type is single, and there are ;; rethrows @@ -845,6 +1200,28 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-tuple-tag-tuple (type $0) (result i32 i64) + ;; STACKIR-OPT-NEXT: (local $0 (tuple i32 i64)) + ;; STACKIR-OPT-NEXT: block $outer0 (type $0) (result i32 i64) + ;; STACKIR-OPT-NEXT: block $catch_all2 + ;; STACKIR-OPT-NEXT: block $catch1 (type $0) (result i32 i64) + ;; STACKIR-OPT-NEXT: try_table (type $0) (result i32 i64) (catch $e-i32-i64 $catch1) (catch_all $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: i32.const 0 + ;; STACKIR-OPT-NEXT: i64.const 0 + ;; STACKIR-OPT-NEXT: tuple.make 2 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: local.set $0 + ;; STACKIR-OPT-NEXT: local.get $0 + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: i32.const 2 + ;; STACKIR-OPT-NEXT: i64.const 2 + ;; STACKIR-OPT-NEXT: tuple.make 2 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-tuple-tag-tuple (result i32 i64) ;; try's type is tuple and catch's tag type is tuple (try $l0 (result i32 i64) @@ -919,6 +1296,37 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $try-tuple-tag-tuple-with-rethrow (type $0) (result i32 i64) + ;; STACKIR-OPT-NEXT: (local $0 exnref) + ;; STACKIR-OPT-NEXT: (local $1 (tuple i32 i64)) + ;; STACKIR-OPT-NEXT: (local $2 (tuple i32 i64 exnref)) + ;; STACKIR-OPT-NEXT: block $outer0 (type $0) (result i32 i64) + ;; STACKIR-OPT-NEXT: block $catch_all2 (result exnref) + ;; STACKIR-OPT-NEXT: block $catch1 (type $4) (result i32 i64 exnref) + ;; STACKIR-OPT-NEXT: try_table (type $0) (result i32 i64) (catch_ref $e-i32-i64 $catch1) (catch_all_ref $catch_all2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: i32.const 0 + ;; STACKIR-OPT-NEXT: i64.const 0 + ;; STACKIR-OPT-NEXT: tuple.make 2 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: local.set $2 + ;; STACKIR-OPT-NEXT: local.get $2 + ;; STACKIR-OPT-NEXT: tuple.extract 3 0 + ;; STACKIR-OPT-NEXT: local.get $2 + ;; STACKIR-OPT-NEXT: tuple.extract 3 1 + ;; STACKIR-OPT-NEXT: tuple.make 2 + ;; STACKIR-OPT-NEXT: local.set $1 + ;; STACKIR-OPT-NEXT: local.get $2 + ;; STACKIR-OPT-NEXT: tuple.extract 3 2 + ;; STACKIR-OPT-NEXT: local.get $1 + ;; STACKIR-OPT-NEXT: tuple.drop 2 + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $try-tuple-tag-tuple-with-rethrow (result i32 i64) ;; try's type is tuple and catch's tag type is tuple, and there are ;; rethrows @@ -950,6 +1358,11 @@ ;; CHECK-NEXT: (call $foo) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $catchless-delegateless-try (type $1) + ;; STACKIR-OPT-NEXT: try_table + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $catchless-delegateless-try (try (do @@ -1034,6 +1447,50 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $multiple-catches-and-catch_all (type $1) + ;; STACKIR-OPT-NEXT: (local $0 exnref) + ;; STACKIR-OPT-NEXT: (local $1 i32) + ;; STACKIR-OPT-NEXT: (local $2 (tuple i32 i64)) + ;; STACKIR-OPT-NEXT: (local $3 (tuple i32 exnref)) + ;; STACKIR-OPT-NEXT: (local $4 (tuple i32 i64 exnref)) + ;; STACKIR-OPT-NEXT: block $outer0 + ;; STACKIR-OPT-NEXT: block $catch_all4 (result exnref) + ;; STACKIR-OPT-NEXT: block $catch3 (type $4) (result i32 i64 exnref) + ;; STACKIR-OPT-NEXT: block $catch2 (type $3) (result i32 exnref) + ;; STACKIR-OPT-NEXT: block $catch1 (result exnref) + ;; STACKIR-OPT-NEXT: try_table (catch_ref $e-empty $catch1) (catch_ref $e-i32 $catch2) (catch_ref $e-i32-i64 $catch3) (catch_all_ref $catch_all4) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: local.set $3 + ;; STACKIR-OPT-NEXT: local.get $3 + ;; STACKIR-OPT-NEXT: tuple.extract 2 0 + ;; STACKIR-OPT-NEXT: local.get $3 + ;; STACKIR-OPT-NEXT: tuple.extract 2 1 + ;; STACKIR-OPT-NEXT: local.set $0 + ;; STACKIR-OPT-NEXT: drop + ;; STACKIR-OPT-NEXT: local.get $0 + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: local.set $4 + ;; STACKIR-OPT-NEXT: local.get $4 + ;; STACKIR-OPT-NEXT: tuple.extract 3 0 + ;; STACKIR-OPT-NEXT: local.get $4 + ;; STACKIR-OPT-NEXT: tuple.extract 3 1 + ;; STACKIR-OPT-NEXT: tuple.make 2 + ;; STACKIR-OPT-NEXT: local.set $2 + ;; STACKIR-OPT-NEXT: local.get $4 + ;; STACKIR-OPT-NEXT: tuple.extract 3 2 + ;; STACKIR-OPT-NEXT: local.get $2 + ;; STACKIR-OPT-NEXT: tuple.drop 2 + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $multiple-catches-and-catch_all (try $l0 (do @@ -1092,6 +1549,32 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $nested-catch-rethrows (type $1) + ;; STACKIR-OPT-NEXT: (local $0 exnref) + ;; STACKIR-OPT-NEXT: (local $1 exnref) + ;; STACKIR-OPT-NEXT: block $outer3 + ;; STACKIR-OPT-NEXT: block $catch_all4 (result exnref) + ;; STACKIR-OPT-NEXT: try_table (catch_all_ref $catch_all4) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer3 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: local.set $0 + ;; STACKIR-OPT-NEXT: block $outer0 + ;; STACKIR-OPT-NEXT: block $catch2 (result exnref) + ;; STACKIR-OPT-NEXT: block $catch1 + ;; STACKIR-OPT-NEXT: try_table (catch $e-empty $catch1) (catch_ref $e-empty $catch2) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: local.get $0 + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $nested-catch-rethrows (try $l0 (do @@ -1141,6 +1624,24 @@ ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $delegate-target-outer-try-none (type $1) + ;; STACKIR-OPT-NEXT: block $outer1 + ;; STACKIR-OPT-NEXT: block $catch_all2 + ;; STACKIR-OPT-NEXT: try_table (catch_all $catch_all2) + ;; STACKIR-OPT-NEXT: block $l00 (result exnref) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: try_table (catch_all_ref $l00) + ;; STACKIR-OPT-NEXT: call $bar + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: call $baz + ;; STACKIR-OPT-NEXT: br $outer1 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: unreachable + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $delegate-target-outer-try-none ;; An inner try-delegate targets an outer try whose type is none (try $l0 @@ -1180,6 +1681,27 @@ ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $multiple-delegates-target-outer-try-none (type $1) + ;; STACKIR-OPT-NEXT: block $outer1 + ;; STACKIR-OPT-NEXT: block $catch_all2 + ;; STACKIR-OPT-NEXT: try_table (catch_all $catch_all2) + ;; STACKIR-OPT-NEXT: block $l00 (result exnref) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: try_table (catch_all_ref $l00) + ;; STACKIR-OPT-NEXT: call $bar + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: try_table (catch_all_ref $l00) + ;; STACKIR-OPT-NEXT: call $bar + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: call $baz + ;; STACKIR-OPT-NEXT: br $outer1 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: unreachable + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $multiple-delegates-target-outer-try-none ;; Multiple inner try-delegates target an outer try whose type is none (try $l0 @@ -1227,6 +1749,25 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $delegate-target-outer-try-concrete (type $2) (result i32) + ;; STACKIR-OPT-NEXT: block $outer1 (result i32) + ;; STACKIR-OPT-NEXT: block $catch_all2 + ;; STACKIR-OPT-NEXT: try_table (result i32) (catch_all $catch_all2) + ;; STACKIR-OPT-NEXT: block $l00 (result exnref) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: try_table (result i32) (catch_all_ref $l00) + ;; STACKIR-OPT-NEXT: call $bar + ;; STACKIR-OPT-NEXT: i32.const 0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer1 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer1 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: i32.const 1 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $delegate-target-outer-try-concrete (result i32) ;; An inner try-delegate targets an outer try whose type is concrete (try $l0 (result i32) @@ -1258,6 +1799,18 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $deletate-target-outer-try-unreachable (type $1) + ;; STACKIR-OPT-NEXT: try_table + ;; STACKIR-OPT-NEXT: block $l00 (result exnref) + ;; STACKIR-OPT-NEXT: try_table (catch_all_ref $l00) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: return + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: unreachable + ;; STACKIR-OPT-NEXT: ) (func $deletate-target-outer-try-unreachable ;; An inner try-delegate targets an outer try whose body type is unreachable ;; (due to a return). In this case we don't need an additional 'br' to an @@ -1287,6 +1840,17 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $delegate-target-caller-none (type $1) + ;; STACKIR-OPT-NEXT: block $__binaryen_delegate_caller_target0 (result exnref) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: try_table (catch_all_ref $__binaryen_delegate_caller_target0) + ;; STACKIR-OPT-NEXT: call $bar + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: call $baz + ;; STACKIR-OPT-NEXT: return + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: ) (func $delegate-target-caller-none ;; A try-delegate targets the caller whose type is none (call $foo) @@ -1314,6 +1878,20 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $multiple-delegates-target-caller-none (type $1) + ;; STACKIR-OPT-NEXT: block $__binaryen_delegate_caller_target0 (result exnref) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: try_table (catch_all_ref $__binaryen_delegate_caller_target0) + ;; STACKIR-OPT-NEXT: call $bar + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: try_table (catch_all_ref $__binaryen_delegate_caller_target0) + ;; STACKIR-OPT-NEXT: call $bar + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: call $baz + ;; STACKIR-OPT-NEXT: return + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: ) (func $multiple-delegates-target-caller-none ;; Multiple try-delegates target the caller whose type is none (call $foo) @@ -1347,6 +1925,17 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $delegate-target-caller-concrete (type $2) (result i32) + ;; STACKIR-OPT-NEXT: block $__binaryen_delegate_caller_target0 (result exnref) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: try_table (result i32) (catch_all_ref $__binaryen_delegate_caller_target0) + ;; STACKIR-OPT-NEXT: call $bar + ;; STACKIR-OPT-NEXT: i32.const 0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: return + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: ) (func $delegate-target-caller-concrete (result i32) ;; A try-delegate targets the caller whose type is concrete (call $foo) @@ -1384,6 +1973,29 @@ ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $delegate-nested-more (type $1) + ;; STACKIR-OPT-NEXT: block $outer3 + ;; STACKIR-OPT-NEXT: block $catch_all4 + ;; STACKIR-OPT-NEXT: try_table (catch_all $catch_all4) + ;; STACKIR-OPT-NEXT: block $l00 (result exnref) + ;; STACKIR-OPT-NEXT: block $outer1 + ;; STACKIR-OPT-NEXT: block $catch_all2 + ;; STACKIR-OPT-NEXT: try_table (catch_all $catch_all2) + ;; STACKIR-OPT-NEXT: try_table (catch_all_ref $l00) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer1 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer3 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: unreachable + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: ) (func $delegate-nested-more (try $l0 (do @@ -1422,6 +2034,24 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $delegate-target-outer-try-delegate (type $1) + ;; STACKIR-OPT-NEXT: block $__binaryen_delegate_caller_target0 (result exnref) + ;; STACKIR-OPT-NEXT: block $outer2 + ;; STACKIR-OPT-NEXT: try_table (catch_all_ref $__binaryen_delegate_caller_target0) + ;; STACKIR-OPT-NEXT: block $l01 (result exnref) + ;; STACKIR-OPT-NEXT: try_table (catch_all_ref $l01) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer2 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: unreachable + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: return + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: ) (func $delegate-target-outer-try-delegate ;; An inner try-delegate targets an outer try-delegate that targets the ;; caller @@ -1460,6 +2090,25 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; STACKIR-OPT: (func $delegate-target-outer-try-delegate-concrete (type $2) (result i32) + ;; STACKIR-OPT-NEXT: block $__binaryen_delegate_caller_target0 (result exnref) + ;; STACKIR-OPT-NEXT: block $outer2 (result i32) + ;; STACKIR-OPT-NEXT: try_table (catch_all_ref $__binaryen_delegate_caller_target0) + ;; STACKIR-OPT-NEXT: block $l01 (result exnref) + ;; STACKIR-OPT-NEXT: try_table (result i32) (catch_all_ref $l01) + ;; STACKIR-OPT-NEXT: call $foo + ;; STACKIR-OPT-NEXT: i32.const 0 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: br $outer2 + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: unreachable + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: return + ;; STACKIR-OPT-NEXT: end + ;; STACKIR-OPT-NEXT: throw_ref + ;; STACKIR-OPT-NEXT: ) (func $delegate-target-outer-try-delegate-concrete (result i32) ;; An inner try-delegate targets an outer try-delegate that targets the ;; caller, where the type of the try-delegates and the caller is concrete |