summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Lively <7121787+tlively@users.noreply.github.com>2021-11-17 11:38:35 -0800
committerGitHub <noreply@github.com>2021-11-17 11:38:35 -0800
commit03dca9aa1a5a266c53a474aeb3c10a3f0584b25b (patch)
treeb405e1b957281c91173f3714859a8ac76405db11
parent87fce24735f7fb1815fc6d0fa7fda8a33bcaeefd (diff)
downloadbinaryen-03dca9aa1a5a266c53a474aeb3c10a3f0584b25b.tar.gz
binaryen-03dca9aa1a5a266c53a474aeb3c10a3f0584b25b.tar.bz2
binaryen-03dca9aa1a5a266c53a474aeb3c10a3f0584b25b.zip
Small cleanups in type fuzzer (#4337)
- Do not require defaultable types in function returns - Increase likelihood of `none` function return types - Correctly generate subtypes of basic types - Actually check output in tests - Print to cout instead of cerr
-rw-r--r--src/tools/fuzzing/heap-types.cpp30
-rw-r--r--src/tools/wasm-fuzz-types.cpp4
-rw-r--r--test/lit/fuzz-types/nominal.test26
-rw-r--r--test/lit/fuzz-types/structural.test64
4 files changed, 48 insertions, 76 deletions
diff --git a/src/tools/fuzzing/heap-types.cpp b/src/tools/fuzzing/heap-types.cpp
index 71f701860..1878f5473 100644
--- a/src/tools/fuzzing/heap-types.cpp
+++ b/src/tools/fuzzing/heap-types.cpp
@@ -81,10 +81,9 @@ struct HeapTypeGenerator {
}
}
- // TODO: Create an enum for `Defaultable, NonDefaultable` in wasm-type.h.
- Type generateRefType(bool defaultable = false) {
+ Type generateRefType() {
auto heapType = generateHeapType();
- auto nullability = (defaultable || rand.oneIn(2)) ? Nullable : NonNullable;
+ auto nullability = rand.oneIn(2) ? Nullable : NonNullable;
return builder.getTempRefType(heapType, nullability);
}
@@ -94,12 +93,12 @@ struct HeapTypeGenerator {
return builder.getTempRttType(Rtt(depth, heapType));
}
- Type generateSingleType(bool defaultable = false) {
- switch (rand.upTo(defaultable ? 2 : 3)) {
+ Type generateSingleType() {
+ switch (rand.upTo(3)) {
case 0:
return generateBasicType();
case 1:
- return generateRefType(defaultable);
+ return generateRefType();
case 2:
return generateRttType();
}
@@ -109,21 +108,18 @@ struct HeapTypeGenerator {
Type generateTupleType() {
std::vector<Type> types(2 + rand.upTo(MAX_TUPLE_SIZE - 1));
for (auto& type : types) {
- // Make sure tuples are defaultable. See comment in
- // TranslateToFuzzReader::getTupleType.
- type = generateSingleType(/*defaultable=*/true);
+ type = generateSingleType();
}
return builder.getTempTupleType(Tuple(types));
}
Type generateReturnType() {
- // This is similar to TranslateToFuzzreader::getControlFlowType.
- if (rand.oneIn(10)) {
+ if (rand.oneIn(6)) {
return Type::none;
} else if (features.hasMultivalue() && rand.oneIn(5)) {
return generateTupleType();
} else {
- return generateSingleType(/*defaultable=*/true);
+ return generateSingleType();
}
}
@@ -313,17 +309,15 @@ struct HeapTypeGenerator {
}
Type generateSubtype(Type type) {
- if (type.isBasic()) {
- // We do not construct types with basic reference types (we go through the
- // TypeBuilder for those instead), so this must be a non-reference basic
- // type, which means it has no other subtypes.
- return type;
- } else if (type.isRef()) {
+ if (type.isRef()) {
auto ref = generateSubRef({type.getHeapType(), type.getNullability()});
return builder.getTempRefType(ref.type, ref.nullability);
} else if (type.isRtt()) {
auto rtt = generateSubRtt(type.getRtt());
return builder.getTempRttType(rtt);
+ } else if (type.isBasic()) {
+ // Non-reference basic types do not have subtypes.
+ return type;
} else {
WASM_UNREACHABLE("unexpected type kind");
}
diff --git a/src/tools/wasm-fuzz-types.cpp b/src/tools/wasm-fuzz-types.cpp
index 5df0c50ba..564bfa212 100644
--- a/src/tools/wasm-fuzz-types.cpp
+++ b/src/tools/wasm-fuzz-types.cpp
@@ -54,9 +54,9 @@ struct Fuzzer {
// TODO: Do some sort of checking or manipulation on the types
if (verbose) {
- std::cerr << "Built " << types.size() << " types:\n";
+ std::cout << "Built " << types.size() << " types:\n";
for (size_t i = 0; i < types.size(); ++i) {
- std::cerr << i << ": " << types[i] << "\n";
+ std::cout << i << ": " << types[i] << "\n";
}
}
}
diff --git a/test/lit/fuzz-types/nominal.test b/test/lit/fuzz-types/nominal.test
index 14dd80ac6..92bfaa4e1 100644
--- a/test/lit/fuzz-types/nominal.test
+++ b/test/lit/fuzz-types/nominal.test
@@ -1,24 +1,24 @@
-;; RUN: wasm-fuzz-types --nominal -v --seed=0
+;; RUN: wasm-fuzz-types --nominal -v --seed=0 | filecheck %s
;; CHECK: Running with seed 0
;; CHECK-NEXT: Built 20 types:
;; CHECK-NEXT: 0: (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32)))
;; CHECK-NEXT: 1: (array (mut (ref null data)))
-;; CHECK-NEXT: 2: (func (result (ref null (func (result ...1 i32 (ref null (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32))))))) i32 (ref null (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32))))))
-;; CHECK-NEXT: 3: (func (result (ref null (func (result ...1 i32 (ref null (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32))))))) i32 (ref null (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32))))))
+;; CHECK-NEXT: 2: (func (result i64))
+;; CHECK-NEXT: 3: (func (result i64))
;; CHECK-NEXT: 4: (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32)))
-;; CHECK-NEXT: 5: (func (result (ref null (func (result ...1 i32 (ref null (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32))))))) i32 (ref null (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32))))))
-;; CHECK-NEXT: 6: (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32) (rtt (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32)))) (mut (ref null i31)) (mut dataref)))
+;; CHECK-NEXT: 5: (func (result i64))
+;; CHECK-NEXT: 6: (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32)))
;; CHECK-NEXT: 7: (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32)))
-;; CHECK-NEXT: 8: (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32)))
-;; CHECK-NEXT: 9: (func (result (ref null ...1) i32 (ref null (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32))))))
-;; CHECK-NEXT: 10: (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32)))
+;; CHECK-NEXT: 8: (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32) (mut (rtt eq)) (rtt (func (result i64))) (mut (rtt (func (result i64)))) (mut i16)))
+;; CHECK-NEXT: 9: (func (result i64))
+;; CHECK-NEXT: 10: (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32) (mut (rtt eq)) (rtt (func (result i64))) (mut (rtt (func (result i64)))) (mut i16)))
;; CHECK-NEXT: 11: (array (mut (ref null data)))
;; CHECK-NEXT: 12: (struct (field (ref ...1) (mut f32)))
-;; CHECK-NEXT: 13: (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32) (rtt (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32)))) (mut (ref null i31)) (mut dataref)))
-;; CHECK-NEXT: 14: (func (result (ref null (func (result ...1 i32 (ref null (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32))))))) i32 (ref null (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32))))))
-;; CHECK-NEXT: 15: (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32)))
-;; CHECK-NEXT: 16: (func (result (ref null (func (result ...1 i32 (ref null (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32))))))) i32 (ref null (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32))))))
+;; CHECK-NEXT: 13: (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32) (rtt 2 (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32)))) (mut (rtt 1 eq)) (mut i31ref)))
+;; CHECK-NEXT: 14: (func (result i64))
+;; CHECK-NEXT: 15: (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32) (mut (rtt eq)) (rtt (func (result i64))) (mut (rtt (func (result i64)))) (mut i16)))
+;; CHECK-NEXT: 16: (func (result i64))
;; CHECK-NEXT: 17: (array (mut (ref null data)))
;; CHECK-NEXT: 18: (array (mut (ref null data)))
-;; CHECK-NEXT: 19: (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32)))
+;; CHECK-NEXT: 19: (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32) f64 eqref (mut (rtt 2 (struct (field (ref (struct (field ...1 (mut f32)))) (mut f32) (mut (rtt eq)) (rtt (func (result i64))) (mut (rtt (func (result i64)))) (mut i16)))))))
diff --git a/test/lit/fuzz-types/structural.test b/test/lit/fuzz-types/structural.test
index efb605740..ec3968466 100644
--- a/test/lit/fuzz-types/structural.test
+++ b/test/lit/fuzz-types/structural.test
@@ -1,47 +1,25 @@
-;; RUN: wasm-fuzz-types --structural -v --seed=0
+;; RUN: wasm-fuzz-types --structural -v --seed=0 | filecheck %s
-;; CHECK: Running with seed 0
-;; CHECK-NEXT: Built 20 types:
-;; CHECK-NEXT: 0: (struct (field anyref (mut f32)))
-;; CHECK-NEXT: 1: (func (result i64))
-;; CHECK-NEXT: 2: (struct (field (rtt 0 ...1) (ref (func (result i64))) (mut (ref null (struct (field anyref (mut f32))))) (mut i8) i64 (mut (ref null (struct (field anyref (mut f32) (mut (rtt 2 eq))))))))
-;; CHECK-NEXT: 3: (struct (field (rtt 0 ...1) (ref (func (result i64))) (mut (ref null (struct (field anyref (mut f32))))) (mut i8) i64 (mut (ref null (struct (field anyref (mut f32) (mut (rtt 2 eq))))))))
-;; CHECK-NEXT: 4: (struct (field (rtt 0 ...1) (ref (func (result i64))) (mut (ref null (struct (field anyref (mut f32))))) (mut i8) i64 (mut (ref null (struct (field anyref (mut f32) (mut (rtt 2 eq))))))))
-;; CHECK-NEXT: 5: (struct (field (rtt 0 ...1) (ref (func (result i64))) (mut (ref null (struct (field anyref (mut f32))))) (mut i8) i64 (mut (ref null (struct (field anyref (mut f32) (mut (rtt 2 eq))))))))
-;; CHECK-NEXT: 6: (struct (field (rtt 0 ...1) (ref (func (result i64))) (mut (ref null (struct (field anyref (mut f32))))) (mut i8) i64 (mut (ref null (struct (field anyref (mut f32) (mut (rtt 2 eq))))))))
-;; CHECK-NEXT: 7: (struct (field anyref (mut f32)))
-;; CHECK-NEXT: 8: (struct (field anyref (mut f32) f64 i8 v128 (mut i8)))
-;; CHECK-NEXT: 9: (struct (field (rtt 0 ...1) (ref (func (result i64))) (mut (ref null (struct (field anyref (mut f32))))) (mut i8) i64 (mut (ref null (struct (field anyref (mut f32) (mut (rtt 2 eq))))))))
-;; CHECK-NEXT: 10: (struct (field anyref (mut f32) (ref null (struct (field anyref (mut f32) (mut (rtt 2 eq))))) (ref (struct (field (rtt 0 ...1) (ref (func (result i64))) (mut (ref null (struct (field anyref (mut f32))))) (mut i8) i64 (mut (ref null (struct (field anyref (mut f32) (mut (rtt 2 eq))))))))) (rtt 1 (struct (field anyref (mut f32) (ref null (struct (field anyref (mut f32) (mut (rtt 2 eq)) i16))) (ref (struct (field (rtt 0 ...1) (ref (func (result i64))) (mut (ref null (struct (field anyref (mut f32))))) (mut i8) i64 (mut (ref null (struct (field anyref (mut f32) (mut (rtt 2 eq))))))))) ...1)))))
-;; CHECK-NEXT: 11: (struct (field (rtt 0 ...1) (ref (func (result i64))) (mut (ref null (struct (field anyref (mut f32))))) (mut i8) i64 (mut (ref null (struct (field anyref (mut f32) (mut (rtt 2 eq))))))))
-;; CHECK-NEXT: 12: (struct (field anyref (mut f32) (mut (rtt 2 eq))))
-;; CHECK-NEXT: 13: (struct (field (rtt 0 ...1) (ref (func (result i64))) (mut (ref null (struct (field anyref (mut f32))))) (mut i8) i64 (mut (ref null (struct (field anyref (mut f32) (mut (rtt 2 eq))))))))
-;; CHECK-NEXT: 14: (struct (field anyref (mut f32) (ref null (struct (field anyref (mut f32) (mut (rtt 2 eq)) i16))) (ref (struct (field (rtt 0 ...1) (ref (func (result i64))) (mut (ref null (struct (field anyref (mut f32))))) (mut i8) i64 (mut (ref null (struct (field anyref (mut f32) (mut (rtt 2 eq))))))))) (rtt 1 ...1)))
-;; CHECK-NEXT: 15: (func (result i64))
-;; CHECK-NEXT: 16: (struct (field (rtt 0 ...1) (ref (func (result i64))) (mut (ref null (struct (field anyref (mut f32))))) (mut i8) i64 (mut (ref null (struct (field anyref (mut f32) (mut (rtt 2 eq))))))))
-;; CHECK-NEXT: 17: (struct (field anyref (mut f32) (ref null (struct (field anyref (mut f32) (mut (rtt 2 eq)) i16))) (ref (struct (field (rtt 0 ...1) (ref (func (result i64))) (mut (ref null (struct (field anyref (mut f32))))) (mut i8) i64 (mut (ref null (struct (field anyref (mut f32) (mut (rtt 2 eq))))))))) (rtt 1 ...1)))
-;; CHECK-NEXT: 18: (struct (field anyref (mut f32) (mut (rtt 2 eq)) i16))
-;; CHECK-NEXT: 19: (func (result i64))
;; CHECK: Running with seed 0
;; CHECK-NEXT: Built 20 types:
-;; CHECK-NEXT: 0: (struct (field (ref null (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...3) (ref (struct (field (mut (ref func)) (mut ...3)))) (mut (ref (func (param (rtt 0 ...7))))) (mut (rtt 2 (struct (field (mut (ref func)) (mut ...3))))) (rtt 2 ...3))))) i64 (mut (rtt (func (param (rtt 0 ...5))))) (rtt 1 (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...5) (ref ...3) (mut (ref (func (param (rtt 0 ...9))))) (mut (rtt 2 ...3)) (rtt 2 ...5)))))))) (mut (ref ...3))))) (ref (struct (field (mut (ref func)) (mut (ref (struct (field (ref (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 ...9))))) (rtt 1 ...5) (mut (ref ...7))))) ...3 (mut (ref (func (param (rtt 0 ...7))))) (mut (rtt 2 ...3)) (rtt 2 (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 ...9))))) (rtt 1 ...5) (mut (ref ...7))))))))))))))
-;; CHECK-NEXT: 1: (func (param (rtt 0 (struct (field (ref null (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...3) (ref (struct (field (mut (ref func)) (mut ...3)))) (mut (ref ...7)) (mut (rtt 2 (struct (field (mut (ref func)) (mut ...3))))) (rtt 2 ...3))))) i64 (mut (rtt ...5)) (rtt 1 (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...5) (ref ...3) (mut (ref ...9)) (mut (rtt 2 ...3)) (rtt 2 ...5)))))))) (mut (ref ...3))))) (ref (struct (field (mut (ref func)) (mut (ref (struct (field (ref (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt ...9)) (rtt 1 ...5) (mut (ref ...7))))) ...3 (mut (ref ...7)) (mut (rtt 2 ...3)) (rtt 2 (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt ...9)) (rtt 1 ...5) (mut (ref ...7)))))))))))))))))
-;; CHECK-NEXT: 2: (struct (field (mut (ref func)) (mut (ref (struct (field (ref (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref ...9)))))))) (rtt 1 ...5) (mut (ref (struct (field (ref null ...3) (ref ...7)))))))) (ref ...3) (mut (ref (func (param (rtt 0 (struct (field (ref null (struct (field (mut (ref func)) (mut ...7) i64 (mut (rtt ...5)) (rtt 1 ...9) (mut (ref ...3))))) (ref ...7)))))))) (mut (rtt 2 ...3)) (rtt 2 (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref ...9)))))))) (rtt 1 ...5) (mut (ref (struct (field (ref null ...3) (ref ...7))))))))))))))
-;; CHECK-NEXT: 3: (struct (field (mut (ref func)) (mut (ref (struct (field (ref (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref ...9)))))))) (rtt 1 ...5) (mut (ref (struct (field (ref null ...3) (ref ...7)))))))) (ref ...3) (mut (ref (func (param (rtt 0 (struct (field (ref null (struct (field (mut (ref func)) (mut ...7) i64 (mut (rtt ...5)) (rtt 1 ...9) (mut (ref ...3))))) (ref ...7)))))))) (mut (rtt 2 ...3)) (rtt 2 (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref ...9)))))))) (rtt 1 ...5) (mut (ref (struct (field (ref null ...3) (ref ...7))))))))))))))
-;; CHECK-NEXT: 4: (struct (field (mut (ref func)) (mut (ref (struct (field (ref (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref ...9)))))))) (rtt 1 ...5) (mut (ref (struct (field (ref null ...3) (ref ...7)))))))) (ref ...3) (mut (ref (func (param (rtt 0 (struct (field (ref null (struct (field (mut (ref func)) (mut ...7) i64 (mut (rtt ...5)) (rtt 1 ...9) (mut (ref ...3))))) (ref ...7)))))))) (mut (rtt 2 ...3)) (rtt 2 (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref ...9)))))))) (rtt 1 ...5) (mut (ref (struct (field (ref null ...3) (ref ...7))))))))))))))
-;; CHECK-NEXT: 5: (struct (field (mut (ref func)) (mut (ref (struct (field (ref (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref ...9)))))))) (rtt 1 ...5) (mut (ref (struct (field (ref null ...3) (ref ...7)))))))) (ref ...3) (mut (ref (func (param (rtt 0 (struct (field (ref null (struct (field (mut (ref func)) (mut ...7) i64 (mut (rtt ...5)) (rtt 1 ...9) (mut (ref ...3))))) (ref ...7)))))))) (mut (rtt 2 ...3)) (rtt 2 (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref ...9)))))))) (rtt 1 ...5) (mut (ref (struct (field (ref null ...3) (ref ...7))))))))))))))
-;; CHECK-NEXT: 6: (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...3) (ref (struct (field (mut (ref func)) (mut ...3)))) (mut (ref (func (param (rtt 0 (struct (field (ref null ...7) (ref (struct (field (mut (ref func)) (mut ...7))))))))))) (mut (rtt 2 (struct (field (mut (ref func)) (mut ...3))))) (rtt 2 ...3))))) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...9) ...3 (mut (ref ...7)) (mut (rtt 2 ...3)) (rtt 2 ...9))))))))))))))) (rtt 1 (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...5) (ref ...3) (mut (ref (func (param (rtt 0 (struct (field (ref null ...9) (ref ...7)))))))) (mut (rtt 2 ...3)) (rtt 2 ...5)))))))) (mut (ref (struct (field (ref null ...3) (ref (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...7) ...3 (mut (ref (func (param (rtt 0 ...7))))) (mut (rtt 2 ...3)) (rtt 2 ...7))))))))))))))
-;; CHECK-NEXT: 7: (struct (field (ref null (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...3) (ref (struct (field (mut (ref func)) (mut ...3)))) (mut (ref (func (param (rtt 0 ...7))))) (mut (rtt 2 (struct (field (mut (ref func)) (mut ...3))))) (rtt 2 ...3))))) i64 (mut (rtt (func (param (rtt 0 ...5))))) (rtt 1 (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...5) (ref ...3) (mut (ref (func (param (rtt 0 ...9))))) (mut (rtt 2 ...3)) (rtt 2 ...5)))))))) (mut (ref ...3))))) (ref (struct (field (mut (ref func)) (mut (ref (struct (field (ref (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 ...9))))) (rtt 1 ...5) (mut (ref ...7))))) ...3 (mut (ref (func (param (rtt 0 ...7))))) (mut (rtt 2 ...3)) (rtt 2 (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 ...9))))) (rtt 1 ...5) (mut (ref ...7))))))))))))))
-;; CHECK-NEXT: 8: (struct (field (ref null (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...3) (ref (struct (field (mut (ref func)) (mut ...3)))) (mut (ref (func (param (rtt 0 ...7))))) (mut (rtt 2 (struct (field (mut (ref func)) (mut ...3))))) (rtt 2 ...3))))) i64 (mut (rtt (func (param (rtt 0 ...5))))) (rtt 1 (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...5) (ref ...3) (mut (ref (func (param (rtt 0 ...9))))) (mut (rtt 2 ...3)) (rtt 2 ...5)))))))) (mut (ref ...3))))) (ref (struct (field (mut (ref func)) (mut (ref (struct (field (ref (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 ...9))))) (rtt 1 ...5) (mut (ref ...7))))) ...3 (mut (ref (func (param (rtt 0 ...7))))) (mut (rtt 2 ...3)) (rtt 2 (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 ...9))))) (rtt 1 ...5) (mut (ref ...7))))))))))))))
-;; CHECK-NEXT: 9: (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...3) (ref (struct (field (mut (ref func)) (mut ...3)))) (mut (ref (func (param (rtt 0 (struct (field (ref null ...7) (ref (struct (field (mut (ref func)) (mut ...7))))))))))) (mut (rtt 2 (struct (field (mut (ref func)) (mut ...3))))) (rtt 2 ...3))))) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...9) ...3 (mut (ref ...7)) (mut (rtt 2 ...3)) (rtt 2 ...9))))))))))))))) (rtt 1 (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...5) (ref ...3) (mut (ref (func (param (rtt 0 (struct (field (ref null ...9) (ref ...7)))))))) (mut (rtt 2 ...3)) (rtt 2 ...5)))))))) (mut (ref (struct (field (ref null ...3) (ref (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...7) ...3 (mut (ref (func (param (rtt 0 ...7))))) (mut (rtt 2 ...3)) (rtt 2 ...7))))))))))))))
-;; CHECK-NEXT: 10: (struct (field (ref (struct (field (mut (ref func)) (mut (ref ...3)) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref (struct (field (mut (ref func)) (mut (ref ...9)))))))))))) (rtt 1 (struct (field (mut (ref func)) (mut (ref ...5))))) (mut (ref (struct (field (ref null ...3) (ref (struct (field (mut (ref func)) (mut (ref ...7)))))))))))) (ref (struct (field (mut (ref func)) (mut (ref ...3))))) (mut (ref (func (param (rtt 0 (struct (field (ref null (struct (field (mut (ref func)) (mut (ref ...7)) i64 (mut (rtt ...5)) (rtt 1 (struct (field (mut (ref func)) (mut (ref ...9))))) (mut (ref ...3))))) (ref (struct (field (mut (ref func)) (mut (ref ...7)))))))))))) (mut (rtt 2 (struct (field (mut (ref func)) (mut (ref ...3)))))) (rtt 2 (struct (field (mut (ref func)) (mut (ref ...3)) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref (struct (field (mut (ref func)) (mut (ref ...9)))))))))))) (rtt 1 (struct (field (mut (ref func)) (mut (ref ...5))))) (mut (ref (struct (field (ref null ...3) (ref (struct (field (mut (ref func)) (mut (ref ...7))))))))))))))
-;; CHECK-NEXT: 11: (struct (field (mut (ref func)) (mut (ref (struct (field (ref (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref ...9)))))))) (rtt 1 ...5) (mut (ref (struct (field (ref null ...3) (ref ...7)))))))) (ref ...3) (mut (ref (func (param (rtt 0 (struct (field (ref null (struct (field (mut (ref func)) (mut ...7) i64 (mut (rtt ...5)) (rtt 1 ...9) (mut (ref ...3))))) (ref ...7)))))))) (mut (rtt 2 ...3)) (rtt 2 (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref ...9)))))))) (rtt 1 ...5) (mut (ref (struct (field (ref null ...3) (ref ...7))))))))))))))
-;; CHECK-NEXT: 12: (struct (field (ref null (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...3) (ref (struct (field (mut (ref func)) (mut ...3)))) (mut (ref (func (param (rtt 0 ...7))))) (mut (rtt 2 (struct (field (mut (ref func)) (mut ...3))))) (rtt 2 ...3))))) i64 (mut (rtt (func (param (rtt 0 ...5))))) (rtt 1 (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...5) (ref ...3) (mut (ref (func (param (rtt 0 ...9))))) (mut (rtt 2 ...3)) (rtt 2 ...5)))))))) (mut (ref ...3))))) (ref (struct (field (mut (ref func)) (mut (ref (struct (field (ref (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 ...9))))) (rtt 1 ...5) (mut (ref ...7))))) ...3 (mut (ref (func (param (rtt 0 ...7))))) (mut (rtt 2 ...3)) (rtt 2 (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 ...9))))) (rtt 1 ...5) (mut (ref ...7))))))))))))))
-;; CHECK-NEXT: 13: (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...3) (ref (struct (field (mut (ref func)) (mut ...3)))) (mut (ref (func (param (rtt 0 (struct (field (ref null ...7) (ref (struct (field (mut (ref func)) (mut ...7))))))))))) (mut (rtt 2 (struct (field (mut (ref func)) (mut ...3))))) (rtt 2 ...3))))) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...9) ...3 (mut (ref ...7)) (mut (rtt 2 ...3)) (rtt 2 ...9))))))))))))))) (rtt 1 (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...5) (ref ...3) (mut (ref (func (param (rtt 0 (struct (field (ref null ...9) (ref ...7)))))))) (mut (rtt 2 ...3)) (rtt 2 ...5)))))))) (mut (ref (struct (field (ref null ...3) (ref (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...7) ...3 (mut (ref (func (param (rtt 0 ...7))))) (mut (rtt 2 ...3)) (rtt 2 ...7))))))))))))))
-;; CHECK-NEXT: 14: (struct (field (ref (struct (field (mut (ref func)) (mut (ref ...3)) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref (struct (field (mut (ref func)) (mut (ref ...9)))))))))))) (rtt 1 (struct (field (mut (ref func)) (mut (ref ...5))))) (mut (ref (struct (field (ref null ...3) (ref (struct (field (mut (ref func)) (mut (ref ...7)))))))))))) (ref (struct (field (mut (ref func)) (mut (ref ...3))))) (mut (ref (func (param (rtt 0 (struct (field (ref null (struct (field (mut (ref func)) (mut (ref ...7)) i64 (mut (rtt ...5)) (rtt 1 (struct (field (mut (ref func)) (mut (ref ...9))))) (mut (ref ...3))))) (ref (struct (field (mut (ref func)) (mut (ref ...7)))))))))))) (mut (rtt 2 (struct (field (mut (ref func)) (mut (ref ...3)))))) (rtt 2 (struct (field (mut (ref func)) (mut (ref ...3)) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref (struct (field (mut (ref func)) (mut (ref ...9)))))))))))) (rtt 1 (struct (field (mut (ref func)) (mut (ref ...5))))) (mut (ref (struct (field (ref null ...3) (ref (struct (field (mut (ref func)) (mut (ref ...7))))))))))))))
-;; CHECK-NEXT: 15: (func (param (rtt 0 (struct (field (ref null (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...3) (ref (struct (field (mut (ref func)) (mut ...3)))) (mut (ref ...7)) (mut (rtt 2 (struct (field (mut (ref func)) (mut ...3))))) (rtt 2 ...3))))) i64 (mut (rtt ...5)) (rtt 1 (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...5) (ref ...3) (mut (ref ...9)) (mut (rtt 2 ...3)) (rtt 2 ...5)))))))) (mut (ref ...3))))) (ref (struct (field (mut (ref func)) (mut (ref (struct (field (ref (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt ...9)) (rtt 1 ...5) (mut (ref ...7))))) ...3 (mut (ref ...7)) (mut (rtt 2 ...3)) (rtt 2 (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt ...9)) (rtt 1 ...5) (mut (ref ...7)))))))))))))))))
-;; CHECK-NEXT: 16: (struct (field (mut (ref func)) (mut (ref (struct (field (ref (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref (struct (field (mut (ref func)) (mut ...9))))))))))) (rtt 1 (struct (field (mut (ref func)) (mut ...5)))) (mut (ref (struct (field (ref null ...3) (ref (struct (field (mut (ref func)) (mut ...7))))))))))) (ref (struct (field (mut (ref func)) (mut ...3)))) (mut (ref (func (param (rtt 0 (struct (field (ref null (struct (field (mut (ref func)) (mut ...7) i64 (mut (rtt ...5)) (rtt 1 (struct (field (mut (ref func)) (mut ...9)))) (mut (ref ...3))))) (ref (struct (field (mut (ref func)) (mut ...7))))))))))) (mut (rtt 2 (struct (field (mut (ref func)) (mut ...3))))) (rtt 2 (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref (struct (field (mut (ref func)) (mut ...9))))))))))) (rtt 1 (struct (field (mut (ref func)) (mut ...5)))) (mut (ref (struct (field (ref null ...3) (ref (struct (field (mut (ref func)) (mut ...7))))))))))))))) (mut (ref (struct (field (mut (ref func)) (mut (ref (struct (field ...3 (ref (struct (field (mut (ref func)) (mut ...3)))) (mut (ref (func (param (rtt 0 (struct (field (ref null ...7) ..!))))))) (mut ..!) ..!)))) i64 (mut ..!) ..! (mut ..!)))))))
-;; CHECK-NEXT: 17: (struct (field (ref (struct (field (mut (ref func)) (mut (ref (struct (field ...3 (ref (struct (field (mut (ref func)) (mut ...3)))) (mut (ref (func (param (rtt 0 (struct (field (ref null ...7) (ref (struct (field (mut (ref func)) (mut ...7))))))))))) (mut (rtt 2 (struct (field (mut (ref func)) (mut ...3))))) (rtt 2 ...3))))) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref (struct (field (mut (ref func)) (mut (ref (struct (field ...9 ...3 (mut (ref ...7)) (mut (rtt 2 ...3)) (rtt 2 ...9))))))))))))))) (rtt 1 (struct (field (mut (ref func)) (mut (ref (struct (field ...5 (ref ...3) (mut (ref (func (param (rtt 0 (struct (field (ref null ...9) (ref ...7)))))))) (mut (rtt 2 ...3)) (rtt 2 ...5)))))))) (mut (ref (struct (field (ref null ...3) (ref (struct (field (mut (ref func)) (mut (ref (struct (field ...7 ...3 (mut (ref (func (param (rtt 0 ...7))))) (mut (rtt 2 ...3)) (rtt 2 ...7))))))))))))))) (ref (struct (field (mut (ref func)) (mut (ref (struct (field (ref (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) ..!))))))) ..! (mut ..!)))) ..! (mut ..!) (mut ..!) ..!))))))) (mut ..!) (mut ..!) ..! ..!))
-;; CHECK-NEXT: 18: (struct (field (ref null (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...3) (ref (struct (field (mut (ref func)) (mut ...3)))) (mut (ref (func (param (rtt 0 ...7))))) (mut (rtt 2 (struct (field (mut (ref func)) (mut ...3))))) (rtt 2 ...3))))) i64 (mut (rtt (func (param (rtt 0 ...5))))) (rtt 1 (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...5) (ref ...3) (mut (ref (func (param (rtt 0 ...9))))) (mut (rtt 2 ...3)) (rtt 2 ...5)))))))) (mut (ref ...3))))) (ref (struct (field (mut (ref func)) (mut (ref (struct (field (ref (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 ...9))))) (rtt 1 ...5) (mut (ref ...7))))) ...3 (mut (ref (func (param (rtt 0 ...7))))) (mut (rtt 2 ...3)) (rtt 2 (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt (func (param (rtt 0 ...9))))) (rtt 1 ...5) (mut (ref ...7))))))))))))))
-;; CHECK-NEXT: 19: (func (param (rtt 0 (struct (field (ref null (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...3) (ref (struct (field (mut (ref func)) (mut ...3)))) (mut (ref ...7)) (mut (rtt 2 (struct (field (mut (ref func)) (mut ...3))))) (rtt 2 ...3))))) i64 (mut (rtt ...5)) (rtt 1 (struct (field (mut (ref func)) (mut (ref (struct (field (ref ...5) (ref ...3) (mut (ref ...9)) (mut (rtt 2 ...3)) (rtt 2 ...5)))))))) (mut (ref ...3))))) (ref (struct (field (mut (ref func)) (mut (ref (struct (field (ref (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt ...9)) (rtt 1 ...5) (mut (ref ...7))))) ...3 (mut (ref ...7)) (mut (rtt 2 ...3)) (rtt 2 (struct (field (mut (ref func)) (mut ...3) i64 (mut (rtt ...9)) (rtt 1 ...5) (mut (ref ...7)))))))))))))))))
+;; CHECK-NEXT: 0: (struct (field (ref null (struct (field (mut (rtt (func (param (rtt 0 ...5))))) (ref (struct (field (mut (rtt (func (param (rtt 0 ...7))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 ...7))))) (ref ...1))))) (mut f64)))) (ref (struct (field (mut (rtt (func (param (rtt 0 ...5))))) (ref (struct (field (mut (rtt (func (param (rtt 0 ...7))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 ...7))))) (ref ...1))))) (mut f64) (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 ...7))))) (ref ...1))))))))))
+;; CHECK-NEXT: 1: (func (param (rtt 0 (struct (field (ref null (struct (field (mut (rtt ...5)) (ref (struct (field (mut (rtt ...7)) ...1))) i32 (mut (ref null (struct (field (mut (rtt ...7)) (ref ...1))))) (mut f64)))) (ref (struct (field (mut (rtt ...5)) (ref (struct (field (mut (rtt ...7)) ...1))) i32 (mut (ref null (struct (field (mut (rtt ...7)) (ref ...1))))) (mut f64) (mut (ref null (struct (field (mut (rtt ...7)) (ref ...1)))))))))))))
+;; CHECK-NEXT: 2: (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null (struct (field (mut ...5) (ref ...7) i32 (mut (ref null ...7)) (mut f64)))) (ref (struct (field (mut ...5) (ref ...7) i32 (mut (ref null ...7)) (mut f64) (mut (ref null ...7)))))))))))) (ref ...1)))
+;; CHECK-NEXT: 3: (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref (struct (field (mut ...5) (ref (struct (field (mut ...7) ...1))) i32 (mut (ref null (struct (field (mut ...7) (ref ...1))))) (mut f64) (mut (ref null (struct (field (mut ...7) (ref ...1))))))))))))))) (ref (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...7) (ref (struct (field (mut ...5) ...7 i32 (mut (ref null ...7)) (mut f64) (mut (ref null ...7)))))))))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...7) (ref (struct (field (mut ...5) (ref ...7) i32 (mut ...7) (mut f64) (mut ...7))))))))))) (ref ...1))))) (mut f64)))
+;; CHECK-NEXT: 4: (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null (struct (field (mut ...5) (ref ...7) i32 (mut (ref null ...7)) (mut f64)))) (ref (struct (field (mut ...5) (ref ...7) i32 (mut (ref null ...7)) (mut f64) (mut (ref null ...7)))))))))))) (ref ...1)))
+;; CHECK-NEXT: 5: (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null (struct (field (mut ...5) (ref (struct (field (mut ...7) ...1))) i32 (mut (ref null (struct (field (mut ...7) (ref ...1))))) (mut f64)))) (ref ...5)))))))) (ref (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null (struct (field (mut ...5) ...7 i32 (mut (ref null ...7)) (mut f64)))) (ref ...7)))))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null (struct (field (mut ...5) (ref ...7) i32 (mut ...7) (mut f64)))) (ref ...7)))))))) (ref ...1))))) (mut f64) (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null (struct (field (mut ...5) (ref ...7) i32 (mut ...7) (mut f64)))) (ref ...7)))))))) (ref ...1)))))))
+;; CHECK-NEXT: 6: (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref (struct (field (mut ...5) (ref (struct (field (mut ...7) ...1))) i32 (mut (ref null (struct (field (mut ...7) (ref ...1))))) (mut f64) (mut (ref null (struct (field (mut ...7) (ref ...1))))))))))))))) (ref (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...7) (ref (struct (field (mut ...5) ...7 i32 (mut (ref null ...7)) (mut f64) (mut (ref null ...7)))))))))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...7) (ref (struct (field (mut ...5) (ref ...7) i32 (mut ...7) (mut f64) (mut ...7))))))))))) (ref ...1))))) (mut f64)))
+;; CHECK-NEXT: 7: (struct (field (ref null (struct (field (mut (rtt (func (param (rtt 0 ...5))))) (ref (struct (field (mut (rtt (func (param (rtt 0 ...7))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 ...7))))) (ref ...1))))) (mut f64)))) (ref (struct (field (mut (rtt (func (param (rtt 0 ...5))))) (ref (struct (field (mut (rtt (func (param (rtt 0 ...7))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 ...7))))) (ref ...1))))) (mut f64) (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 ...7))))) (ref ...1))))))))))
+;; CHECK-NEXT: 8: (struct (field (ref null (struct (field (mut (rtt (func (param (rtt 0 ...5))))) (ref (struct (field (mut (rtt (func (param (rtt 0 ...7))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 ...7))))) (ref ...1))))) (mut f64)))) (ref (struct (field (mut (rtt (func (param (rtt 0 ...5))))) (ref (struct (field (mut (rtt (func (param (rtt 0 ...7))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 ...7))))) (ref ...1))))) (mut f64) (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 ...7))))) (ref ...1))))))))))
+;; CHECK-NEXT: 9: (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref (struct (field (mut ...5) (ref (struct (field (mut ...7) ...1))) i32 (mut (ref null (struct (field (mut ...7) (ref ...1))))) (mut f64) (mut (ref null (struct (field (mut ...7) (ref ...1))))))))))))))) (ref (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...7) (ref (struct (field (mut ...5) ...7 i32 (mut (ref null ...7)) (mut f64) (mut (ref null ...7)))))))))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...7) (ref (struct (field (mut ...5) (ref ...7) i32 (mut ...7) (mut f64) (mut ...7))))))))))) (ref ...1))))) (mut f64)))
+;; CHECK-NEXT: 10: (struct (field (ref (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref (struct (field (mut ...5) (ref (struct (field (mut ...7) ...1))) i32 (mut (ref null (struct (field (mut ...7) (ref ...1))))) (mut f64) (mut (ref null (struct (field (mut ...7) (ref ...1))))))))))))))) (ref (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...7) (ref (struct (field (mut ...5) ...7 i32 (mut (ref null ...7)) (mut f64) (mut (ref null ...7)))))))))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...7) (ref (struct (field (mut ...5) (ref ...7) i32 (mut ...7) (mut f64) (mut ...7))))))))))) (ref ...1))))) (mut f64)))) (ref (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null (struct (field (mut ...5) (ref (struct (field (mut ...7) ...1))) i32 (mut (ref null (struct (field (mut ...7) (ref ...1))))) (mut f64)))) ...5))))))) (ref (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null (struct (field (mut ...5) ...7 i32 (mut (ref null ...7)) (mut f64)))) ...7))))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ..!) ..!))))))) ..!)))) (mut f64) (mut ..!)))) (mut i31ref)))
+;; CHECK-NEXT: 11: (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null (struct (field (mut ...5) (ref ...7) i32 (mut (ref null ...7)) (mut f64)))) (ref (struct (field (mut ...5) (ref ...7) i32 (mut (ref null ...7)) (mut f64) (mut (ref null ...7)))))))))))) (ref ...1)))
+;; CHECK-NEXT: 12: (struct (field (ref null (struct (field (mut (rtt (func (param (rtt 0 ...5))))) (ref (struct (field (mut (rtt (func (param (rtt 0 ...7))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 ...7))))) (ref ...1))))) (mut f64)))) (ref (struct (field (mut (rtt (func (param (rtt 0 ...5))))) (ref (struct (field (mut (rtt (func (param (rtt 0 ...7))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 ...7))))) (ref ...1))))) (mut f64) (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 ...7))))) (ref ...1))))))))))
+;; CHECK-NEXT: 13: (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null (struct (field (mut ...5) (ref (struct (field (mut ...7) ...1))) i32 (mut (ref null (struct (field (mut ...7) (ref ...1))))) (mut f64)))) (ref (struct (field (mut ...5) (ref (struct (field (mut ...7) ...1))) i32 (mut (ref null (struct (field (mut ...7) (ref ...1))))) (mut f64) (mut (ref null (struct (field (mut ...7) (ref ...1))))))))))))))) (ref (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null (struct (field (mut ...5) ...7 i32 (mut (ref null ...7)) (mut f64)))) (ref (struct (field (mut ...5) ...7 i32 (mut (ref null ...7)) (mut f64) (mut (ref null ...7)))))))))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null (struct (field (mut ...5) (ref ...7) i32 (mut ...7) (mut f64)))) (ref (struct (field (mut ...5) (ref ...7) i32 (mut ...7) (mut f64) (mut ...7))))))))))) (ref ...1))))) (mut f64) (ref null i31)))
+;; CHECK-NEXT: 14: (struct (field (ref (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref (struct (field (mut ...5) (ref (struct (field (mut ...7) ...1))) i32 (mut (ref null (struct (field (mut ...7) (ref ...1))))) (mut f64) (mut (ref null (struct (field (mut ...7) (ref ...1))))))))))))))) (ref (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...7) (ref (struct (field (mut ...5) ...7 i32 (mut (ref null ...7)) (mut f64) (mut (ref null ...7)))))))))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...7) (ref (struct (field (mut ...5) (ref ...7) i32 (mut ...7) (mut f64) (mut ...7))))))))))) (ref ...1))))) (mut f64)))) (ref (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null (struct (field (mut ...5) (ref (struct (field (mut ...7) ...1))) i32 (mut (ref null (struct (field (mut ...7) (ref ...1))))) (mut f64)))) ...5))))))) (ref (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null (struct (field (mut ...5) ...7 i32 (mut (ref null ...7)) (mut f64)))) ...7))))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ..!) ..!))))))) ..!)))) (mut f64) (mut ..!)))) (mut i31ref) i8))
+;; CHECK-NEXT: 15: (func (param (rtt 0 (struct (field (ref null (struct (field (mut (rtt ...5)) (ref (struct (field (mut (rtt ...7)) ...1))) i32 (mut (ref null (struct (field (mut (rtt ...7)) (ref ...1))))) (mut f64)))) (ref (struct (field (mut (rtt ...5)) (ref (struct (field (mut (rtt ...7)) ...1))) i32 (mut (ref null (struct (field (mut (rtt ...7)) (ref ...1))))) (mut f64) (mut (ref null (struct (field (mut (rtt ...7)) (ref ...1)))))))))))))
+;; CHECK-NEXT: 16: (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null (struct (field (mut ...5) (ref ...7) i32 (mut (ref null ...7)) (mut f64)))) (ref (struct (field (mut ...5) (ref ...7) i32 (mut (ref null ...7)) (mut f64) (mut (ref null ...7)))))))))))) (ref ...1)))
+;; CHECK-NEXT: 17: (struct (field (ref (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...5) (ref (struct (field (mut ...5) (ref (struct (field (mut ...7) ...1))) i32 (mut (ref null (struct (field (mut ...7) (ref ...1))))) (mut f64) (mut (ref null (struct (field (mut ...7) (ref ...1))))))))))))))) (ref (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...7) (ref (struct (field (mut ...5) ...7 i32 (mut (ref null ...7)) (mut f64) (mut (ref null ...7)))))))))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ...7) (ref (struct (field (mut ...5) (ref ...7) i32 (mut ...7) (mut f64) (mut ...7))))))))))) (ref ...1))))) (mut f64)))) (ref (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null (struct (field (mut ...5) (ref (struct (field (mut ...7) ...1))) i32 (mut (ref null (struct (field (mut ...7) (ref ...1))))) (mut f64)))) ...5))))))) (ref (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null (struct (field (mut ...5) ...7 i32 (mut (ref null ...7)) (mut f64)))) ...7))))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 (struct (field (ref null ..!) ..!))))))) ..!)))) (mut f64) (mut ..!)))) (mut i31ref) i8 (mut dataref) (mut i16)))
+;; CHECK-NEXT: 18: (struct (field (ref null (struct (field (mut (rtt (func (param (rtt 0 ...5))))) (ref (struct (field (mut (rtt (func (param (rtt 0 ...7))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 ...7))))) (ref ...1))))) (mut f64)))) (ref (struct (field (mut (rtt (func (param (rtt 0 ...5))))) (ref (struct (field (mut (rtt (func (param (rtt 0 ...7))))) ...1))) i32 (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 ...7))))) (ref ...1))))) (mut f64) (mut (ref null (struct (field (mut (rtt (func (param (rtt 0 ...7))))) (ref ...1))))))))))
+;; CHECK-NEXT: 19: (func (param (rtt 0 (struct (field (ref null (struct (field (mut (rtt ...5)) (ref (struct (field (mut (rtt ...7)) ...1))) i32 (mut (ref null (struct (field (mut (rtt ...7)) (ref ...1))))) (mut f64)))) (ref (struct (field (mut (rtt ...5)) (ref (struct (field (mut (rtt ...7)) ...1))) i32 (mut (ref null (struct (field (mut (rtt ...7)) (ref ...1))))) (mut f64) (mut (ref null (struct (field (mut (rtt ...7)) (ref ...1)))))))))))))