// 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 }