Skip to content

Commit 343193f

Browse files
committed
Fix test cases and enable copy-on-write existentials
1 parent 17e8ce4 commit 343193f

19 files changed

+149
-121
lines changed

CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ option(SWIFT_STDLIB_ENABLE_RESILIENCE
272272

273273
option(SWIFT_RUNTIME_ENABLE_COW_EXISTENTIALS
274274
"Build the runtime with a copy-on-write implementation for opaque existentials"
275-
FALSE)
275+
TRUE)
276276

277277
option(SWIFT_STDLIB_USE_NONATOMIC_RC
278278
"Build the standard libraries and overlays with nonatomic reference count operations enabled"

test/IRGen/alloc.sil

+6-5
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,16 @@ struct Huge {
2020
}
2121

2222
// CHECK: @_swift_slowAlloc = external global i8* ([[SIZE_T:i(32|64)]],
23-
// CHECK: define linkonce_odr hidden i8* @swift_rt_swift_slowAlloc([[SIZE_T:i(32|64)]],
2423

2524
// CHECK: define linkonce_odr hidden void @_T04main4HugeVwde(
2625
// CHECK: [[T0:%.*]] = bitcast [[BUFFER:.[0-9]+ x i8.]]* {{%.*}} to i8**
2726
// CHECK-NEXT: [[T1:%.*]] = load i8*, i8** [[T0]]
2827
// CHECK-NEXT: call void @swift_rt_swift_slowDealloc(i8* [[T1]], [[SIZE_T]] 4097, [[SIZE_T]] 7)
2928
// CHECK-NEXT: ret void
3029

31-
// CHECK: define linkonce_odr hidden [[OPAQUE:%swift.opaque]]* @_T04main4HugeVwal(
32-
// CHECK: [[T0:%.*]] = call noalias i8* @swift_rt_swift_slowAlloc([[SIZE_T]] 4097, [[SIZE_T]] 7)
33-
// CHECK-NEXT: [[T1:%.*]] = bitcast [[BUFFER]]* {{%.*}} to i8**
34-
// CHECK-NEXT: store i8* [[T0]], i8** [[T1]]
30+
31+
// CHECK: define linkonce_odr hidden [[OPAQUE:%swift.opaque]]* @_T04main4HugeVwal({{.*}}* [[BUFFER:%.*]], %swift.type
32+
// CHECK: [[BOXPAIR:%.*]] = call { %swift.refcounted*, %swift.opaque* } @swift_allocBox({{.*}} @_T04main4HugeVMf
33+
// CHECK: [[REF:%.*]] = extractvalue { %swift.refcounted*, %swift.opaque* } %0, 0
34+
// CHECK: [[BUFFER_ADDR:%.*]] = bitcast {{.*}}* [[BUFFER]] to %swift.refcounted**
35+
// CHECK: store %swift.refcounted* [[REF]], %swift.refcounted** [[BUFFER_ADDR]]

test/IRGen/existentials_objc.sil

+10-9
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ bb0(%0 : $*Any, %1 : $T):
2323
// CHECK: [[T0:%.*]] = getelementptr inbounds [[ANY]], [[ANY]]* %0, i32 0, i32 1
2424
// CHECK-NEXT: store [[TYPE]]* %T, [[TYPE]]** [[T0]], align 8
2525
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[ANY]], [[ANY]]* %0, i32 0, i32 0
26+
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[ANY]], [[ANY]]* %0, i32 0, i32 0
2627
// CHECK-NEXT: [[T1:%.*]] = bitcast [24 x i8]* [[T0]] to [[GIZMO]]**
2728
// CHECK-NEXT: store [[GIZMO]]* %1, [[GIZMO]]** [[T1]], align 8
2829
// CHECK-NEXT: ret void
@@ -39,15 +40,15 @@ bb0(%0 : $*Any, %1 : $*Any):
3940
// CHECK-NEXT: [[TYPE:%.*]] = load %swift.type*, %swift.type** [[T0]], align 8
4041
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[ANY]], [[ANY]]* [[DEST:%0]], i32 0, i32 1
4142
// CHECK-NEXT: store %swift.type* [[TYPE]], %swift.type** [[T0]], align 8
42-
// CHECK-NEXT: [[SRC_BUF:%.*]] = getelementptr inbounds [[ANY]], [[ANY]]* [[SRC]], i32 0, i32 0
43-
// CHECK-NEXT: [[DEST_BUF:%.*]] = getelementptr inbounds [[ANY]], [[ANY]]* [[DEST]], i32 0, i32 0
44-
// CHECK-NEXT: [[T0:%.*]] = bitcast %swift.type* [[TYPE]] to i8***
45-
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8**, i8*** [[T0]], i64 -1
46-
// CHECK-NEXT: [[VWTABLE:%.*]] = load i8**, i8*** [[T1]], align 8
47-
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i8*, i8** [[VWTABLE]], i32 12
48-
// CHECK-NEXT: [[T1:%.*]] = load i8*, i8** [[T0]], align 8
49-
// CHECK-NEXT: [[INIT:%.*]] = bitcast i8* [[T1]] to %swift.opaque* ([24 x i8]*, [24 x i8]*, %swift.type*)*
50-
// CHECK-NEXT: call %swift.opaque* [[INIT]]([24 x i8]* noalias [[DEST_BUF]], [24 x i8]* [[SRC_BUF]], %swift.type* [[TYPE]])
43+
// CHECK-NEXT: [[FROM_BUFFER_ADDR:%.*]] = getelementptr inbounds %Any, %Any* %1, i32 0, i32 0
44+
// CHECK-NEXT: [[TO_BUFFER_ADDR:%.*]] = getelementptr inbounds %Any, %Any* %0, i32 0, i32 0
45+
// CHECK-NEXT: [[CAST:%.*]] = bitcast %swift.type* [[TYPE]] to i8***
46+
// CHECK-NEXT: [[VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[CAST]], i64 -1
47+
// CHECK-NEXT: [[VWT:%.*]] = load i8**, i8*** [[VWT_ADDR]]
48+
// CHECK-NEXT: [[VW_ADDR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32 12
49+
// CHECK-NEXT: [[VW:%.*]] = load i8*, i8** [[VW_ADDR]]
50+
// CHECK-NEXT: [[INITWITHTAKEBUFFER:%.*]] = bitcast i8* [[VW]]
51+
// CHECK-NEXT: call %swift.opaque* [[INITWITHTAKEBUFFER]]({{.*}} [[TO_BUFFER_ADDR]], {{.*}} [[FROM_BUFFER_ADDR]], %swift.type* [[TYPE]])
5152
// CHECK-NEXT: ret void
5253

5354
// rdar://problem/19035529

test/IRGen/fixed_size_buffer_peepholes.sil

+4-20
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,17 @@ import Builtin
44

55
protocol P {}
66

7-
// CHECK-LABEL: define{{( protected)?}} swiftcc void @join_init_existential_copy_addr(%T27fixed_size_buffer_peepholes1PP* noalias nocapture sret, %swift.opaque* noalias nocapture, %swift.type* %T, i8** %T.P)
8-
// CHECK: [[BUFFER:%.*]] = getelementptr inbounds %T27fixed_size_buffer_peepholes1PP, %T27fixed_size_buffer_peepholes1PP* %0, i32 0, i32 0
9-
// CHECK: call %swift.opaque* %initializeBufferWithTake([[BUFFER_TYPE:\[.* x i8\]]]* [[BUFFER]], %swift.opaque* %1
10-
sil @join_init_existential_copy_addr : $@convention(thin) <T: P> (@in T) -> @out P {
11-
entry(%p : $*P, %x: $*T):
12-
%y = init_existential_addr %p : $*P, $T
13-
copy_addr [take] %x to [initialization] %y : $*T
14-
return undef : $()
15-
}
16-
177
// CHECK-LABEL: define{{( protected)?}} swiftcc void @dont_crash(
188
// CHECK: [[TYPE_ADDR:%.*]] = getelementptr inbounds %T27fixed_size_buffer_peepholes1PP, %T27fixed_size_buffer_peepholes1PP* %0, i32 0, i32 1
199
// CHECK: [[TYPE:%.*]] = load %swift.type*, %swift.type** [[TYPE_ADDR]]
10+
// CHECK: call {{.*}} @__swift_project_boxed_opaque_existential_1
2011
// CHECK: [[PTR:%.*]] = bitcast %swift.type* [[TYPE]] to i8***
2112
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[PTR]], {{(i64|i32)}} -1
2213
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[VWT_ADDR]]
23-
// CHECK: [[WITNESS_ADDR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], {{(i64|i32)}} 2
24-
// CHECK: [[WITNESS:%.*]] = load i8*, i8** [[WITNESS_ADDR]]
25-
// CHECK: [[PROJECTBUFFER:%.*]] = bitcast i8* [[WITNESS]]
26-
// CHECK: call %swift.opaque* [[PROJECTBUFFER]](
27-
// CHECK: [[PTR:%.*]] = bitcast %swift.type* [[TYPE]] to i8***
28-
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[PTR]], {{(i64|i32)}} -1
29-
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[VWT_ADDR]]
30-
// CHECK: [[WITNESS_ADDR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], {{(i64|i32)}} 5
14+
// CHECK: [[WITNESS_ADDR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], {{(i64|i32)}} 6
3115
// CHECK: [[WITNESS:%.*]] = load i8*, i8** [[WITNESS_ADDR]]
32-
// CHECK: [[INITBUFFERWITHCOPY:%.*]] = bitcast i8* [[WITNESS]] to %swift.opaque* ([{{.*}} x i8]*, %swift.opaque*, %swift.type*)*
33-
// CHECK: call %swift.opaque* [[INITBUFFERWITHCOPY]](
16+
// CHECK: [[INITWITHCOPY:%.*]] = bitcast i8* [[WITNESS]] to %swift.opaque* (%swift.opaque*, %swift.opaque*, %swift.type*)*
17+
// CHECK: call %swift.opaque* [[INITWITHCOPY]](
3418
sil @dont_crash : $@convention(thin) (@in P) -> () {
3519
entry(%p : $*P):
3620
%0 = alloc_stack $P

test/IRGen/generic_metatypes.swift

+5-15
Original file line numberDiff line numberDiff line change
@@ -46,21 +46,11 @@ func protocolTypeof(_ x: Bas) -> Bas.Type {
4646
// CHECK: [[METADATA_ADDR:%.*]] = getelementptr inbounds %T17generic_metatypes3BasP, %T17generic_metatypes3BasP* [[X:%.*]], i32 0, i32 1
4747
// CHECK: [[METADATA:%.*]] = load %swift.type*, %swift.type** [[METADATA_ADDR]]
4848
// CHECK: [[BUFFER:%.*]] = getelementptr inbounds %T17generic_metatypes3BasP, %T17generic_metatypes3BasP* [[X]], i32 0, i32 0
49-
// CHECK: [[METADATA_I8:%.*]] = bitcast %swift.type* [[METADATA]] to i8***
50-
// CHECK-32: [[VW_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[METADATA_I8]], i32 -1
51-
// CHECK-64: [[VW_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[METADATA_I8]], i64 -1
52-
// CHECK: [[VW:%.*]] = load i8**, i8*** [[VW_ADDR]]
53-
// CHECK: [[PROJECT_ADDR:%.*]] = getelementptr inbounds i8*, i8** [[VW]], i32 2
54-
// CHECK-32: [[PROJECT_PTR:%.*]] = load i8*, i8** [[PROJECT_ADDR]], align 4
55-
// CHECK-64: [[PROJECT_PTR:%.*]] = load i8*, i8** [[PROJECT_ADDR]], align 8
56-
// CHECK-32: [[PROJECT:%.*]] = bitcast i8* [[PROJECT_PTR]] to %swift.opaque* ([12 x i8]*, %swift.type*)*
57-
// CHECK-64: [[PROJECT:%.*]] = bitcast i8* [[PROJECT_PTR]] to %swift.opaque* ([24 x i8]*, %swift.type*)*
58-
// CHECK-32: [[PROJECTION:%.*]] = call %swift.opaque* [[PROJECT]]([12 x i8]* [[BUFFER]], %swift.type* [[METADATA]])
59-
// CHECK-64: [[PROJECTION:%.*]] = call %swift.opaque* [[PROJECT]]([24 x i8]* [[BUFFER]], %swift.type* [[METADATA]])
60-
// CHECK: [[METATYPE:%.*]] = call %swift.type* @swift_getDynamicType(%swift.opaque* [[PROJECTION]], %swift.type* [[METADATA]], i1 true)
61-
// CHECK: [[T0:%.*]] = getelementptr inbounds %T17generic_metatypes3BasP, %T17generic_metatypes3BasP* [[X]], i32 0, i32 2
62-
// CHECK-32: [[WTABLE:%.*]] = load i8**, i8*** [[T0]], align 4
63-
// CHECK-64: [[WTABLE:%.*]] = load i8**, i8*** [[T0]], align 8
49+
// CHECK: [[VALUE_ADDR:%.*]] = call %swift.opaque* @__swift_project_boxed_opaque_existential_1({{.*}} [[BUFFER]], %swift.type* [[METADATA]])
50+
// CHECK: [[METATYPE:%.*]] = call %swift.type* @swift_getDynamicType(%swift.opaque* [[VALUE_ADDR]], %swift.type* [[METADATA]], i1 true)
51+
// CHECK: [[WTABLE_ADDR:%.*]] = getelementptr inbounds %T17generic_metatypes3BasP, %T17generic_metatypes3BasP* %0, i32 0, i32 2
52+
// CHECK: [[WTABLE:%.*]] = load i8**, i8*** [[WTABLE_ADDR]]
53+
// CHECK: call void @__swift_destroy_boxed_opaque_existential_1(%T17generic_metatypes3BasP* %0)
6454
// CHECK: [[T0:%.*]] = insertvalue { %swift.type*, i8** } undef, %swift.type* [[METATYPE]], 0
6555
// CHECK: [[T1:%.*]] = insertvalue { %swift.type*, i8** } [[T0]], i8** [[WTABLE]], 1
6656
// CHECK: ret { %swift.type*, i8** } [[T1]]

test/IRGen/generic_metatypes_arm.swift

+5-15
Original file line numberDiff line numberDiff line change
@@ -44,21 +44,11 @@ func protocolTypeof(_ x: Bas) -> Bas.Type {
4444
// CHECK: [[METADATA_ADDR:%.*]] = getelementptr inbounds %T17generic_metatypes3BasP, %T17generic_metatypes3BasP* [[X:%.*]], i32 0, i32 1
4545
// CHECK: [[METADATA:%.*]] = load %swift.type*, %swift.type** [[METADATA_ADDR]]
4646
// CHECK: [[BUFFER:%.*]] = getelementptr inbounds %T17generic_metatypes3BasP, %T17generic_metatypes3BasP* [[X]], i32 0, i32 0
47-
// CHECK: [[METADATA_I8:%.*]] = bitcast %swift.type* [[METADATA]] to i8***
48-
// CHECK-32: [[VW_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[METADATA_I8]], i32 -1
49-
// CHECK-64: [[VW_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[METADATA_I8]], i64 -1
50-
// CHECK: [[VW:%.*]] = load i8**, i8*** [[VW_ADDR]]
51-
// CHECK: [[PROJECT_ADDR:%.*]] = getelementptr inbounds i8*, i8** [[VW]], i32 2
52-
// CHECK-32: [[PROJECT_PTR:%.*]] = load i8*, i8** [[PROJECT_ADDR]], align 4
53-
// CHECK-64: [[PROJECT_PTR:%.*]] = load i8*, i8** [[PROJECT_ADDR]], align 8
54-
// CHECK-32: [[PROJECT:%.*]] = bitcast i8* [[PROJECT_PTR]] to %swift.opaque* ([12 x i8]*, %swift.type*)*
55-
// CHECK-64: [[PROJECT:%.*]] = bitcast i8* [[PROJECT_PTR]] to %swift.opaque* ([24 x i8]*, %swift.type*)*
56-
// CHECK-32: [[PROJECTION:%.*]] = call %swift.opaque* [[PROJECT]]([12 x i8]* [[BUFFER]], %swift.type* [[METADATA]])
57-
// CHECK-64: [[PROJECTION:%.*]] = call %swift.opaque* [[PROJECT]]([24 x i8]* [[BUFFER]], %swift.type* [[METADATA]])
58-
// CHECK: [[METATYPE:%.*]] = call %swift.type* @swift_getDynamicType(%swift.opaque* [[PROJECTION]], %swift.type* [[METADATA]], i1 true)
59-
// CHECK: [[T0:%.*]] = getelementptr inbounds %T17generic_metatypes3BasP, %T17generic_metatypes3BasP* [[X]], i32 0, i32 2
60-
// CHECK-32: [[WTABLE:%.*]] = load i8**, i8*** [[T0]], align 4
61-
// CHECK-64: [[WTABLE:%.*]] = load i8**, i8*** [[T0]], align 8
47+
// CHECK: [[VALUE_ADDR:%.*]] = call %swift.opaque* @__swift_project_boxed_opaque_existential_1({{.*}} [[BUFFER]], %swift.type* [[METADATA]])
48+
// CHECK: [[METATYPE:%.*]] = call %swift.type* @swift_getDynamicType(%swift.opaque* [[VALUE_ADDR]], %swift.type* [[METADATA]], i1 true)
49+
// CHECK: [[WTABLE_ADDR:%.*]] = getelementptr inbounds %T17generic_metatypes3BasP, %T17generic_metatypes3BasP* %0, i32 0, i32 2
50+
// CHECK: [[WTABLE:%.*]] = load i8**, i8*** [[WTABLE_ADDR]]
51+
// CHECK: call void @__swift_destroy_boxed_opaque_existential_1(%T17generic_metatypes3BasP* %0)
6252
// CHECK: [[T0:%.*]] = insertvalue { %swift.type*, i8** } undef, %swift.type* [[METATYPE]], 0
6353
// CHECK: [[T1:%.*]] = insertvalue { %swift.type*, i8** } [[T0]], i8** [[WTABLE]], 1
6454
// CHECK: ret { %swift.type*, i8** } [[T1]]

test/IRGen/global_resilience.sil

+55-13
Original file line numberDiff line numberDiff line change
@@ -103,27 +103,69 @@ bb0:
103103
return %tuple : $()
104104
}
105105

106+
// CHECK-LABEL: define {{.*}} @testOtherGlobal
106107
sil @testOtherGlobal : $@convention(thin) () -> () {
107108
bb0:
108109
// CHECK: [[METADATA:%.*]] = call %swift.type* @_T016resilient_struct4SizeVMa()
110+
// CHECK: call %swift.opaque* @__swift_allocate_value_buffer(%swift.type* %0, %swift.opaque* bitcast ([{{.*}} x i8]* @otherGlobal to %swift.opaque*))
111+
alloc_global @otherGlobal
109112

110-
// CHECK: [[METADATA_ADDR:%.*]] = bitcast %swift.type* [[METADATA]] to i8***
111-
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[METADATA_ADDR]], [[INT]] -1
112-
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[VWT_ADDR]]
113-
// CHECK: [[WITNESS_PTR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32 11
114-
// CHECK: [[WITNESS:%.*]] = load i8*, i8** [[WITNESS_PTR]]
115-
// CHECK: [[allocateBuffer:%.*]] = bitcast i8* [[WITNESS]] to %swift.opaque* ([[BUFFER]]*, %swift.type*)*
116-
// CHECK: [[VALUE:%.*]] = call %swift.opaque* [[allocateBuffer]]([[BUFFER]]* @otherGlobal, %swift.type* [[METADATA]])
117-
alloc_global @otherGlobal
118-
119-
// CHECK: [[WITNESS_PTR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32 2
120-
// CHECK: [[WITNESS:%.*]] = load i8*, i8** [[WITNESS_PTR]]
121-
// CHECK: [[projectBuffer:%.*]] = bitcast i8* [[WITNESS]] to %swift.opaque* ([[BUFFER]]*, %swift.type*)*
122-
// CHECK: [[VALUE:%.*]] = call %swift.opaque* [[projectBuffer]]([[BUFFER]]* @otherGlobal, %swift.type* [[METADATA]])
113+
// CHECK: call %swift.opaque* @__swift_project_value_buffer(%swift.type* %0, %swift.opaque* bitcast ([{{.*}} x i8]* @otherGlobal to %swift.opaque*))
123114
%addr = global_addr @otherGlobal : $*Size
124115

125116
%tuple = tuple ()
126117

127118
// CHECK: ret void
128119
return %tuple : $()
129120
}
121+
122+
// CHECK-LABEL: define linkonce_odr hidden %swift.opaque* @__swift_allocate_value_buffer(%swift.type*, %swift.opaque*)
123+
// CHECK: entry:
124+
// CHECK: [[CAST:%.*]] = bitcast %swift.type* %0 to i8***
125+
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[CAST]], {{.*}} -1
126+
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[VWT_ADDR]]
127+
// CHECK: [[FLAGS_ADDR:%.*]] = getelementptr inbounds i8*, i8** %.valueWitnesses, i32 18
128+
// CHECK: [[FLAGSWITNESS:%.*]] = load i8*, i8** [[FLAGS_ADDR]]
129+
// CHECK: [[FLAGS:%.*]] = ptrtoint i8* [[FLAGSWITNESS]] to i{{.*}}
130+
// CHECK: [[ISNOTINLINE:%.*]] = and {{.*}} [[FLAGS]], 131072
131+
// CHECK: [[ISINLINE:%.*]] = icmp eq {{.*}} [[ISNOTINLINE]], 0
132+
// CHECK: br i1 [[ISINLINE]], label %done, label %outline.allocateValueInBuffer
133+
//
134+
// CHECK: outline.allocateValueInBuffer:
135+
// CHECK: [[CAST:%.*]] = bitcast %swift.type* %0 to i8***
136+
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[CAST]], {{.*}} -1
137+
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[VWT_ADDR]]
138+
// CHECK: [[SIZE_ADDR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32 17
139+
// CHECK: [[SIZEWITNESS:%.*]] = load i8*, i8** [[SIZE_ADDR]]
140+
// CHECK: [[SIZE:%.*]] = ptrtoint i8* [[SIZEWITNESS]]
141+
// CHECK: [[ALIGN:%.*]] = and {{.*}} [[FLAGS]], 65535
142+
// CHECK: [[PTR:%.*]] = call noalias i8* @swift_rt_swift_slowAlloc({{.*}} [[SIZE]], {{.*}} [[ALIGN]])
143+
// CHECK: [[ADDR:%.*]] = bitcast %swift.opaque* %1 to i8**
144+
// CHECK: store i8* [[PTR]], i8** [[ADDR]]
145+
// CHECK: [[OUTLINEADDR:%.*]] = bitcast i8* [[PTR]] to %swift.opaque*
146+
// CHECK: br label %done
147+
//
148+
// CHECK: done:
149+
// CHECK: [[PHI:%.*]] = phi %swift.opaque* [ %1, %entry ], [ [[OUTLINEADDR]], %outline.allocateValueInBuffer ]
150+
// CHECK: ret %swift.opaque* [[PHI]]
151+
152+
153+
// CHECK-LABEL: define linkonce_odr hidden %swift.opaque* @__swift_project_value_buffer(%swift.type*, %swift.opaque*)
154+
// CHECK: [[CAST:%.*]] = bitcast %swift.type* %0 to i8***
155+
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[CAST]], {{.*}} -1
156+
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[VWT_ADDR]]
157+
// CHECK: [[FLAGS_ADDR:%.*]] = getelementptr inbounds i8*, i8** %.valueWitnesses, i32 18
158+
// CHECK: [[FLAGSWITNESS:%.*]] = load i8*, i8** [[FLAGS_ADDR]]
159+
// CHECK: [[FLAGS:%.*]] = ptrtoint i8* [[FLAGSWITNESS]] to i{{.*}}
160+
// CHECK: [[ISNOTINLINE:%.*]] = and {{.*}} [[FLAGS]], 131072
161+
// CHECK: [[ISINLINE:%.*]] = icmp eq {{.*}} [[ISNOTINLINE]], 0
162+
// CHECK: br i1 [[ISINLINE]], label %done, label %outline.projectValueInBuffer
163+
//
164+
// CHECK: outline.projectValueInBuffer:
165+
// CHECK: [[CAST:%.*]] = bitcast %swift.opaque* %1 to %swift.opaque**
166+
// CHECK: [[PTR_TO_BUFFER:%.*]] = load %swift.opaque*, %swift.opaque** [[CAST]]
167+
// CHECK: br label %done
168+
//
169+
// CHECK: done:
170+
// CHECK: [[PHI:%.*]] = phi %swift.opaque* [ %1, %entry ], [ [[PTR_TO_BUFFER]], %outline.projectValueInBuffer ]
171+
// CHECK: ret %swift.opaque* [[PHI]]

test/IRGen/witness_table_multifile.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
// CHECK-LABEL: define hidden swiftcc void @_T023witness_table_multifile3baryyF
66
func bar() {
77
// CHECK: call swiftcc void @_T023witness_table_multifile2goAA1P_pyF
8-
// CHECK: [[BUFFER:%[0-9]+]] = call %swift.opaque* %projectBuffer
9-
// CHECK-NEXT: [[WITNESS_TABLE_ADDR:%[0-9]+]] = getelementptr inbounds [[P_WITNESS_TABLE]], [[P_WITNESS_TABLE]]* %0, i32 0, i32 2
10-
// CHECK-NEXT: [[WITNESS_TABLE:%[A-Za-z0-9_-]+]] = load i8**, i8*** [[WITNESS_TABLE_ADDR]]
8+
// CHECK: [[WITNESS_TABLE_ADDR:%[0-9]+]] = getelementptr inbounds [[P_WITNESS_TABLE]], [[P_WITNESS_TABLE]]* %0, i32 0, i32 2
9+
// CHECK: [[WITNESS_TABLE:%[A-Za-z0-9_-]+]] = load i8**, i8*** [[WITNESS_TABLE_ADDR]]
10+
// CHECK: [[BUFFER:%[0-9]+]] = call %swift.opaque* @__swift_project_boxed_opaque_existential_1
1111
// CHECK-NEXT: getelementptr inbounds i8*, i8** [[WITNESS_TABLE]], i32 3
1212
go().foo()
1313
}
@@ -16,4 +16,4 @@ func bar() {
1616
// when they're only used as types.
1717
func useAProtocol() -> ProtocolOnlyUsedAsAType? {
1818
return nil
19-
}
19+
}

test/SILGen/address_only_types.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ func address_only_materialize() -> Int {
151151
// CHECK: [[TEMP_PROJ:%[0-9]+]] = open_existential_addr immutable_access [[TEMP]] : $*Unloadable to $*[[OPENED:@opened(.*) Unloadable]]
152152
// CHECK: [[FOO_METHOD:%[0-9]+]] = witness_method $[[OPENED]], #Unloadable.foo!1
153153
// CHECK: [[RET:%[0-9]+]] = apply [[FOO_METHOD]]<[[OPENED]]>([[TEMP_PROJ]])
154-
// CHECK: destroy_addr [[TEMP_PROJ]]
154+
// CHECK: destroy_addr [[TEMP]]
155155
// CHECK: dealloc_stack [[TEMP]]
156156
// CHECK: return [[RET]]
157157
}

test/SILGen/existential_erasure.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ func throwingFunc() throws -> Bool { return true }
2626
func PQtoP() {
2727
// CHECK: [[PQ_PAYLOAD:%.*]] = open_existential_addr immutable_access [[PQ:%.*]] : $*P & Q to $*[[OPENED_TYPE:@opened(.*) P & Q]]
2828
// CHECK: [[P_PAYLOAD:%.*]] = init_existential_addr [[P:%.*]] : $*P, $[[OPENED_TYPE]]
29-
// CHECK: copy_addr [take] [[PQ_PAYLOAD]] to [initialization] [[P_PAYLOAD]]
30-
// CHECK: deinit_existential_addr [[PQ]]
29+
// CHECK: copy_addr [[PQ_PAYLOAD]] to [initialization] [[P_PAYLOAD]]
30+
// CHECK: destroy_addr [[PQ]]
3131
// CHECK-NOT: destroy_addr [[P]]
3232
// CHECK-NOT: destroy_addr [[P_PAYLOAD]]
33-
// CHECK-NOT: destroy_addr [[PQ]]
33+
// CHECK-NOT: deinit_existential_addr [[PQ]]
3434
// CHECK-NOT: destroy_addr [[PQ_PAYLOAD]]
3535
useP(makePQ())
3636
}

test/SILGen/function_conversion.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -234,11 +234,11 @@ func convExistentialTrivial(_ t2: @escaping (Q) -> Trivial, t3: @escaping (Q?) -
234234
// CHECK: alloc_stack $Q
235235
// CHECK-NEXT: open_existential_addr immutable_access %1 : $*P
236236
// CHECK-NEXT: init_existential_addr %3 : $*Q
237-
// CHECK-NEXT: copy_addr [take] {{.*}} to [initialization] {{.*}}
237+
// CHECK-NEXT: copy_addr {{.*}} to [initialization] {{.*}}
238238
// CHECK-NEXT: apply
239239
// CHECK-NEXT: init_existential_addr
240240
// CHECK-NEXT: store
241-
// CHECK: deinit_existential_addr
241+
// CHECK: destroy_addr
242242
// CHECK: return
243243

244244
// ==== Existential metatypes

test/SILGen/functions.swift

+1-2
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,7 @@ func calls(_ i:Int, j:Int, k:Int) {
218218
// CHECK: [[PMETHOD:%[0-9]+]] = witness_method $[[OPENED]], #SomeProtocol.method!1
219219
// CHECK: [[I:%[0-9]+]] = load [trivial] [[IADDR]]
220220
// CHECK: apply [[PMETHOD]]<[[OPENED]]>([[I]], [[PVALUE]])
221-
// CHECK: destroy_addr [[PVALUE]]
222-
// CHECK: deinit_existential_addr [[TEMP]]
221+
// CHECK: destroy_addr [[TEMP]]
223222
// CHECK: dealloc_stack [[TEMP]]
224223
p.method(i)
225224

0 commit comments

Comments
 (0)