RefToBridgeObjectInst and BridgeObjectToRefInst are rc identity preserving

rdar://19006443

Swift SVN r23411
This commit is contained in:
Arnold Schwaighofer
2014-11-18 21:23:07 +00:00
parent 20f75c7f67
commit 08015deced
3 changed files with 24 additions and 1 deletions

View File

@@ -31,6 +31,8 @@ static bool isRCIdentityPreservingCast(ValueKind Kind) {
case ValueKind::UncheckedAddrCastInst:
case ValueKind::UnconditionalCheckedCastInst:
case ValueKind::UncheckedRefBitCastInst:
case ValueKind::RefToBridgeObjectInst:
case ValueKind::BridgeObjectToRefInst:
return true;
default:
return false;
@@ -46,6 +48,8 @@ static bool isUpcastPreservingCast(ValueKind Kind) {
case ValueKind::UncheckedRefCastInst:
case ValueKind::UncheckedAddrCastInst:
case ValueKind::UncheckedRefBitCastInst:
case ValueKind::RefToBridgeObjectInst:
case ValueKind::BridgeObjectToRefInst:
return true;
default:
return false;

View File

@@ -43,6 +43,8 @@ static bool isRCIdentityPreservingCast(ValueKind Kind) {
case ValueKind::UncheckedRefBitCastInst:
case ValueKind::InitExistentialRefInst:
case ValueKind::OpenExistentialRefInst:
case ValueKind::RefToBridgeObjectInst:
case ValueKind::BridgeObjectToRefInst:
return true;
default:
return false;

View File

@@ -419,3 +419,20 @@ bb0(%0 : $C):
%3 = tuple()
return %3 : $()
}
// CHECK-LABEL: sil @strip_off_bridge_object
// CHECK-NOT: strong_retain
// CHECK-NOT: strong_release
sil @strip_off_bridge_object : $@thin (Builtin.BridgeObject, C) -> () {
bb0(%0 : $Builtin.BridgeObject, %5 : $C):
%1 = bridge_object_to_ref %0 : $Builtin.BridgeObject to $C
strong_retain %1 : $C
strong_release %0 : $Builtin.BridgeObject
%4 = integer_literal $Builtin.Word, 0
%2 = ref_to_bridge_object %5 : $C, %4 : $Builtin.Word
strong_retain %5 : $C
strong_release %2 : $Builtin.BridgeObject
%3 = tuple()
return %3 : $()
}