Skip to content

Commit 93a22b6

Browse files
authored
Merge pull request #17114 from aschwaighofer/fix_sil_combine_cast_opt_address_only_type_4.2
2 parents 4f08a78 + a6db327 commit 93a22b6

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
@@ -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/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)