blob: da537c59e9891379abf5a13db4b58c2aaf14f9ef [file] [log] [blame] [edit]
;; 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)
)
)
)
)