summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/binaryen.js/kitchen-sink.js.txt56
-rw-r--r--test/example/c-api-kitchen-sink.txt56
-rw-r--r--test/example/c-api-kitchen-sink.txt.txt28
-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-xtest/unit/input/tail_call_target_feature.wasmbin129 -> 113 bytes
-rw-r--r--test/unit/test_features.py14
-rw-r--r--test/unit/test_tail_call_type.py42
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
index 063b6d2a5..651c92ec8 100755
--- a/test/unit/input/tail_call_target_feature.wasm
+++ b/test/unit/input/tail_call_target_feature.wasm
Binary files differ
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)