diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/binaryen.js/kitchen-sink.js.txt | 56 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.txt | 56 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.txt.txt | 28 | ||||
-rw-r--r-- | test/passes/dae_enable-tail-call.txt (renamed from test/passes/dae.txt) | 38 | ||||
-rw-r--r-- | test/passes/dae_enable-tail-call.wast (renamed from test/passes/dae.wast) | 32 | ||||
-rw-r--r-- | test/passes/directize_enable-tail-call.txt (renamed from test/passes/directize.txt) | 14 | ||||
-rw-r--r-- | test/passes/directize_enable-tail-call.wast (renamed from test/passes/directize.wast) | 15 | ||||
-rw-r--r-- | test/passes/inlining_enable-tail-call.txt (renamed from test/passes/inlining.txt) | 164 | ||||
-rw-r--r-- | test/passes/inlining_enable-tail-call.wast (renamed from test/passes/inlining.wast) | 113 | ||||
-rwxr-xr-x | test/unit/input/tail_call_target_feature.wasm | bin | 129 -> 113 bytes | |||
-rw-r--r-- | test/unit/test_features.py | 14 | ||||
-rw-r--r-- | test/unit/test_tail_call_type.py | 42 |
12 files changed, 490 insertions, 82 deletions
diff --git a/test/binaryen.js/kitchen-sink.js.txt b/test/binaryen.js/kitchen-sink.js.txt index 3ec65d02b..74268dd44 100644 --- a/test/binaryen.js/kitchen-sink.js.txt +++ b/test/binaryen.js/kitchen-sink.js.txt @@ -1416,22 +1416,18 @@ getExpressionInfo(f64.const)={"id":14,"type":4,"value":9.5} (return (i32.const 1337) ) - (drop - (return_call "$kitchen()sinker" - (i32.const 13) - (i64.const 37) - (f32.const 1.2999999523162842) - (f64.const 3.7) - ) - ) - (drop - (return_call_indirect (type $iiIfF) - (i32.const 13) - (i64.const 37) - (f32.const 1.2999999523162842) - (f64.const 3.7) - (i32.const 2449) - ) + (return_call "$kitchen()sinker" + (i32.const 13) + (i64.const 37) + (f32.const 1.2999999523162842) + (f64.const 3.7) + ) + (return_call_indirect (type $iiIfF) + (i32.const 13) + (i64.const 37) + (f32.const 1.2999999523162842) + (f64.const 3.7) + (i32.const 2449) ) (nop) (unreachable) @@ -4800,22 +4796,18 @@ getExpressionInfo(f64.const)={"id":14,"type":4,"value":9.5} (return (i32.const 1337) ) - (drop - (return_call "$kitchen()sinker" - (i32.const 13) - (i64.const 37) - (f32.const 1.2999999523162842) - (f64.const 3.7) - ) - ) - (drop - (return_call_indirect (type $iiIfF) - (i32.const 13) - (i64.const 37) - (f32.const 1.2999999523162842) - (f64.const 3.7) - (i32.const 2449) - ) + (return_call "$kitchen()sinker" + (i32.const 13) + (i64.const 37) + (f32.const 1.2999999523162842) + (f64.const 3.7) + ) + (return_call_indirect (type $iiIfF) + (i32.const 13) + (i64.const 37) + (f32.const 1.2999999523162842) + (f64.const 3.7) + (i32.const 2449) ) (nop) (unreachable) diff --git a/test/example/c-api-kitchen-sink.txt b/test/example/c-api-kitchen-sink.txt index d18e1728e..14ed2c50e 100644 --- a/test/example/c-api-kitchen-sink.txt +++ b/test/example/c-api-kitchen-sink.txt @@ -1380,22 +1380,18 @@ BinaryenFeatureAll: 255 (return (i32.const 1337) ) - (drop - (return_call "$kitchen()sinker" - (i32.const 13) - (i64.const 37) - (f32.const 1.2999999523162842) - (f64.const 3.7) - ) - ) - (drop - (return_call_indirect (type $iiIfF) - (i32.const 13) - (i64.const 37) - (f32.const 1.2999999523162842) - (f64.const 3.7) - (i32.const 2449) - ) + (return_call "$kitchen()sinker" + (i32.const 13) + (i64.const 37) + (f32.const 1.2999999523162842) + (f64.const 3.7) + ) + (return_call_indirect (type $iiIfF) + (i32.const 13) + (i64.const 37) + (f32.const 1.2999999523162842) + (f64.const 3.7) + (i32.const 2449) ) (nop) (unreachable) @@ -4743,22 +4739,18 @@ int main() { (return (i32.const 1337) ) - (drop - (return_call "$kitchen()sinker" - (i32.const 13) - (i64.const 37) - (f32.const 1.2999999523162842) - (f64.const 3.7) - ) - ) - (drop - (return_call_indirect (type $iiIfF) - (i32.const 13) - (i64.const 37) - (f32.const 1.2999999523162842) - (f64.const 3.7) - (i32.const 2449) - ) + (return_call "$kitchen()sinker" + (i32.const 13) + (i64.const 37) + (f32.const 1.2999999523162842) + (f64.const 3.7) + ) + (return_call_indirect (type $iiIfF) + (i32.const 13) + (i64.const 37) + (f32.const 1.2999999523162842) + (f64.const 3.7) + (i32.const 2449) ) (nop) (unreachable) diff --git a/test/example/c-api-kitchen-sink.txt.txt b/test/example/c-api-kitchen-sink.txt.txt index c73646727..fd8ee7e94 100644 --- a/test/example/c-api-kitchen-sink.txt.txt +++ b/test/example/c-api-kitchen-sink.txt.txt @@ -1362,22 +1362,18 @@ (return (i32.const 1337) ) - (drop - (return_call "$kitchen()sinker" - (i32.const 13) - (i64.const 37) - (f32.const 1.2999999523162842) - (f64.const 3.7) - ) - ) - (drop - (return_call_indirect (type $iiIfF) - (i32.const 13) - (i64.const 37) - (f32.const 1.2999999523162842) - (f64.const 3.7) - (i32.const 2449) - ) + (return_call "$kitchen()sinker" + (i32.const 13) + (i64.const 37) + (f32.const 1.2999999523162842) + (f64.const 3.7) + ) + (return_call_indirect (type $iiIfF) + (i32.const 13) + (i64.const 37) + (f32.const 1.2999999523162842) + (f64.const 3.7) + (i32.const 2449) ) (nop) (unreachable) diff --git a/test/passes/dae.txt b/test/passes/dae_enable-tail-call.txt index 2789d5206..1854f8a33 100644 --- a/test/passes/dae.txt +++ b/test/passes/dae_enable-tail-call.txt @@ -243,3 +243,41 @@ ) ) ) +(module + (type $FUNCSIG$ii (func (param i32) (result i32))) + (func $foo (; 0 ;) (type $FUNCSIG$ii) (param $x i32) (result i32) + (drop + (return_call $bar) + ) + (i32.const 42) + ) + (func $bar (; 1 ;) (result i32) + (local $0 i32) + (local.set $0 + (i32.const 0) + ) + (i32.const 7) + ) +) +(module + (type $T (func (result i32))) + (type $FUNCSIG$ii (func (param i32) (result i32))) + (type $FUNCSIG$v (func)) + (table $0 1 1 funcref) + (func $foo (; 0 ;) (result i32) + (local $0 i32) + (local.set $0 + (i32.const 42) + ) + (drop + (return_call_indirect (type $T) + (i32.const 0) + ) + ) + ) + (func $bar (; 1 ;) (type $FUNCSIG$v) + (drop + (call $foo) + ) + ) +) diff --git a/test/passes/dae.wast b/test/passes/dae_enable-tail-call.wast index 2fdf6958d..e70cde1bb 100644 --- a/test/passes/dae.wast +++ b/test/passes/dae_enable-tail-call.wast @@ -130,4 +130,34 @@ (local.get $x) ) ) - +(module ;; tail calls inhibit dropped result removal + (func $foo (param $x i32) (result i32) + (drop + (return_call $bar + (i32.const 0) + ) + ) + (i32.const 42) + ) + (func $bar (param $x i32) (result i32) + (i32.const 7) + ) +) +(module ;; indirect tail calls inhibit dropped result removal + (type $T (func (result i32))) + (table 1 1 funcref) + (func $foo (param $x i32) (result i32) + (drop + (return_call_indirect (type $T) + (i32.const 0) + ) + ) + ) + (func $bar + (drop + (call $foo + (i32.const 42) + ) + ) + ) +) diff --git a/test/passes/directize.txt b/test/passes/directize_enable-tail-call.txt index 109140a8f..2a74aff68 100644 --- a/test/passes/directize.txt +++ b/test/passes/directize_enable-tail-call.txt @@ -195,3 +195,17 @@ ) ) ) +(module + (type $ii (func (param i32 i32))) + (table $0 5 5 funcref) + (elem (i32.const 1) $foo) + (func $foo (; 0 ;) (type $ii) (param $0 i32) (param $1 i32) + (unreachable) + ) + (func $bar (; 1 ;) (type $ii) (param $x i32) (param $y i32) + (return_call $foo + (local.get $x) + (local.get $y) + ) + ) +) diff --git a/test/passes/directize.wast b/test/passes/directize_enable-tail-call.wast index 4385aa18a..e111cf615 100644 --- a/test/passes/directize.wast +++ b/test/passes/directize_enable-tail-call.wast @@ -191,3 +191,18 @@ ) ) ) +(module ;; indirect tail call + (type $ii (func (param i32 i32))) + (table $0 5 5 funcref) + (elem (i32.const 1) $foo) + (func $foo (param i32) (param i32) + (unreachable) + ) + (func $bar (param $x i32) (param $y i32) + (return_call_indirect (type $ii) + (local.get $x) + (local.get $y) + (i32.const 1) + ) + ) +) diff --git a/test/passes/inlining.txt b/test/passes/inlining_enable-tail-call.txt index 738b580de..3119de526 100644 --- a/test/passes/inlining.txt +++ b/test/passes/inlining_enable-tail-call.txt @@ -261,3 +261,167 @@ ) ) ) +(module + (type $FUNCSIG$i (func (result i32))) + (func $0 (; 0 ;) (type $FUNCSIG$i) (result i32) + (return + (block $__inlined_func$1 (result i32) + (i32.const 42) + ) + ) + ) +) +(module + (type $FUNCSIG$v (func)) + (type $FUNCSIG$vi (func (param i32))) + (func $0 (; 0 ;) (type $FUNCSIG$v) + (local $0 i32) + (block + (block $__inlined_func$1 + (local.set $0 + (i32.const 42) + ) + (drop + (local.get $0) + ) + ) + (return) + ) + ) +) +(module + (type $FUNCSIG$i (func (result i32))) + (type $FUNCSIG$ii (func (param i32) (result i32))) + (func $0 (; 0 ;) (type $FUNCSIG$i) (result i32) + (local $0 i32) + (return + (block $__inlined_func$1 (result i32) + (local.set $0 + (i32.const 42) + ) + (local.get $0) + ) + ) + ) +) +(module + (type $FUNCSIG$v (func)) + (type $FUNCSIG$i (func (result i32))) + (func $0 (; 0 ;) (type $FUNCSIG$v) + (drop + (block (result i32) + (block $__inlined_func$1 (result i32) + (block + (br $__inlined_func$1 + (block (result i32) + (block $__inlined_func$2 (result i32) + (i32.const 42) + ) + ) + ) + ) + ) + ) + ) + ) +) +(module + (type $FUNCSIG$v (func)) + (type $FUNCSIG$vi (func (param i32))) + (func $0 (; 0 ;) (type $FUNCSIG$v) + (local $0 i32) + (block $__inlined_func$1 + (block + (block + (block + (block $__inlined_func$2 + (local.set $0 + (i32.const 42) + ) + (drop + (local.get $0) + ) + ) + ) + (br $__inlined_func$1) + ) + ) + (br $__inlined_func$1) + ) + ) +) +(module + (type $T (func (param i32) (result i32))) + (type $FUNCSIG$v (func)) + (type $FUNCSIG$i (func (result i32))) + (table $0 10 funcref) + (func $0 (; 0 ;) (type $FUNCSIG$v) + (drop + (block (result i32) + (block $__inlined_func$1 (result i32) + (br $__inlined_func$1 + (call_indirect (type $T) + (i32.const 42) + (i32.const 0) + ) + ) + ) + ) + ) + ) +) +(module + (type $T (func (param i32))) + (type $FUNCSIG$v (func)) + (table $0 10 funcref) + (func $0 (; 0 ;) (type $FUNCSIG$v) + (block $__inlined_func$1 + (block + (call_indirect (type $T) + (i32.const 42) + (i32.const 0) + ) + (br $__inlined_func$1) + ) + (br $__inlined_func$1) + ) + ) +) +(module + (type $6 (func)) + (memory $0 1 1) + (global $global$0 (mut i32) (i32.const 10)) + (export "func_102_invoker" (func $19)) + (func $19 (; 0 ;) (type $6) + (block + (block + (block $__inlined_func$13 + (block + (if + (global.get $global$0) + (unreachable) + ) + (block + (block + (block $__inlined_func$2 + (block + (if + (global.get $global$0) + (br $__inlined_func$2) + ) + (global.set $global$0 + (i32.const 1) + ) + ) + ) + (br $__inlined_func$13) + ) + ) + ) + (br $__inlined_func$13) + ) + ) + ) + (unreachable) + ) +) diff --git a/test/passes/inlining.wast b/test/passes/inlining_enable-tail-call.wast index 050ee9bc2..0ca64267a 100644 --- a/test/passes/inlining.wast +++ b/test/passes/inlining_enable-tail-call.wast @@ -174,4 +174,115 @@ (call $0) ) ) - +(module + (func $0 (result i32) + (return_call $1) + ) + (func $1 (result i32) + (i32.const 42) + ) +) +(module + (func $0 + (return_call $1 + (i32.const 42) + ) + ) + (func $1 (param i32) + (drop + (local.get 0) + ) + ) +) +(module + (func $0 (result i32) + (return_call $1 + (i32.const 42) + ) + ) + (func $1 (param i32) (result i32) + (local.get 0) + ) +) +(module + (func $0 + (drop + (call $1) + ) + ) + (func $1 (result i32) + (return_call $2) + ) + (func $2 (result i32) + (i32.const 42) + ) +) +(module + (func $0 + (call $1) + ) + (func $1 + (return_call $2 + (i32.const 42) + ) + ) + (func $2 (param i32) + (drop + (local.get 0) + ) + ) +) +(module + (type $T (func (param i32) (result i32))) + (table 10 funcref) + (func $0 + (drop + (call $1) + ) + ) + (func $1 (result i32) + (return_call_indirect (type $T) + (i32.const 42) + (i32.const 0) + ) + ) +) +(module + (type $T (func (param i32))) + (table 10 funcref) + (func $0 + (call $1) + ) + (func $1 + (return_call_indirect (type $T) + (i32.const 42) + (i32.const 0) + ) + ) +) +(module + (type $6 (func)) + (memory $0 1 1) + (global $global$0 (mut i32) (i32.const 10)) + (export "func_102_invoker" (func $19)) + (func $2 (; 2 ;) (type $6) + (if + (global.get $global$0) + (return) + ) + (global.set $global$0 + (i32.const 1) + ) + ) + (func $13 (; 13 ;) (type $6) + (if + (global.get $global$0) + (unreachable) + ) + (return_call $2) + ) + (func $19 (; 19 ;) (type $6) + (call $13) + (unreachable) + ) +) diff --git a/test/unit/input/tail_call_target_feature.wasm b/test/unit/input/tail_call_target_feature.wasm Binary files differindex 063b6d2a5..651c92ec8 100755 --- a/test/unit/input/tail_call_target_feature.wasm +++ b/test/unit/input/tail_call_target_feature.wasm diff --git a/test/unit/test_features.py b/test/unit/test_features.py index 968aaa252..2a0eca39b 100644 --- a/test/unit/test_features.py +++ b/test/unit/test_features.py @@ -131,6 +131,20 @@ class FeatureValidationTest(BinaryenTestCase): ''' self.check_tail_call(module, 'return_call requires tail calls to be enabled') + def test_tail_call_indirect(self): + module = ''' + (module + (type $T (func)) + (table $0 1 1 funcref) + (func $foo + (return_call_indirect (type $T) + (i32.const 0) + ) + ) + ) + ''' + self.check_tail_call(module, 'return_call_indirect requires tail calls to be enabled') + class TargetFeaturesSectionTest(BinaryenTestCase): def test_atomics(self): diff --git a/test/unit/test_tail_call_type.py b/test/unit/test_tail_call_type.py new file mode 100644 index 000000000..4db0589c4 --- /dev/null +++ b/test/unit/test_tail_call_type.py @@ -0,0 +1,42 @@ +from scripts.test.shared import WASM_OPT, run_process +from utils import BinaryenTestCase +import os + + +class TailCallTypeTest(BinaryenTestCase): + def test_return_call(self): + module = ''' + (module + (func $foo (result f32) + (return_call $bar) + ) + (func $bar (result i32) + (i32.const 1) + ) + ) + ''' + p = run_process(WASM_OPT + ['--enable-tail-call', '-o', os.devnull], + input=module, check=False, capture_output=True) + self.assertNotEqual(p.returncode, 0) + self.assertIn( + 'return_call callee return type must match caller return type', + p.stderr) + + def test_return_call_indirect(self): + module = ''' + (module + (type $T (func (result i32))) + (table $0 1 1 funcref) + (func $foo (result f32) + (return_call_indirect (type $T) + (i32.const 0) + ) + ) + ) + ''' + p = run_process(WASM_OPT + ['--enable-tail-call', '-o', os.devnull], + input=module, check=False, capture_output=True) + self.assertNotEqual(p.returncode, 0) + self.assertIn( + 'return_call_indirect callee return type must match caller return type', + p.stderr) |