| // RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -enable-sil-verify-all %s -sil-combine | %FileCheck %s |
| |
| // REQUIRES: objc_interop |
| |
| sil_stage canonical |
| |
| import Builtin |
| import Swift |
| import SwiftShims |
| |
| @objc(XX) protocol X { |
| } |
| |
| class XImpl : X { |
| @objc deinit |
| init() |
| } |
| |
| // (thick_to_objc_metatype (metatype @thick)) -> (metatype @objc_metatype) |
| // |
| // CHECK-LABEL: sil @_TF31peephole_thick_to_objc_metatype36test_thick_to_objc_metatype_metatypeFT_Ps9AnyObject_ : $@convention(thin) () -> @owned AnyObject |
| // CHECK-NOT: metatype $@thick |
| // CHECK-NOT: {{thick_to_objc_metatype }} |
| // CHECK: metatype $@objc_metatype |
| // CHECK: return |
| // peephole_thick_to_objc_metatype.test_thick_to_objc_metatype_metatype () -> Swift.AnyObject |
| sil @_TF31peephole_thick_to_objc_metatype36test_thick_to_objc_metatype_metatypeFT_Ps9AnyObject_ : $@convention(thin) () -> @owned AnyObject { |
| bb0: |
| %0 = metatype $@thick XImpl.Type // users: %1, %2 |
| %2 = thick_to_objc_metatype %0 : $@thick XImpl.Type to $@objc_metatype XImpl.Type // user: %3 |
| %3 = objc_metatype_to_object %2 : $@objc_metatype XImpl.Type to $AnyObject // user: %4 |
| return %3 : $AnyObject // id: %4 |
| } |
| |
| // (thick_to_objc_metatype (existential_metatype @thick)) -> (existential_metatype @objc_metatype) |
| // |
| // CHECK-LABEL: sil @_TF31peephole_thick_to_objc_metatype48test_thick_to_objc_metatype_existential_metatypeFPS_1X_Ps9AnyObject_ : $@convention(thin) (@owned X) -> @owned AnyObject |
| // CHECK-NOT: existential_metatype $@thick |
| // CHECK-NOT: {{thick_to_objc_metatype }} |
| // CHECK: existential_metatype $@objc_metatype |
| // CHECK: return |
| // peephole_thick_to_objc_metatype.test_thick_to_objc_metatype_existential_metatype (peephole_thick_to_objc_metatype.X) -> Swift.AnyObject |
| sil @_TF31peephole_thick_to_objc_metatype48test_thick_to_objc_metatype_existential_metatypeFPS_1X_Ps9AnyObject_ : $@convention(thin) (@owned X) -> @owned AnyObject { |
| bb0(%0 : $X): |
| debug_value %0 : $X, let, name "o" // id: %1 |
| %2 = existential_metatype $@thick X.Type, %0 : $X // user: %3 |
| %3 = thick_to_objc_metatype %2 : $@thick X.Type to $@objc_metatype X.Type // user: %4 |
| %4 = objc_existential_metatype_to_object %3 : $@objc_metatype X.Type to $AnyObject // users: %5, %7 |
| debug_value %4 : $AnyObject, let, name "Ty" // id: %5 |
| strong_release %0 : $X // id: %6 |
| return %4 : $AnyObject // id: %7 |
| } |
| |
| // (thick_to_objc_metatype (value_metatype @thick)) -> (value_metatype @objc_metatype) |
| // |
| // CHECK-LABEL: sil @_TF31peephole_thick_to_objc_metatype42test_thick_to_objc_metatype_value_metatypeUs9AnyObject__FQ_PS0__ : $@convention(thin) <T where T : AnyObject> (@owned T) -> @owned An |
| // CHECK-NOT: value_metatype $@thick |
| // CHECK-NOT: {{thick_to_objc_metatype }} |
| // CHECK: value_metatype $@objc_metatype |
| // CHECK: return |
| // peephole_thick_to_objc_metatype.test_thick_to_objc_metatype_value_metatype <A : Swift.AnyObject>(A) -> Swift.AnyObject |
| sil @_TF31peephole_thick_to_objc_metatype42test_thick_to_objc_metatype_value_metatypeUs9AnyObject__FQ_PS0__ : $@convention(thin) <T where T : AnyObject> (@owned T) -> @owned AnyObject { |
| bb0(%0 : $T): |
| debug_value %0 : $T, let, name "o" // id: %1 |
| %2 = value_metatype $@thick T.Type, %0 : $T // user: %3 |
| %3 = thick_to_objc_metatype %2 : $@thick T.Type to $@objc_metatype T.Type // user: %4 |
| %4 = objc_metatype_to_object %3 : $@objc_metatype T.Type to $AnyObject // users: %5, %7 |
| debug_value %4 : $AnyObject, let, name "Ty" // id: %5 |
| strong_release %0 : $T // id: %6 |
| return %4 : $AnyObject // id: %7 |
| } |
| |
| // (objc_to_thick_metatype (metatype @objc_metatype)) -> (metatype @thick) |
| // |
| // CHECK-LABEL: sil @_TF31peephole_thick_to_objc_metatype36test_objc_to_thick_metatype_metatypeFT_Ps9AnyObject_ : $@convention(thin) () -> @thick XImpl.Type |
| // CHECK-NOT: metatype $@objc_metatype |
| // CHECK-NOT: {{objc_to_thick_metatype }} |
| // CHECK: metatype $@thick |
| // CHECK: return |
| sil @_TF31peephole_thick_to_objc_metatype36test_objc_to_thick_metatype_metatypeFT_Ps9AnyObject_ : $@convention(thin) () -> @thick XImpl.Type { |
| bb0: |
| %0 = metatype $@objc_metatype XImpl.Type // users: %1, %2 |
| %2 = objc_to_thick_metatype %0 : $@objc_metatype XImpl.Type to $@thick XImpl.Type |
| return %2 : $@thick XImpl.Type |
| } |
| |
| // (objc_to_objc_metatype (existential_metatype @objc_metatype)) -> (existential_metatype @thick) |
| // |
| // CHECK-LABEL: sil @_TF31peephole_thick_to_objc_metatype48test_objc_to_thick_metatype_existential_metatypeFPS_1X_Ps9AnyObject_ : $@convention(thin) (@owned X) -> @thick X.Type |
| // CHECK-NOT: existential_metatype $@objc_metatype |
| // CHECK-NOT: {{objc_to_thick_metatype }} |
| // CHECK: existential_metatype $@thick |
| // CHECK: return |
| sil @_TF31peephole_thick_to_objc_metatype48test_objc_to_thick_metatype_existential_metatypeFPS_1X_Ps9AnyObject_ : $@convention(thin) (@owned X) -> @thick X.Type { |
| bb0(%0 : $X): |
| debug_value %0 : $X, let, name "o" // id: %1 |
| %2 = existential_metatype $@objc_metatype X.Type, %0 : $X // user: %3 |
| %3 = objc_to_thick_metatype %2 : $@objc_metatype X.Type to $@thick X.Type // user: %4 |
| strong_release %0 : $X |
| return %3 : $@thick X.Type |
| } |
| |
| // (objc_to_thick_metatype (value_metatype @objc_metatype)) -> (value_metatype @thick) |
| // |
| // CHECK-LABEL: sil @_TF31peephole_thick_to_objc_metatype42test_objc_to_thick_metatype_value_metatypeUs9AnyObject__FQ_PS0__ : $@convention(thin) <T where T : AnyObject> (@owned T) -> @thick T.Type |
| // CHECK-NOT: value_metatype $@objc_metatype |
| // CHECK-NOT: {{objc_to_thick_metatype }} |
| // CHECK: value_metatype $@thick |
| // CHECK: return |
| sil @_TF31peephole_thick_to_objc_metatype42test_objc_to_thick_metatype_value_metatypeUs9AnyObject__FQ_PS0__ : $@convention(thin) <T where T : AnyObject> (@owned T) -> @thick T.Type { |
| bb0(%0 : $T): |
| debug_value %0 : $T, let, name "o" // id: %1 |
| %2 = value_metatype $@objc_metatype T.Type, %0 : $T // user: %3 |
| %3 = objc_to_thick_metatype %2 : $@objc_metatype T.Type to $@thick T.Type // user: %4 |
| strong_release %0 : $T |
| return %3 : $@thick T.Type |
| } |