| // 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 : $() |
| } |