diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/lit/passes/type-ssa.wast | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/test/lit/passes/type-ssa.wast b/test/lit/passes/type-ssa.wast index f799cd871..790c6488a 100644 --- a/test/lit/passes/type-ssa.wast +++ b/test/lit/passes/type-ssa.wast @@ -219,3 +219,233 @@ ) ) ) + +(module + ;; CHECK: (type $array (array (mut anyref))) + ;; NOMNL: (type $array (array (mut anyref))) + (type $array (array (mut (ref null any)))) + + ;; CHECK: (type $ref|i31|_anyref_=>_none (func (param (ref i31) anyref))) + + ;; CHECK: (type $array-func (array (mut funcref))) + ;; NOMNL: (type $ref|i31|_anyref_=>_none (func (param (ref i31) anyref))) + + ;; NOMNL: (type $array$1 (array_subtype (mut anyref) $array)) + + ;; NOMNL: (type $array$2 (array_subtype (mut anyref) $array)) + + ;; NOMNL: (type $array$3 (array_subtype (mut anyref) $array)) + + ;; NOMNL: (type $none_=>_none (func)) + + ;; NOMNL: (type $array-func (array (mut funcref))) + (type $array-func (array (mut funcref))) + + + ;; CHECK: (rec + ;; CHECK-NEXT: (type $array$1 (array_subtype (mut anyref) $array)) + + ;; CHECK: (type $array$2 (array_subtype (mut anyref) $array)) + + ;; CHECK: (type $array$3 (array_subtype (mut anyref) $array)) + + ;; CHECK: (type $array-func$4 (array_subtype (mut funcref) $array-func)) + + ;; CHECK: (type $array$5 (array_subtype (mut anyref) $array)) + + ;; CHECK: (type $array$6 (array_subtype (mut anyref) $array)) + + ;; CHECK: (type $none_=>_none (func)) + + ;; CHECK: (elem func $array.new) + ;; NOMNL: (type $array-func$4 (array_subtype (mut funcref) $array-func)) + + ;; NOMNL: (type $array$5 (array_subtype (mut anyref) $array)) + + ;; NOMNL: (type $array$6 (array_subtype (mut anyref) $array)) + + ;; NOMNL: (elem func $array.new) + (elem func $array.new) + + ;; CHECK: (func $array.new (type $ref|i31|_anyref_=>_none) (param $refined (ref i31)) (param $null-any anyref) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (array.new_default $array$1 + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (array.new $array$2 + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (array.new $array$3 + ;; CHECK-NEXT: (local.get $refined) + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (array.new $array + ;; CHECK-NEXT: (local.get $null-any) + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; NOMNL: (func $array.new (type $ref|i31|_anyref_=>_none) (param $refined (ref i31)) (param $null-any anyref) + ;; NOMNL-NEXT: (drop + ;; NOMNL-NEXT: (array.new_default $array$1 + ;; NOMNL-NEXT: (i32.const 5) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: (drop + ;; NOMNL-NEXT: (array.new $array$2 + ;; NOMNL-NEXT: (ref.null none) + ;; NOMNL-NEXT: (i32.const 5) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: (drop + ;; NOMNL-NEXT: (array.new $array$3 + ;; NOMNL-NEXT: (local.get $refined) + ;; NOMNL-NEXT: (i32.const 5) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: (drop + ;; NOMNL-NEXT: (array.new $array + ;; NOMNL-NEXT: (local.get $null-any) + ;; NOMNL-NEXT: (i32.const 5) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: ) + (func $array.new (param $refined (ref i31)) (param $null-any (ref null any)) + ;; Default null, an interesting value, so we get a new type. + (drop + (array.new_default $array + (i32.const 5) + ) + ) + ;; Given null, also interesting. + (drop + (array.new $array + (ref.null none) + (i32.const 5) + ) + ) + ;; More refined type, interesting. + (drop + (array.new $array + (local.get $refined) + (i32.const 5) + ) + ) + ;; Same type as declared - boring, no new type. + (drop + (array.new $array + (local.get $null-any) + (i32.const 5) + ) + ) + ) + + ;; CHECK: (func $array.new_seg (type $none_=>_none) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (array.new_elem $array-func$4 0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; NOMNL: (func $array.new_seg (type $none_=>_none) + ;; NOMNL-NEXT: (drop + ;; NOMNL-NEXT: (array.new_elem $array-func$4 0 + ;; NOMNL-NEXT: (i32.const 0) + ;; NOMNL-NEXT: (i32.const 3) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: ) + (func $array.new_seg + ;; We consider all new_elem to be interesting as we don't look at the elem + ;; data yet. + (drop + (array.new_elem $array-func 0 + (i32.const 0) + (i32.const 3) + ) + ) + ) + + ;; CHECK: (func $array.init (type $ref|i31|_anyref_=>_none) (param $refined (ref i31)) (param $null-any anyref) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (array.init_static $array$5 + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (array.init_static $array$6 + ;; CHECK-NEXT: (local.get $refined) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (array.init_static $array + ;; CHECK-NEXT: (local.get $null-any) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (array.init_static $array + ;; CHECK-NEXT: (local.get $refined) + ;; CHECK-NEXT: (local.get $null-any) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; NOMNL: (func $array.init (type $ref|i31|_anyref_=>_none) (param $refined (ref i31)) (param $null-any anyref) + ;; NOMNL-NEXT: (drop + ;; NOMNL-NEXT: (array.init_static $array$5 + ;; NOMNL-NEXT: (ref.null none) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: (drop + ;; NOMNL-NEXT: (array.init_static $array$6 + ;; NOMNL-NEXT: (local.get $refined) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: (drop + ;; NOMNL-NEXT: (array.init_static $array + ;; NOMNL-NEXT: (local.get $null-any) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: (drop + ;; NOMNL-NEXT: (array.init_static $array + ;; NOMNL-NEXT: (local.get $refined) + ;; NOMNL-NEXT: (local.get $null-any) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: ) + (func $array.init (param $refined (ref i31)) (param $null-any (ref null any)) + ;; Null, interesting, so we get a new type. + (drop + (array.init_static $array + (ref.null none) + ) + ) + ;; More refined type, interesting. + (drop + (array.init_static $array + (local.get $refined) + ) + ) + ;; Same type as declared - boring, no new type. + (drop + (array.init_static $array + (local.get $null-any) + ) + ) + ;; Mixture of boring and interesting => boring (since we infer a single type + ;; for the entire array). + (drop + (array.init_static $array + (local.get $refined) + (local.get $null-any) + ) + ) + ) +) |