| ;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. | |
| ;; RUN: foreach %s %t wasm-opt -all --string-lifting -S -o - | filecheck %s | |
| (module | |
| ;; CHECK: (type $0 (func (param externref) (result i32))) | |
| ;; CHECK: (type $array16 (array (mut i16))) | |
| (type $array16 (array (mut i16))) | |
| ;; CHECK: (type $2 (func (param externref externref) (result i32))) | |
| ;; CHECK: (type $3 (func (param externref i32 i32) (result (ref extern)))) | |
| ;; CHECK: (type $4 (func (param externref externref) (result (ref extern)))) | |
| ;; CHECK: (type $5 (func (param (ref null $array16) i32 i32) (result (ref extern)))) | |
| ;; CHECK: (type $6 (func (param i32) (result (ref extern)))) | |
| ;; CHECK: (type $7 (func (param externref (ref null $array16) i32) (result i32))) | |
| ;; CHECK: (type $8 (func (param externref i32) (result i32))) | |
| ;; CHECK: (type $9 (func)) | |
| ;; CHECK: (type $10 (func (param (ref $array16)))) | |
| ;; CHECK: (type $11 (func (result externref))) | |
| ;; CHECK: (type $12 (func (param externref (ref $array16)) (result i32))) | |
| ;; CHECK: (type $13 (func (param externref) (result externref))) | |
| ;; CHECK: (type $14 (func (param externref))) | |
| ;; CHECK: (import "\'" "foo" (global $string_foo (ref extern))) | |
| (import "\'" "foo" (global $string_foo (ref extern))) | |
| ;; CHECK: (import "\'" "bar" (global $string_bar (ref extern))) | |
| (import "\'" "bar" (global $string_bar (ref extern))) | |
| ;; CHECK: (import "wasm:js-string" "fromCharCodeArray" (func $fromCharCodeArray (type $5) (param (ref null $array16) i32 i32) (result (ref extern)))) | |
| (import "wasm:js-string" "fromCharCodeArray" (func $fromCharCodeArray (param (ref null $array16) i32 i32) (result (ref extern)))) | |
| ;; CHECK: (import "wasm:js-string" "fromCodePoint" (func $fromCodePoint (type $6) (param i32) (result (ref extern)))) | |
| (import "wasm:js-string" "fromCodePoint" (func $fromCodePoint (param i32) (result (ref extern)))) | |
| ;; CHECK: (import "wasm:js-string" "concat" (func $concat (type $4) (param externref externref) (result (ref extern)))) | |
| (import "wasm:js-string" "concat" (func $concat (param externref externref) (result (ref extern)))) | |
| ;; CHECK: (import "wasm:js-string" "intoCharCodeArray" (func $intoCharCodeArray (type $7) (param externref (ref null $array16) i32) (result i32))) | |
| (import "wasm:js-string" "intoCharCodeArray" (func $intoCharCodeArray (param externref (ref null $array16) i32) (result i32))) | |
| ;; CHECK: (import "wasm:js-string" "equals" (func $equals (type $2) (param externref externref) (result i32))) | |
| (import "wasm:js-string" "equals" (func $equals (param externref externref) (result i32))) | |
| ;; CHECK: (import "wasm:js-string" "compare" (func $compare (type $2) (param externref externref) (result i32))) | |
| (import "wasm:js-string" "compare" (func $compare (param externref externref) (result i32))) | |
| ;; CHECK: (import "wasm:js-string" "test" (func $test (type $0) (param externref) (result i32))) | |
| (import "wasm:js-string" "test" (func $test (param externref) (result i32))) | |
| ;; CHECK: (import "wasm:js-string" "length" (func $length (type $0) (param externref) (result i32))) | |
| (import "wasm:js-string" "length" (func $length (param externref) (result i32))) | |
| ;; CHECK: (import "wasm:js-string" "charCodeAt" (func $charCodeAt (type $8) (param externref i32) (result i32))) | |
| (import "wasm:js-string" "charCodeAt" (func $charCodeAt (param externref i32) (result i32))) | |
| ;; CHECK: (import "wasm:js-string" "substring" (func $substring_foo (type $3) (param externref i32 i32) (result (ref extern)))) | |
| (import "wasm:js-string" "substring" (func $substring_foo (param externref i32 i32) (result (ref extern)))) | |
| ;; A function from the right module, but an unsupported name. | |
| ;; CHECK: (import "wasm:js-string" "wrong-name" (func $wrong-base (type $3) (param externref i32 i32) (result (ref extern)))) | |
| (import "wasm:js-string" "wrong-name" (func $wrong-base (param externref i32 i32) (result (ref extern)))) | |
| ;; A function that is right in all ways but the module. | |
| ;; CHECK: (import "oops" "substring" (func $wrong-module (type $3) (param externref i32 i32) (result (ref extern)))) | |
| (import "oops" "substring" (func $wrong-module (param externref i32 i32) (result (ref extern)))) | |
| ;; CHECK: (func $func (type $9) | |
| ;; CHECK-NEXT: (drop | |
| ;; CHECK-NEXT: (string.const "foo") | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: (drop | |
| ;; CHECK-NEXT: (select (result (ref string)) | |
| ;; CHECK-NEXT: (string.const "bar") | |
| ;; CHECK-NEXT: (string.const "bar") | |
| ;; CHECK-NEXT: (i32.const 1) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| (func $func | |
| (drop | |
| (global.get $string_foo) | |
| ) | |
| ;; Test multiple uses of the same constant, and that we update types. | |
| (drop | |
| (select (result externref) | |
| (global.get $string_bar) | |
| (global.get $string_bar) | |
| (i32.const 1) | |
| ) | |
| ) | |
| ) | |
| ;; CHECK: (func $string.new.gc (type $10) (param $ref (ref $array16)) | |
| ;; CHECK-NEXT: (drop | |
| ;; CHECK-NEXT: (string.new_wtf16_array | |
| ;; CHECK-NEXT: (local.get $ref) | |
| ;; CHECK-NEXT: (i32.const 7) | |
| ;; CHECK-NEXT: (i32.const 8) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| (func $string.new.gc (param $ref (ref $array16)) | |
| (drop | |
| (call $fromCharCodeArray | |
| (local.get $ref) | |
| (i32.const 7) | |
| (i32.const 8) | |
| ) | |
| ) | |
| ) | |
| ;; CHECK: (func $string.from_code_point (type $11) (result externref) | |
| ;; CHECK-NEXT: (string.from_code_point | |
| ;; CHECK-NEXT: (i32.const 1) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| (func $string.from_code_point (result externref) | |
| (call $fromCodePoint | |
| (i32.const 1) | |
| ) | |
| ) | |
| ;; CHECK: (func $string.concat (type $4) (param $a externref) (param $b externref) (result (ref extern)) | |
| ;; CHECK-NEXT: (string.concat | |
| ;; CHECK-NEXT: (local.get $a) | |
| ;; CHECK-NEXT: (local.get $b) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| (func $string.concat (param $a externref) (param $b externref) (result (ref extern)) | |
| (call $concat | |
| (local.get $a) | |
| (local.get $b) | |
| ) | |
| ) | |
| ;; CHECK: (func $string.encode (type $12) (param $ref externref) (param $array16 (ref $array16)) (result i32) | |
| ;; CHECK-NEXT: (string.encode_wtf16_array | |
| ;; CHECK-NEXT: (local.get $ref) | |
| ;; CHECK-NEXT: (local.get $array16) | |
| ;; CHECK-NEXT: (i32.const 10) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| (func $string.encode (param $ref externref) (param $array16 (ref $array16)) (result i32) | |
| (call $intoCharCodeArray | |
| (local.get $ref) | |
| (local.get $array16) | |
| (i32.const 10) | |
| ) | |
| ) | |
| ;; CHECK: (func $string.eq (type $2) (param $a externref) (param $b externref) (result i32) | |
| ;; CHECK-NEXT: (string.eq | |
| ;; CHECK-NEXT: (local.get $a) | |
| ;; CHECK-NEXT: (local.get $b) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| (func $string.eq (param $a externref) (param $b externref) (result i32) | |
| (call $equals | |
| (local.get $a) | |
| (local.get $b) | |
| ) | |
| ) | |
| ;; CHECK: (func $string.compare (type $2) (param $a externref) (param $b externref) (result i32) | |
| ;; CHECK-NEXT: (string.compare | |
| ;; CHECK-NEXT: (local.get $a) | |
| ;; CHECK-NEXT: (local.get $b) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| (func $string.compare (param $a externref) (param $b externref) (result i32) | |
| (call $compare | |
| (local.get $a) | |
| (local.get $b) | |
| ) | |
| ) | |
| ;; CHECK: (func $string.test (type $0) (param $a externref) (result i32) | |
| ;; CHECK-NEXT: (string.test | |
| ;; CHECK-NEXT: (local.get $a) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| (func $string.test (param $a externref) (result i32) | |
| (call $test | |
| (local.get $a) | |
| ) | |
| ) | |
| ;; CHECK: (func $string.length (type $0) (param $ref externref) (result i32) | |
| ;; CHECK-NEXT: (string.measure_wtf16 | |
| ;; CHECK-NEXT: (local.get $ref) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| (func $string.length (param $ref externref) (result i32) | |
| (call $length | |
| (local.get $ref) | |
| ) | |
| ) | |
| ;; CHECK: (func $string.get_codeunit (type $0) (param $ref externref) (result i32) | |
| ;; CHECK-NEXT: (stringview_wtf16.get_codeunit | |
| ;; CHECK-NEXT: (local.get $ref) | |
| ;; CHECK-NEXT: (i32.const 2) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| (func $string.get_codeunit (param $ref externref) (result i32) | |
| (call $charCodeAt | |
| (local.get $ref) | |
| (i32.const 2) | |
| ) | |
| ) | |
| ;; CHECK: (func $string.slice (type $13) (param $ref externref) (result externref) | |
| ;; CHECK-NEXT: (stringview_wtf16.slice | |
| ;; CHECK-NEXT: (local.get $ref) | |
| ;; CHECK-NEXT: (i32.const 2) | |
| ;; CHECK-NEXT: (i32.const 3) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| (func $string.slice (param $ref externref) (result externref) | |
| ;; Note how the internal name has _foo appended, but that does not confuse | |
| ;; use - the module and base names of the import are what matter. | |
| (call $substring_foo | |
| (local.get $ref) | |
| (i32.const 2) | |
| (i32.const 3) | |
| ) | |
| ) | |
| ;; CHECK: (func $wrong (type $14) (param $ref externref) | |
| ;; CHECK-NEXT: (drop | |
| ;; CHECK-NEXT: (call $wrong-base | |
| ;; CHECK-NEXT: (local.get $ref) | |
| ;; CHECK-NEXT: (i32.const 4) | |
| ;; CHECK-NEXT: (i32.const 5) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: (drop | |
| ;; CHECK-NEXT: (call $wrong-module | |
| ;; CHECK-NEXT: (local.get $ref) | |
| ;; CHECK-NEXT: (i32.const 6) | |
| ;; CHECK-NEXT: (i32.const 7) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| (func $wrong (param $ref externref) | |
| ;; We do nothing with functions with the wrong base or module name. | |
| (drop | |
| (call $wrong-base | |
| (local.get $ref) | |
| (i32.const 4) | |
| (i32.const 5) | |
| ) | |
| ) | |
| (drop | |
| (call $wrong-module | |
| (local.get $ref) | |
| (i32.const 6) | |
| (i32.const 7) | |
| ) | |
| ) | |
| ) | |
| ) |