blob: a5af3ecaef7e00ce882da09ffb82de3d1fe8f07b [file] [log] [blame]
// RUN: %target-swift-frontend -module-name bridged_casts_folding -O -emit-sil %s | %FileCheck %s
// REQUIRES: objc_interop
sil_stage raw
import Swift
import Foundation
class NSObjectSubclass : NSObject {}
sil_vtable NSObjectSubclass {}
// CHECK-LABEL: sil @anyhashable_cast_unconditional
// CHECK: [[BRIDGED:%.*]] = apply {{.*}}(%0)
// CHECK-NEXT: destroy_addr %0
// CHECK-NEXT: [[CAST:%.*]] = unconditional_checked_cast [[BRIDGED]] : $NSObject to $NSObjectSubclass
sil [ossa] @anyhashable_cast_unconditional : $@convention(thin) (@in AnyHashable) -> @owned NSObjectSubclass {
entry(%0 : $*AnyHashable):
%1 = alloc_stack $NSObjectSubclass
unconditional_checked_cast_addr AnyHashable in %0 : $*AnyHashable
to NSObjectSubclass in %1 : $*NSObjectSubclass
%3 = load [take] %1 : $*NSObjectSubclass
dealloc_stack %1 : $*NSObjectSubclass
return %3 : $NSObjectSubclass
}
// CHECK-LABEL: sil @anyhashable_cast_take_always
// CHECK: [[BRIDGED:%.*]] = apply {{.*}}(%0)
// CHECK-NEXT: destroy_addr %0
// CHECK-NEXT: checked_cast_br [[BRIDGED]] : $NSObject to $NSObjectSubclass, [[YES:bb[0-9]+]], [[NO:bb[0-9]+]]
sil [ossa] @anyhashable_cast_take_always : $@convention(thin) (@in AnyHashable, @owned NSObjectSubclass) -> @owned NSObjectSubclass {
entry(%0 : $*AnyHashable, %1 : @owned $NSObjectSubclass):
%2 = alloc_stack $NSObjectSubclass
checked_cast_addr_br take_always AnyHashable in %0 : $*AnyHashable
to NSObjectSubclass in %2 : $*NSObjectSubclass, bb1, bb2
bb1:
%4 = load [take] %2 : $*NSObjectSubclass
destroy_value %1 : $NSObjectSubclass
br bb3(%4 : $NSObjectSubclass)
bb2:
br bb3(%1 : $NSObjectSubclass)
bb3(%8 : @owned $NSObjectSubclass):
dealloc_stack %2 : $*NSObjectSubclass
return %8 : $NSObjectSubclass
}
// CHECK-LABEL: sil @anyhashable_cast_take_on_success
// CHECK: [[BRIDGED:%.*]] = apply {{.*}}(%0)
// CHECK-NEXT: checked_cast_br [[BRIDGED]] : $NSObject to $NSObjectSubclass, [[YES:bb[0-9]+]], [[NO:bb[0-9]+]]
// CHECK: [[YES]]{{.*}}:
// CHECK-NEXT: destroy_addr %0
sil [ossa] @anyhashable_cast_take_on_success : $@convention(thin) (@in AnyHashable, @owned NSObjectSubclass) -> @owned NSObjectSubclass {
entry(%0 : $*AnyHashable, %1 : @owned $NSObjectSubclass):
%2 = alloc_stack $NSObjectSubclass
checked_cast_addr_br take_on_success AnyHashable in %0 : $*AnyHashable
to NSObjectSubclass in %2 : $*NSObjectSubclass, bb1, bb2
bb1:
%4 = load [take] %2 : $*NSObjectSubclass
destroy_value %1 : $NSObjectSubclass
br bb3(%4 : $NSObjectSubclass)
bb2:
destroy_addr %0 : $*AnyHashable
br bb3(%1 : $NSObjectSubclass)
bb3(%8 : @owned $NSObjectSubclass):
dealloc_stack %2 : $*NSObjectSubclass
return %8 : $NSObjectSubclass
}
// CHECK-LABEL: sil @anyhashable_cast_copy_on_success
// CHECK-NOT: copy_addr
// CHECK: [[BRIDGED:%.*]] = apply {{.*}}(%0)
// CHECK-NOT: destroy_addr
// CHECK-NEXT: checked_cast_br [[BRIDGED]] : $NSObject to $NSObjectSubclass, [[YES:bb[0-9]+]], [[NO:bb[0-9]+]]
// CHECK: [[YES]]{{.*}}:
// CHECK-NOT: dealloc_stack
// CHECK: [[NO]]{{.*}}:
// CHECK-NOT: dealloc_stack
sil [ossa] @anyhashable_cast_copy_on_success : $@convention(thin) (@in_guaranteed AnyHashable, @owned NSObjectSubclass) -> @owned NSObjectSubclass {
entry(%0 : $*AnyHashable, %1 : @owned $NSObjectSubclass):
%2 = alloc_stack $NSObjectSubclass
checked_cast_addr_br copy_on_success AnyHashable in %0 : $*AnyHashable
to NSObjectSubclass in %2 : $*NSObjectSubclass, bb1, bb2
bb1:
%4 = load [take] %2 : $*NSObjectSubclass
destroy_value %1 : $NSObjectSubclass
br bb3(%4 : $NSObjectSubclass)
bb2:
br bb3(%1 : $NSObjectSubclass)
bb3(%8 : @owned $NSObjectSubclass):
dealloc_stack %2 : $*NSObjectSubclass
return %8 : $NSObjectSubclass
}