From 89c619b46ed2b26dc8a32137c7ec440af7b8629b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 29 May 2024 14:19:10 -0700 Subject: [PATCH 1/8] fix --- src/ir/type-updating.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/ir/type-updating.cpp b/src/ir/type-updating.cpp index 12a8c7c3621..d38670630f6 100644 --- a/src/ir/type-updating.cpp +++ b/src/ir/type-updating.cpp @@ -18,6 +18,7 @@ #include "find_all.h" #include "ir/local-structural-dominance.h" #include "ir/module-utils.h" +#include "ir/names.h" #include "ir/utils.h" #include "support/topological_sort.h" #include "wasm-type-ordering.h" @@ -141,10 +142,23 @@ GlobalTypeRewriter::TypeMap GlobalTypeRewriter::rebuildTypes( } // Update type names (doing it before mapTypes can help debugging there, but - // has no other effect; mapTypes does not look at type names). + // has no other effect; mapTypes does not look at type names). While doing so + // avoid creating duplicate names. + std::unordered_set typeNames; + for (auto& [type, info] : wasm.typeNames) { + typeNames.insert(info.name); + } for (auto& [old, new_] : oldToNewTypes) { if (auto it = wasm.typeNames.find(old); it != wasm.typeNames.end()) { - wasm.typeNames[new_] = it->second; + // Use the existing name in the new type, as usually it completely + // replaces the old. Rename the old name in a unique way to avoid + // confusion in the case that it remains used. + wasm.typeNames[new_] = wasm.typeNames[old]; + auto deduped = Names::getValidName(wasm.typeNames[old].name, [&](Name test) { + return !typeNames.count(test); + }); + wasm.typeNames[old].name = deduped; + typeNames.insert(deduped); } } From 02aa6f0410ba7de339514a6d96e91e1d90b1aa47 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 29 May 2024 16:52:55 -0700 Subject: [PATCH 2/8] nicer --- src/ir/type-updating.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ir/type-updating.cpp b/src/ir/type-updating.cpp index d38670630f6..a312aa6a8fc 100644 --- a/src/ir/type-updating.cpp +++ b/src/ir/type-updating.cpp @@ -150,10 +150,10 @@ GlobalTypeRewriter::TypeMap GlobalTypeRewriter::rebuildTypes( } for (auto& [old, new_] : oldToNewTypes) { if (auto it = wasm.typeNames.find(old); it != wasm.typeNames.end()) { + wasm.typeNames[new_] = wasm.typeNames[old]; // Use the existing name in the new type, as usually it completely // replaces the old. Rename the old name in a unique way to avoid // confusion in the case that it remains used. - wasm.typeNames[new_] = wasm.typeNames[old]; auto deduped = Names::getValidName(wasm.typeNames[old].name, [&](Name test) { return !typeNames.count(test); }); From e5b24a0c2048e7d832f90eb6623b69bec2ad43ca Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 30 May 2024 09:49:01 -0700 Subject: [PATCH 3/8] work --- src/passes/RemoveUnusedTypes.cpp | 2 +- test/lit/passes/signature-pruning.wast | 3 +- test/lit/passes/type-ssa_and_merging.wast | 42 +- test/lit/passes/unsubtyping-casts.wast | 222 ++++--- test/lit/passes/unsubtyping.wast | 753 +++++++++++++--------- 5 files changed, 586 insertions(+), 436 deletions(-) diff --git a/src/passes/RemoveUnusedTypes.cpp b/src/passes/RemoveUnusedTypes.cpp index 1ea65fb0f04..45222708a81 100644 --- a/src/passes/RemoveUnusedTypes.cpp +++ b/src/passes/RemoveUnusedTypes.cpp @@ -45,7 +45,7 @@ struct RemoveUnusedTypes : Pass { } // We're not changing the contents of any of the types, so we just round - // trip them throgh GlobalTypeRewriter, which will put all the private types + // trip them through GlobalTypeRewriter which will put all the private types // in a single new rec group and leave out all the unused types. GlobalTypeRewriter(*module).update(); } diff --git a/test/lit/passes/signature-pruning.wast b/test/lit/passes/signature-pruning.wast index c273d1588ba..8754c8189f8 100644 --- a/test/lit/passes/signature-pruning.wast +++ b/test/lit/passes/signature-pruning.wast @@ -1168,10 +1168,11 @@ ;; CHECK: (rec ;; CHECK-NEXT: (type $none (func)) (type $none (func)) - ;; CHECK: (type $much (func (param i32))) (type $much (func (param i32))) ) + ;; CHECK: (type $much_0 (func (param i32))) + ;; CHECK: (export "exported" (func $exported)) ;; CHECK: (func $exported (type $none) diff --git a/test/lit/passes/type-ssa_and_merging.wast b/test/lit/passes/type-ssa_and_merging.wast index 8928820bfcd..b726c0e2415 100644 --- a/test/lit/passes/type-ssa_and_merging.wast +++ b/test/lit/passes/type-ssa_and_merging.wast @@ -7,24 +7,26 @@ ;; can. (module + (type $A (sub (struct (field (mut i32))))) + ;; NOP: (rec - ;; NOP-NEXT: (type $0 (func (param (ref $A)) (result i32))) + ;; NOP-NEXT: (type $0 (func (param (ref $A_1)) (result i32))) + + ;; NOP: (type $A_1 (sub (struct (field i32)))) + + ;; NOP: (type $2 (func (result i32))) - ;; NOP: (type $A (sub (struct (field i32)))) + ;; NOP: (import "a" "b" (func $import (type $2) (result i32))) ;; YES: (type $0 (func (result i32))) ;; YES: (rec - ;; YES-NEXT: (type $1 (func (param (ref $A)))) + ;; YES-NEXT: (type $1 (func (param (ref $A_3)))) - ;; YES: (type $A (sub (struct ))) - (type $A (sub (struct (field (mut i32))))) + ;; YES: (type $A_3 (sub (struct ))) - ;; NOP: (type $2 (func (result i32))) - - ;; NOP: (import "a" "b" (func $import (type $2) (result i32))) - ;; YES: (type $A_2 (sub $A (struct ))) + ;; YES: (type $A_2_1 (sub $A_3 (struct ))) - ;; YES: (type $A_1 (sub $A (struct ))) + ;; YES: (type $A_1_1 (sub $A_3 (struct ))) ;; YES: (import "a" "b" (func $import (type $0) (result i32))) (import "a" "b" (func $import (result i32))) @@ -35,7 +37,7 @@ ;; NOP: (func $main1 (type $2) (result i32) ;; NOP-NEXT: (call $get-a-1 - ;; NOP-NEXT: (struct.new $A + ;; NOP-NEXT: (struct.new $A_1 ;; NOP-NEXT: (i32.const 42) ;; NOP-NEXT: ) ;; NOP-NEXT: ) @@ -46,7 +48,7 @@ ;; YES: (func $main1 (type $0) (result i32) ;; YES-NEXT: (call $get-a-1 - ;; YES-NEXT: (struct.new_default $A) + ;; YES-NEXT: (struct.new_default $A_3) ;; YES-NEXT: ) ;; YES-NEXT: (i32.const 42) ;; YES-NEXT: ) @@ -59,14 +61,14 @@ ;; NOP: (func $main2 (type $2) (result i32) ;; NOP-NEXT: (call $get-a-2 - ;; NOP-NEXT: (struct.new $A + ;; NOP-NEXT: (struct.new $A_1 ;; NOP-NEXT: (i32.const 1337) ;; NOP-NEXT: ) ;; NOP-NEXT: ) ;; NOP-NEXT: ) ;; YES: (func $main2 (type $0) (result i32) ;; YES-NEXT: (call $get-a-2 - ;; YES-NEXT: (struct.new_default $A) + ;; YES-NEXT: (struct.new_default $A_3) ;; YES-NEXT: ) ;; YES-NEXT: (i32.const 1337) ;; YES-NEXT: ) @@ -77,7 +79,7 @@ ) ) - ;; NOP: (func $get-a-1 (type $0) (param $0 (ref $A)) (result i32) + ;; NOP: (func $get-a-1 (type $0) (param $0 (ref $A_1)) (result i32) ;; NOP-NEXT: (if ;; NOP-NEXT: (call $import) ;; NOP-NEXT: (then @@ -88,11 +90,11 @@ ;; NOP-NEXT: ) ;; NOP-NEXT: ) ;; NOP-NEXT: ) - ;; NOP-NEXT: (struct.get $A 0 + ;; NOP-NEXT: (struct.get $A_1 0 ;; NOP-NEXT: (local.get $0) ;; NOP-NEXT: ) ;; NOP-NEXT: ) - ;; YES: (func $get-a-1 (type $1) (param $0 (ref $A)) + ;; YES: (func $get-a-1 (type $1) (param $0 (ref $A_3)) ;; YES-NEXT: (if ;; YES-NEXT: (call $import) ;; YES-NEXT: (then @@ -119,7 +121,7 @@ (struct.get $A 0 (local.get 0)) ) - ;; NOP: (func $get-a-2 (type $0) (param $0 (ref $A)) (result i32) + ;; NOP: (func $get-a-2 (type $0) (param $0 (ref $A_1)) (result i32) ;; NOP-NEXT: (if ;; NOP-NEXT: (call $import) ;; NOP-NEXT: (then @@ -130,11 +132,11 @@ ;; NOP-NEXT: ) ;; NOP-NEXT: ) ;; NOP-NEXT: ) - ;; NOP-NEXT: (struct.get $A 0 + ;; NOP-NEXT: (struct.get $A_1 0 ;; NOP-NEXT: (local.get $0) ;; NOP-NEXT: ) ;; NOP-NEXT: ) - ;; YES: (func $get-a-2 (type $1) (param $0 (ref $A)) + ;; YES: (func $get-a-2 (type $1) (param $0 (ref $A_3)) ;; YES-NEXT: (if ;; YES-NEXT: (call $import) ;; YES-NEXT: (then diff --git a/test/lit/passes/unsubtyping-casts.wast b/test/lit/passes/unsubtyping-casts.wast index 8f0f66ef2e1..bdf1474f71d 100644 --- a/test/lit/passes/unsubtyping-casts.wast +++ b/test/lit/passes/unsubtyping-casts.wast @@ -30,24 +30,27 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $top (sub (struct ))) (type $top (sub (struct))) - ;; CHECK: (type $mid (sub $top (struct ))) (type $mid (sub $top (struct))) - ;; CHECK: (type $bot (sub $mid (struct ))) (type $bot (sub $mid (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $top_1 (sub (struct ))) + + ;; CHECK: (type $mid_1 (sub $top_1 (struct ))) + + ;; CHECK: (type $bot_1 (sub $mid_1 (struct ))) + ;; CHECK: (type $3 (func)) ;; CHECK: (func $cast (type $3) - ;; CHECK-NEXT: (local $l (ref null $top)) + ;; CHECK-NEXT: (local $l (ref null $top_1)) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $bot) + ;; CHECK-NEXT: (struct.new_default $bot_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $mid) - ;; CHECK-NEXT: (struct.new_default $top) + ;; CHECK-NEXT: (ref.cast (ref $mid_1) + ;; CHECK-NEXT: (struct.new_default $top_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -68,24 +71,27 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $top (sub (struct ))) (type $top (sub (struct))) - ;; CHECK: (type $mid (sub $top (struct ))) (type $mid (sub $top (struct))) - ;; CHECK: (type $bot (sub $mid (struct ))) (type $bot (sub $mid (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $top_1 (sub (struct ))) + + ;; CHECK: (type $mid_1 (sub $top_1 (struct ))) + + ;; CHECK: (type $bot_1 (sub $mid_1 (struct ))) + ;; CHECK: (type $3 (func)) ;; CHECK: (func $cast (type $3) - ;; CHECK-NEXT: (local $l (ref null $top)) + ;; CHECK-NEXT: (local $l (ref null $top_1)) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $bot) + ;; CHECK-NEXT: (struct.new_default $bot_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.test (ref $mid) - ;; CHECK-NEXT: (struct.new_default $top) + ;; CHECK-NEXT: (ref.test (ref $mid_1) + ;; CHECK-NEXT: (struct.new_default $top_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -105,26 +111,29 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $top (sub (struct ))) (type $top (sub (struct))) - ;; CHECK: (type $mid (sub $top (struct ))) (type $mid (sub $top (struct))) - ;; CHECK: (type $bot (sub $mid (struct ))) (type $bot (sub $mid (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $top_1 (sub (struct ))) + + ;; CHECK: (type $mid_1 (sub $top_1 (struct ))) + + ;; CHECK: (type $bot_1 (sub $mid_1 (struct ))) + ;; CHECK: (type $3 (func)) ;; CHECK: (func $cast (type $3) - ;; CHECK-NEXT: (local $l (ref null $top)) + ;; CHECK-NEXT: (local $l (ref null $top_1)) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $bot) + ;; CHECK-NEXT: (struct.new_default $bot_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $l (result (ref $mid)) + ;; CHECK-NEXT: (block $l (result (ref $mid_1)) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (br_on_cast $l (ref $top) (ref $mid) - ;; CHECK-NEXT: (struct.new_default $top) + ;; CHECK-NEXT: (br_on_cast $l (ref $top_1) (ref $mid_1) + ;; CHECK-NEXT: (struct.new_default $top_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) @@ -152,26 +161,29 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $top (sub (struct ))) (type $top (sub (struct))) - ;; CHECK: (type $mid (sub $top (struct ))) (type $mid (sub $top (struct))) - ;; CHECK: (type $bot (sub $mid (struct ))) (type $bot (sub $mid (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $top_1 (sub (struct ))) + + ;; CHECK: (type $mid_1 (sub $top_1 (struct ))) + + ;; CHECK: (type $bot_1 (sub $mid_1 (struct ))) + ;; CHECK: (type $3 (func)) ;; CHECK: (func $cast (type $3) - ;; CHECK-NEXT: (local $l (ref null $top)) + ;; CHECK-NEXT: (local $l (ref null $top_1)) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $bot) + ;; CHECK-NEXT: (struct.new_default $bot_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $l (result (ref $top)) + ;; CHECK-NEXT: (block $l (result (ref $top_1)) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (br_on_cast_fail $l (ref $top) (ref $mid) - ;; CHECK-NEXT: (struct.new_default $top) + ;; CHECK-NEXT: (br_on_cast_fail $l (ref $top_1) (ref $mid_1) + ;; CHECK-NEXT: (struct.new_default $top_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) @@ -199,25 +211,28 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $top (sub (func))) (type $top (sub (func))) - ;; CHECK: (type $mid (sub $top (func))) (type $mid (sub $top (func))) - ;; CHECK: (type $bot (sub $mid (func))) (type $bot (sub $mid (func))) - ;; CHECK: (table $t 1 1 (ref null $top)) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $top_1 (sub (func))) + + ;; CHECK: (type $mid_1 (sub $top_1 (func))) + + ;; CHECK: (type $bot_1 (sub $mid_1 (func))) + + ;; CHECK: (table $t 1 1 (ref null $top_1)) (table $t 1 1 (ref null $top)) ;; CHECK: (elem declare func $cast) - ;; CHECK: (func $cast (type $bot) - ;; CHECK-NEXT: (local $l (ref null $top)) + ;; CHECK: (func $cast (type $bot_1) + ;; CHECK-NEXT: (local $l (ref null $top_1)) ;; CHECK-NEXT: (local.set $l ;; CHECK-NEXT: (ref.func $cast) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (call_indirect $t (type $mid) + ;; CHECK-NEXT: (call_indirect $t (type $mid_1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -236,24 +251,27 @@ (module (rec - ;; CHECK: (rec - ;; CHECK-NEXT: (type $unrelated (sub (func))) (type $unrelated (sub (func))) - ;; CHECK: (type $top (sub (func))) (type $top (sub (func))) - ;; CHECK: (type $bot (sub $top (func))) (type $bot (sub $top (func))) ) - ;; CHECK: (table $t 1 1 (ref null $bot)) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $unrelated_0_0 (sub (func))) + + ;; CHECK: (type $top_0_0 (sub (func))) + + ;; CHECK: (type $bot_0_0 (sub $top_0_0 (func))) + + ;; CHECK: (table $t 1 1 (ref null $bot_0_0)) (table $t 1 1 (ref null $bot)) - ;; CHECK: (func $call-indirect (type $bot) - ;; CHECK-NEXT: (call_indirect $t (type $top) + ;; CHECK: (func $call-indirect (type $bot_0_0) + ;; CHECK-NEXT: (call_indirect $t (type $top_0_0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (call_indirect $t (type $unrelated) + ;; CHECK-NEXT: (call_indirect $t (type $unrelated_0_0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -271,24 +289,27 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $top (sub (struct ))) (type $top (sub (struct))) - ;; CHECK: (type $mid (sub (struct ))) (type $mid (sub $top (struct))) - ;; CHECK: (type $bot (sub $mid (struct ))) (type $bot (sub $mid (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $top_1 (sub (struct ))) + + ;; CHECK: (type $mid_1 (sub (struct ))) + + ;; CHECK: (type $bot_1 (sub $mid_1 (struct ))) + ;; CHECK: (type $3 (func)) ;; CHECK: (func $cast-optimizable (type $3) - ;; CHECK-NEXT: (local $l (ref null $mid)) + ;; CHECK-NEXT: (local $l (ref null $mid_1)) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $bot) + ;; CHECK-NEXT: (struct.new_default $bot_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (ref.cast (ref none) - ;; CHECK-NEXT: (struct.new_default $top) + ;; CHECK-NEXT: (struct.new_default $top_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -311,36 +332,39 @@ (module (rec - ;; CHECK: (rec - ;; CHECK-NEXT: (type $top (sub (struct ))) (type $top (sub (struct))) - ;; CHECK: (type $mid (sub $top (struct ))) (type $mid (sub $top (struct))) - ;; CHECK: (type $bot (sub (struct ))) (type $bot (sub $mid (struct))) ) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $top_1 (sub (struct ))) + + ;; CHECK: (type $mid_1 (sub $top_1 (struct ))) + + ;; CHECK: (type $bot_1 (sub (struct ))) + ;; CHECK: (type $3 (func (param anyref))) ;; CHECK: (func $cast (type $3) (param $any anyref) ;; CHECK-NEXT: (local $l anyref) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $bot) + ;; CHECK-NEXT: (ref.cast (ref $bot_1) ;; CHECK-NEXT: (local.get $any) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $top) + ;; CHECK-NEXT: (ref.cast (ref $top_1) ;; CHECK-NEXT: (local.get $any) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $mid) + ;; CHECK-NEXT: (ref.cast (ref $mid_1) ;; CHECK-NEXT: (local.get $any) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $mid) + ;; CHECK-NEXT: (struct.new_default $mid_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $cast (param $any anyref) @@ -380,18 +404,21 @@ ;; from user types. (module (rec - ;; CHECK: (rec - ;; CHECK-NEXT: (type $top (sub (struct ))) (type $top (sub (struct))) - ;; CHECK: (type $mid (sub $top (struct ))) (type $mid (sub $top (struct))) - ;; CHECK: (type $bot (sub (struct ))) (type $bot (sub $mid (struct))) ) - ;; CHECK: (type $3 (func (param anyref (ref $top) (ref $mid) (ref $bot)))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $top_1 (sub (struct ))) + + ;; CHECK: (type $mid_1 (sub $top_1 (struct ))) + + ;; CHECK: (type $bot_1 (sub (struct ))) - ;; CHECK: (func $cast (type $3) (param $any anyref) (param $top (ref $top)) (param $mid (ref $mid)) (param $bot (ref $bot)) + ;; CHECK: (type $3 (func (param anyref (ref $top_1) (ref $mid_1) (ref $bot_1)))) + + ;; CHECK: (func $cast (type $3) (param $any anyref) (param $top (ref $top_1)) (param $mid (ref $mid_1)) (param $bot (ref $bot_1)) ;; CHECK-NEXT: (local $l anyref) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (ref.eq @@ -412,22 +439,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $bot) + ;; CHECK-NEXT: (ref.cast (ref $bot_1) ;; CHECK-NEXT: (local.get $any) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $top) + ;; CHECK-NEXT: (ref.cast (ref $top_1) ;; CHECK-NEXT: (local.get $any) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $mid) + ;; CHECK-NEXT: (ref.cast (ref $mid_1) ;; CHECK-NEXT: (local.get $any) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $mid) + ;; CHECK-NEXT: (struct.new_default $mid_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $cast (param $any anyref) (param $top (ref $top)) (param $mid (ref $mid)) (param $bot (ref $bot)) @@ -477,49 +504,58 @@ (module (rec - ;; CHECK: (rec - ;; CHECK-NEXT: (type $topC (sub (struct ))) (type $topC (sub (struct))) - ;; CHECK: (type $midC (sub $topC (struct ))) (type $midC (sub $topC (struct))) - ;; CHECK: (type $botC (sub $midC (struct ))) (type $botC (sub $midC (struct))) - ;; CHECK: (type $topB (sub (struct (field (ref null $topC))))) (type $topB (sub (struct (ref null $topC)))) - ;; CHECK: (type $midB (sub $topB (struct (field (ref null $botC))))) (type $midB (sub $topB (struct (ref null $botC)))) - ;; CHECK: (type $botB (sub $midB (struct (field (ref null $botC))))) (type $botB (sub $midB (struct (ref null $botC)))) - ;; CHECK: (type $topA (sub (struct (field (ref null $topB))))) (type $topA (sub (struct (ref null $topB)))) - ;; CHECK: (type $midA (sub $topA (struct (field (ref null $botB))))) (type $midA (sub $topA (struct (ref null $botB)))) - ;; CHECK: (type $botA (sub $midA (struct (field (ref null $botB))))) (type $botA (sub $midA (struct (ref null $botB)))) ) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $topC_1 (sub (struct ))) + + ;; CHECK: (type $midC_1 (sub $topC_1 (struct ))) + + ;; CHECK: (type $botC_1 (sub $midC_1 (struct ))) + + ;; CHECK: (type $topB_1 (sub (struct (field (ref null $topC_1))))) + + ;; CHECK: (type $midB_1 (sub $topB_1 (struct (field (ref null $botC_1))))) + + ;; CHECK: (type $botB_1 (sub $midB_1 (struct (field (ref null $botC_1))))) + + ;; CHECK: (type $topA_1 (sub (struct (field (ref null $topB_1))))) + + ;; CHECK: (type $midA_1 (sub $topA_1 (struct (field (ref null $botB_1))))) + + ;; CHECK: (type $botA_1 (sub $midA_1 (struct (field (ref null $botB_1))))) + ;; CHECK: (type $9 (func)) ;; CHECK: (func $cast (type $9) - ;; CHECK-NEXT: (local $l (ref null $topA)) + ;; CHECK-NEXT: (local $l (ref null $topA_1)) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $botA) + ;; CHECK-NEXT: (struct.new_default $botA_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $midA) - ;; CHECK-NEXT: (struct.new_default $topA) + ;; CHECK-NEXT: (ref.cast (ref $midA_1) + ;; CHECK-NEXT: (struct.new_default $topA_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $midB) - ;; CHECK-NEXT: (struct.new_default $topB) + ;; CHECK-NEXT: (ref.cast (ref $midB_1) + ;; CHECK-NEXT: (struct.new_default $topB_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $midC) - ;; CHECK-NEXT: (struct.new_default $topC) + ;; CHECK-NEXT: (ref.cast (ref $midC_1) + ;; CHECK-NEXT: (struct.new_default $topC_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/unsubtyping.wast b/test/lit/passes/unsubtyping.wast index 368f935b9fc..35248a5d039 100644 --- a/test/lit/passes/unsubtyping.wast +++ b/test/lit/passes/unsubtyping.wast @@ -60,17 +60,19 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) ;; A function body requires subtyping - ;; CHECK: (type $2 (func (result (ref $super)))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (func $foo (type $2) (result (ref $super)) - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK: (type $2 (func (result (ref $super_1)))) + + ;; CHECK: (func $foo (type $2) (result (ref $super_1)) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) (func $foo (result (ref $super)) (struct.new $sub) @@ -78,66 +80,79 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) ;; A global initializer requires subtyping - ;; CHECK: (global $g1 (ref $super) (struct.new_default $sub)) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + + ;; CHECK: (global $g1 (ref $super_1) (struct.new_default $sub_1)) (global $g1 (ref $super) (struct.new $sub)) ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (type $subsub (sub $sub (struct ))) (type $subsub (sub $sub (struct))) - ;; CHECK: (table $t 1 1 (ref null $super)) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + + ;; CHECK: (type $subsub_1 (sub $sub_1 (struct ))) + + ;; CHECK: (table $t 1 1 (ref null $super_1)) (table $t 1 1 (ref null $super)) ;; An active element segment requires subtyping. So does an element segment ;; element. - ;; CHECK: (elem $e (table $t) (i32.const 0) (ref null $sub) (struct.new_default $subsub)) + ;; CHECK: (elem $e (table $t) (i32.const 0) (ref null $sub_1) (struct.new_default $subsub_1)) (elem $e (table $t) (offset (i32.const 0)) (ref null $sub) (struct.new $subsub)) ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $X (sub (struct ))) (type $X (sub (struct))) - ;; CHECK: (type $Y (sub $X (struct ))) (type $Y (sub $X (struct))) - ;; CHECK: (type $A (sub (struct (field (ref null $X))))) (type $A (sub (struct (ref null $X)))) - ;; CHECK: (type $B (sub $A (struct (field (ref null $Y))))) (type $B (sub $A (struct (ref null $Y)))) ;; Requiring B <: A also requires X <: Y - ;; CHECK: (global $g (ref $A) (struct.new_default $B)) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $X_1 (sub (struct ))) + + ;; CHECK: (type $Y_1 (sub $X_1 (struct ))) + + ;; CHECK: (type $A_1 (sub (struct (field (ref null $X_1))))) + + ;; CHECK: (type $B_1 (sub $A_1 (struct (field (ref null $Y_1))))) + + ;; CHECK: (global $g (ref $A_1) (struct.new_default $B_1)) (global $g (ref $A) (struct.new_default $B)) ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $X (sub (struct ))) (type $X (sub (struct))) - ;; CHECK: (type $Y (sub $X (struct ))) (type $Y (sub $X (struct))) - ;; CHECK: (type $A (sub (array (ref null $X)))) (type $A (sub (array (field (ref null $X))))) - ;; CHECK: (type $B (sub $A (array (ref null $Y)))) (type $B (sub $A (array (field (ref null $Y))))) ;; Transitive dependencies through an array. - ;; CHECK: (global $g (ref $A) (array.new_default $B + ;; CHECK: (rec + ;; CHECK-NEXT: (type $X_1 (sub (struct ))) + + ;; CHECK: (type $Y_1 (sub $X_1 (struct ))) + + ;; CHECK: (type $A_1 (sub (array (ref null $X_1)))) + + ;; CHECK: (type $B_1 (sub $A_1 (array (ref null $Y_1)))) + + ;; CHECK: (global $g (ref $A_1) (array.new_default $B_1 ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: )) (global $g (ref $A) (array.new_default $B (i32.const 0))) @@ -145,28 +160,34 @@ (module (rec - ;; CHECK: (rec - ;; CHECK-NEXT: (type $X (sub (struct ))) (type $X (sub (struct))) - ;; CHECK: (type $Y (sub $X (struct ))) (type $Y (sub $X (struct))) - ;; CHECK: (type $X' (sub (struct ))) (type $X' (sub (struct))) - ;; CHECK: (type $Y' (sub $X' (struct ))) (type $Y' (sub $X' (struct))) - ;; CHECK: (type $A (sub (func (param (ref $Y')) (result (ref $X))))) (type $A (sub (func (param (ref $Y')) (result (ref $X))))) - ;; CHECK: (type $B (sub $A (func (param (ref $X')) (result (ref $Y))))) (type $B (sub $A (func (param (ref $X')) (result (ref $Y))))) ) ;; Transitive dependencies through a function type. - ;; CHECK: (global $g (ref null $A) (ref.func $foo)) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $X_0_0 (sub (struct ))) + + ;; CHECK: (type $Y_0_0 (sub $X_0_0 (struct ))) + + ;; CHECK: (type $X'_0_0 (sub (struct ))) + + ;; CHECK: (type $Y'_0_0 (sub $X'_0_0 (struct ))) + + ;; CHECK: (type $A_0_0 (sub (func (param (ref $Y'_0_0)) (result (ref $X_0_0))))) + + ;; CHECK: (type $B_0_0 (sub $A_0_0 (func (param (ref $X'_0_0)) (result (ref $Y_0_0))))) + + ;; CHECK: (global $g (ref null $A_0_0) (ref.func $foo)) (global $g (ref null $A) (ref.func $foo)) - ;; CHECK: (func $foo (type $B) (param $0 (ref $X')) (result (ref $Y)) + ;; CHECK: (func $foo (type $B_0_0) (param $0 (ref $X'_0_0)) (result (ref $Y_0_0)) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $foo (type $B) @@ -175,24 +196,26 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $2 (func)) ;; CHECK: (func $block-fallthrough (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $l (result (ref $super)) + ;; CHECK-NEXT: (block $l (result (ref $super_1)) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (br_if $l - ;; CHECK-NEXT: (struct.new_default $super) + ;; CHECK-NEXT: (struct.new_default $super_1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -213,31 +236,33 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $opt (sub (struct (field i32)))) - - ;; CHECK: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) (type $opt (sub $super (struct i32))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $opt_1 (sub (struct (field i32)))) + + ;; CHECK: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $3 (func)) ;; CHECK: (func $block-br (type $3) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $l (result (ref $super)) + ;; CHECK-NEXT: (block $l (result (ref $super_1)) ;; CHECK-NEXT: (br $l - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $other (result (ref $opt)) + ;; CHECK-NEXT: (block $other (result (ref $opt_1)) ;; CHECK-NEXT: (br $other - ;; CHECK-NEXT: (struct.new_default $opt) + ;; CHECK-NEXT: (struct.new_default $opt_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (struct.new_default $super) + ;; CHECK-NEXT: (struct.new_default $super_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -263,23 +288,25 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $2 (func)) ;; CHECK: (func $if (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (if (result (ref $sub)) + ;; CHECK-NEXT: (if (result (ref $sub_1)) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (then - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -301,18 +328,20 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $2 (func)) ;; CHECK: (func $loop (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (loop (result (ref $sub)) - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (loop (result (ref $sub_1)) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -327,21 +356,23 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $2 (func)) ;; CHECK: (func $loop (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $super (result (ref $sub)) + ;; CHECK-NEXT: (block $super (result (ref $sub_1)) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $sub (result (ref $sub)) + ;; CHECK-NEXT: (block $sub (result (ref $sub_1)) ;; CHECK-NEXT: (br_table $super $sub - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -369,21 +400,23 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $2 (func)) ;; CHECK: (func $br-table (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $super (result (ref $sub)) + ;; CHECK-NEXT: (block $super (result (ref $sub_1)) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $sub (result (ref $sub)) + ;; CHECK-NEXT: (block $sub (result (ref $sub_1)) ;; CHECK-NEXT: (br_table $sub $super - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -411,17 +444,19 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (type $2 (func (param (ref $super)))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + + ;; CHECK: (type $2 (func (param (ref $super_1)))) - ;; CHECK: (func $call (type $2) (param $0 (ref $super)) + ;; CHECK: (func $call (type $2) (param $0 (ref $super_1)) ;; CHECK-NEXT: (call $call - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $call (param (ref $super)) @@ -433,17 +468,19 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (type $2 (func (result (ref $sub)))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $3 (func (result (ref $super)))) + ;; CHECK: (type $2 (func (result (ref $sub_1)))) - ;; CHECK: (func $return-call (type $3) (result (ref $super)) + ;; CHECK: (type $3 (func (result (ref $super_1)))) + + ;; CHECK: (func $return-call (type $3) (result (ref $super_1)) ;; CHECK-NEXT: (return_call $callee) ;; CHECK-NEXT: ) (func $return-call (result (ref $super)) @@ -451,7 +488,7 @@ (return_call $callee) ) - ;; CHECK: (func $callee (type $2) (result (ref $sub)) + ;; CHECK: (func $callee (type $2) (result (ref $sub_1)) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $callee (result (ref $sub)) @@ -460,20 +497,22 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (type $2 (func (param (ref $super)))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + + ;; CHECK: (type $2 (func (param (ref $super_1)))) ;; CHECK: (table $t 1 1 funcref) (table $t 1 1 funcref) - ;; CHECK: (func $call-indirect (type $2) (param $0 (ref $super)) + ;; CHECK: (func $call-indirect (type $2) (param $0 (ref $super_1)) ;; CHECK-NEXT: (call_indirect $t (type $2) - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -487,20 +526,22 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (type $2 (func (result (ref $sub)))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $3 (func (result (ref $super)))) + ;; CHECK: (type $2 (func (result (ref $sub_1)))) + + ;; CHECK: (type $3 (func (result (ref $super_1)))) ;; CHECK: (table $t 1 1 funcref) (table $t 1 1 funcref) - ;; CHECK: (func $return-call-indirect (type $3) (result (ref $super)) + ;; CHECK: (func $return-call-indirect (type $3) (result (ref $super_1)) ;; CHECK-NEXT: (return_call_indirect $t (type $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -514,18 +555,19 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $sub (sub (func))) - - ;; CHECK: (type $super (sub (func))) (type $super (sub (func))) (type $sub (sub $super (func))) - ;; CHECK: (table $t 1 1 (ref null $super)) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $sub_1 (sub (func))) + + ;; CHECK: (type $super_1 (sub (func))) + + ;; CHECK: (table $t 1 1 (ref null $super_1)) (table $t 1 1 (ref null $super)) - ;; CHECK: (func $call-indirect-table (type $sub) - ;; CHECK-NEXT: (call_indirect $t (type $sub) + ;; CHECK: (func $call-indirect-table (type $sub_1) + ;; CHECK-NEXT: (call_indirect $t (type $sub_1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -540,18 +582,20 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $2 (func)) ;; CHECK: (func $local-set (type $2) - ;; CHECK-NEXT: (local $l (ref null $super)) + ;; CHECK-NEXT: (local $l (ref null $super_1)) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $local-set @@ -564,19 +608,21 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $2 (func)) ;; CHECK: (func $local-tee (type $2) - ;; CHECK-NEXT: (local $l (ref null $super)) + ;; CHECK-NEXT: (local $l (ref null $super_1)) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (local.tee $l - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -592,20 +638,22 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $2 (func)) - ;; CHECK: (global $g (mut (ref null $super)) (ref.null none)) + ;; CHECK: (global $g (mut (ref null $super_1)) (ref.null none)) (global $g (mut (ref null $super)) (ref.null none)) ;; CHECK: (func $global-set (type $2) ;; CHECK-NEXT: (global.set $g - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $global-set @@ -617,22 +665,24 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub2 (sub $super (struct (field i32)))) - - ;; CHECK: (type $sub1 (sub $super (struct ))) (type $sub1 (sub $super (struct))) (type $sub2 (sub $super (struct i32))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub2_1 (sub $super_1 (struct (field i32)))) + + ;; CHECK: (type $sub1_1 (sub $super_1 (struct ))) + ;; CHECK: (type $3 (func)) ;; CHECK: (func $select (type $3) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (select (result (ref $super)) - ;; CHECK-NEXT: (struct.new_default $sub1) - ;; CHECK-NEXT: (struct.new_default $sub2) + ;; CHECK-NEXT: (select (result (ref $super_1)) + ;; CHECK-NEXT: (struct.new_default $sub1_1) + ;; CHECK-NEXT: (struct.new_default $sub2_1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -650,17 +700,19 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (type $2 (func (result (ref $super)))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - ;; CHECK: (func $return (type $2) (result (ref $super)) + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + + ;; CHECK: (type $2 (func (result (ref $super_1)))) + + ;; CHECK: (func $return (type $2) (result (ref $super_1)) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $return (result (ref $super)) @@ -672,18 +724,19 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $sub (sub (struct ))) - - ;; CHECK: (type $super (sub (struct ))) (type $super (sub (struct))) (type $sub (sub $super (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $sub_1 (sub (struct ))) + + ;; CHECK: (type $super_1 (sub (struct ))) + ;; CHECK: (type $2 (func)) ;; CHECK: (func $return-none (type $2) - ;; CHECK-NEXT: (local $super (ref null $super)) - ;; CHECK-NEXT: (local $sub (ref null $sub)) + ;; CHECK-NEXT: (local $super (ref null $super_1)) + ;; CHECK-NEXT: (local $sub (ref null $sub_1)) ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) (func $return-none @@ -696,26 +749,28 @@ (module (rec - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super2 (sub (struct ))) - - ;; CHECK: (type $sub2 (sub $super2 (struct ))) - - ;; CHECK: (type $super1 (sub (struct ))) (type $super1 (sub (struct))) (type $super2 (sub (struct))) - ;; CHECK: (type $sub1 (sub $super1 (struct ))) (type $sub1 (sub $super1 (struct))) (type $sub2 (sub $super2 (struct))) ) - ;; CHECK: (type $4 (func (result (ref $super1) (ref $super2)))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super2_1 (sub (struct ))) + + ;; CHECK: (type $sub2_1 (sub $super2_1 (struct ))) + + ;; CHECK: (type $super1_1 (sub (struct ))) + + ;; CHECK: (type $sub1_1 (sub $super1_1 (struct ))) + + ;; CHECK: (type $4 (func (result (ref $super1_1) (ref $super2_1)))) - ;; CHECK: (func $return-many (type $4) (result (ref $super1) (ref $super2)) + ;; CHECK: (func $return-many (type $4) (result (ref $super1_1) (ref $super2_1)) ;; CHECK-NEXT: (return ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (struct.new_default $sub1) - ;; CHECK-NEXT: (struct.new_default $sub2) + ;; CHECK-NEXT: (struct.new_default $sub1_1) + ;; CHECK-NEXT: (struct.new_default $sub2_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -731,21 +786,23 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $2 (func)) - ;; CHECK: (table $t 1 1 (ref null $super)) + ;; CHECK: (table $t 1 1 (ref null $super_1)) (table $t 1 1 (ref null $super)) ;; CHECK: (func $table-set (type $2) ;; CHECK-NEXT: (table.set $t ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $table-set @@ -758,21 +815,23 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $2 (func)) - ;; CHECK: (table $t 1 1 (ref null $super)) + ;; CHECK: (table $t 1 1 (ref null $super_1)) (table $t 1 1 (ref null $super)) ;; CHECK: (func $table-fill (type $2) ;; CHECK-NEXT: (table.fill $t ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -787,18 +846,20 @@ ) (module + (type $super (sub (struct))) + (type $sub (sub $super (struct))) + ;; CHECK: (rec ;; CHECK-NEXT: (type $0 (func)) - ;; CHECK: (type $super (sub (struct ))) - (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) - (type $sub (sub $super (struct))) + ;; CHECK: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (table $super 1 1 (ref null $super)) + ;; CHECK: (table $super 1 1 (ref null $super_1)) (table $super 1 1 (ref null $super)) - ;; CHECK: (table $sub 1 1 (ref null $sub)) + ;; CHECK: (table $sub 1 1 (ref null $sub_1)) (table $sub 1 1 (ref null $sub)) ;; CHECK: (func $table-copy (type $0) @@ -819,22 +880,24 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $2 (func)) ;; CHECK: (func $try (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (try (result (ref $super)) + ;; CHECK-NEXT: (try (result (ref $super_1)) ;; CHECK-NEXT: (do - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (catch_all - ;; CHECK-NEXT: (struct.new_default $super) + ;; CHECK-NEXT: (struct.new_default $super_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -855,22 +918,24 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $2 (func)) ;; CHECK: (func $try-catch (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (try (result (ref $super)) + ;; CHECK-NEXT: (try (result (ref $super_1)) ;; CHECK-NEXT: (do - ;; CHECK-NEXT: (struct.new_default $super) + ;; CHECK-NEXT: (struct.new_default $super_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (catch_all - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -891,24 +956,26 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $2 (func)) - ;; CHECK: (type $3 (func (param (ref $super)))) + ;; CHECK: (type $3 (func (param (ref $super_1)))) - ;; CHECK: (type $4 (func (param (ref $super)))) + ;; CHECK: (type $4 (func (param (ref $super_1)))) - ;; CHECK: (tag $t (param (ref $super))) + ;; CHECK: (tag $t (param (ref $super_1))) (tag $t (param (ref $super))) ;; CHECK: (func $throw (type $2) ;; CHECK-NEXT: (throw $t - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $throw @@ -920,25 +987,28 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (type $f (func (param (ref $super)))) (type $f (func (param (ref $super)))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + + ;; CHECK: (type $f_1 (func (param (ref $super_1)))) + ;; CHECK: (elem declare func $call-ref) - ;; CHECK: (func $call-ref (type $f) (param $0 (ref $super)) - ;; CHECK-NEXT: (call_ref $f - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK: (func $call-ref (type $f_1) (param $0 (ref $super_1)) + ;; CHECK-NEXT: (call_ref $f_1 + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: (ref.func $call-ref) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block ;; (replaces unreachable CallRef we can't emit) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (unreachable) @@ -947,7 +1017,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block ;; (replaces unreachable CallRef we can't emit) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (ref.null nofunc) @@ -975,21 +1045,24 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (type $f (func (result (ref $sub)))) (type $f (func (result (ref $sub)))) - ;; CHECK: (type $3 (func (result (ref $super)))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + + ;; CHECK: (type $f_1 (func (result (ref $sub_1)))) + + ;; CHECK: (type $3 (func (result (ref $super_1)))) ;; CHECK: (elem declare func $callee) - ;; CHECK: (func $return-call-ref (type $3) (result (ref $super)) - ;; CHECK-NEXT: (return_call_ref $f + ;; CHECK: (func $return-call-ref (type $3) (result (ref $super_1)) + ;; CHECK-NEXT: (return_call_ref $f_1 ;; CHECK-NEXT: (ref.func $callee) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1000,7 +1073,7 @@ ) ) - ;; CHECK: (func $callee (type $f) (result (ref $sub)) + ;; CHECK: (func $callee (type $f_1) (result (ref $sub_1)) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $callee (result (ref $sub)) @@ -1009,21 +1082,23 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $2 (func)) ;; CHECK: (func $br-on-non-null (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $l (result (ref $super)) + ;; CHECK-NEXT: (block $l (result (ref $super_1)) ;; CHECK-NEXT: (br_on_non_null $l - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (struct.new_default $super) + ;; CHECK-NEXT: (struct.new_default $super_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1041,19 +1116,21 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $2 (func)) ;; CHECK: (func $br-on-cast (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $l (result (ref $super)) - ;; CHECK-NEXT: (br_on_cast $l (ref $super) (ref $sub) - ;; CHECK-NEXT: (struct.new_default $super) + ;; CHECK-NEXT: (block $l (result (ref $super_1)) + ;; CHECK-NEXT: (br_on_cast $l (ref $super_1) (ref $sub_1) + ;; CHECK-NEXT: (struct.new_default $super_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1071,19 +1148,21 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $2 (func)) ;; CHECK: (func $br-on-cast-fail (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $l (result (ref $sub)) - ;; CHECK-NEXT: (br_on_cast_fail $l (ref $sub) (ref none) - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (block $l (result (ref $sub_1)) + ;; CHECK-NEXT: (br_on_cast_fail $l (ref $sub_1) (ref none) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1101,26 +1180,28 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $struct (sub (struct (field (ref null $super))))) - - ;; CHECK: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) (type $struct (sub (struct (ref null $super)))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $struct_1 (sub (struct (field (ref null $super_1))))) + + ;; CHECK: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $3 (func)) ;; CHECK: (func $struct-new (type $3) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new $struct - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new $struct_1 + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $struct) + ;; CHECK-NEXT: (struct.new_default $struct_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block ;; (replaces unreachable StructNew we can't emit) ;; CHECK-NEXT: (drop @@ -1148,29 +1229,31 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $struct (sub (struct (field (mut (ref null $super)))))) - - ;; CHECK: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) (type $struct (sub (struct (mut (ref null $super))))) - ;; CHECK: (type $3 (func (param (ref null $struct)))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $struct_1 (sub (struct (field (mut (ref null $super_1)))))) + + ;; CHECK: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (func $struct-set (type $3) (param $struct (ref null $struct)) - ;; CHECK-NEXT: (struct.set $struct 0 + ;; CHECK: (type $3 (func (param (ref null $struct_1)))) + + ;; CHECK: (func $struct-set (type $3) (param $struct (ref null $struct_1)) + ;; CHECK-NEXT: (struct.set $struct_1 0 ;; CHECK-NEXT: (local.get $struct) - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block ;; (replaces unreachable StructSet we can't emit) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) @@ -1179,7 +1262,7 @@ ;; CHECK-NEXT: (ref.null none) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) @@ -1204,27 +1287,29 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $array (sub (array (ref null $super)))) - - ;; CHECK: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) (type $array (sub (array (ref null $super)))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $array_1 (sub (array (ref null $super_1)))) + + ;; CHECK: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $3 (func)) ;; CHECK: (func $array-new (type $3) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (array.new $array - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (array.new $array_1 + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (array.new_default $array + ;; CHECK-NEXT: (array.new_default $array_1 ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1265,24 +1350,26 @@ ) (module + (type $super (sub (struct))) + (type $sub (sub $super (struct))) + + (type $array (sub (array (ref null $super)))) + ;; CHECK: (rec - ;; CHECK-NEXT: (type $array (sub (array (ref null $super)))) + ;; CHECK-NEXT: (type $array_1 (sub (array (ref null $super_1)))) ;; CHECK: (type $1 (func)) - ;; CHECK: (type $super (sub (struct ))) - (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) - (type $sub (sub $super (struct))) + ;; CHECK: (type $super_1 (sub (struct ))) - (type $array (sub (array (ref null $super)))) + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (elem $e (ref null $sub)) + ;; CHECK: (elem $e (ref null $sub_1)) (elem $e (ref null $sub)) ;; CHECK: (func $array-new-elem (type $1) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (array.new_elem $array $e + ;; CHECK-NEXT: (array.new_elem $array_1 $e ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -1314,22 +1401,24 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $array (sub (array (ref null $super)))) - - ;; CHECK: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) (type $array (sub (array (ref null $super)))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $array_1 (sub (array (ref null $super_1)))) + + ;; CHECK: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $3 (func)) ;; CHECK: (func $array-new-fixed (type $3) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (array.new_fixed $array 1 - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (array.new_fixed $array_1 1 + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block ;; (replaces unreachable ArrayNewFixed we can't emit) @@ -1354,22 +1443,25 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (type $array (sub (array (mut (ref null $super))))) (type $array (sub (array (mut (ref null $super))))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + + ;; CHECK: (type $array_1 (sub (array (mut (ref null $super_1))))) + ;; CHECK: (type $3 (func)) ;; CHECK: (func $array-set (type $3) - ;; CHECK-NEXT: (array.set $array - ;; CHECK-NEXT: (array.new_fixed $array 0) + ;; CHECK-NEXT: (array.set $array_1 + ;; CHECK-NEXT: (array.new_fixed $array_1 0) ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block ;; (replaces unreachable ArraySet we can't emit) ;; CHECK-NEXT: (drop @@ -1379,7 +1471,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) @@ -1391,7 +1483,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) @@ -1419,25 +1511,28 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (type $sub-array (sub (array (mut (ref null $sub))))) - - ;; CHECK: (type $super-array (sub (array (mut (ref null $super))))) (type $super-array (sub (array (mut (ref null $super))))) (type $sub-array (sub (array (mut (ref null $sub))))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + + ;; CHECK: (type $sub-array_1 (sub (array (mut (ref null $sub_1))))) + + ;; CHECK: (type $super-array_1 (sub (array (mut (ref null $super_1))))) + ;; CHECK: (type $4 (func)) ;; CHECK: (func $array-copy (type $4) - ;; CHECK-NEXT: (array.copy $super-array $sub-array - ;; CHECK-NEXT: (array.new_fixed $super-array 0) + ;; CHECK-NEXT: (array.copy $super-array_1 $sub-array_1 + ;; CHECK-NEXT: (array.new_fixed $super-array_1 0) ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (array.new_fixed $sub-array 0) + ;; CHECK-NEXT: (array.new_fixed $sub-array_1 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -1449,7 +1544,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (array.new_fixed $sub-array 0) + ;; CHECK-NEXT: (array.new_fixed $sub-array_1 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 0) @@ -1461,7 +1556,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block ;; (replaces unreachable ArrayCopy we can't emit) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (array.new_fixed $super-array 0) + ;; CHECK-NEXT: (array.new_fixed $super-array_1 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 0) @@ -1507,22 +1602,25 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (type $array (sub (array (mut (ref null $super))))) (type $array (sub (array (mut (ref null $super))))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_1 (sub (struct ))) + + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + + ;; CHECK: (type $array_1 (sub (array (mut (ref null $super_1))))) + ;; CHECK: (type $3 (func)) ;; CHECK: (func $array-fill (type $3) - ;; CHECK-NEXT: (array.fill $array - ;; CHECK-NEXT: (array.new_fixed $array 0) + ;; CHECK-NEXT: (array.fill $array_1 + ;; CHECK-NEXT: (array.new_fixed $array_1 0) ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block ;; (replaces unreachable ArrayFill we can't emit) @@ -1533,7 +1631,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 0) @@ -1548,7 +1646,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $sub) + ;; CHECK-NEXT: (struct.new_default $sub_1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 0) @@ -1582,24 +1680,26 @@ ) (module + (type $super (sub (struct))) + (type $sub (sub $super (struct))) + + (type $array (sub (array (mut (ref null $super))))) + ;; CHECK: (rec - ;; CHECK-NEXT: (type $array (sub (array (mut (ref null $super))))) + ;; CHECK-NEXT: (type $array_1 (sub (array (mut (ref null $super_1))))) ;; CHECK: (type $1 (func)) - ;; CHECK: (type $super (sub (struct ))) - (type $super (sub (struct))) - ;; CHECK: (type $sub (sub $super (struct ))) - (type $sub (sub $super (struct))) + ;; CHECK: (type $super_1 (sub (struct ))) - (type $array (sub (array (mut (ref null $super))))) + ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (elem $e (ref null $sub)) + ;; CHECK: (elem $e (ref null $sub_1)) (elem $e (ref null $sub)) ;; CHECK: (func $array-init-elem (type $1) - ;; CHECK-NEXT: (array.init_elem $array $e - ;; CHECK-NEXT: (array.new_fixed $array 0) + ;; CHECK-NEXT: (array.init_elem $array_1 $e + ;; CHECK-NEXT: (array.new_fixed $array_1 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) @@ -1675,57 +1775,68 @@ (module (rec - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct (field (ref null $mid))))) (type $super (sub (struct (ref null $mid)))) - ;; CHECK: (type $mid (sub $super (struct (field (ref null $mid)) (field i32)))) (type $mid (sub $super (struct (ref null $mid) i32))) - ;; CHECK: (type $sub (sub $mid (struct (field (ref null $sub)) (field i32) (field i32)))) (type $sub (sub $mid (struct (ref null $sub) i32 i32))) ) ;; Same as above, but now that transitively requires $sub <: $mid, so we don't ;; end up changing anything. - ;; CHECK: (global $g (ref $super) (struct.new_default $sub)) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_0_0 (sub (struct (field (ref null $mid_0_0))))) + + ;; CHECK: (type $mid_0_0 (sub $super_0_0 (struct (field (ref null $mid_0_0)) (field i32)))) + + ;; CHECK: (type $sub_0_0 (sub $mid_0_0 (struct (field (ref null $sub_0_0)) (field i32) (field i32)))) + + ;; CHECK: (global $g (ref $super_0_0) (struct.new_default $sub_0_0)) (global $g (ref $super) (struct.new_default $sub)) ) (module (rec - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super (sub (struct (field (ref null $super))))) (type $super (sub (struct (ref null $super)))) - ;; CHECK: (type $mid (sub $super (struct (field (ref null $super)) (field i32)))) (type $mid (sub $super (struct (ref null $super) i32))) - ;; CHECK: (type $sub (sub $mid (struct (field (ref null $sub)) (field i32) (field i32)))) (type $sub (sub $mid (struct (ref null $sub) i32 i32))) ) ;; Similar, but now we directly require that $sub <: $mid and transitively ;; require that $sub <: $super, so again we cannot change anything. - ;; CHECK: (global $g (ref $mid) (struct.new_default $sub)) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super_0_0 (sub (struct (field (ref null $super_0_0))))) + + ;; CHECK: (type $mid_0_0 (sub $super_0_0 (struct (field (ref null $super_0_0)) (field i32)))) + + ;; CHECK: (type $sub_0_0 (sub $mid_0_0 (struct (field (ref null $sub_0_0)) (field i32) (field i32)))) + + ;; CHECK: (global $g (ref $mid_0_0) (struct.new_default $sub_0_0)) (global $g (ref $mid) (struct.new_default $sub)) ) (module (rec - ;; CHECK: (rec - ;; CHECK-NEXT: (type $X (sub (struct ))) (type $X (sub (struct))) - ;; CHECK: (type $Y (sub $X (struct ))) (type $Y (sub $X (struct))) - ;; CHECK: (type $super (sub (struct (field (ref null $mid))))) (type $super (sub (struct (ref null $mid)))) - ;; CHECK: (type $mid (sub $super (struct (field (ref null $sub)) (field (ref null $X))))) (type $mid (sub $super (struct (ref null $sub) (ref null $X)))) - ;; CHECK: (type $sub (sub $mid (struct (field (ref null $sub)) (field (ref null $Y))))) (type $sub (sub $mid (struct (ref null $sub) (ref null $Y)))) ) ;; Require $sub <: $super, which transitively requires $sub <: $mid, which then ;; requires $Y <: $X. This only works because we put $sub back in the work list ;; when we find a more refined supertype for it. - ;; CHECK: (global $g (ref $super) (struct.new_default $sub)) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $X_0_0 (sub (struct ))) + + ;; CHECK: (type $Y_0_0 (sub $X_0_0 (struct ))) + + ;; CHECK: (type $super_0_0 (sub (struct (field (ref null $mid_0_0))))) + + ;; CHECK: (type $mid_0_0 (sub $super_0_0 (struct (field (ref null $sub_0_0)) (field (ref null $X_0_0))))) + + ;; CHECK: (type $sub_0_0 (sub $mid_0_0 (struct (field (ref null $sub_0_0)) (field (ref null $Y_0_0))))) + + ;; CHECK: (global $g (ref $super_0_0) (struct.new_default $sub_0_0)) (global $g (ref $super) (struct.new_default $sub)) ) From d5c5c82be3235ae9cdc4e0045897321a3dbe25ca Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 30 May 2024 10:59:29 -0700 Subject: [PATCH 4/8] fix --- src/ir/type-updating.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/ir/type-updating.cpp b/src/ir/type-updating.cpp index d4b3f0284b6..4a5fd84a532 100644 --- a/src/ir/type-updating.cpp +++ b/src/ir/type-updating.cpp @@ -147,15 +147,22 @@ GlobalTypeRewriter::TypeMap GlobalTypeRewriter::rebuildTypes( #endif auto& newTypes = *buildResults; - // Map the old types to the new ones. + // Map the old types to the new ones, and check if anything changed. + bool changed = false; TypeMap oldToNewTypes; for (auto [type, index] : typeIndices) { oldToNewTypes[type] = newTypes[index]; + if (newTypes[index] != type) { + changed = true; + } + } + + // If no types changed then we do not need to fix up type names. + if (!changed) { + return oldToNewTypes; } - // Update type names (doing it before mapTypes can help debugging there, but - // has no other effect; mapTypes does not look at type names). While doing so - // avoid creating duplicate names. + // Update type names to avoid duplicates. std::unordered_set typeNames; for (auto& [type, info] : wasm.typeNames) { typeNames.insert(info.name); From 78e5c49f9adbed514ac30a601ceadb8452f0afcf Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 30 May 2024 10:59:39 -0700 Subject: [PATCH 5/8] format --- src/ir/type-updating.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ir/type-updating.cpp b/src/ir/type-updating.cpp index 4a5fd84a532..f97806374da 100644 --- a/src/ir/type-updating.cpp +++ b/src/ir/type-updating.cpp @@ -173,9 +173,9 @@ GlobalTypeRewriter::TypeMap GlobalTypeRewriter::rebuildTypes( // Use the existing name in the new type, as usually it completely // replaces the old. Rename the old name in a unique way to avoid // confusion in the case that it remains used. - auto deduped = Names::getValidName(wasm.typeNames[old].name, [&](Name test) { - return !typeNames.count(test); - }); + auto deduped = + Names::getValidName(wasm.typeNames[old].name, + [&](Name test) { return !typeNames.count(test); }); wasm.typeNames[old].name = deduped; typeNames.insert(deduped); } From 5832079f3c8c3989ab484b02da2f9ce5d5af482f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 30 May 2024 10:59:47 -0700 Subject: [PATCH 6/8] test.undo --- test/lit/passes/type-ssa_and_merging.wast | 42 +- test/lit/passes/unsubtyping-casts.wast | 222 +++---- test/lit/passes/unsubtyping.wast | 737 +++++++++------------- 3 files changed, 427 insertions(+), 574 deletions(-) diff --git a/test/lit/passes/type-ssa_and_merging.wast b/test/lit/passes/type-ssa_and_merging.wast index b726c0e2415..8928820bfcd 100644 --- a/test/lit/passes/type-ssa_and_merging.wast +++ b/test/lit/passes/type-ssa_and_merging.wast @@ -7,26 +7,24 @@ ;; can. (module - (type $A (sub (struct (field (mut i32))))) - ;; NOP: (rec - ;; NOP-NEXT: (type $0 (func (param (ref $A_1)) (result i32))) - - ;; NOP: (type $A_1 (sub (struct (field i32)))) - - ;; NOP: (type $2 (func (result i32))) + ;; NOP-NEXT: (type $0 (func (param (ref $A)) (result i32))) - ;; NOP: (import "a" "b" (func $import (type $2) (result i32))) + ;; NOP: (type $A (sub (struct (field i32)))) ;; YES: (type $0 (func (result i32))) ;; YES: (rec - ;; YES-NEXT: (type $1 (func (param (ref $A_3)))) + ;; YES-NEXT: (type $1 (func (param (ref $A)))) - ;; YES: (type $A_3 (sub (struct ))) + ;; YES: (type $A (sub (struct ))) + (type $A (sub (struct (field (mut i32))))) - ;; YES: (type $A_2_1 (sub $A_3 (struct ))) + ;; NOP: (type $2 (func (result i32))) + + ;; NOP: (import "a" "b" (func $import (type $2) (result i32))) + ;; YES: (type $A_2 (sub $A (struct ))) - ;; YES: (type $A_1_1 (sub $A_3 (struct ))) + ;; YES: (type $A_1 (sub $A (struct ))) ;; YES: (import "a" "b" (func $import (type $0) (result i32))) (import "a" "b" (func $import (result i32))) @@ -37,7 +35,7 @@ ;; NOP: (func $main1 (type $2) (result i32) ;; NOP-NEXT: (call $get-a-1 - ;; NOP-NEXT: (struct.new $A_1 + ;; NOP-NEXT: (struct.new $A ;; NOP-NEXT: (i32.const 42) ;; NOP-NEXT: ) ;; NOP-NEXT: ) @@ -48,7 +46,7 @@ ;; YES: (func $main1 (type $0) (result i32) ;; YES-NEXT: (call $get-a-1 - ;; YES-NEXT: (struct.new_default $A_3) + ;; YES-NEXT: (struct.new_default $A) ;; YES-NEXT: ) ;; YES-NEXT: (i32.const 42) ;; YES-NEXT: ) @@ -61,14 +59,14 @@ ;; NOP: (func $main2 (type $2) (result i32) ;; NOP-NEXT: (call $get-a-2 - ;; NOP-NEXT: (struct.new $A_1 + ;; NOP-NEXT: (struct.new $A ;; NOP-NEXT: (i32.const 1337) ;; NOP-NEXT: ) ;; NOP-NEXT: ) ;; NOP-NEXT: ) ;; YES: (func $main2 (type $0) (result i32) ;; YES-NEXT: (call $get-a-2 - ;; YES-NEXT: (struct.new_default $A_3) + ;; YES-NEXT: (struct.new_default $A) ;; YES-NEXT: ) ;; YES-NEXT: (i32.const 1337) ;; YES-NEXT: ) @@ -79,7 +77,7 @@ ) ) - ;; NOP: (func $get-a-1 (type $0) (param $0 (ref $A_1)) (result i32) + ;; NOP: (func $get-a-1 (type $0) (param $0 (ref $A)) (result i32) ;; NOP-NEXT: (if ;; NOP-NEXT: (call $import) ;; NOP-NEXT: (then @@ -90,11 +88,11 @@ ;; NOP-NEXT: ) ;; NOP-NEXT: ) ;; NOP-NEXT: ) - ;; NOP-NEXT: (struct.get $A_1 0 + ;; NOP-NEXT: (struct.get $A 0 ;; NOP-NEXT: (local.get $0) ;; NOP-NEXT: ) ;; NOP-NEXT: ) - ;; YES: (func $get-a-1 (type $1) (param $0 (ref $A_3)) + ;; YES: (func $get-a-1 (type $1) (param $0 (ref $A)) ;; YES-NEXT: (if ;; YES-NEXT: (call $import) ;; YES-NEXT: (then @@ -121,7 +119,7 @@ (struct.get $A 0 (local.get 0)) ) - ;; NOP: (func $get-a-2 (type $0) (param $0 (ref $A_1)) (result i32) + ;; NOP: (func $get-a-2 (type $0) (param $0 (ref $A)) (result i32) ;; NOP-NEXT: (if ;; NOP-NEXT: (call $import) ;; NOP-NEXT: (then @@ -132,11 +130,11 @@ ;; NOP-NEXT: ) ;; NOP-NEXT: ) ;; NOP-NEXT: ) - ;; NOP-NEXT: (struct.get $A_1 0 + ;; NOP-NEXT: (struct.get $A 0 ;; NOP-NEXT: (local.get $0) ;; NOP-NEXT: ) ;; NOP-NEXT: ) - ;; YES: (func $get-a-2 (type $1) (param $0 (ref $A_3)) + ;; YES: (func $get-a-2 (type $1) (param $0 (ref $A)) ;; YES-NEXT: (if ;; YES-NEXT: (call $import) ;; YES-NEXT: (then diff --git a/test/lit/passes/unsubtyping-casts.wast b/test/lit/passes/unsubtyping-casts.wast index bdf1474f71d..8f0f66ef2e1 100644 --- a/test/lit/passes/unsubtyping-casts.wast +++ b/test/lit/passes/unsubtyping-casts.wast @@ -30,27 +30,24 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $top (sub (struct ))) (type $top (sub (struct))) + ;; CHECK: (type $mid (sub $top (struct ))) (type $mid (sub $top (struct))) + ;; CHECK: (type $bot (sub $mid (struct ))) (type $bot (sub $mid (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $top_1 (sub (struct ))) - - ;; CHECK: (type $mid_1 (sub $top_1 (struct ))) - - ;; CHECK: (type $bot_1 (sub $mid_1 (struct ))) - ;; CHECK: (type $3 (func)) ;; CHECK: (func $cast (type $3) - ;; CHECK-NEXT: (local $l (ref null $top_1)) + ;; CHECK-NEXT: (local $l (ref null $top)) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $bot_1) + ;; CHECK-NEXT: (struct.new_default $bot) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $mid_1) - ;; CHECK-NEXT: (struct.new_default $top_1) + ;; CHECK-NEXT: (ref.cast (ref $mid) + ;; CHECK-NEXT: (struct.new_default $top) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -71,27 +68,24 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $top (sub (struct ))) (type $top (sub (struct))) + ;; CHECK: (type $mid (sub $top (struct ))) (type $mid (sub $top (struct))) + ;; CHECK: (type $bot (sub $mid (struct ))) (type $bot (sub $mid (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $top_1 (sub (struct ))) - - ;; CHECK: (type $mid_1 (sub $top_1 (struct ))) - - ;; CHECK: (type $bot_1 (sub $mid_1 (struct ))) - ;; CHECK: (type $3 (func)) ;; CHECK: (func $cast (type $3) - ;; CHECK-NEXT: (local $l (ref null $top_1)) + ;; CHECK-NEXT: (local $l (ref null $top)) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $bot_1) + ;; CHECK-NEXT: (struct.new_default $bot) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.test (ref $mid_1) - ;; CHECK-NEXT: (struct.new_default $top_1) + ;; CHECK-NEXT: (ref.test (ref $mid) + ;; CHECK-NEXT: (struct.new_default $top) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -111,29 +105,26 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $top (sub (struct ))) (type $top (sub (struct))) + ;; CHECK: (type $mid (sub $top (struct ))) (type $mid (sub $top (struct))) + ;; CHECK: (type $bot (sub $mid (struct ))) (type $bot (sub $mid (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $top_1 (sub (struct ))) - - ;; CHECK: (type $mid_1 (sub $top_1 (struct ))) - - ;; CHECK: (type $bot_1 (sub $mid_1 (struct ))) - ;; CHECK: (type $3 (func)) ;; CHECK: (func $cast (type $3) - ;; CHECK-NEXT: (local $l (ref null $top_1)) + ;; CHECK-NEXT: (local $l (ref null $top)) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $bot_1) + ;; CHECK-NEXT: (struct.new_default $bot) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $l (result (ref $mid_1)) + ;; CHECK-NEXT: (block $l (result (ref $mid)) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (br_on_cast $l (ref $top_1) (ref $mid_1) - ;; CHECK-NEXT: (struct.new_default $top_1) + ;; CHECK-NEXT: (br_on_cast $l (ref $top) (ref $mid) + ;; CHECK-NEXT: (struct.new_default $top) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) @@ -161,29 +152,26 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $top (sub (struct ))) (type $top (sub (struct))) + ;; CHECK: (type $mid (sub $top (struct ))) (type $mid (sub $top (struct))) + ;; CHECK: (type $bot (sub $mid (struct ))) (type $bot (sub $mid (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $top_1 (sub (struct ))) - - ;; CHECK: (type $mid_1 (sub $top_1 (struct ))) - - ;; CHECK: (type $bot_1 (sub $mid_1 (struct ))) - ;; CHECK: (type $3 (func)) ;; CHECK: (func $cast (type $3) - ;; CHECK-NEXT: (local $l (ref null $top_1)) + ;; CHECK-NEXT: (local $l (ref null $top)) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $bot_1) + ;; CHECK-NEXT: (struct.new_default $bot) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $l (result (ref $top_1)) + ;; CHECK-NEXT: (block $l (result (ref $top)) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (br_on_cast_fail $l (ref $top_1) (ref $mid_1) - ;; CHECK-NEXT: (struct.new_default $top_1) + ;; CHECK-NEXT: (br_on_cast_fail $l (ref $top) (ref $mid) + ;; CHECK-NEXT: (struct.new_default $top) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) @@ -211,28 +199,25 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $top (sub (func))) (type $top (sub (func))) + ;; CHECK: (type $mid (sub $top (func))) (type $mid (sub $top (func))) + ;; CHECK: (type $bot (sub $mid (func))) (type $bot (sub $mid (func))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $top_1 (sub (func))) - - ;; CHECK: (type $mid_1 (sub $top_1 (func))) - - ;; CHECK: (type $bot_1 (sub $mid_1 (func))) - - ;; CHECK: (table $t 1 1 (ref null $top_1)) + ;; CHECK: (table $t 1 1 (ref null $top)) (table $t 1 1 (ref null $top)) ;; CHECK: (elem declare func $cast) - ;; CHECK: (func $cast (type $bot_1) - ;; CHECK-NEXT: (local $l (ref null $top_1)) + ;; CHECK: (func $cast (type $bot) + ;; CHECK-NEXT: (local $l (ref null $top)) ;; CHECK-NEXT: (local.set $l ;; CHECK-NEXT: (ref.func $cast) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (call_indirect $t (type $mid_1) + ;; CHECK-NEXT: (call_indirect $t (type $mid) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -251,27 +236,24 @@ (module (rec + ;; CHECK: (rec + ;; CHECK-NEXT: (type $unrelated (sub (func))) (type $unrelated (sub (func))) + ;; CHECK: (type $top (sub (func))) (type $top (sub (func))) + ;; CHECK: (type $bot (sub $top (func))) (type $bot (sub $top (func))) ) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $unrelated_0_0 (sub (func))) - - ;; CHECK: (type $top_0_0 (sub (func))) - - ;; CHECK: (type $bot_0_0 (sub $top_0_0 (func))) - - ;; CHECK: (table $t 1 1 (ref null $bot_0_0)) + ;; CHECK: (table $t 1 1 (ref null $bot)) (table $t 1 1 (ref null $bot)) - ;; CHECK: (func $call-indirect (type $bot_0_0) - ;; CHECK-NEXT: (call_indirect $t (type $top_0_0) + ;; CHECK: (func $call-indirect (type $bot) + ;; CHECK-NEXT: (call_indirect $t (type $top) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (call_indirect $t (type $unrelated_0_0) + ;; CHECK-NEXT: (call_indirect $t (type $unrelated) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -289,27 +271,24 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $top (sub (struct ))) (type $top (sub (struct))) + ;; CHECK: (type $mid (sub (struct ))) (type $mid (sub $top (struct))) + ;; CHECK: (type $bot (sub $mid (struct ))) (type $bot (sub $mid (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $top_1 (sub (struct ))) - - ;; CHECK: (type $mid_1 (sub (struct ))) - - ;; CHECK: (type $bot_1 (sub $mid_1 (struct ))) - ;; CHECK: (type $3 (func)) ;; CHECK: (func $cast-optimizable (type $3) - ;; CHECK-NEXT: (local $l (ref null $mid_1)) + ;; CHECK-NEXT: (local $l (ref null $mid)) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $bot_1) + ;; CHECK-NEXT: (struct.new_default $bot) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (ref.cast (ref none) - ;; CHECK-NEXT: (struct.new_default $top_1) + ;; CHECK-NEXT: (struct.new_default $top) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -332,39 +311,36 @@ (module (rec + ;; CHECK: (rec + ;; CHECK-NEXT: (type $top (sub (struct ))) (type $top (sub (struct))) + ;; CHECK: (type $mid (sub $top (struct ))) (type $mid (sub $top (struct))) + ;; CHECK: (type $bot (sub (struct ))) (type $bot (sub $mid (struct))) ) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $top_1 (sub (struct ))) - - ;; CHECK: (type $mid_1 (sub $top_1 (struct ))) - - ;; CHECK: (type $bot_1 (sub (struct ))) - ;; CHECK: (type $3 (func (param anyref))) ;; CHECK: (func $cast (type $3) (param $any anyref) ;; CHECK-NEXT: (local $l anyref) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $bot_1) + ;; CHECK-NEXT: (ref.cast (ref $bot) ;; CHECK-NEXT: (local.get $any) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $top_1) + ;; CHECK-NEXT: (ref.cast (ref $top) ;; CHECK-NEXT: (local.get $any) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $mid_1) + ;; CHECK-NEXT: (ref.cast (ref $mid) ;; CHECK-NEXT: (local.get $any) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $mid_1) + ;; CHECK-NEXT: (struct.new_default $mid) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $cast (param $any anyref) @@ -404,21 +380,18 @@ ;; from user types. (module (rec + ;; CHECK: (rec + ;; CHECK-NEXT: (type $top (sub (struct ))) (type $top (sub (struct))) + ;; CHECK: (type $mid (sub $top (struct ))) (type $mid (sub $top (struct))) + ;; CHECK: (type $bot (sub (struct ))) (type $bot (sub $mid (struct))) ) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $top_1 (sub (struct ))) - - ;; CHECK: (type $mid_1 (sub $top_1 (struct ))) - - ;; CHECK: (type $bot_1 (sub (struct ))) + ;; CHECK: (type $3 (func (param anyref (ref $top) (ref $mid) (ref $bot)))) - ;; CHECK: (type $3 (func (param anyref (ref $top_1) (ref $mid_1) (ref $bot_1)))) - - ;; CHECK: (func $cast (type $3) (param $any anyref) (param $top (ref $top_1)) (param $mid (ref $mid_1)) (param $bot (ref $bot_1)) + ;; CHECK: (func $cast (type $3) (param $any anyref) (param $top (ref $top)) (param $mid (ref $mid)) (param $bot (ref $bot)) ;; CHECK-NEXT: (local $l anyref) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (ref.eq @@ -439,22 +412,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $bot_1) + ;; CHECK-NEXT: (ref.cast (ref $bot) ;; CHECK-NEXT: (local.get $any) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $top_1) + ;; CHECK-NEXT: (ref.cast (ref $top) ;; CHECK-NEXT: (local.get $any) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $mid_1) + ;; CHECK-NEXT: (ref.cast (ref $mid) ;; CHECK-NEXT: (local.get $any) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $mid_1) + ;; CHECK-NEXT: (struct.new_default $mid) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $cast (param $any anyref) (param $top (ref $top)) (param $mid (ref $mid)) (param $bot (ref $bot)) @@ -504,58 +477,49 @@ (module (rec + ;; CHECK: (rec + ;; CHECK-NEXT: (type $topC (sub (struct ))) (type $topC (sub (struct))) + ;; CHECK: (type $midC (sub $topC (struct ))) (type $midC (sub $topC (struct))) + ;; CHECK: (type $botC (sub $midC (struct ))) (type $botC (sub $midC (struct))) + ;; CHECK: (type $topB (sub (struct (field (ref null $topC))))) (type $topB (sub (struct (ref null $topC)))) + ;; CHECK: (type $midB (sub $topB (struct (field (ref null $botC))))) (type $midB (sub $topB (struct (ref null $botC)))) + ;; CHECK: (type $botB (sub $midB (struct (field (ref null $botC))))) (type $botB (sub $midB (struct (ref null $botC)))) + ;; CHECK: (type $topA (sub (struct (field (ref null $topB))))) (type $topA (sub (struct (ref null $topB)))) + ;; CHECK: (type $midA (sub $topA (struct (field (ref null $botB))))) (type $midA (sub $topA (struct (ref null $botB)))) + ;; CHECK: (type $botA (sub $midA (struct (field (ref null $botB))))) (type $botA (sub $midA (struct (ref null $botB)))) ) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $topC_1 (sub (struct ))) - - ;; CHECK: (type $midC_1 (sub $topC_1 (struct ))) - - ;; CHECK: (type $botC_1 (sub $midC_1 (struct ))) - - ;; CHECK: (type $topB_1 (sub (struct (field (ref null $topC_1))))) - - ;; CHECK: (type $midB_1 (sub $topB_1 (struct (field (ref null $botC_1))))) - - ;; CHECK: (type $botB_1 (sub $midB_1 (struct (field (ref null $botC_1))))) - - ;; CHECK: (type $topA_1 (sub (struct (field (ref null $topB_1))))) - - ;; CHECK: (type $midA_1 (sub $topA_1 (struct (field (ref null $botB_1))))) - - ;; CHECK: (type $botA_1 (sub $midA_1 (struct (field (ref null $botB_1))))) - ;; CHECK: (type $9 (func)) ;; CHECK: (func $cast (type $9) - ;; CHECK-NEXT: (local $l (ref null $topA_1)) + ;; CHECK-NEXT: (local $l (ref null $topA)) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $botA_1) + ;; CHECK-NEXT: (struct.new_default $botA) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $midA_1) - ;; CHECK-NEXT: (struct.new_default $topA_1) + ;; CHECK-NEXT: (ref.cast (ref $midA) + ;; CHECK-NEXT: (struct.new_default $topA) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $midB_1) - ;; CHECK-NEXT: (struct.new_default $topB_1) + ;; CHECK-NEXT: (ref.cast (ref $midB) + ;; CHECK-NEXT: (struct.new_default $topB) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast (ref $midC_1) - ;; CHECK-NEXT: (struct.new_default $topC_1) + ;; CHECK-NEXT: (ref.cast (ref $midC) + ;; CHECK-NEXT: (struct.new_default $topC) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/unsubtyping.wast b/test/lit/passes/unsubtyping.wast index 35248a5d039..277916d73ba 100644 --- a/test/lit/passes/unsubtyping.wast +++ b/test/lit/passes/unsubtyping.wast @@ -60,19 +60,17 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) ;; A function body requires subtyping - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - - ;; CHECK: (type $2 (func (result (ref $super_1)))) + ;; CHECK: (type $2 (func (result (ref $super)))) - ;; CHECK: (func $foo (type $2) (result (ref $super_1)) - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK: (func $foo (type $2) (result (ref $super)) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) (func $foo (result (ref $super)) (struct.new $sub) @@ -80,79 +78,66 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) ;; A global initializer requires subtyping - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - - ;; CHECK: (global $g1 (ref $super_1) (struct.new_default $sub_1)) + ;; CHECK: (global $g1 (ref $super) (struct.new_default $sub)) (global $g1 (ref $super) (struct.new $sub)) ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (type $subsub (sub $sub (struct ))) (type $subsub (sub $sub (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - - ;; CHECK: (type $subsub_1 (sub $sub_1 (struct ))) - - ;; CHECK: (table $t 1 1 (ref null $super_1)) + ;; CHECK: (table $t 1 1 (ref null $super)) (table $t 1 1 (ref null $super)) ;; An active element segment requires subtyping. So does an element segment ;; element. - ;; CHECK: (elem $e (table $t) (i32.const 0) (ref null $sub_1) (struct.new_default $subsub_1)) + ;; CHECK: (elem $e (table $t) (i32.const 0) (ref null $sub) (struct.new_default $subsub)) (elem $e (table $t) (offset (i32.const 0)) (ref null $sub) (struct.new $subsub)) ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $X (sub (struct ))) (type $X (sub (struct))) + ;; CHECK: (type $Y (sub $X (struct ))) (type $Y (sub $X (struct))) + ;; CHECK: (type $A (sub (struct (field (ref null $X))))) (type $A (sub (struct (ref null $X)))) + ;; CHECK: (type $B (sub $A (struct (field (ref null $Y))))) (type $B (sub $A (struct (ref null $Y)))) ;; Requiring B <: A also requires X <: Y - ;; CHECK: (rec - ;; CHECK-NEXT: (type $X_1 (sub (struct ))) - - ;; CHECK: (type $Y_1 (sub $X_1 (struct ))) - - ;; CHECK: (type $A_1 (sub (struct (field (ref null $X_1))))) - - ;; CHECK: (type $B_1 (sub $A_1 (struct (field (ref null $Y_1))))) - - ;; CHECK: (global $g (ref $A_1) (struct.new_default $B_1)) + ;; CHECK: (global $g (ref $A) (struct.new_default $B)) (global $g (ref $A) (struct.new_default $B)) ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $X (sub (struct ))) (type $X (sub (struct))) + ;; CHECK: (type $Y (sub $X (struct ))) (type $Y (sub $X (struct))) + ;; CHECK: (type $A (sub (array (ref null $X)))) (type $A (sub (array (field (ref null $X))))) + ;; CHECK: (type $B (sub $A (array (ref null $Y)))) (type $B (sub $A (array (field (ref null $Y))))) ;; Transitive dependencies through an array. - ;; CHECK: (rec - ;; CHECK-NEXT: (type $X_1 (sub (struct ))) - - ;; CHECK: (type $Y_1 (sub $X_1 (struct ))) - - ;; CHECK: (type $A_1 (sub (array (ref null $X_1)))) - - ;; CHECK: (type $B_1 (sub $A_1 (array (ref null $Y_1)))) - - ;; CHECK: (global $g (ref $A_1) (array.new_default $B_1 + ;; CHECK: (global $g (ref $A) (array.new_default $B ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: )) (global $g (ref $A) (array.new_default $B (i32.const 0))) @@ -160,34 +145,28 @@ (module (rec + ;; CHECK: (rec + ;; CHECK-NEXT: (type $X (sub (struct ))) (type $X (sub (struct))) + ;; CHECK: (type $Y (sub $X (struct ))) (type $Y (sub $X (struct))) + ;; CHECK: (type $X' (sub (struct ))) (type $X' (sub (struct))) + ;; CHECK: (type $Y' (sub $X' (struct ))) (type $Y' (sub $X' (struct))) + ;; CHECK: (type $A (sub (func (param (ref $Y')) (result (ref $X))))) (type $A (sub (func (param (ref $Y')) (result (ref $X))))) + ;; CHECK: (type $B (sub $A (func (param (ref $X')) (result (ref $Y))))) (type $B (sub $A (func (param (ref $X')) (result (ref $Y))))) ) ;; Transitive dependencies through a function type. - ;; CHECK: (rec - ;; CHECK-NEXT: (type $X_0_0 (sub (struct ))) - - ;; CHECK: (type $Y_0_0 (sub $X_0_0 (struct ))) - - ;; CHECK: (type $X'_0_0 (sub (struct ))) - - ;; CHECK: (type $Y'_0_0 (sub $X'_0_0 (struct ))) - - ;; CHECK: (type $A_0_0 (sub (func (param (ref $Y'_0_0)) (result (ref $X_0_0))))) - - ;; CHECK: (type $B_0_0 (sub $A_0_0 (func (param (ref $X'_0_0)) (result (ref $Y_0_0))))) - - ;; CHECK: (global $g (ref null $A_0_0) (ref.func $foo)) + ;; CHECK: (global $g (ref null $A) (ref.func $foo)) (global $g (ref null $A) (ref.func $foo)) - ;; CHECK: (func $foo (type $B_0_0) (param $0 (ref $X'_0_0)) (result (ref $Y_0_0)) + ;; CHECK: (func $foo (type $B) (param $0 (ref $X')) (result (ref $Y)) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $foo (type $B) @@ -196,26 +175,24 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $2 (func)) ;; CHECK: (func $block-fallthrough (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $l (result (ref $super_1)) + ;; CHECK-NEXT: (block $l (result (ref $super)) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (br_if $l - ;; CHECK-NEXT: (struct.new_default $super_1) + ;; CHECK-NEXT: (struct.new_default $super) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -236,33 +213,31 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $opt (sub (struct (field i32)))) + + ;; CHECK: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) (type $opt (sub $super (struct i32))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $opt_1 (sub (struct (field i32)))) - - ;; CHECK: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $3 (func)) ;; CHECK: (func $block-br (type $3) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $l (result (ref $super_1)) + ;; CHECK-NEXT: (block $l (result (ref $super)) ;; CHECK-NEXT: (br $l - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $other (result (ref $opt_1)) + ;; CHECK-NEXT: (block $other (result (ref $opt)) ;; CHECK-NEXT: (br $other - ;; CHECK-NEXT: (struct.new_default $opt_1) + ;; CHECK-NEXT: (struct.new_default $opt) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (struct.new_default $super_1) + ;; CHECK-NEXT: (struct.new_default $super) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -288,25 +263,23 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $2 (func)) ;; CHECK: (func $if (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (if (result (ref $sub_1)) + ;; CHECK-NEXT: (if (result (ref $sub)) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (then - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -328,20 +301,18 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $2 (func)) ;; CHECK: (func $loop (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (loop (result (ref $sub_1)) - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (loop (result (ref $sub)) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -356,23 +327,21 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $2 (func)) ;; CHECK: (func $loop (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $super (result (ref $sub_1)) + ;; CHECK-NEXT: (block $super (result (ref $sub)) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $sub (result (ref $sub_1)) + ;; CHECK-NEXT: (block $sub (result (ref $sub)) ;; CHECK-NEXT: (br_table $super $sub - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -400,23 +369,21 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $2 (func)) ;; CHECK: (func $br-table (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $super (result (ref $sub_1)) + ;; CHECK-NEXT: (block $super (result (ref $sub)) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $sub (result (ref $sub_1)) + ;; CHECK-NEXT: (block $sub (result (ref $sub)) ;; CHECK-NEXT: (br_table $sub $super - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -444,19 +411,17 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - - ;; CHECK: (type $2 (func (param (ref $super_1)))) + ;; CHECK: (type $2 (func (param (ref $super)))) - ;; CHECK: (func $call (type $2) (param $0 (ref $super_1)) + ;; CHECK: (func $call (type $2) (param $0 (ref $super)) ;; CHECK-NEXT: (call $call - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $call (param (ref $super)) @@ -468,19 +433,17 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - - ;; CHECK: (type $2 (func (result (ref $sub_1)))) + ;; CHECK: (type $2 (func (result (ref $sub)))) - ;; CHECK: (type $3 (func (result (ref $super_1)))) + ;; CHECK: (type $3 (func (result (ref $super)))) - ;; CHECK: (func $return-call (type $3) (result (ref $super_1)) + ;; CHECK: (func $return-call (type $3) (result (ref $super)) ;; CHECK-NEXT: (return_call $callee) ;; CHECK-NEXT: ) (func $return-call (result (ref $super)) @@ -488,7 +451,7 @@ (return_call $callee) ) - ;; CHECK: (func $callee (type $2) (result (ref $sub_1)) + ;; CHECK: (func $callee (type $2) (result (ref $sub)) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $callee (result (ref $sub)) @@ -497,22 +460,20 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - - ;; CHECK: (type $2 (func (param (ref $super_1)))) + ;; CHECK: (type $2 (func (param (ref $super)))) ;; CHECK: (table $t 1 1 funcref) (table $t 1 1 funcref) - ;; CHECK: (func $call-indirect (type $2) (param $0 (ref $super_1)) + ;; CHECK: (func $call-indirect (type $2) (param $0 (ref $super)) ;; CHECK-NEXT: (call_indirect $t (type $2) - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -526,22 +487,20 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - - ;; CHECK: (type $2 (func (result (ref $sub_1)))) + ;; CHECK: (type $2 (func (result (ref $sub)))) - ;; CHECK: (type $3 (func (result (ref $super_1)))) + ;; CHECK: (type $3 (func (result (ref $super)))) ;; CHECK: (table $t 1 1 funcref) (table $t 1 1 funcref) - ;; CHECK: (func $return-call-indirect (type $3) (result (ref $super_1)) + ;; CHECK: (func $return-call-indirect (type $3) (result (ref $super)) ;; CHECK-NEXT: (return_call_indirect $t (type $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -555,19 +514,18 @@ ) (module - (type $super (sub (func))) - (type $sub (sub $super (func))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $sub_1 (sub (func))) + ;; CHECK-NEXT: (type $sub (sub (func))) - ;; CHECK: (type $super_1 (sub (func))) + ;; CHECK: (type $super (sub (func))) + (type $super (sub (func))) + (type $sub (sub $super (func))) - ;; CHECK: (table $t 1 1 (ref null $super_1)) + ;; CHECK: (table $t 1 1 (ref null $super)) (table $t 1 1 (ref null $super)) - ;; CHECK: (func $call-indirect-table (type $sub_1) - ;; CHECK-NEXT: (call_indirect $t (type $sub_1) + ;; CHECK: (func $call-indirect-table (type $sub) + ;; CHECK-NEXT: (call_indirect $t (type $sub) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -582,20 +540,18 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $2 (func)) ;; CHECK: (func $local-set (type $2) - ;; CHECK-NEXT: (local $l (ref null $super_1)) + ;; CHECK-NEXT: (local $l (ref null $super)) ;; CHECK-NEXT: (local.set $l - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $local-set @@ -608,21 +564,19 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $2 (func)) ;; CHECK: (func $local-tee (type $2) - ;; CHECK-NEXT: (local $l (ref null $super_1)) + ;; CHECK-NEXT: (local $l (ref null $super)) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (local.tee $l - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -638,22 +592,20 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $2 (func)) - ;; CHECK: (global $g (mut (ref null $super_1)) (ref.null none)) + ;; CHECK: (global $g (mut (ref null $super)) (ref.null none)) (global $g (mut (ref null $super)) (ref.null none)) ;; CHECK: (func $global-set (type $2) ;; CHECK-NEXT: (global.set $g - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $global-set @@ -665,24 +617,22 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub2 (sub $super (struct (field i32)))) + + ;; CHECK: (type $sub1 (sub $super (struct ))) (type $sub1 (sub $super (struct))) (type $sub2 (sub $super (struct i32))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub2_1 (sub $super_1 (struct (field i32)))) - - ;; CHECK: (type $sub1_1 (sub $super_1 (struct ))) - ;; CHECK: (type $3 (func)) ;; CHECK: (func $select (type $3) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (select (result (ref $super_1)) - ;; CHECK-NEXT: (struct.new_default $sub1_1) - ;; CHECK-NEXT: (struct.new_default $sub2_1) + ;; CHECK-NEXT: (select (result (ref $super)) + ;; CHECK-NEXT: (struct.new_default $sub1) + ;; CHECK-NEXT: (struct.new_default $sub2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -700,19 +650,17 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - - ;; CHECK: (type $2 (func (result (ref $super_1)))) + ;; CHECK: (type $2 (func (result (ref $super)))) - ;; CHECK: (func $return (type $2) (result (ref $super_1)) + ;; CHECK: (func $return (type $2) (result (ref $super)) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $return (result (ref $super)) @@ -724,19 +672,18 @@ ) (module - (type $super (sub (struct))) - (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $sub_1 (sub (struct ))) + ;; CHECK-NEXT: (type $sub (sub (struct ))) - ;; CHECK: (type $super_1 (sub (struct ))) + ;; CHECK: (type $super (sub (struct ))) + (type $super (sub (struct))) + (type $sub (sub $super (struct))) ;; CHECK: (type $2 (func)) ;; CHECK: (func $return-none (type $2) - ;; CHECK-NEXT: (local $super (ref null $super_1)) - ;; CHECK-NEXT: (local $sub (ref null $sub_1)) + ;; CHECK-NEXT: (local $super (ref null $super)) + ;; CHECK-NEXT: (local $sub (ref null $sub)) ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) (func $return-none @@ -749,28 +696,26 @@ (module (rec + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super2 (sub (struct ))) + + ;; CHECK: (type $sub2 (sub $super2 (struct ))) + + ;; CHECK: (type $super1 (sub (struct ))) (type $super1 (sub (struct))) (type $super2 (sub (struct))) + ;; CHECK: (type $sub1 (sub $super1 (struct ))) (type $sub1 (sub $super1 (struct))) (type $sub2 (sub $super2 (struct))) ) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super2_1 (sub (struct ))) - - ;; CHECK: (type $sub2_1 (sub $super2_1 (struct ))) - - ;; CHECK: (type $super1_1 (sub (struct ))) - - ;; CHECK: (type $sub1_1 (sub $super1_1 (struct ))) - - ;; CHECK: (type $4 (func (result (ref $super1_1) (ref $super2_1)))) + ;; CHECK: (type $4 (func (result (ref $super1) (ref $super2)))) - ;; CHECK: (func $return-many (type $4) (result (ref $super1_1) (ref $super2_1)) + ;; CHECK: (func $return-many (type $4) (result (ref $super1) (ref $super2)) ;; CHECK-NEXT: (return ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (struct.new_default $sub1_1) - ;; CHECK-NEXT: (struct.new_default $sub2_1) + ;; CHECK-NEXT: (struct.new_default $sub1) + ;; CHECK-NEXT: (struct.new_default $sub2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -786,23 +731,21 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $2 (func)) - ;; CHECK: (table $t 1 1 (ref null $super_1)) + ;; CHECK: (table $t 1 1 (ref null $super)) (table $t 1 1 (ref null $super)) ;; CHECK: (func $table-set (type $2) ;; CHECK-NEXT: (table.set $t ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $table-set @@ -815,23 +758,21 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $2 (func)) - ;; CHECK: (table $t 1 1 (ref null $super_1)) + ;; CHECK: (table $t 1 1 (ref null $super)) (table $t 1 1 (ref null $super)) ;; CHECK: (func $table-fill (type $2) ;; CHECK-NEXT: (table.fill $t ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -846,20 +787,18 @@ ) (module - (type $super (sub (struct))) - (type $sub (sub $super (struct))) - ;; CHECK: (rec ;; CHECK-NEXT: (type $0 (func)) - ;; CHECK: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + ;; CHECK: (type $super (sub (struct ))) + (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) + (type $sub (sub $super (struct))) - ;; CHECK: (table $super 1 1 (ref null $super_1)) + ;; CHECK: (table $super 1 1 (ref null $super)) (table $super 1 1 (ref null $super)) - ;; CHECK: (table $sub 1 1 (ref null $sub_1)) + ;; CHECK: (table $sub 1 1 (ref null $sub)) (table $sub 1 1 (ref null $sub)) ;; CHECK: (func $table-copy (type $0) @@ -880,24 +819,22 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $2 (func)) ;; CHECK: (func $try (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (try (result (ref $super_1)) + ;; CHECK-NEXT: (try (result (ref $super)) ;; CHECK-NEXT: (do - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (catch_all - ;; CHECK-NEXT: (struct.new_default $super_1) + ;; CHECK-NEXT: (struct.new_default $super) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -918,24 +855,22 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $2 (func)) ;; CHECK: (func $try-catch (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (try (result (ref $super_1)) + ;; CHECK-NEXT: (try (result (ref $super)) ;; CHECK-NEXT: (do - ;; CHECK-NEXT: (struct.new_default $super_1) + ;; CHECK-NEXT: (struct.new_default $super) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (catch_all - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -987,28 +922,25 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (type $f (func (param (ref $super)))) (type $f (func (param (ref $super)))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - - ;; CHECK: (type $f_1 (func (param (ref $super_1)))) - ;; CHECK: (elem declare func $call-ref) - ;; CHECK: (func $call-ref (type $f_1) (param $0 (ref $super_1)) - ;; CHECK-NEXT: (call_ref $f_1 - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK: (func $call-ref (type $f) (param $0 (ref $super)) + ;; CHECK-NEXT: (call_ref $f + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: (ref.func $call-ref) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block ;; (replaces unreachable CallRef we can't emit) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (unreachable) @@ -1017,7 +949,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block ;; (replaces unreachable CallRef we can't emit) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (ref.null nofunc) @@ -1045,24 +977,21 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (type $f (func (result (ref $sub)))) (type $f (func (result (ref $sub)))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - - ;; CHECK: (type $f_1 (func (result (ref $sub_1)))) - - ;; CHECK: (type $3 (func (result (ref $super_1)))) + ;; CHECK: (type $3 (func (result (ref $super)))) ;; CHECK: (elem declare func $callee) - ;; CHECK: (func $return-call-ref (type $3) (result (ref $super_1)) - ;; CHECK-NEXT: (return_call_ref $f_1 + ;; CHECK: (func $return-call-ref (type $3) (result (ref $super)) + ;; CHECK-NEXT: (return_call_ref $f ;; CHECK-NEXT: (ref.func $callee) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1073,7 +1002,7 @@ ) ) - ;; CHECK: (func $callee (type $f_1) (result (ref $sub_1)) + ;; CHECK: (func $callee (type $f) (result (ref $sub)) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $callee (result (ref $sub)) @@ -1082,23 +1011,21 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $2 (func)) ;; CHECK: (func $br-on-non-null (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $l (result (ref $super_1)) + ;; CHECK-NEXT: (block $l (result (ref $super)) ;; CHECK-NEXT: (br_on_non_null $l - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (struct.new_default $super_1) + ;; CHECK-NEXT: (struct.new_default $super) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1116,21 +1043,19 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $2 (func)) ;; CHECK: (func $br-on-cast (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $l (result (ref $super_1)) - ;; CHECK-NEXT: (br_on_cast $l (ref $super_1) (ref $sub_1) - ;; CHECK-NEXT: (struct.new_default $super_1) + ;; CHECK-NEXT: (block $l (result (ref $super)) + ;; CHECK-NEXT: (br_on_cast $l (ref $super) (ref $sub) + ;; CHECK-NEXT: (struct.new_default $super) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1148,21 +1073,19 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $2 (func)) ;; CHECK: (func $br-on-cast-fail (type $2) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $l (result (ref $sub_1)) - ;; CHECK-NEXT: (br_on_cast_fail $l (ref $sub_1) (ref none) - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (block $l (result (ref $sub)) + ;; CHECK-NEXT: (br_on_cast_fail $l (ref $sub) (ref none) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1180,28 +1103,26 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $struct (sub (struct (field (ref null $super))))) + + ;; CHECK: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) (type $struct (sub (struct (ref null $super)))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $struct_1 (sub (struct (field (ref null $super_1))))) - - ;; CHECK: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $3 (func)) ;; CHECK: (func $struct-new (type $3) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new $struct_1 - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new $struct + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $struct_1) + ;; CHECK-NEXT: (struct.new_default $struct) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block ;; (replaces unreachable StructNew we can't emit) ;; CHECK-NEXT: (drop @@ -1229,31 +1150,29 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $struct (sub (struct (field (mut (ref null $super)))))) + + ;; CHECK: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) (type $struct (sub (struct (mut (ref null $super))))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $struct_1 (sub (struct (field (mut (ref null $super_1)))))) - - ;; CHECK: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - - ;; CHECK: (type $3 (func (param (ref null $struct_1)))) + ;; CHECK: (type $3 (func (param (ref null $struct)))) - ;; CHECK: (func $struct-set (type $3) (param $struct (ref null $struct_1)) - ;; CHECK-NEXT: (struct.set $struct_1 0 + ;; CHECK: (func $struct-set (type $3) (param $struct (ref null $struct)) + ;; CHECK-NEXT: (struct.set $struct 0 ;; CHECK-NEXT: (local.get $struct) - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block ;; (replaces unreachable StructSet we can't emit) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) @@ -1262,7 +1181,7 @@ ;; CHECK-NEXT: (ref.null none) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) @@ -1287,29 +1206,27 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $array (sub (array (ref null $super)))) + + ;; CHECK: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) (type $array (sub (array (ref null $super)))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $array_1 (sub (array (ref null $super_1)))) - - ;; CHECK: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $3 (func)) ;; CHECK: (func $array-new (type $3) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (array.new $array_1 - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (array.new $array + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (array.new_default $array_1 + ;; CHECK-NEXT: (array.new_default $array ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1350,26 +1267,24 @@ ) (module - (type $super (sub (struct))) - (type $sub (sub $super (struct))) - - (type $array (sub (array (ref null $super)))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $array_1 (sub (array (ref null $super_1)))) + ;; CHECK-NEXT: (type $array (sub (array (ref null $super)))) ;; CHECK: (type $1 (func)) - ;; CHECK: (type $super_1 (sub (struct ))) + ;; CHECK: (type $super (sub (struct ))) + (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) + (type $sub (sub $super (struct))) - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + (type $array (sub (array (ref null $super)))) - ;; CHECK: (elem $e (ref null $sub_1)) + ;; CHECK: (elem $e (ref null $sub)) (elem $e (ref null $sub)) ;; CHECK: (func $array-new-elem (type $1) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (array.new_elem $array_1 $e + ;; CHECK-NEXT: (array.new_elem $array $e ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -1401,24 +1316,22 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $array (sub (array (ref null $super)))) + + ;; CHECK: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) (type $array (sub (array (ref null $super)))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $array_1 (sub (array (ref null $super_1)))) - - ;; CHECK: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $3 (func)) ;; CHECK: (func $array-new-fixed (type $3) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (array.new_fixed $array_1 1 - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (array.new_fixed $array 1 + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block ;; (replaces unreachable ArrayNewFixed we can't emit) @@ -1443,25 +1356,22 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (type $array (sub (array (mut (ref null $super))))) (type $array (sub (array (mut (ref null $super))))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - - ;; CHECK: (type $array_1 (sub (array (mut (ref null $super_1))))) - ;; CHECK: (type $3 (func)) ;; CHECK: (func $array-set (type $3) - ;; CHECK-NEXT: (array.set $array_1 - ;; CHECK-NEXT: (array.new_fixed $array_1 0) + ;; CHECK-NEXT: (array.set $array + ;; CHECK-NEXT: (array.new_fixed $array 0) ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block ;; (replaces unreachable ArraySet we can't emit) ;; CHECK-NEXT: (drop @@ -1471,7 +1381,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) @@ -1483,7 +1393,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) @@ -1511,28 +1421,25 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (type $sub-array (sub (array (mut (ref null $sub))))) + + ;; CHECK: (type $super-array (sub (array (mut (ref null $super))))) (type $super-array (sub (array (mut (ref null $super))))) (type $sub-array (sub (array (mut (ref null $sub))))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - - ;; CHECK: (type $sub-array_1 (sub (array (mut (ref null $sub_1))))) - - ;; CHECK: (type $super-array_1 (sub (array (mut (ref null $super_1))))) - ;; CHECK: (type $4 (func)) ;; CHECK: (func $array-copy (type $4) - ;; CHECK-NEXT: (array.copy $super-array_1 $sub-array_1 - ;; CHECK-NEXT: (array.new_fixed $super-array_1 0) + ;; CHECK-NEXT: (array.copy $super-array $sub-array + ;; CHECK-NEXT: (array.new_fixed $super-array 0) ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (array.new_fixed $sub-array_1 0) + ;; CHECK-NEXT: (array.new_fixed $sub-array 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -1544,7 +1451,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (array.new_fixed $sub-array_1 0) + ;; CHECK-NEXT: (array.new_fixed $sub-array 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 0) @@ -1556,7 +1463,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block ;; (replaces unreachable ArrayCopy we can't emit) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (array.new_fixed $super-array_1 0) + ;; CHECK-NEXT: (array.new_fixed $super-array 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 0) @@ -1602,25 +1509,22 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) + ;; CHECK: (type $array (sub (array (mut (ref null $super))))) (type $array (sub (array (mut (ref null $super))))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - - ;; CHECK: (type $array_1 (sub (array (mut (ref null $super_1))))) - ;; CHECK: (type $3 (func)) ;; CHECK: (func $array-fill (type $3) - ;; CHECK-NEXT: (array.fill $array_1 - ;; CHECK-NEXT: (array.new_fixed $array_1 0) + ;; CHECK-NEXT: (array.fill $array + ;; CHECK-NEXT: (array.new_fixed $array 0) ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block ;; (replaces unreachable ArrayFill we can't emit) @@ -1631,7 +1535,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 0) @@ -1646,7 +1550,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 0) @@ -1680,26 +1584,24 @@ ) (module - (type $super (sub (struct))) - (type $sub (sub $super (struct))) - - (type $array (sub (array (mut (ref null $super))))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $array_1 (sub (array (mut (ref null $super_1))))) + ;; CHECK-NEXT: (type $array (sub (array (mut (ref null $super))))) ;; CHECK: (type $1 (func)) - ;; CHECK: (type $super_1 (sub (struct ))) + ;; CHECK: (type $super (sub (struct ))) + (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) + (type $sub (sub $super (struct))) - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) + (type $array (sub (array (mut (ref null $super))))) - ;; CHECK: (elem $e (ref null $sub_1)) + ;; CHECK: (elem $e (ref null $sub)) (elem $e (ref null $sub)) ;; CHECK: (func $array-init-elem (type $1) - ;; CHECK-NEXT: (array.init_elem $array_1 $e - ;; CHECK-NEXT: (array.new_fixed $array_1 0) + ;; CHECK-NEXT: (array.init_elem $array $e + ;; CHECK-NEXT: (array.new_fixed $array 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) @@ -1775,68 +1677,57 @@ (module (rec + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct (field (ref null $mid))))) (type $super (sub (struct (ref null $mid)))) + ;; CHECK: (type $mid (sub $super (struct (field (ref null $mid)) (field i32)))) (type $mid (sub $super (struct (ref null $mid) i32))) + ;; CHECK: (type $sub (sub $mid (struct (field (ref null $sub)) (field i32) (field i32)))) (type $sub (sub $mid (struct (ref null $sub) i32 i32))) ) ;; Same as above, but now that transitively requires $sub <: $mid, so we don't ;; end up changing anything. - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_0_0 (sub (struct (field (ref null $mid_0_0))))) - - ;; CHECK: (type $mid_0_0 (sub $super_0_0 (struct (field (ref null $mid_0_0)) (field i32)))) - - ;; CHECK: (type $sub_0_0 (sub $mid_0_0 (struct (field (ref null $sub_0_0)) (field i32) (field i32)))) - - ;; CHECK: (global $g (ref $super_0_0) (struct.new_default $sub_0_0)) + ;; CHECK: (global $g (ref $super) (struct.new_default $sub)) (global $g (ref $super) (struct.new_default $sub)) ) (module (rec + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct (field (ref null $super))))) (type $super (sub (struct (ref null $super)))) + ;; CHECK: (type $mid (sub $super (struct (field (ref null $super)) (field i32)))) (type $mid (sub $super (struct (ref null $super) i32))) + ;; CHECK: (type $sub (sub $mid (struct (field (ref null $sub)) (field i32) (field i32)))) (type $sub (sub $mid (struct (ref null $sub) i32 i32))) ) ;; Similar, but now we directly require that $sub <: $mid and transitively ;; require that $sub <: $super, so again we cannot change anything. - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_0_0 (sub (struct (field (ref null $super_0_0))))) - - ;; CHECK: (type $mid_0_0 (sub $super_0_0 (struct (field (ref null $super_0_0)) (field i32)))) - - ;; CHECK: (type $sub_0_0 (sub $mid_0_0 (struct (field (ref null $sub_0_0)) (field i32) (field i32)))) - - ;; CHECK: (global $g (ref $mid_0_0) (struct.new_default $sub_0_0)) + ;; CHECK: (global $g (ref $mid) (struct.new_default $sub)) (global $g (ref $mid) (struct.new_default $sub)) ) (module (rec + ;; CHECK: (rec + ;; CHECK-NEXT: (type $X (sub (struct ))) (type $X (sub (struct))) + ;; CHECK: (type $Y (sub $X (struct ))) (type $Y (sub $X (struct))) + ;; CHECK: (type $super (sub (struct (field (ref null $mid))))) (type $super (sub (struct (ref null $mid)))) + ;; CHECK: (type $mid (sub $super (struct (field (ref null $sub)) (field (ref null $X))))) (type $mid (sub $super (struct (ref null $sub) (ref null $X)))) + ;; CHECK: (type $sub (sub $mid (struct (field (ref null $sub)) (field (ref null $Y))))) (type $sub (sub $mid (struct (ref null $sub) (ref null $Y)))) ) ;; Require $sub <: $super, which transitively requires $sub <: $mid, which then ;; requires $Y <: $X. This only works because we put $sub back in the work list ;; when we find a more refined supertype for it. - ;; CHECK: (rec - ;; CHECK-NEXT: (type $X_0_0 (sub (struct ))) - - ;; CHECK: (type $Y_0_0 (sub $X_0_0 (struct ))) - - ;; CHECK: (type $super_0_0 (sub (struct (field (ref null $mid_0_0))))) - - ;; CHECK: (type $mid_0_0 (sub $super_0_0 (struct (field (ref null $sub_0_0)) (field (ref null $X_0_0))))) - - ;; CHECK: (type $sub_0_0 (sub $mid_0_0 (struct (field (ref null $sub_0_0)) (field (ref null $Y_0_0))))) - - ;; CHECK: (global $g (ref $super_0_0) (struct.new_default $sub_0_0)) + ;; CHECK: (global $g (ref $super) (struct.new_default $sub)) (global $g (ref $super) (struct.new_default $sub)) ) From 04fc8eee5494b79a66928d778000c537bb3d27d4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 30 May 2024 11:00:40 -0700 Subject: [PATCH 7/8] simpl --- src/ir/type-updating.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ir/type-updating.cpp b/src/ir/type-updating.cpp index f97806374da..f3f085c3ea1 100644 --- a/src/ir/type-updating.cpp +++ b/src/ir/type-updating.cpp @@ -151,8 +151,9 @@ GlobalTypeRewriter::TypeMap GlobalTypeRewriter::rebuildTypes( bool changed = false; TypeMap oldToNewTypes; for (auto [type, index] : typeIndices) { - oldToNewTypes[type] = newTypes[index]; - if (newTypes[index] != type) { + auto newType = newTypes[index]; + oldToNewTypes[type] = newType; + if (newType != type) { changed = true; } } From 9c128d383740e0ba33ac265c8801cc2a9c3d64f3 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 30 May 2024 12:45:49 -0700 Subject: [PATCH 8/8] fix --- src/ir/type-updating.cpp | 19 +++++++------------ test/lit/passes/unsubtyping.wast | 16 +++++++--------- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/src/ir/type-updating.cpp b/src/ir/type-updating.cpp index f3f085c3ea1..520408d449f 100644 --- a/src/ir/type-updating.cpp +++ b/src/ir/type-updating.cpp @@ -147,20 +147,10 @@ GlobalTypeRewriter::TypeMap GlobalTypeRewriter::rebuildTypes( #endif auto& newTypes = *buildResults; - // Map the old types to the new ones, and check if anything changed. - bool changed = false; + // Map the old types to the new ones. TypeMap oldToNewTypes; for (auto [type, index] : typeIndices) { - auto newType = newTypes[index]; - oldToNewTypes[type] = newType; - if (newType != type) { - changed = true; - } - } - - // If no types changed then we do not need to fix up type names. - if (!changed) { - return oldToNewTypes; + oldToNewTypes[type] = newTypes[index]; } // Update type names to avoid duplicates. @@ -169,6 +159,11 @@ GlobalTypeRewriter::TypeMap GlobalTypeRewriter::rebuildTypes( typeNames.insert(info.name); } for (auto& [old, new_] : oldToNewTypes) { + if (old == new_) { + // The type is being mapped to itself; no need to rename anything. + continue; + } + if (auto it = wasm.typeNames.find(old); it != wasm.typeNames.end()) { wasm.typeNames[new_] = wasm.typeNames[old]; // Use the existing name in the new type, as usually it completely diff --git a/test/lit/passes/unsubtyping.wast b/test/lit/passes/unsubtyping.wast index 277916d73ba..368f935b9fc 100644 --- a/test/lit/passes/unsubtyping.wast +++ b/test/lit/passes/unsubtyping.wast @@ -891,26 +891,24 @@ ) (module + ;; CHECK: (rec + ;; CHECK-NEXT: (type $super (sub (struct ))) (type $super (sub (struct))) + ;; CHECK: (type $sub (sub $super (struct ))) (type $sub (sub $super (struct))) - ;; CHECK: (rec - ;; CHECK-NEXT: (type $super_1 (sub (struct ))) - - ;; CHECK: (type $sub_1 (sub $super_1 (struct ))) - ;; CHECK: (type $2 (func)) - ;; CHECK: (type $3 (func (param (ref $super_1)))) + ;; CHECK: (type $3 (func (param (ref $super)))) - ;; CHECK: (type $4 (func (param (ref $super_1)))) + ;; CHECK: (type $4 (func (param (ref $super)))) - ;; CHECK: (tag $t (param (ref $super_1))) + ;; CHECK: (tag $t (param (ref $super))) (tag $t (param (ref $super))) ;; CHECK: (func $throw (type $2) ;; CHECK-NEXT: (throw $t - ;; CHECK-NEXT: (struct.new_default $sub_1) + ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $throw