| // RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -enable-sil-verify-all %s -jumpthread-simplify-cfg | %FileCheck %s |
| |
| sil_stage canonical |
| |
| import Builtin |
| import Swift |
| |
| enum DupCaseEnum { |
| case firstCase |
| case secondCase |
| } |
| |
| // CHECK-LABEL: sil @performSwitch : $@convention(thin) (Int64, @thin DupCaseEnum.Type) -> DupCaseEnum { |
| // CHECK: bb0(%0 : $Int64, %1 : $@thin DupCaseEnum.Type): |
| // CHECK: select_value |
| // CHECK: br bb1 |
| // CHECK: bb1: |
| // CHECK: return |
| sil @performSwitch : $@convention(thin) (Int64, @thin DupCaseEnum.Type) -> DupCaseEnum { |
| // %0 // users: %9, %5, %3, %2 |
| bb0(%0 : $Int64, %1 : $@thin DupCaseEnum.Type): |
| %4 = integer_literal $Builtin.Int64, 0 // user: %6 |
| %5 = struct_extract %0 : $Int64, #Int64._value // user: %6 |
| %6 = builtin "cmp_eq_Int64"(%4 : $Builtin.Int64, %5 : $Builtin.Int64) : $Builtin.Int1 // users: %10, %7 |
| cond_br %6, bb6, bb1 // id: %7 |
| |
| bb1: // Preds: bb0 |
| br bb2 // id: %8 |
| |
| bb2: // Preds: bb1 |
| cond_br %6, bb5, bb3 // id: %10 |
| |
| bb3: // Preds: bb2 |
| br bb4 // id: %11 |
| |
| bb4: // Preds: bb3 |
| %12 = enum $DupCaseEnum, #DupCaseEnum.secondCase!enumelt // user: %13 |
| br bb7(%12 : $DupCaseEnum) // id: %13 |
| |
| bb5: // Preds: bb2 |
| %14 = enum $DupCaseEnum, #DupCaseEnum.firstCase!enumelt // user: %15 |
| br bb7(%14 : $DupCaseEnum) // id: %15 |
| |
| bb6: // Preds: bb0 |
| %16 = enum $DupCaseEnum, #DupCaseEnum.firstCase!enumelt // user: %17 |
| br bb7(%16 : $DupCaseEnum) // id: %17 |
| |
| // %18 // user: %19 |
| bb7(%18 : $DupCaseEnum): // Preds: bb6 bb5 bb4 |
| return %18 : $DupCaseEnum // id: %19 |
| } |
| |
| // CHECK-LABEL: sil @performSwitch_bail_out : $@convention(thin) (Int64, @thin DupCaseEnum.Type) -> DupCaseEnum { |
| // CHECK: bb0(%0 : $Int64, %1 : $@thin DupCaseEnum.Type): |
| // CHECK-NOT: select_value |
| // CHECK-NOT: br bb1 |
| // CHECK: cond_br |
| sil @performSwitch_bail_out : $@convention(thin) (Int64, @thin DupCaseEnum.Type) -> DupCaseEnum { |
| // %0 // users: %9, %5, %3, %2 |
| bb0(%0 : $Int64, %1 : $@thin DupCaseEnum.Type): |
| %4 = integer_literal $Builtin.Int64, 0 // user: %6 |
| %5 = struct_extract %0 : $Int64, #Int64._value // user: %6 |
| %6 = builtin "cmp_eq_Int64"(%4 : $Builtin.Int64, %5 : $Builtin.Int64) : $Builtin.Int1 // users: %10, %7 |
| cond_br %6, bb6, bb1 // id: %7 |
| |
| bb1: // Preds: bb0 |
| br bb2 // id: %8 |
| |
| bb2: // Preds: bb1 |
| cond_br %6, bb5, bb3 // id: %10 |
| |
| bb3: // Preds: bb2 |
| br bb4 // id: %11 |
| |
| bb4: // Preds: bb3 |
| %12 = enum $DupCaseEnum, #DupCaseEnum.secondCase!enumelt // user: %13 |
| br bb7(%12 : $DupCaseEnum) // id: %13 |
| |
| bb5: // Preds: bb2 |
| %14 = enum $DupCaseEnum, #DupCaseEnum.secondCase!enumelt // user: %15 |
| br bb7(%14 : $DupCaseEnum) // id: %15 |
| |
| bb6: // Preds: bb0 |
| %16 = enum $DupCaseEnum, #DupCaseEnum.firstCase!enumelt // user: %17 |
| br bb7(%16 : $DupCaseEnum) // id: %17 |
| |
| // %18 // user: %19 |
| bb7(%18 : $DupCaseEnum): // Preds: bb6 bb5 bb4 |
| return %18 : $DupCaseEnum // id: %19 |
| } |