Skip to content

Commit 40e17d9

Browse files
committed
[metadata prespecialization] Direct refs to enums.
When a specialized usage of a generic enum occurs in the same module where the enum was defined, directly reference the prespecialized metadata. rdar://problem/56994321
1 parent 949029a commit 40e17d9

File tree

35 files changed

+5698
-25
lines changed

35 files changed

+5698
-25
lines changed

lib/IRGen/MetadataRequest.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -684,11 +684,6 @@ bool irgen::isNominalGenericContextTypeMetadataAccessTrivial(
684684
return false;
685685
}
686686

687-
if (isa<EnumType>(type) || isa<BoundGenericEnumType>(type)) {
688-
// TODO: Support enums.
689-
return false;
690-
}
691-
692687
if (isa<ClassType>(type) || isa<BoundGenericClassType>(type)) {
693688
// TODO: Support classes.
694689
return false;

test/IRGen/enum.sil

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// #if directives don't work with SIL keywords, therefore please put ObjC tests
22
// in `enum_objc.sil`.
3-
// RUN: %target-swift-frontend %s -gnone -emit-ir -disable-diagnostic-passes -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-objc-%target-ptrsize-simulator-%target-is-simulator -DWORD=i%target-ptrsize
4-
// RUN: %target-swift-frontend %s -gnone -emit-ir -disable-diagnostic-passes -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize -DWORD=i%target-ptrsize
3+
// RUN: %target-swift-frontend %s -disable-generic-metadata-prespecialization -disable-generic-metadata-prespecialization -gnone -emit-ir -disable-diagnostic-passes -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-objc-%target-ptrsize-simulator-%target-is-simulator -DWORD=i%target-ptrsize
4+
// RUN: %target-swift-frontend %s -disable-generic-metadata-prespecialization -gnone -emit-ir -disable-diagnostic-passes -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize -DWORD=i%target-ptrsize
55

66
// REQUIRES: CPU=i386 || CPU=x86_64
77

test/IRGen/enum_future.sil

Lines changed: 2767 additions & 0 deletions
Large diffs are not rendered by default.

test/IRGen/enum_value_semantics.sil

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
// RUN: %target-swift-frontend %s -gnone -emit-ir -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-simulator-%target-is-simulator --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-objc-%target-os
2-
// RUN: %target-swift-frontend %s -gnone -emit-ir -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-native-%target-os
1+
// RUN: %target-swift-frontend %s -disable-generic-metadata-prespecialization -gnone -emit-ir -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-simulator-%target-is-simulator --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-objc-%target-os
2+
// RUN: %target-swift-frontend %s -disable-generic-metadata-prespecialization -gnone -emit-ir -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-native-%target-os
33

44
// REQUIRES: CPU=x86_64
55

test/IRGen/enum_value_semantics_future.sil

Lines changed: 666 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
public protocol P {
2+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
@frozen
2+
public struct Integer {
3+
public let value: Int
4+
5+
public init(_ value: Int) {
6+
self.value = value
7+
}
8+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
public struct Integer {
2+
public let value: Int
3+
4+
public init(_ value: Int) {
5+
self.value = value
6+
}
7+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
2+
3+
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
4+
// UNSUPPORTED: CPU=i386 && OS=ios
5+
// UNSUPPORTED: CPU=armv7 && OS=ios
6+
// UNSUPPORTED: CPU=armv7s && OS=ios
7+
8+
// CHECK: @"$s4main5Value[[UNIQUE_ID_1:[0-9A-Z_]+]]OySiGMf" = internal constant <{
9+
// CHECK-SAME: i8**,
10+
// CHECK-SAME: [[INT]],
11+
// CHECK-SAME: %swift.type_descriptor*,
12+
// CHECK-SAME: %swift.type*,
13+
// CHECK-SAME: i64
14+
// CHECK-SAME: }> <{
15+
// i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s4main5Value[[UNIQUE_ID_1]]OySiGWV", i32 0, i32 0),
16+
// CHECK-SAME: [[INT]] 513,
17+
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main5Value[[UNIQUE_ID_1]]OMn" to %swift.type_descriptor*),
18+
// CHECK-SAME: %swift.type* @"$sSiN",
19+
// CHECK-SAME: i64 3
20+
// CHECK-SAME: }>, align [[ALIGNMENT]]
21+
22+
fileprivate enum Value<First> {
23+
case first(First)
24+
}
25+
26+
@inline(never)
27+
func consume<T>(_ t: T) {
28+
withExtendedLifetime(t) { t in
29+
}
30+
}
31+
32+
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
33+
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
34+
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
35+
// CHECK-SAME: %swift.type* getelementptr inbounds (
36+
// CHECK-SAME: %swift.full_type,
37+
// CHECK-SAME: %swift.full_type* bitcast (
38+
// CHECK-SAME: <{
39+
// CHECK-SAME: i8**,
40+
// CHECK-SAME: [[INT]],
41+
// CHECK-SAME: %swift.type_descriptor*,
42+
// CHECK-SAME: %swift.type*,
43+
// CHECK-SAME: i64
44+
// CHECK-SAME: }>* @"$s4main5Value[[UNIQUE_ID_1]]OySiGMf"
45+
// CHECK-SAME: to %swift.full_type*
46+
// CHECK-SAME: ),
47+
// CHECK-SAME: i32 0,
48+
// CHECK-SAME: i32 1
49+
// CHECK-SAME: )
50+
// CHECK-SAME: )
51+
// CHECK: }
52+
func doit() {
53+
consume( Value.first(13) )
54+
}
55+
doit()
56+
57+
// CHECK: ; Function Attrs: noinline nounwind readnone
58+
// CHECK: define internal swiftcc %swift.metadata_response @"$s4main5Value[[UNIQUE_ID_1]]OMa"([[INT]] %0, %swift.type* %1) #{{[0-9]+}} {
59+
// CHECK: entry:
60+
// CHECK: [[ERASED_TYPE:%[0-9]+]] = bitcast %swift.type* %1 to i8*
61+
// CHECK: br label %[[TYPE_COMPARISON_LABEL:[0-9]+]]
62+
// CHECK: [[TYPE_COMPARISON_LABEL]]:
63+
// CHECK: [[EQUAL_TYPE:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE]]
64+
// CHECK: [[EQUAL_TYPES:%[0-9]+]] = and i1 true, [[EQUAL_TYPE]]
65+
// CHECK: br i1 [[EQUAL_TYPES]], label %[[EXIT_PRESPECIALIZED:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
66+
// CHECK: [[EXIT_PRESPECIALIZED]]:
67+
// CHECK: ret %swift.metadata_response {
68+
// CHECK-SAME: %swift.type* getelementptr inbounds (
69+
// CHECK-SAME: %swift.full_type,
70+
// CHECK-SAME: %swift.full_type* bitcast (
71+
// CHECK-SAME: <{
72+
// CHECK-SAME: i8**,
73+
// CHECK-SAME: [[INT]],
74+
// CHECK-SAME: %swift.type_descriptor*,
75+
// CHECK-SAME: %swift.type*,
76+
// CHECK-SAME: i64
77+
// CHECK-SAME: }>* @"$s4main5Value[[UNIQUE_ID_1]]OySiGMf"
78+
// CHECK-SAME: to %swift.full_type*
79+
// CHECK-SAME: ),
80+
// CHECK-SAME: i32 0,
81+
// CHECK-SAME: i32 1
82+
// CHECK-SAME: ),
83+
// CHECK-SAME: [[INT]] 0
84+
// CHECK-SAME: }
85+
// CHECK: [[EXIT_NORMAL]]:
86+
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata([[INT]] %0, i8* [[ERASED_TYPE]], i8* undef, i8* undef, %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main5Value[[UNIQUE_ID_1]]OMn" to %swift.type_descriptor*)) #{{[0-9]+}}
87+
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
88+
// CHECK: }
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
2+
3+
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
4+
// UNSUPPORTED: CPU=i386 && OS=ios
5+
// UNSUPPORTED: CPU=armv7 && OS=ios
6+
// UNSUPPORTED: CPU=armv7s && OS=ios
7+
8+
// CHECK: @"$s4main9NamespaceC5ValueOySi_GMf" = internal constant <{
9+
// CHECk-SAME: i8**,
10+
// CHECK-SAME: [[INT]],
11+
// CHECK-SAME: %swift.type_descriptor*,
12+
// CHECK-SAME: %swift.type*,
13+
// CHECK-SAME: }> <{
14+
// i8** getelementptr inbounds (
15+
// %swift.enum_vwtable,
16+
// %swift.enum_vwtable* @"$s4main9NamespaceC5ValueOySi_GWV",
17+
// i32 0,
18+
// i32 0
19+
// ),
20+
// CHECK-SAME: [[INT]] 513,
21+
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main9NamespaceC5ValueOMn" to %swift.type_descriptor*),
22+
// CHECK-SAME: %swift.type* @"$sSiN",
23+
// CHECK-SAME: i64 3
24+
// CHECK-SAME: }>, align [[ALIGNMENT]]
25+
26+
27+
final class Namespace<First> {
28+
enum Value {
29+
case first(First)
30+
}
31+
}
32+
33+
@inline(never)
34+
func consume<T>(_ t: T) {
35+
withExtendedLifetime(t) { t in
36+
}
37+
}
38+
39+
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
40+
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
41+
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
42+
// CHECK-SAME: %swift.type* getelementptr inbounds (
43+
// CHECK-SAME: %swift.full_type,
44+
// CHECK-SAME: %swift.full_type* bitcast (
45+
// CHECK-SAME: <{
46+
// CHECK-SAME: i8**,
47+
// CHECK-SAME: [[INT]],
48+
// CHECK-SAME: %swift.type_descriptor*,
49+
// CHECK-SAME: %swift.type*,
50+
// CHECK-SAME: i64
51+
// CHECK-SAME: }>* @"$s4main9NamespaceC5ValueOySi_GMf"
52+
// CHECK-SAME: to %swift.full_type*
53+
// CHECK-SAME: ),
54+
// CHECK-SAME: i32 0,
55+
// CHECK-SAME: i32 1
56+
// CHECK-SAME: )
57+
// CHECK-SAME: )
58+
// CHECK: }
59+
func doit() {
60+
consume( Namespace.Value.first(13) )
61+
}
62+
doit()
63+
64+
// CHECK: ; Function Attrs: noinline nounwind readnone
65+
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main9NamespaceC5ValueOMa"([[INT]] %0, %swift.type* %1) #{{[0-9]+}} {
66+
// CHECK: entry:
67+
// CHECK: [[ERASED_TYPE_1:%[0-9]+]] = bitcast %swift.type* %1 to i8*
68+
// CHECK: br label %[[TYPE_COMPARISON_1:[0-9]+]]
69+
// CHECK: [[TYPE_COMPARISON_1]]:
70+
// CHECK: [[EQUAL_TYPE_1_1:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_1]]
71+
// CHECK: [[EQUAL_TYPES_1_1:%[0-9]+]] = and i1 true, [[EQUAL_TYPE_1_1]]
72+
// CHECK: br i1 [[EQUAL_TYPES_1_1]], label %[[EXIT_PRESPECIALIZED_1:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
73+
// CHECK: [[EXIT_PRESPECIALIZED_1]]:
74+
// CHECK: ret %swift.metadata_response {
75+
// CHECK-SAME: %swift.type* getelementptr inbounds (
76+
// CHECK-SAME: %swift.full_type,
77+
// CHECK-SAME: %swift.full_type* bitcast (
78+
// CHECK-SAME: <{
79+
// CHECK-SAME: i8**,
80+
// CHECK-SAME: [[INT]],
81+
// CHECK-SAME: %swift.type_descriptor*,
82+
// CHECK-SAME: %swift.type*,
83+
// CHECK-SAME: i64
84+
// CHECK-SAME: }>* @"$s4main9NamespaceC5ValueOySi_GMf"
85+
// CHECK-SAME: to %swift.full_type*
86+
// CHECK-SAME: ),
87+
// CHECK-SAME: i32 0,
88+
// CHECK-SAME: i32 1
89+
// CHECK-SAME: ),
90+
// CHECK-SAME: [[INT]] 0
91+
// CHECK-SAME: }
92+
// CHECK: [[EXIT_NORMAL]]:
93+
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata([[INT]] %0, i8* [[ERASED_TYPE_1]], i8* undef, i8* undef, %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main9NamespaceC5ValueOMn" to %swift.type_descriptor*)) #{{[0-9]+}}
94+
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
95+
// CHECK: }
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
2+
3+
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
4+
// UNSUPPORTED: CPU=i386 && OS=ios
5+
// UNSUPPORTED: CPU=armv7 && OS=ios
6+
// UNSUPPORTED: CPU=armv7s && OS=ios
7+
8+
enum Value<First> {
9+
case first(First)
10+
}
11+
12+
@inline(never)
13+
func consume<T>(_ t: T) {
14+
withExtendedLifetime(t) { t in
15+
}
16+
}
17+
18+
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
19+
// CHECK: }
20+
func doit() {
21+
}
22+
doit()
23+
24+
// CHECK: ; Function Attrs: noinline nounwind readnone
25+
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main5ValueOMa"([[INT]] %0, %swift.type* %1) #{{[0-9]+}} {
26+
// CHECK: entry:
27+
// CHECK: [[ERASED_TYPE:%[0-9]+]] = bitcast %swift.type* %1 to i8*
28+
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata(
29+
// CHECK-SAME: [[INT]] %0,
30+
// CHECK-SAME: i8* [[ERASED_TYPE]],
31+
// CHECK-SAME: i8* undef,
32+
// CHECK-SAME: i8* undef,
33+
// CHECK-SAME: %swift.type_descriptor* bitcast (
34+
// CHECK-SAME: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>*
35+
// CHECK-SAME: @"$s4main5ValueOMn"
36+
// CHECK-SAME: to %swift.type_descriptor*
37+
// CHECK-SAME: )
38+
// CHECK-SAME: ) #{{[0-9]+}}
39+
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
40+
// CHECK: }
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
2+
3+
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
4+
// UNSUPPORTED: CPU=i386 && OS=ios
5+
// UNSUPPORTED: CPU=armv7 && OS=ios
6+
// UNSUPPORTED: CPU=armv7s && OS=ios
7+
8+
// CHECK: @"$sytN" = external{{( dllimport)?}} global %swift.full_type
9+
10+
// CHECK: @"$s4main5ValueOySiGMf" = internal constant <{
11+
// CHECK-SAME: i8**,
12+
// CHECK-SAME: [[INT]],
13+
// CHECK-SAME: %swift.type_descriptor*,
14+
// CHECK-SAME: %swift.type*,
15+
// CHECK-SAME: i8**,
16+
// CHECK-SAME: i64
17+
// CHECK-SAME: }> <{
18+
// CHECK-SAME: i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s4main5ValueOySiGWV", i32 0, i32 0),
19+
// CHECK-SAME: [[INT]] 513,
20+
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8, i32, i32, i32 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*),
21+
// CHECK-SAME: %swift.type* @"$sSiN",
22+
// CHECK-SAME: i8** getelementptr inbounds ([1 x i8*], [1 x i8*]* @"$sSi4main1PAAWP", i32 0, i32 0),
23+
// CHECK-SAME: i64 3
24+
// CHECK-SAME: }>, align [[ALIGNMENT]]
25+
26+
protocol P {}
27+
extension Int : P {}
28+
enum Value<First : P> {
29+
case first(First)
30+
}
31+
32+
@inline(never)
33+
func consume<T>(_ t: T) {
34+
withExtendedLifetime(t) { t in
35+
}
36+
}
37+
38+
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
39+
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
40+
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
41+
// CHECK-SAME: %swift.type* getelementptr inbounds (
42+
// CHECK-SAME: %swift.full_type,
43+
// CHECK-SAME: %swift.full_type* bitcast (
44+
// CHECK-SAME: <{
45+
// CHECK-SAME: i8**,
46+
// CHECK-SAME: [[INT]],
47+
// CHECK-SAME: %swift.type_descriptor*,
48+
// CHECK-SAME: %swift.type*,
49+
// CHECK-SAME: i8**,
50+
// CHECK-SAME: i64
51+
// CHECK-SAME: }>* @"$s4main5ValueOySiGMf"
52+
// CHECK-SAME: to %swift.full_type*
53+
// CHECK-SAME: ),
54+
// CHECK-SAME: i32 0,
55+
// CHECK-SAME: i32 1
56+
// CHECK-SAME: )
57+
// CHECK-SAME: )
58+
// CHECK: }
59+
func doit() {
60+
consume( Value.first(13) )
61+
}
62+
doit()
63+
64+
// CHECK: ; Function Attrs: noinline nounwind readnone
65+
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main5ValueOMa"([[INT]] %0, %swift.type* %1, i8** %2) #{{[0-9]+}} {
66+
// CHECK: entry:
67+
// CHECK: [[ERASED_TYPE:%[0-9]+]] = bitcast %swift.type* %1 to i8*
68+
// CHECK: [[ERASED_TABLE:%[0-9]+]] = bitcast i8** %2 to i8*
69+
// CHECK: br label %[[TYPE_COMPARISON_LABEL:[0-9]+]]
70+
// CHECK: [[TYPE_COMPARISON_LABEL]]:
71+
// CHECK: [[EQUAL_TYPE:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE]]
72+
// CHECK: [[EQUAL_TYPES:%[0-9]+]] = and i1 true, [[EQUAL_TYPE]]
73+
// CHECK: br i1 [[EQUAL_TYPES]], label %[[EXIT_PRESPECIALIZED:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
74+
// CHECK: [[EXIT_PRESPECIALIZED]]:
75+
// CHECK: ret %swift.metadata_response {
76+
// CHECK-SAME: %swift.type* getelementptr inbounds (
77+
// CHECK-SAME: %swift.full_type,
78+
// CHECK-SAME: %swift.full_type* bitcast (
79+
// CHECK-SAME: <{
80+
// CHECK-SAME: i8**,
81+
// CHECK-SAME: [[INT]],
82+
// CHECK-SAME: %swift.type_descriptor*,
83+
// CHECK-SAME: %swift.type*,
84+
// CHECK-SAME: i8**,
85+
// CHECK-SAME: i64
86+
// CHECK-SAME: }>* @"$s4main5ValueOySiGMf"
87+
// CHECK-SAME: to %swift.full_type*
88+
// CHECK-SAME: ),
89+
// CHECK-SAME: i32 0,
90+
// CHECK-SAME: i32 1
91+
// CHECK-SAME: ),
92+
// CHECK-SAME: [[INT]] 0
93+
// CHECK-SAME: }
94+
// CHECK: [[EXIT_NORMAL]]:
95+
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata([[INT]] %0, i8* [[ERASED_TYPE]], i8* [[ERASED_TABLE]], i8* undef, %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8, i32, i32, i32 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*))
96+
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
97+
// CHECK: }

0 commit comments

Comments
 (0)