Skip to content

Commit 4929726

Browse files
authored
Merge pull request #25075 from gottesmm/pr-05279e58e2e7aae45eae13d77fdadfbc0f5084b4
[cast-opt] Update checked_cast_addr_br objc -> swift bridged cast opt…
2 parents 1e171af + 39dbf54 commit 4929726

File tree

3 files changed

+128
-5
lines changed

3 files changed

+128
-5
lines changed

lib/SILOptimizer/Utils/CastOptimizer.cpp

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -321,17 +321,45 @@ CastOptimizer::optimizeBridgedObjCToSwiftCast(SILDynamicCastInst dynamicCast) {
321321
auto *CCABI = cast<CheckedCastAddrBranchInst>(Inst);
322322
switch (CCABI->getConsumptionKind()) {
323323
case CastConsumptionKind::TakeAlways:
324-
Builder.createReleaseValue(Loc, srcOp, Builder.getDefaultAtomicity());
324+
Builder.emitDestroyValueOperation(Loc, srcOp);
325325
break;
326326
case CastConsumptionKind::TakeOnSuccess: {
327-
// Insert a release in the success BB.
328-
SILBuilderWithScope SuccessBuilder(SuccessBB->begin());
329-
SuccessBuilder.emitDestroyValueOperation(Loc, srcOp);
327+
{
328+
// Insert a release in the success BB.
329+
SILBuilderWithScope successBuilder(SuccessBB->begin());
330+
successBuilder.emitDestroyValueOperation(Loc, srcOp);
331+
}
332+
{
333+
// And a store in the failure BB.
334+
if (Builder.hasOwnership()) {
335+
SILBuilderWithScope failureBuilder(FailureBB->begin());
336+
SILValue writeback = srcOp;
337+
SILType srcType = src->getType().getObjectType();
338+
if (writeback->getType() != srcType) {
339+
writeback =
340+
failureBuilder.createUncheckedRefCast(Loc, writeback, srcType);
341+
}
342+
failureBuilder.emitStoreValueOperation(Loc, writeback, src,
343+
StoreOwnershipQualifier::Init);
344+
}
345+
}
330346
break;
331347
}
332348
case CastConsumptionKind::BorrowAlways:
333349
llvm_unreachable("checked_cast_addr_br never has BorrowAlways");
334350
case CastConsumptionKind::CopyOnSuccess:
351+
// If we are performing copy_on_success, store the value back into memory
352+
// here since we loaded it. We may need to cast back to the actual
353+
// underlying type.
354+
if (Builder.hasOwnership()) {
355+
SILValue writeback = srcOp;
356+
SILType srcType = src->getType().getObjectType();
357+
if (writeback->getType() != srcType) {
358+
writeback = Builder.createUncheckedRefCast(Loc, writeback, srcType);
359+
}
360+
Builder.emitStoreValueOperation(Loc, writeback, src,
361+
StoreOwnershipQualifier::Init);
362+
}
335363
break;
336364
}
337365

test/SILOptimizer/constant_propagation_objc.sil

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ bb4:
185185
// CHECK: apply {{%.*}}<Array<String>>([[CAST_TMP]], [[INPUT_VALUE]],
186186
// CHECK: strong_release [[INPUT_VALUE]]
187187
// NOTE: When we perform take_always, this is the take of the cast.
188-
// CHECK: release_value [[INPUT_VALUE]]
188+
// CHECK: strong_release [[INPUT_VALUE]]
189189
// CHECK: switch_enum_addr [[CAST_TMP]] : $*Optional<Array<String>>, case #Optional.none!enumelt: [[FAIL_BB]], default [[SUCCESS_TRAMPOLINE_BB:bb[0-9]+]]
190190
//
191191
// CHECK: [[SUCCESS_TRAMPOLINE_BB]]:

test/SILOptimizer/constant_propagation_ownership_objc.sil

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import Foundation
1010
import Builtin
1111

1212
sil @$ss11AnyHashableVyABxcSHRzlufC : $@convention(method) <τ_0_0 where τ_0_0 : Hashable> (@in τ_0_0, @thin AnyHashable.Type) -> @out AnyHashable
13+
sil @guaranteed_swift_array_user : $@convention(thin) <τ_0_0> (@guaranteed Array<τ_0_0>) -> ()
1314

1415
// CHECK-LABEL: sil [ossa] @bridged_cast_anyhashable : $@convention(method) (@guaranteed NSArray) -> @out Optional<AnyHashable> {
1516
// CHECK: [[FUNC:%.*]] = function_ref @$ss37_forceBridgeFromObjectiveC_bridgeableyx01_D5CTypeQz_xmts01_D11CBridgeableRzlF :
@@ -36,3 +37,97 @@ bb0(%0 : $*Optional<AnyHashable>, %1 : @guaranteed $NSArray):
3637
%19 = tuple ()
3738
return %19 : $()
3839
}
40+
41+
// CHECK-LABEL: sil [ossa] @array_downcast_copyonsuccess : $@convention(thin) (@guaranteed NSArray) -> () {
42+
// CHECK-NOT: checked_cast_addr_br
43+
// CHECK: } // end sil function 'array_downcast_copyonsuccess'
44+
sil [ossa] @array_downcast_copyonsuccess : $@convention(thin) (@guaranteed NSArray) -> () {
45+
bb0(%0 : @guaranteed $NSArray):
46+
%4 = alloc_stack $NSArray
47+
%5 = copy_value %0 : $NSArray
48+
store %5 to [init] %4 : $*NSArray
49+
%7 = alloc_stack $Array<String>
50+
checked_cast_addr_br copy_on_success NSArray in %4 : $*NSArray to Array<String> in %7 : $*Array<String>, bb2, bb3
51+
52+
bb2:
53+
%9 = load [take] %7 : $*Array<String>
54+
%10 = function_ref @guaranteed_swift_array_user : $@convention(thin) <τ_0_0> (@guaranteed Array<τ_0_0>) -> ()
55+
apply %10<String>(%9) : $@convention(thin) <τ_0_0> (@guaranteed Array<τ_0_0>) -> ()
56+
destroy_value %9 : $Array<String>
57+
dealloc_stack %7 : $*Array<String>
58+
destroy_addr %4 : $*NSArray
59+
dealloc_stack %4 : $*NSArray
60+
br bb4
61+
62+
bb3:
63+
dealloc_stack %7 : $*Array<String>
64+
destroy_addr %4 : $*NSArray
65+
dealloc_stack %4 : $*NSArray
66+
br bb4
67+
68+
bb4:
69+
%9999 = tuple()
70+
return %9999 : $()
71+
}
72+
73+
// CHECK-LABEL: sil [ossa] @array_downcast_takeonsuccess : $@convention(thin) (@guaranteed NSArray) -> () {
74+
// CHECK-NOT: checked_cast_addr_br
75+
// CHECK: } // end sil function 'array_downcast_takeonsuccess'
76+
sil [ossa] @array_downcast_takeonsuccess : $@convention(thin) (@guaranteed NSArray) -> () {
77+
bb0(%0 : @guaranteed $NSArray):
78+
%4 = alloc_stack $NSArray
79+
%5 = copy_value %0 : $NSArray
80+
store %5 to [init] %4 : $*NSArray
81+
%7 = alloc_stack $Array<String>
82+
checked_cast_addr_br take_on_success NSArray in %4 : $*NSArray to Array<String> in %7 : $*Array<String>, bb2, bb3
83+
84+
bb2:
85+
%9 = load [take] %7 : $*Array<String>
86+
%10 = function_ref @guaranteed_swift_array_user : $@convention(thin) <τ_0_0> (@guaranteed Array<τ_0_0>) -> ()
87+
apply %10<String>(%9) : $@convention(thin) <τ_0_0> (@guaranteed Array<τ_0_0>) -> ()
88+
destroy_value %9 : $Array<String>
89+
dealloc_stack %7 : $*Array<String>
90+
dealloc_stack %4 : $*NSArray
91+
br bb4
92+
93+
bb3:
94+
dealloc_stack %7 : $*Array<String>
95+
destroy_addr %4 : $*NSArray
96+
dealloc_stack %4 : $*NSArray
97+
br bb4
98+
99+
bb4:
100+
%9999 = tuple()
101+
return %9999 : $()
102+
}
103+
104+
// CHECK-LABEL: sil [ossa] @array_downcast_takealways : $@convention(thin) (@guaranteed NSArray) -> () {
105+
// CHECK-NOT: checked_cast_addr_br
106+
// CHECK: } // end sil function 'array_downcast_takealways'
107+
sil [ossa] @array_downcast_takealways : $@convention(thin) (@guaranteed NSArray) -> () {
108+
bb0(%0 : @guaranteed $NSArray):
109+
%4 = alloc_stack $NSArray
110+
%5 = copy_value %0 : $NSArray
111+
store %5 to [init] %4 : $*NSArray
112+
%7 = alloc_stack $Array<String>
113+
checked_cast_addr_br take_always NSArray in %4 : $*NSArray to Array<String> in %7 : $*Array<String>, bb2, bb3
114+
115+
bb2:
116+
%9 = load [take] %7 : $*Array<String>
117+
%10 = function_ref @guaranteed_swift_array_user : $@convention(thin) <τ_0_0> (@guaranteed Array<τ_0_0>) -> ()
118+
apply %10<String>(%9) : $@convention(thin) <τ_0_0> (@guaranteed Array<τ_0_0>) -> ()
119+
destroy_value %9 : $Array<String>
120+
dealloc_stack %7 : $*Array<String>
121+
dealloc_stack %4 : $*NSArray
122+
br bb4
123+
124+
bb3:
125+
dealloc_stack %7 : $*Array<String>
126+
dealloc_stack %4 : $*NSArray
127+
br bb4
128+
129+
bb4:
130+
%9999 = tuple()
131+
return %9999 : $()
132+
}
133+

0 commit comments

Comments
 (0)