Skip to content

Commit e8b5f1c

Browse files
committed
CastOptimizer: A load store to the existential box is not valid on address only types
rdar://40949457
1 parent 016a619 commit e8b5f1c

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
@@ -1434,10 +1434,7 @@ static bool optimizeStaticallyKnownProtocolConformance(
14341434
SourceType, Conformances);
14351435
auto Projection =
14361436
B.createProjectExistentialBox(Loc, Src->getType(), AllocBox);
1437-
auto Value = B.createLoad(Loc, Src,
1438-
swift::LoadOwnershipQualifier::Unqualified);
1439-
B.createStore(Loc, Value, Projection,
1440-
swift::StoreOwnershipQualifier::Unqualified);
1437+
B.createCopyAddr(Loc, Src, Projection, IsTake, IsInitialization);
14411438
B.createStore(Loc, AllocBox, Dest,
14421439
swift::StoreOwnershipQualifier::Unqualified);
14431440
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)