| // RUN: %target-swift-frontend -primary-file %s -O -disable-llvm-optzns -emit-ir | FileCheck %s |
| |
| enum NoPayload { |
| case E0 |
| case E1 |
| case E2 |
| case E3 |
| } |
| |
| // Check if the code of a select_num is a simple int cast and not a switch. |
| |
| // CHECK-LABEL: define {{.*}}selectDirect |
| // CHECK: %1 = zext i2 %0 to i32 |
| // CHECK: ret i32 %1 |
| |
| @inline(never) |
| func selectDirect(e: NoPayload) -> Int32 { |
| switch e { |
| case .E0: |
| return 0 |
| case .E1: |
| return 1 |
| case .E2: |
| return 2 |
| case .E3: |
| return 3 |
| } |
| } |
| |
| // CHECK-LABEL: define {{.*}}selectNegOffset |
| // CHECK: %1 = zext i2 %0 to i32 |
| // CHECK: %2 = add i32 %1, -6 |
| // CHECK: ret i32 %2 |
| |
| @inline(never) |
| func selectNegOffset(e: NoPayload) -> Int32 { |
| switch e { |
| case .E0: |
| return -6 |
| case .E1: |
| return -5 |
| case .E2: |
| return -4 |
| case .E3: |
| return -3 |
| } |
| } |
| |
| // CHECK-LABEL: define {{.*}}selectPosOffset |
| // CHECK: %1 = zext i2 %0 to i32 |
| // CHECK: %2 = add i32 %1, 3 |
| // CHECK: ret i32 %2 |
| |
| @inline(never) |
| func selectPosOffset(e: NoPayload) -> Int32 { |
| switch e { |
| case .E0: |
| return 3 |
| case .E1: |
| return 4 |
| case .E2: |
| return 5 |
| case .E3: |
| return 6 |
| } |
| } |
| |
| // Following functions contain select_enums, which cannot be generated as a |
| // simple conversion. |
| |
| // CHECK-LABEL: define {{.*}}selectWithDefault |
| // CHECK: switch i2 |
| // CHECK: ret |
| |
| @inline(never) |
| func selectWithDefault(e: NoPayload) -> Int32 { |
| switch e { |
| case .E0: |
| return 0 |
| case .E1: |
| return 1 |
| default: |
| return 2 |
| } |
| } |
| |
| // CHECK-LABEL: define {{.*}}selectNonContiguous |
| // CHECK: switch i2 |
| // CHECK: ret |
| |
| @inline(never) |
| func selectNonContiguous(e: NoPayload) -> Int32 { |
| switch e { |
| case .E0: |
| return 0 |
| case .E1: |
| return 1 |
| case .E2: |
| return 3 |
| case .E3: |
| return 4 |
| } |
| } |
| |
| var gg : Int32 = 10 |
| |
| // CHECK-LABEL: define {{.*}}selectNonConstant |
| // CHECK: switch i2 |
| // CHECK: ret |
| |
| @inline(never) |
| func selectNonConstant(e: NoPayload) -> Int32 { |
| switch e { |
| case .E0: |
| return 0 |
| case .E1: |
| return 1 |
| case .E2: |
| return gg |
| case .E3: |
| return 4 |
| } |
| } |
| |
| // CHECK-LABEL: define {{.*}}selectTuple |
| // CHECK: switch i2 |
| // CHECK: ret |
| |
| @inline(never) |
| func selectTuple(e: NoPayload) -> (Int32, Int32) { |
| switch e { |
| case .E0: |
| return (0, 1) |
| case .E1: |
| return (1, 2) |
| case .E2: |
| return (2, 3) |
| case .E3: |
| return (3, 4) |
| } |
| } |
| |
| // CHECK-LABEL: define {{.*}}selectNonInt |
| // CHECK: switch i2 |
| // CHECK: ret |
| |
| @inline(never) |
| func selectNonInt(e: NoPayload) -> String { |
| switch e { |
| case .E0: |
| return "a" |
| case .E1: |
| return "ab" |
| case .E2: |
| return "abc" |
| case .E3: |
| return "abcd" |
| } |
| } |
| |