summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2024-02-13 17:09:30 -0800
committerGitHub <noreply@github.com>2024-02-13 17:09:30 -0800
commit9784f012848a7eb321c2037bdb363dfe0eab8bc9 (patch)
tree413f22ba04b2c4f8191e2d399cb6e4e6461d74ac /test
parent78516ae1febad02ebf3162f5db9debc8904e8e74 (diff)
downloadbinaryen-9784f012848a7eb321c2037bdb363dfe0eab8bc9.tar.gz
binaryen-9784f012848a7eb321c2037bdb363dfe0eab8bc9.tar.bz2
binaryen-9784f012848a7eb321c2037bdb363dfe0eab8bc9.zip
StringLowering: Use an array16 type in its own rec group (#6302)
The input module might use an array of 16-bit elements type that is somewhere in a giant rec group, but that is not valid for imported strings: that array type is now on an import and must match the expected ABI, which is to be in its own personal rec group. The old array16 type remains in the module after this transformation, but all uses of it are replaced with uses of the new array16 type. Also move makeImports to after updateTypes: there are no types to update in the new imports. That does not matter but it can make debugging less pleasant, so improve it.
Diffstat (limited to 'test')
-rw-r--r--test/lit/passes/string-lowering-instructions.wast161
1 files changed, 118 insertions, 43 deletions
diff --git a/test/lit/passes/string-lowering-instructions.wast b/test/lit/passes/string-lowering-instructions.wast
index 9e2d78012..2feedcb39 100644
--- a/test/lit/passes/string-lowering-instructions.wast
+++ b/test/lit/passes/string-lowering-instructions.wast
@@ -3,70 +3,89 @@
;; RUN: foreach %s %t wasm-opt --string-lowering -all -S -o - | filecheck %s
(module
- ;; CHECK: (type $array16 (array (mut i16)))
- (type $array16 (array (mut i16)))
+ (rec
+ ;; CHECK: (type $0 (array (mut i16)))
- ;; CHECK: (type $1 (func (param externref externref) (result i32)))
+ ;; CHECK: (type $1 (func))
- ;; CHECK: (rec
- ;; CHECK-NEXT: (type $2 (func (param externref i32 externref)))
+ ;; CHECK: (type $2 (func (param externref externref) (result i32)))
- ;; CHECK: (type $3 (func (result externref)))
+ ;; CHECK: (rec
+ ;; CHECK-NEXT: (type $3 (func (param externref i32 externref)))
- ;; CHECK: (type $4 (func (param externref) (result externref)))
+ ;; CHECK: (type $4 (func (result externref)))
- ;; CHECK: (type $5 (func (param externref) (result externref)))
+ ;; CHECK: (type $struct-of-array (struct (field (ref $0))))
+ (type $struct-of-array (struct (field (ref $array16))))
- ;; CHECK: (type $6 (func (param externref) (result i32)))
+ ;; CHECK: (type $array16-imm (array i32))
+ (type $array16-imm (array i32))
- ;; CHECK: (type $7 (func (param externref externref) (result i32)))
+ ;; CHECK: (type $array32 (array (mut i32)))
+ (type $array32 (array (mut i32)))
- ;; CHECK: (type $8 (func (param externref (ref $array16)) (result i32)))
+ ;; CHECK: (type $array16-open (sub (array (mut i16))))
+ (type $array16-open (sub (array (mut i16))))
- ;; CHECK: (type $9 (func (param (ref $array16))))
+ ;; CHECK: (type $array16-child (sub $array16-open (array (mut i16))))
+ (type $array16-child (sub $array16-open (array (mut i16))))
- ;; CHECK: (type $10 (func (param externref externref externref externref)))
+ ;; CHECK: (type $array16 (array (mut i16)))
+ (type $array16 (array (mut i16)))
+ )
+
+ ;; CHECK: (type $11 (func (param externref) (result externref)))
+
+ ;; CHECK: (type $12 (func (param externref) (result externref)))
+
+ ;; CHECK: (type $13 (func (param externref) (result i32)))
+
+ ;; CHECK: (type $14 (func (param externref externref) (result i32)))
+
+ ;; CHECK: (type $15 (func (param externref (ref $0)) (result i32)))
- ;; CHECK: (type $11 (func))
+ ;; CHECK: (type $16 (func (param (ref $0))))
- ;; CHECK: (type $12 (func (param (ref null $array16) i32 i32) (result (ref extern))))
+ ;; CHECK: (type $17 (func (param externref externref externref externref)))
- ;; CHECK: (type $13 (func (param i32) (result (ref extern))))
+ ;; CHECK: (type $18 (func (param (ref null $0) i32 i32) (result (ref extern))))
- ;; CHECK: (type $14 (func (param externref (ref null $array16) i32) (result i32)))
+ ;; CHECK: (type $19 (func (param i32) (result (ref extern))))
- ;; CHECK: (type $15 (func (param externref) (result i32)))
+ ;; CHECK: (type $20 (func (param externref (ref null $0) i32) (result i32)))
- ;; CHECK: (type $16 (func (param externref i32) (result i32)))
+ ;; CHECK: (type $21 (func (param externref) (result i32)))
- ;; CHECK: (type $17 (func (param externref i32 i32) (result (ref extern))))
+ ;; CHECK: (type $22 (func (param externref i32) (result i32)))
+
+ ;; CHECK: (type $23 (func (param externref i32 i32) (result (ref extern))))
;; CHECK: (import "string.const" "0" (global $string.const_exported (ref extern)))
- ;; CHECK: (import "colliding" "name" (func $fromCodePoint (type $11)))
+ ;; CHECK: (import "colliding" "name" (func $fromCodePoint (type $1)))
(import "colliding" "name" (func $fromCodePoint))
- ;; CHECK: (import "wasm:js-string" "fromCharCodeArray" (func $fromCharCodeArray (type $12) (param (ref null $array16) i32 i32) (result (ref extern))))
+ ;; CHECK: (import "wasm:js-string" "fromCharCodeArray" (func $fromCharCodeArray (type $18) (param (ref null $0) i32 i32) (result (ref extern))))
- ;; CHECK: (import "wasm:js-string" "fromCodePoint" (func $fromCodePoint_15 (type $13) (param i32) (result (ref extern))))
+ ;; CHECK: (import "wasm:js-string" "fromCodePoint" (func $fromCodePoint_16 (type $19) (param i32) (result (ref extern))))
- ;; CHECK: (import "wasm:js-string" "intoCharCodeArray" (func $intoCharCodeArray (type $14) (param externref (ref null $array16) i32) (result i32)))
+ ;; CHECK: (import "wasm:js-string" "intoCharCodeArray" (func $intoCharCodeArray (type $20) (param externref (ref null $0) i32) (result i32)))
- ;; CHECK: (import "wasm:js-string" "equals" (func $equals (type $1) (param externref externref) (result i32)))
+ ;; CHECK: (import "wasm:js-string" "equals" (func $equals (type $2) (param externref externref) (result i32)))
- ;; CHECK: (import "wasm:js-string" "compare" (func $compare (type $1) (param externref externref) (result i32)))
+ ;; CHECK: (import "wasm:js-string" "compare" (func $compare (type $2) (param externref externref) (result i32)))
- ;; CHECK: (import "wasm:js-string" "length" (func $length (type $15) (param externref) (result i32)))
+ ;; CHECK: (import "wasm:js-string" "length" (func $length (type $21) (param externref) (result i32)))
- ;; CHECK: (import "wasm:js-string" "codePointAt" (func $codePointAt (type $16) (param externref i32) (result i32)))
+ ;; CHECK: (import "wasm:js-string" "codePointAt" (func $codePointAt (type $22) (param externref i32) (result i32)))
- ;; CHECK: (import "wasm:js-string" "substring" (func $substring (type $17) (param externref i32 i32) (result (ref extern))))
+ ;; CHECK: (import "wasm:js-string" "substring" (func $substring (type $23) (param externref i32 i32) (result (ref extern))))
;; CHECK: (export "export.1" (func $exported-string-returner))
;; CHECK: (export "export.2" (func $exported-string-receiver))
- ;; CHECK: (func $string.as (type $10) (param $a externref) (param $b externref) (param $c externref) (param $d externref)
+ ;; CHECK: (func $string.as (type $17) (param $a externref) (param $b externref) (param $c externref) (param $d externref)
;; CHECK-NEXT: (local.set $b
;; CHECK-NEXT: (local.get $a)
;; CHECK-NEXT: )
@@ -101,7 +120,7 @@
)
)
- ;; CHECK: (func $string.new.gc (type $9) (param $array16 (ref $array16))
+ ;; CHECK: (func $string.new.gc (type $16) (param $array16 (ref $0))
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (call $fromCharCodeArray
;; CHECK-NEXT: (local.get $array16)
@@ -120,8 +139,8 @@
)
)
- ;; CHECK: (func $string.from_code_point (type $3) (result externref)
- ;; CHECK-NEXT: (call $fromCodePoint_15
+ ;; CHECK: (func $string.from_code_point (type $4) (result externref)
+ ;; CHECK-NEXT: (call $fromCodePoint_16
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
@@ -131,7 +150,7 @@
)
)
- ;; CHECK: (func $string.encode (type $8) (param $ref externref) (param $array16 (ref $array16)) (result i32)
+ ;; CHECK: (func $string.encode (type $15) (param $ref externref) (param $array16 (ref $0)) (result i32)
;; CHECK-NEXT: (call $intoCharCodeArray
;; CHECK-NEXT: (local.get $ref)
;; CHECK-NEXT: (local.get $array16)
@@ -146,7 +165,7 @@
)
)
- ;; CHECK: (func $string.eq (type $7) (param $a externref) (param $b externref) (result i32)
+ ;; CHECK: (func $string.eq (type $14) (param $a externref) (param $b externref) (result i32)
;; CHECK-NEXT: (call $equals
;; CHECK-NEXT: (local.get $a)
;; CHECK-NEXT: (local.get $b)
@@ -159,7 +178,7 @@
)
)
- ;; CHECK: (func $string.compare (type $7) (param $a externref) (param $b externref) (result i32)
+ ;; CHECK: (func $string.compare (type $14) (param $a externref) (param $b externref) (result i32)
;; CHECK-NEXT: (call $compare
;; CHECK-NEXT: (local.get $a)
;; CHECK-NEXT: (local.get $b)
@@ -172,7 +191,7 @@
)
)
- ;; CHECK: (func $string.length (type $6) (param $ref externref) (result i32)
+ ;; CHECK: (func $string.length (type $13) (param $ref externref) (result i32)
;; CHECK-NEXT: (call $length
;; CHECK-NEXT: (local.get $ref)
;; CHECK-NEXT: )
@@ -183,7 +202,7 @@
)
)
- ;; CHECK: (func $string.get_codeunit (type $6) (param $ref externref) (result i32)
+ ;; CHECK: (func $string.get_codeunit (type $13) (param $ref externref) (result i32)
;; CHECK-NEXT: (call $codePointAt
;; CHECK-NEXT: (local.get $ref)
;; CHECK-NEXT: (i32.const 2)
@@ -196,7 +215,7 @@
)
)
- ;; CHECK: (func $string.slice (type $5) (param $ref externref) (result externref)
+ ;; CHECK: (func $string.slice (type $12) (param $ref externref) (result externref)
;; CHECK-NEXT: (call $substring
;; CHECK-NEXT: (local.get $ref)
;; CHECK-NEXT: (i32.const 2)
@@ -211,7 +230,7 @@
)
)
- ;; CHECK: (func $if.string (type $4) (param $ref externref) (result externref)
+ ;; CHECK: (func $if.string (type $11) (param $ref externref) (result externref)
;; CHECK-NEXT: (if (result externref)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
@@ -234,7 +253,7 @@
)
)
- ;; CHECK: (func $if.string.flip (type $4) (param $ref externref) (result externref)
+ ;; CHECK: (func $if.string.flip (type $11) (param $ref externref) (result externref)
;; CHECK-NEXT: (if (result externref)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
@@ -258,7 +277,7 @@
)
)
- ;; CHECK: (func $exported-string-returner (type $3) (result externref)
+ ;; CHECK: (func $exported-string-returner (type $4) (result externref)
;; CHECK-NEXT: (global.get $string.const_exported)
;; CHECK-NEXT: )
(func $exported-string-returner (export "export.1") (result stringref)
@@ -267,7 +286,7 @@
(string.const "exported")
)
- ;; CHECK: (func $exported-string-receiver (type $2) (param $x externref) (param $y i32) (param $z externref)
+ ;; CHECK: (func $exported-string-receiver (type $3) (param $x externref) (param $y i32) (param $z externref)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $x)
;; CHECK-NEXT: )
@@ -291,4 +310,60 @@
(local.get $z)
)
)
+
+ ;; CHECK: (func $use-struct-of-array (type $1)
+ ;; CHECK-NEXT: (local $array16 (ref $0))
+ ;; CHECK-NEXT: (local $open (ref $array16-open))
+ ;; CHECK-NEXT: (local $child (ref $array16-child))
+ ;; CHECK-NEXT: (local $32 (ref $array32))
+ ;; CHECK-NEXT: (local $imm (ref $array16-imm))
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (call $fromCharCodeArray
+ ;; CHECK-NEXT: (struct.get $struct-of-array 0
+ ;; CHECK-NEXT: (struct.new $struct-of-array
+ ;; CHECK-NEXT: (array.new_fixed $0 2
+ ;; CHECK-NEXT: (i32.const 10)
+ ;; CHECK-NEXT: (i32.const 20)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $use-struct-of-array
+ ;; The array type here should switch to the new 16-bit array type that we
+ ;; use for the new imports, so that it is compatible with them. Without
+ ;; that, calling the import as we do below will fail.
+ (local $array16 (ref $array16))
+
+ ;; In comparison, the array16-open param should remain as it is: it is an
+ ;; open type which is different then the one we care about.
+ (local $open (ref $array16-open))
+
+ ;; Likewise a child of that open type is also ignored.
+ (local $child (ref $array16-child))
+
+ ;; Another array size is also ignored.
+ (local $32 (ref $array32))
+
+ ;; An immutable array is also ignored.
+ (local $imm (ref $array16-imm))
+
+ (drop
+ (string.new_wtf16_array
+ (struct.get $struct-of-array 0
+ (struct.new $struct-of-array
+ (array.new_fixed $array16 2
+ (i32.const 10)
+ (i32.const 20)
+ )
+ )
+ )
+ (i32.const 0)
+ (i32.const 1)
+ )
+ )
+ )
)