Skip to content

Commit 56e9ca4

Browse files
committed
[sil-combine] Update unchecked_addr_cast simplifications for ownership.
1 parent cff4e50 commit 56e9ca4

File tree

2 files changed

+19
-14
lines changed

2 files changed

+19
-14
lines changed

lib/SILOptimizer/SILCombiner/SILCombinerCastVisitors.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -259,20 +259,20 @@ visitPointerToAddressInst(PointerToAddressInst *PTAI) {
259259

260260
SILInstruction *
261261
SILCombiner::visitUncheckedAddrCastInst(UncheckedAddrCastInst *UADCI) {
262-
if (UADCI->getFunction()->hasOwnership())
263-
return nullptr;
262+
// These are always safe to perform due to interior pointer ownership
263+
// requirements being transitive along addresses.
264264

265265
Builder.setCurrentDebugScope(UADCI->getDebugScope());
266266

267-
// (unchecked-addr-cast (unchecked-addr-cast x X->Y) Y->Z)
267+
// (unchecked_addr_cast (unchecked_addr_cast x X->Y) Y->Z)
268268
// ->
269-
// (unchecked-addr-cast x X->Z)
269+
// (unchecked_addr_cast x X->Z)
270270
if (auto *OtherUADCI = dyn_cast<UncheckedAddrCastInst>(UADCI->getOperand()))
271271
return Builder.createUncheckedAddrCast(UADCI->getLoc(),
272272
OtherUADCI->getOperand(),
273273
UADCI->getType());
274274

275-
// (unchecked-addr-cast cls->superclass) -> (upcast cls->superclass)
275+
// (unchecked_addr_cast cls->superclass) -> (upcast cls->superclass)
276276
if (UADCI->getType() != UADCI->getOperand()->getType() &&
277277
UADCI->getType().isExactSuperclassOf(UADCI->getOperand()->getType()))
278278
return Builder.createUpcast(UADCI->getLoc(), UADCI->getOperand(),

test/SILOptimizer/sil_combine_ossa.sil

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,11 +1254,12 @@ bb0(%0 : $*Builtin.NativeObject):
12541254
}
12551255

12561256
// CHECK-LABEL: sil [ossa] @unchecked_addr_cast_forwarding : $@convention(thin) (@inout Builtin.NativeObject) -> Builtin.Word {
1257-
// XHECK: bb0([[INPUT_PTR:%[0-9]+]] : $*Builtin.NativeObject):
1258-
// XHECK-NEXT: [[ADDR_CAST:%[0-9]+]] = unchecked_addr_cast [[INPUT_PTR]] : $*Builtin.NativeObject to $*Builtin.Word
1259-
// XHECK-NEXT: debug_value [[ADDR_CAST]]
1260-
// XHECK-NEXT: [[RETURN_VALUE:%[0-9]+]] = load [trivial] [[ADDR_CAST]] : $*Builtin.Word
1261-
// XHECK-NEXT: return [[RETURN_VALUE]]
1257+
// CHECK: bb0([[INPUT_PTR:%[0-9]+]] : $*Builtin.NativeObject):
1258+
// CHECK-NEXT: [[ADDR_CAST:%[0-9]+]] = unchecked_addr_cast [[INPUT_PTR]] : $*Builtin.NativeObject to $*Builtin.Word
1259+
// CHECK-NEXT: debug_value [[ADDR_CAST]]
1260+
// CHECK-NEXT: [[RETURN_VALUE:%[0-9]+]] = load [trivial] [[ADDR_CAST]] : $*Builtin.Word
1261+
// CHECK-NEXT: return [[RETURN_VALUE]]
1262+
// CHECK: } // end sil function 'unchecked_addr_cast_forwarding'
12621263
sil [ossa] @unchecked_addr_cast_forwarding : $@convention(thin) (@inout Builtin.NativeObject) -> Builtin.Word {
12631264
bb0(%0 : $*Builtin.NativeObject):
12641265
%1 = unchecked_addr_cast %0 : $*Builtin.NativeObject to $*Builtin.RawPointer
@@ -1434,6 +1435,7 @@ bb0(%0 : $*@callee_owned (@in ()) -> @out AnotherClass, %1 : $*AnotherClass):
14341435
// XHECK-NEXT: upcast
14351436
// XHECK-NEXT: store
14361437
// XHECK-NEXT: return
1438+
// CHECK: } // end sil function 'upcast_formation'
14371439
sil [ossa] @upcast_formation : $@convention(thin) (@inout E, @owned E, @inout B) -> @owned B {
14381440
bb0(%0 : $*E, %1 : @owned $E, %2 : $*B):
14391441
%3 = unchecked_addr_cast %0 : $*E to $*B
@@ -1444,10 +1446,13 @@ bb0(%0 : $*E, %1 : @owned $E, %2 : $*B):
14441446
}
14451447

14461448
// CHECK-LABEL: sil [ossa] @dont_form_upcast_when_casts_are_identity : $@convention(thin) (@inout E, @owned E, @inout E) -> @owned E {
1447-
// XHECK: bb0
1448-
// XHECK-NEXT: load
1449-
// XHECK-NEXT: store
1450-
// XHECK-NEXT: return
1449+
// CHECK: bb0
1450+
// CHECK-NEXT: copy_value
1451+
// CHECK-NEXT: destroy_value
1452+
// CHECK-NEXT: load
1453+
// CHECK-NEXT: store
1454+
// CHECK-NEXT: return
1455+
// CHECK: } // end sil function 'dont_form_upcast_when_casts_are_identity'
14511456
sil [ossa] @dont_form_upcast_when_casts_are_identity : $@convention(thin) (@inout E, @owned E, @inout E) -> @owned E {
14521457
bb0(%0 : $*E, %1 : @owned $E, %2 : $*E):
14531458
%3 = unchecked_addr_cast %0 : $*E to $*E

0 commit comments

Comments
 (0)