diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/lit/passes/inlining-unreachable.wast | 58 | ||||
-rw-r--r-- | test/lit/passes/inlining_enable-tail-call.wast | 859 |
2 files changed, 734 insertions, 183 deletions
diff --git a/test/lit/passes/inlining-unreachable.wast b/test/lit/passes/inlining-unreachable.wast index 2c93359fd..1b08ac2b0 100644 --- a/test/lit/passes/inlining-unreachable.wast +++ b/test/lit/passes/inlining-unreachable.wast @@ -66,22 +66,51 @@ ) (module - ;; CHECK: (type $0 (func (param i32) (result i32))) + ;; CHECK: (type $0 (func)) - ;; CHECK: (type $1 (func)) + ;; CHECK: (type $1 (func (param i32) (result i32))) - ;; CHECK: (import "env" "imported" (func $imported (type $0) (param i32) (result i32))) + ;; CHECK: (import "env" "imported" (func $imported (type $1) (param i32) (result i32))) (import "env" "imported" (func $imported (param i32) (result i32))) - ;; CHECK: (func $caller (type $1) + ;; CHECK: (func $caller (type $0) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block ;; CHECK-NEXT: (block $__inlined_func$callee + ;; CHECK-NEXT: (call $imported + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $caller + (drop + (call $callee) + ) + ) + + ;; After inlining, this return_call will turn into a call, but should still be + ;; unreachable. Validation will fail if it is not. + (func $callee (result i32) + (return_call $imported + (unreachable) + ) + ) + + ;; CHECK: (func $caller-2 (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $__inlined_func$callee-2$1 ;; CHECK-NEXT: (block ;; CHECK-NEXT: (block $__return_call ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (br $__return_call) + ;; CHECK-NEXT: (try $try + ;; CHECK-NEXT: (do + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br $__return_call) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $imported @@ -92,17 +121,20 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - (func $caller + (func $caller-2 (drop - (call $callee) + (call $callee-2) ) ) - ;; After inlining, this return_call will turn into a call, but should still be - ;; unreachable. Validation will fail if it is not. - (func $callee (result i32) - (return_call $imported - (unreachable) + ;; Same as above, but with a return_call with a try block + (func $callee-2 (result i32) + (try + (do + (return_call $imported + (unreachable) + ) + ) ) ) ) diff --git a/test/lit/passes/inlining_enable-tail-call.wast b/test/lit/passes/inlining_enable-tail-call.wast index 49ea1c3c4..77aa77974 100644 --- a/test/lit/passes/inlining_enable-tail-call.wast +++ b/test/lit/passes/inlining_enable-tail-call.wast @@ -1,7 +1,7 @@ ;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. ;; NOTE: This test was ported using port_passes_tests_to_lit.py and could be cleaned up. -;; RUN: foreach %s %t wasm-opt --inlining --enable-tail-call -S -o - | filecheck %s +;; RUN: foreach %s %t wasm-opt --inlining --enable-tail-call --enable-exception-handling -S -o - | filecheck %s (module (table 1 1 funcref) @@ -474,20 +474,39 @@ ;; CHECK: (type $0 (func)) ;; CHECK: (func $caller + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $__inlined_func$callee + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $caller + (return_call $callee) + ) + ;; CHECK: (func $caller-2 ;; CHECK-NEXT: (block $__original_body - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (br $__original_body) + ;; CHECK-NEXT: (try $try + ;; CHECK-NEXT: (do + ;; CHECK-NEXT: (br $__original_body) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block $__inlined_func$callee + ;; CHECK-NEXT: (block $__inlined_func$callee$1 ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - (func $caller - (return_call $callee) + (func $caller-2 + (try + (do + (return_call $callee) + ) + ) ) (func $callee (drop @@ -501,19 +520,35 @@ ;; CHECK: (type $0 (func (result i32))) ;; CHECK: (func $caller (result i32) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (block $__inlined_func$callee (result i32) + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $caller (result i32) + (return_call $callee) + ) + ;; CHECK: (func $caller-2 (result i32) ;; CHECK-NEXT: (block $__original_body ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (br $__original_body) + ;; CHECK-NEXT: (try $try + ;; CHECK-NEXT: (do + ;; CHECK-NEXT: (br $__original_body) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block $__inlined_func$callee (result i32) + ;; CHECK-NEXT: (block $__inlined_func$callee$1 (result i32) ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - (func $caller (result i32) - (return_call $callee) + (func $caller-2 (result i32) + (try + (do + (return_call $callee) + ) + ) ) (func $callee (result i32) (i32.const 42) @@ -526,26 +561,51 @@ ;; CHECK: (func $caller ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $__inlined_func$callee + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $caller + (return_call $callee + (i32.const 42) + ) + ) + ;; CHECK: (func $caller-2 + ;; CHECK-NEXT: (local $0 i32) ;; CHECK-NEXT: (block $__original_body - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (local.set $0 - ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (try $try + ;; CHECK-NEXT: (do + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $__original_body) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (br $__original_body) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block $__inlined_func$callee + ;; CHECK-NEXT: (block $__inlined_func$callee$1 ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - (func $caller - (return_call $callee - (i32.const 42) + (func $caller-2 + (try + (do + (return_call $callee + (i32.const 42) + ) + ) ) ) (func $callee (param i32) @@ -561,25 +621,47 @@ ;; CHECK: (func $caller (result i32) ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (block $__inlined_func$callee (result i32) + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $caller (result i32) + (return_call $callee + (i32.const 42) + ) + ) + ;; CHECK: (func $caller-2 (result i32) + ;; CHECK-NEXT: (local $0 i32) ;; CHECK-NEXT: (block $__original_body ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (local.set $0 - ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (try $try + ;; CHECK-NEXT: (do + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $__original_body) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (br $__original_body) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block $__inlined_func$callee (result i32) + ;; CHECK-NEXT: (block $__inlined_func$callee$1 (result i32) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - (func $caller (result i32) - (return_call $callee - (i32.const 42) + (func $caller-2 (result i32) + (try + (do + (return_call $callee + (i32.const 42) + ) + ) ) ) (func $callee (param i32) (result i32) @@ -596,16 +678,64 @@ ;; CHECK-NEXT: (local $y i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local $3 i32) - ;; CHECK-NEXT: (block $__original_body - ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $__inlined_func$callee + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (local.set $2 - ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $3 - ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $caller + (local $x i32) + (local $y i32) + (return_call $callee + (local.get $x) + (local.get $y) + ) + ) + (func $callee (param i32 i32) + (drop + (local.get 0) + ) + (drop + (local.get 1) + ) + ) +) +(module + ;; Multiple params, no result, return_call within try block + ;; CHECK: (type $0 (func)) + + ;; CHECK: (func $caller + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (local $y i32) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (local $3 i32) + ;; CHECK-NEXT: (block $__original_body + ;; CHECK-NEXT: (try $try + ;; CHECK-NEXT: (do + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $__original_body) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (br $__original_body) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) @@ -624,9 +754,13 @@ (func $caller (local $x i32) (local $y i32) - (return_call $callee - (local.get $x) - (local.get $y) + (try + (do + (return_call $callee + (local.get $x) + (local.get $y) + ) + ) ) ) (func $callee (param i32 i32) @@ -644,36 +778,73 @@ ;; CHECK: (type $0 (func)) ;; CHECK: (func $first + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $__inlined_func$second + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $__inlined_func$third$2 + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $first + (return_call $second) + ) + ;; CHECK: (func $first-2 ;; CHECK-NEXT: (block $__original_body_0 ;; CHECK-NEXT: (block ;; CHECK-NEXT: (block $__original_body - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (br $__original_body) + ;; CHECK-NEXT: (try $try + ;; CHECK-NEXT: (do + ;; CHECK-NEXT: (br $__original_body) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block $__inlined_func$second - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (br $__original_body_0) + ;; CHECK-NEXT: (block $__inlined_func$second-2$1 + ;; CHECK-NEXT: (try $try0 + ;; CHECK-NEXT: (do + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $__original_body_0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block $__inlined_func$third$1 + ;; CHECK-NEXT: (block $__inlined_func$third$3 ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - (func $first - (return_call $second) + (func $first-2 + (try + (do + (return_call $second-2) + ) + ) ) (func $second (return_call $third) ) + (func $second-2 + (try + (do + (return_call $third) + ) + ) + ) (func $third (drop (i32.const 42) @@ -692,35 +863,109 @@ ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local $4 i32) ;; CHECK-NEXT: (local $5 i32) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (block $__inlined_func$second + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (block $__inlined_func$third$1 (result i32) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $first (result i32) + (local $x i32) + (local $y i32) + (return_call $second + (local.get $x) + (local.get $y) + ) + ) + (func $second (param i32 i32) (result i32) + (return_call $third + (local.get 0) + (local.get 1) + ) + ) + (func $third (param i32 i32) (result i32) + (drop + (local.get 0) + ) + (drop + (local.get 1) + ) + (i32.const 42) + ) +) + +(module + ;; Chain of return_calls with params and results, return_calls in try block. + ;; CHECK: (type $0 (func (result i32))) + + ;; CHECK: (func $first (result i32) + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (local $y i32) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (local $3 i32) + ;; CHECK-NEXT: (local $4 i32) + ;; CHECK-NEXT: (local $5 i32) ;; CHECK-NEXT: (block $__original_body_0 ;; CHECK-NEXT: (return ;; CHECK-NEXT: (block ;; CHECK-NEXT: (block $__original_body ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (local.set $2 - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $3 - ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (try $try + ;; CHECK-NEXT: (do + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $__original_body) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (br $__original_body) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block $__inlined_func$second - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (try $try0 + ;; CHECK-NEXT: (do ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (local.set $4 - ;; CHECK-NEXT: (local.get $2) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $5 - ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $__original_body_0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (br $__original_body_0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -743,15 +988,23 @@ (func $first (result i32) (local $x i32) (local $y i32) - (return_call $second - (local.get $x) - (local.get $y) + (try + (do + (return_call $second + (local.get $x) + (local.get $y) + ) + ) ) ) (func $second (param i32 i32) (result i32) - (return_call $third - (local.get 0) - (local.get 1) + (try + (do + (return_call $third + (local.get 0) + (local.get 1) + ) + ) ) ) (func $third (param i32 i32) (result i32) @@ -768,20 +1021,46 @@ (module ;; CHECK: (type $0 (func)) - ;; CHECK: (func $0 + ;; CHECK: (func $first ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (block $__inlined_func$1 (result i32) + ;; CHECK-NEXT: (block $__inlined_func$second (result i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $__inlined_func$second + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (block $__inlined_func$third$2 (result i32) + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $first + (drop + (call $second) + ) + ) + ;; CHECK: (func $first-2 + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (block $__inlined_func$second-2$1 (result i32) ;; CHECK-NEXT: (block (result i32) ;; CHECK-NEXT: (block $__return_call ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (br $__return_call) + ;; CHECK-NEXT: (try $try + ;; CHECK-NEXT: (do + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $__return_call) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (block $__inlined_func$2$1 (result i32) + ;; CHECK-NEXT: (block $__inlined_func$third$3 (result i32) ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -790,15 +1069,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - (func $0 + (func $first-2 (drop - (call $1) + (call $second-2) ) ) - (func $1 (result i32) - (return_call $2) + (func $second (result i32) + (return_call $third) + ) + (func $second-2 (result i32) + (try + (do + (return_call $third) + ) + ) ) - (func $2 (result i32) + (func $third (result i32) (i32.const 42) ) ) @@ -806,18 +1092,45 @@ (module ;; CHECK: (type $0 (func)) - ;; CHECK: (func $0 + ;; CHECK: (func $first ;; CHECK-NEXT: (local $0 i32) - ;; CHECK-NEXT: (block $__inlined_func$1 + ;; CHECK-NEXT: (block $__inlined_func$second ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (block $__return_call + ;; CHECK-NEXT: (block ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (br $__return_call) + ;; CHECK-NEXT: (block $__inlined_func$third$2 + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $__inlined_func$second) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $first + (call $second) + ) + ;; CHECK: (func $first-2 + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (block $__inlined_func$second-2$1 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $__return_call + ;; CHECK-NEXT: (try $try + ;; CHECK-NEXT: (do + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $__return_call) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (br $__inlined_func$1) + ;; CHECK-NEXT: (br $__inlined_func$second-2$1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (block $__inlined_func$2$1 + ;; CHECK-NEXT: (block $__inlined_func$third$3 ;; CHECK-NEXT: (local.set $0 ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: ) @@ -829,15 +1142,24 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - (func $0 - (call $1) + (func $first-2 + (call $second-2) ) - (func $1 - (return_call $2 + (func $second + (return_call $third (i32.const 42) ) ) - (func $2 (param i32) + (func $second-2 + (try + (do + (return_call $third + (i32.const 42) + ) + ) + ) + ) + (func $third (param i32) (drop (local.get 0) ) @@ -850,34 +1172,60 @@ ;; CHECK: (type $1 (func (param i32))) - ;; CHECK: (func $0 - ;; CHECK-NEXT: (block $__inlined_func$1 + ;; CHECK: (func $first + ;; CHECK-NEXT: (block $__inlined_func$second + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $third + ;; CHECK-NEXT: (br $__inlined_func$second) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $__inlined_func$second) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $first + (call $second) + ) + ;; CHECK: (func $first-2 + ;; CHECK-NEXT: (block $__inlined_func$second-2$1 ;; CHECK-NEXT: (block ;; CHECK-NEXT: (block $__return_call - ;; CHECK-NEXT: (br $__inlined_func$1) - ;; CHECK-NEXT: (br $__return_call) - ;; CHECK-NEXT: (br $__inlined_func$1) + ;; CHECK-NEXT: (try $try + ;; CHECK-NEXT: (do + ;; CHECK-NEXT: (br $__inlined_func$second-2$1) + ;; CHECK-NEXT: (br $__return_call) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $__inlined_func$second-2$1) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (call $2 + ;; CHECK-NEXT: (call $third ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - (func $0 - (call $1) + (func $first-2 + (call $second-2) ) - (func $1 - (return_call $2 + (func $second + (return_call $third (return) ) ) - ;; CHECK: (func $2 (param $0 i32) + (func $second-2 + (try + (do + (return_call $third + (return) + ) + ) + ) + ) + ;; CHECK: (func $third (param $0 i32) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - (func $2 (param i32) + (func $third (param i32) (drop (local.get 0) ) @@ -888,24 +1236,47 @@ ;; Same as above, but this time the child is not unreachable. ;; CHECK: (type $0 (func)) - ;; CHECK: (func $0 + ;; CHECK: (type $1 (func (param i32))) + + ;; CHECK: (func $first + ;; CHECK-NEXT: (block $__inlined_func$second + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $third + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $__inlined_func$second) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $__inlined_func$second) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $first + (call $second) + ) + ;; CHECK: (func $first-2 ;; CHECK-NEXT: (local $0 i32) ;; CHECK-NEXT: (local $1 i32) - ;; CHECK-NEXT: (block $__inlined_func$1 + ;; CHECK-NEXT: (block $__inlined_func$second-2$1 ;; CHECK-NEXT: (block ;; CHECK-NEXT: (block $__return_call - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (local.tee $0 + ;; CHECK-NEXT: (try $try + ;; CHECK-NEXT: (do ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (br $__inlined_func$1) + ;; CHECK-NEXT: (local.tee $0 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $__inlined_func$second-2$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $__return_call) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (br $__return_call) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (br $__inlined_func$1) + ;; CHECK-NEXT: (br $__inlined_func$second-2$1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (block $__inlined_func$2$1 + ;; CHECK-NEXT: (block $__inlined_func$third$2 ;; CHECK-NEXT: (local.set $1 ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) @@ -917,17 +1288,33 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - (func $0 - (call $1) + (func $first-2 + (call $second-2) ) - (func $1 - (return_call $2 + (func $second + (return_call $third (block (result i32) (return) ) ) ) - (func $2 (param i32) + (func $second-2 + (try + (do + (return_call $third + (block (result i32) + (return) + ) + ) + ) + ) + ) + ;; CHECK: (func $third (param $0 i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $third (param i32) (drop (local.get 0) ) @@ -942,14 +1329,43 @@ (table 10 funcref) ;; CHECK: (table $0 10 funcref) - ;; CHECK: (func $0 + ;; CHECK: (func $caller + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (block $__inlined_func$callee (result i32) + ;; CHECK-NEXT: (br $__inlined_func$callee + ;; CHECK-NEXT: (call_indirect (type $T) + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $caller + (drop + (call $callee) + ) + ) + (func $callee (result i32) + (return_call_indirect (type $T) + (i32.const 42) + (i32.const 0) + ) + ) + ;; CHECK: (func $caller-2 ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (block $__inlined_func$1 (result i32) + ;; CHECK-NEXT: (block $__inlined_func$callee-2$1 (result i32) ;; CHECK-NEXT: (block (result i32) ;; CHECK-NEXT: (block $__return_call ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (br $__return_call) + ;; CHECK-NEXT: (try $try + ;; CHECK-NEXT: (do + ;; CHECK-NEXT: (br $__return_call) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call_indirect (type $T) @@ -961,15 +1377,19 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - (func $0 + (func $caller-2 (drop - (call $1) + (call $callee-2) ) ) - (func $1 (result i32) - (return_call_indirect (type $T) - (i32.const 42) - (i32.const 0) + (func $callee-2 (result i32) + (try + (do + (return_call_indirect (type $T) + (i32.const 42) + (i32.const 0) + ) + ) ) ) ) @@ -981,29 +1401,57 @@ (table 10 funcref) ;; CHECK: (table $0 10 funcref) - ;; CHECK: (func $0 - ;; CHECK-NEXT: (block $__inlined_func$1 + ;; CHECK: (func $caller + ;; CHECK-NEXT: (block $__inlined_func$callee ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (block $__return_call - ;; CHECK-NEXT: (br $__return_call) - ;; CHECK-NEXT: (br $__inlined_func$1) - ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call_indirect (type $T) ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $__inlined_func$callee) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - (func $0 - (call $1) + (func $caller + (call $callee) ) - (func $1 + (func $callee (return_call_indirect (type $T) (i32.const 42) (i32.const 0) ) ) + ;; CHECK: (func $caller-2 + ;; CHECK-NEXT: (block $__inlined_func$callee-2$1 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $__return_call + ;; CHECK-NEXT: (try $try + ;; CHECK-NEXT: (do + ;; CHECK-NEXT: (br $__return_call) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $__inlined_func$callee-2$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call_indirect (type $T) + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $caller-2 + (call $callee-2) + ) + (func $callee-2 + (try + (do + (return_call_indirect (type $T) + (i32.const 42) + (i32.const 0) + ) + ) + ) + ) ) (module ;; CHECK: (type $6 (func)) @@ -1040,6 +1488,80 @@ ;; CHECK-NEXT: (block ;; CHECK-NEXT: (block $__inlined_func$13$1 ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (global.get $global$0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $__inlined_func$2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (global.get $global$0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (br $__inlined_func$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (global.set $global$0 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $__inlined_func$13$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (func $19 (; 19 ;) (type $6) + (call $13) + (unreachable) + ) +) +(module + ;; CHECK: (type $6 (func)) + (type $6 (func)) + ;; CHECK: (global $global$0 (mut i32) (i32.const 10)) + + ;; CHECK: (memory $0 1 1) + (memory $0 1 1) + (global $global$0 (mut i32) (i32.const 10)) + ;; CHECK: (export "func_102_invoker" (func $19)) + (export "func_102_invoker" (func $19)) + (func $2 (; 2 ;) (type $6) + (if + (global.get $global$0) + (then + (return) + ) + ) + (global.set $global$0 + (i32.const 1) + ) + ) + (func $13 (; 13 ;) (type $6) + (if + (global.get $global$0) + (then + (unreachable) + ) + ) + (try + (do + (return_call $2) + ) + ) + ) + ;; CHECK: (func $19 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $__inlined_func$13$1 + ;; CHECK-NEXT: (block ;; CHECK-NEXT: (block $__original_body ;; CHECK-NEXT: (block ;; CHECK-NEXT: (if @@ -1048,8 +1570,10 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (br $__original_body) + ;; CHECK-NEXT: (try $try + ;; CHECK-NEXT: (do + ;; CHECK-NEXT: (br $__original_body) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $__inlined_func$13$1) @@ -1086,42 +1610,37 @@ (export "is_even" (func $is_even)) ;; CHECK: (func $is_even (param $i i32) (result i32) ;; CHECK-NEXT: (local $1 i32) - ;; CHECK-NEXT: (block $__original_body - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (if (result i32) - ;; CHECK-NEXT: (i32.eqz - ;; CHECK-NEXT: (local.get $i) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (then - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (else - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (local.set $1 - ;; CHECK-NEXT: (i32.sub - ;; CHECK-NEXT: (local.get $i) - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.get $i) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (block $__inlined_func$is_odd (result i32) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (i32.sub + ;; CHECK-NEXT: (local.get $i) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (br $__original_body) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block $__inlined_func$is_odd (result i32) - ;; CHECK-NEXT: (if (result i32) - ;; CHECK-NEXT: (i32.eqz - ;; CHECK-NEXT: (local.get $1) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (then - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (else - ;; CHECK-NEXT: (return_call $is_even - ;; CHECK-NEXT: (i32.sub - ;; CHECK-NEXT: (local.get $1) - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (return_call $is_even + ;; CHECK-NEXT: (i32.sub + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) |