Skip to content

Commit f2addd1

Browse files
committed
[4.2] CastOptimizer: A load store to the existential box is not valid on address only types
rdar://40949457
1 parent 4f08a78 commit f2addd1

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

lib/SILOptimizer/Utils/CastOptimizer.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1440,10 +1440,7 @@ static bool optimizeStaticallyKnownProtocolConformance(
14401440
SourceType, Conformances);
14411441
auto Projection =
14421442
B.createProjectExistentialBox(Loc, Src->getType(), AllocBox);
1443-
auto Value = B.createLoad(Loc, Src,
1444-
swift::LoadOwnershipQualifier::Unqualified);
1445-
B.createStore(Loc, Value, Projection,
1446-
swift::StoreOwnershipQualifier::Unqualified);
1443+
B.createCopyAddr(Loc, Src, Projection, IsTake, IsInitialization);
14471444
B.createStore(Loc, AllocBox, Dest,
14481445
swift::StoreOwnershipQualifier::Unqualified);
14491446
break;

test/SILOptimizer/sil_combine_objc_bridge.sil

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,3 +197,28 @@ bb0(%0 : $*NSObject, %1 : $*Array<String>):
197197
return %7 : $()
198198
}
199199

200+
enum AddressOnlyError : Error {
201+
case data(Data)
202+
case none
203+
}
204+
205+
// CHECK-LABEL: sil @unconditional_checked_cast_addr_address_only_type
206+
// CHECK: alloc_stack $Error
207+
// CHECK: alloc_stack $AddressOnlyError
208+
// CHECK copy_addr
209+
// CHECK: alloc_existential_box
210+
// CHECK: project_existential_box
211+
// CHECK: copy_addr
212+
// CHECK: store
213+
sil @unconditional_checked_cast_addr_address_only_type: $@convention(thin) (@in_guaranteed AddressOnlyError) -> @owned Error {
214+
bb0(%0 : $*AddressOnlyError):
215+
%1 = alloc_stack $Error
216+
%2 = alloc_stack $AddressOnlyError
217+
copy_addr %0 to [initialization] %2 : $*AddressOnlyError
218+
unconditional_checked_cast_addr AddressOnlyError in %2 : $*AddressOnlyError to Error in %1 : $*Error
219+
dealloc_stack %2 : $*AddressOnlyError
220+
%8 = tuple ()
221+
%9 = load %1 : $*Error
222+
dealloc_stack %1 : $*Error
223+
return %9 : $Error
224+
}

0 commit comments

Comments
 (0)