blob: 482f545b640ce381d8729b378edad9ca5bad04d7 [file] [log] [blame]
// RUN: %target-sil-opt -enable-objc-interop -enable-sil-verify-all %s -split-critical-edges | %FileCheck %s
import Builtin
import Swift
sil_stage raw
enum OnePayload {
case x(Builtin.Int64)
case y
}
// CHECK-LABEL: sil @check_switch_value
// CHECK: bb0
// CHECK: cond_br %1, bb1, bb2
// CHECK: bb1:
// CHECK: integer_literal $Builtin.Int64, 1
// CHECK: br bb4
// CHECK: bb2:
// CHECK: [[VAL:%[0-9]+]] = integer_literal $Builtin.Int32, 1
// CHECK: switch_value %0 : $Builtin.Int32, case [[VAL]]: bb3, default bb5
// CHECK: bb3:
// CHECK: br bb4
// CHECK: bb4:
// CHECK: br bb6
// CHECK: bb5:
// CHECK: br bb6
// CHECK: bb6:
// CHECK: return
sil @check_switch_value : $(Builtin.Int32, Builtin.Int1) -> () {
entry(%0 : $Builtin.Int32, %1: $Builtin.Int1):
cond_br %1, bb1, bb2
bb1:
%2 = integer_literal $Builtin.Int64, 1
br x_cont
bb2:
%3 = integer_literal $Builtin.Int32, 1
switch_value %0 : $Builtin.Int32, case %3: x_dest, default y_dest
x_dest:
br x_cont
x_cont:
br end
y_dest:
br end
end:
%v = tuple ()
return %v : $()
}
class X {
@objc func f() { }
@objc class func g() { }
@objc var value : Int { get }
@objc subscript (i : Int) -> Int { get }
}
// CHECK: sil @dynamic_lookup_br : $@convention(thin) (AnyObject, Builtin.Int1) -> () {
// CHECK: bb0(
// CHECK: cond_br %1, bb1, bb2
// CHECK: bb1:
// CHECK: dynamic_method_br {{.*}} : $Builtin.UnknownObject, #X.f!1.foreign, bb3, bb4
// CHECK: bb2:
// CHECK: dynamic_method_br {{.*}} : $Builtin.UnknownObject, #X.f!1.foreign, bb5, bb6
// CHECK: bb3({{.*}} : $@convention(objc_method) (Builtin.UnknownObject) -> ())
// CHECK: br bb7
// CHECK: bb4:
// CHECK: br bb7
// CHECK: bb5({{.*}} : $@convention(objc_method) (Builtin.UnknownObject) -> ()):
// CHECK: br bb7
// CHECK: bb6:
// CHECK: br bb7
// CHECK: bb7:
// CHECK: return
// CHECK-LABEL: } // end sil function 'dynamic_lookup_br'
sil @dynamic_lookup_br : $@convention(thin) (AnyObject, Builtin.Int1) -> () {
bb0(%0 : $AnyObject, %10: $Builtin.Int1):
cond_br %10, lookup1, lookup2
lookup1:
%1 = alloc_box $_0_0> { var τ_0_0 } <AnyObject>
%1a = project_box %1 : $_0_0> { var τ_0_0 } <AnyObject>, 0
store %0 to %1a : $*AnyObject
%3 = alloc_box $_0_0> { var τ_0_0 } <Optional<() -> ()>>
%4 = load %1a : $*AnyObject
strong_retain %4 : $AnyObject
%6 = open_existential_ref %4 : $AnyObject to $@opened("01234567-89ab-cdef-0123-000000000000") AnyObject
%7 = unchecked_ref_cast %6 : $@opened("01234567-89ab-cdef-0123-000000000000") AnyObject to $Builtin.UnknownObject
dynamic_method_br %7 : $Builtin.UnknownObject, #X.f!1.foreign, bb1, bb2
lookup2:
%21 = alloc_box $_0_0> { var τ_0_0 } <AnyObject>
%21a = project_box %21 : $_0_0> { var τ_0_0 } <AnyObject>, 0
store %0 to %21a : $*AnyObject
%23 = alloc_box $_0_0> { var τ_0_0 } <Optional<() -> ()>>
%24 = load %21a : $*AnyObject
strong_retain %24 : $AnyObject
%26 = open_existential_ref %24 : $AnyObject to $@opened("12345678-89ab-cdef-0123-000000000000") AnyObject
%27 = unchecked_ref_cast %26 : $@opened("12345678-89ab-cdef-0123-000000000000") AnyObject to $Builtin.UnknownObject
dynamic_method_br %27 : $Builtin.UnknownObject, #X.f!1.foreign, bb3, bb4
bb1(%8 : $@convention(objc_method) (Builtin.UnknownObject) -> ()):
br bb5
bb2:
br bb5
bb3(%9 : $@convention(objc_method) (Builtin.UnknownObject) -> ()):
br bb5
bb4:
br bb5
bb5:
%43 = tuple ()
return %43 : $()
}
class Node {
}
class ParentNode : Node {
}
// CHECK-LABEL: sil @test_checked_cast_br
// CHECK: bb0(
// CHECK: cond_br %1, bb1, bb2
// CHECK: bb1:
// CHECK: checked_cast_br [exact] {{.*}} : $Node to $ParentNode, bb3, bb4
// CHECK: bb2:
// CHECK: checked_cast_br [exact] {{.*}} : $Node to $ParentNode, bb5, bb6
// CHECK: bb3({{.*}} : $ParentNode):
// CHECK: br bb7
// CHECK: bb4:
// CHECK: br bb7
// CHECK: bb5({{.*}} : $ParentNode):
// CHECK: br bb7
// CHECK: bb6:
// CHECK: br bb7
// CHECK: bb7:
// CHECK: return
sil @test_checked_cast_br : $@convention(method) (@owned Node, Builtin.Int1) -> () {
bb0(%0 : $Node, %2 : $Builtin.Int1):
cond_br %2, ccb1, ccb2
ccb1:
checked_cast_br [exact] %0 : $Node to $ParentNode, bb2, bb3
ccb2:
checked_cast_br [exact] %0 : $Node to $ParentNode, bb4, bb5
bb2(%5 : $ParentNode):
br bb1
bb3:
br bb1
bb4(%6 : $ParentNode):
br bb1
bb5:
br bb1
bb1:
%1 = tuple ()
return %1 : $()
}