Skip to content

Commit ae5715e

Browse files
Merge pull request #17113 from aschwaighofer/fix_sil_combine_cast_opt_address_only_type
CastOptimizer: A load store to the existential box is not valid on ad…
2 parents 642bd68 + 7b7189f commit ae5715e

File tree

3 files changed

+27
-6
lines changed

3 files changed

+27
-6
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/constant_propagation.sil

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -889,8 +889,7 @@ bb0(%0 : $*MyError, %1 : $*E2<X>):
889889
// CHECK-NOT: unconditional_checked_cast_addr
890890
// CHECK: [[ALLOC_BOX:%.*]] = alloc_existential_box $Error, $E1
891891
// CHECK: [[PROJ:%.*]] = project_existential_box $E1 in [[ALLOC_BOX]] : $Error
892-
// CHECK: [[VAL:%.*]] = load %1 : $*E1
893-
// CHECK: store [[VAL]] to [[PROJ]]
892+
// CHECK: copy_addr [take] %1 to [initialization] [[PROJ]]
894893
// CHECK: store [[ALLOC_BOX]] to %0 : $*Error
895894
// CHECK: return
896895
sil @replace_unconditional_check_cast_addr_for_type_to_error_existential : $@convention(thin) (@in E1) -> (@out Error) {

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)