diff options
author | Alon Zakai <azakai@google.com> | 2024-02-13 17:09:30 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-13 17:09:30 -0800 |
commit | 9784f012848a7eb321c2037bdb363dfe0eab8bc9 (patch) | |
tree | 413f22ba04b2c4f8191e2d399cb6e4e6461d74ac /test | |
parent | 78516ae1febad02ebf3162f5db9debc8904e8e74 (diff) | |
download | binaryen-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.wast | 161 |
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) + ) + ) + ) ) |