| // RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -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_enum |
| // CHECK: bb0( |
| // CHECK: cond_br %1, bb1, bb2 |
| // CHECK: bb1: |
| // CHECK: integer_literal $Builtin.Int64, 1 |
| // CHECK: br bb4( |
| // CHECK: bb2: |
| // CHECK: switch_enum {{.*}} : $OnePayload, case #OnePayload.x!enumelt.1: bb3, case #OnePayload.y!enumelt: bb5 |
| // CHECK: bb3([[PAYLOAD:%.]] : $Builtin.Int64): |
| // CHECK: br bb4([[PAYLOAD]] : $Builtin.Int64) |
| // CHECK: bb4([[VAL:%.*]] : $Builtin.Int64): |
| // CHECK: struct $Int64 ([[VAL]] : $Builtin.Int64) |
| // CHECK: br bb6 |
| // CHECK: bb5: |
| // CHECK: br bb6 |
| // CHECK: bb6: |
| // CHECK: return |
| |
| sil @check_switch_enum : $(OnePayload, Builtin.Int1) -> () { |
| entry(%0 : $OnePayload, %1: $Builtin.Int1): |
| cond_br %1, bb1, bb2 |
| |
| bb1: |
| %2 = integer_literal $Builtin.Int64, 1 |
| br x_dest(%2 : $Builtin.Int64) |
| |
| bb2: |
| switch_enum %0 : $OnePayload, case #OnePayload.x!enumelt.1: x_dest, case #OnePayload.y!enumelt: y_dest |
| |
| x_dest(%4: $Builtin.Int64): |
| %5 = struct $Int64 (%4 : $Builtin.Int64) |
| br end |
| |
| y_dest: |
| br end |
| |
| end: |
| %v = tuple () |
| return %v : $() |
| } |
| |
| // 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_dest |
| bb2: |
| %3 = integer_literal $Builtin.Int32, 1 |
| switch_value %0 : $Builtin.Int32, case %3: x_dest, default y_dest |
| |
| x_dest: |
| 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, bb4 |
| // CHECK: bb1: |
| // CHECK: dynamic_method_br {{.*}} : $Builtin.UnknownObject, #X.f!1.foreign, bb3, bb2 |
| // CHECK: bb2: |
| // CHECK: br bb8 |
| // CHECK: bb3({{.*}} : $@convention(objc_method) (Builtin.UnknownObject) -> ()) |
| // CHECK: br bb7({{.*}} : $@convention(objc_method) (Builtin.UnknownObject) -> ()) |
| // CHECK: bb4: |
| // CHECK: dynamic_method_br {{.*}} : $Builtin.UnknownObject, #X.f!1.foreign, bb6, bb5 |
| // CHECK: bb5: |
| // CHECK: br bb8 |
| // CHECK: bb6({{.*}} : $@convention(objc_method) (Builtin.UnknownObject) -> ()): |
| // CHECK: br bb7({{.*}} : $@convention(objc_method) (Builtin.UnknownObject) -> ()) |
| // CHECK: bb7({{.*}} : $@convention(objc_method) (Builtin.UnknownObject) -> ()): |
| // CHECK: br bb9 |
| // CHECK: bb8: |
| // CHECK: br bb9 |
| // CHECK: bb9: |
| // CHECK: return |
| |
| 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, bb1, bb2 |
| |
| bb1(%8 : $@convention(objc_method) (Builtin.UnknownObject) -> ()): |
| br bb3 |
| |
| bb2: |
| br bb3 |
| |
| bb3: |
| %43 = tuple () |
| return %43 : $() |
| } |
| |
| class Node { |
| } |
| |
| class ParentNode : Node { |
| } |
| |
| // CHECK-LABEL: sil @test_checked_cast_br |
| // CHECK: bb0( |
| // CHECK: cond_br %1, bb1, bb4 |
| // CHECK: bb1: |
| // CHECK: checked_cast_br [exact] {{.*}} : $Node to $ParentNode, bb3, bb2 |
| // CHECK: bb2: |
| // CHECK: br bb8 |
| // CHECK: bb3({{.*}} : $ParentNode): |
| // CHECK: br bb7({{.*}} : $ParentNode) |
| // CHECK: bb4: |
| // CHECK: checked_cast_br [exact] {{.*}} : $Node to $ParentNode, bb6, bb5 |
| // CHECK: bb5: |
| // CHECK: br bb8 |
| // CHECK: bb6({{.*}} : $ParentNode): |
| // CHECK: br bb7({{.*}} : $ParentNode) |
| // CHECK: bb7({{.*}} : $ParentNode): |
| // CHECK: br bb9 |
| // CHECK: bb8: |
| // CHECK: br bb9 |
| // CHECK: bb9: |
| // 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, bb2, bb3 |
| |
| bb2(%5 : $ParentNode): |
| br bb1 |
| |
| bb3: |
| br bb1 |
| |
| bb1: |
| %1 = tuple () |
| return %1 : $() |
| } |