blob: 136c56cc095b89eaf4a4057868677afc73ce9922 [file] [log] [blame]
// RUN: %target-sil-opt -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
}