| // RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -enable-sil-verify-all %s -performance-constant-propagation | %FileCheck %s |
| |
| // REQUIRES: objc_interop |
| |
| sil_stage canonical |
| |
| import Builtin |
| import Swift |
| import Foundation |
| |
| @objc class ObjCClass {} |
| |
| struct Str: _ObjectiveCBridgeable { |
| func _bridgeToObjectiveC() -> ObjCClass |
| static func _forceBridgeFromObjectiveC(_ source: ObjCClass, |
| result: inout Str?) |
| static func _conditionallyBridgeFromObjectiveC(_ source: ObjCClass, |
| result: inout Str?) -> Bool |
| static func _unconditionallyBridgeFromObjectiveC(_ source: ObjCClass?) -> Str |
| |
| // Make it a non-trivial type |
| var x: AnyObject? |
| } |
| |
| // CHECK-LABEL: sil @checked_cast_with_take_always |
| // CHECK: [[A:%[0-9]+]] = alloc_stack |
| // CHECK: [[S:%[0-9]+]] = load %0 |
| // CHECK-NOT: retain |
| // CHECK: [[D:%[0-9]+]] = apply %{{[0-9]+}}([[S]]) |
| // CHECK: release_value [[S]] |
| // CHECK: store [[D]] to [[A]] |
| // CHECK: bb1: |
| // CHECK-NEXT: br bb3 |
| // CHECK: bb2: |
| // CHECK-NEXT: br bb3 |
| // CHECK: return |
| sil @checked_cast_with_take_always : $@convention(thin) (@in Str) -> ObjCClass { |
| bb0(%0 : $*Str): |
| %b = alloc_stack $ObjCClass |
| checked_cast_addr_br take_always Str in %0 : $*Str to ObjCClass in %b : $*ObjCClass, bb1, bb2 |
| |
| bb1: |
| br bb3 |
| |
| bb2: |
| br bb3 |
| |
| bb3: |
| %r = load %b : $*ObjCClass |
| dealloc_stack %b : $*ObjCClass |
| return %r : $ObjCClass |
| } |
| |
| // CHECK-LABEL: sil @checked_cast_with_take_on_success |
| // CHECK: [[A:%[0-9]+]] = alloc_stack |
| // CHECK: [[S:%[0-9]+]] = load %0 |
| // CHECK-NOT: retain |
| // CHECK: [[D:%[0-9]+]] = apply %{{[0-9]+}}([[S]]) |
| // CHECK-NOT: release |
| // CHECK: store [[D]] to [[A]] |
| // CHECK: bb1: |
| // CHECK-NEXT: release_value [[S]] |
| // CHECK-NEXT: br bb3 |
| // CHECK: bb2: |
| // CHECK-NEXT: br bb3 |
| // CHECK: return |
| sil @checked_cast_with_take_on_success : $@convention(thin) (@in Str) -> ObjCClass { |
| bb0(%0 : $*Str): |
| %b = alloc_stack $ObjCClass |
| checked_cast_addr_br take_on_success Str in %0 : $*Str to ObjCClass in %b : $*ObjCClass, bb1, bb2 |
| |
| bb1: |
| br bb3 |
| |
| bb2: |
| br bb3 |
| |
| bb3: |
| %r = load %b : $*ObjCClass |
| dealloc_stack %b : $*ObjCClass |
| return %r : $ObjCClass |
| } |
| |
| // CHECK-LABEL: sil @checked_cast_with_copy_on_success |
| // CHECK: [[A:%[0-9]+]] = alloc_stack |
| // CHECK: [[S:%[0-9]+]] = load %0 |
| // CHECK: retain_value [[S]] |
| // CHECK: [[D:%[0-9]+]] = apply %{{[0-9]+}}([[S]]) |
| // CHECK: release_value [[S]] |
| // CHECK: bb1: |
| // CHECK-NEXT: br bb3 |
| // CHECK: bb2: |
| // CHECK-NEXT: br bb3 |
| // CHECK: return |
| sil @checked_cast_with_copy_on_success : $@convention(thin) (@in Str) -> ObjCClass { |
| bb0(%0 : $*Str): |
| %b = alloc_stack $ObjCClass |
| checked_cast_addr_br copy_on_success Str in %0 : $*Str to ObjCClass in %b : $*ObjCClass, bb1, bb2 |
| |
| bb1: |
| br bb3 |
| |
| bb2: |
| br bb3 |
| |
| bb3: |
| %r = load %b : $*ObjCClass |
| dealloc_stack %b : $*ObjCClass |
| return %r : $ObjCClass |
| } |
| |