blob: c9063d3ec26ff0ee006ac3a8e85685b11b50e4f0 [file] [log] [blame]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S -passes='simplifycfg' < %s | FileCheck %s --check-prefix=OPTNOLUT
; RUN: %if amdgpu-registered-target %{ opt -mtriple=amdgcn--amdpal -S -passes='simplifycfg<switch-to-lookup>' < %s | FileCheck %s --check-prefix=TTINOLUT %}
;
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
define i32 @linear_transform_with_default(i32 %x) {
; OPTNOLUT-LABEL: define i32 @linear_transform_with_default(
; OPTNOLUT-SAME: i32 [[X:%.*]]) {
; OPTNOLUT-NEXT: [[ENTRY:.*]]:
; OPTNOLUT-NEXT: switch i32 [[X]], label %[[END:.*]] [
; OPTNOLUT-NEXT: i32 0, label %[[CASE0:.*]]
; OPTNOLUT-NEXT: i32 1, label %[[CASE1:.*]]
; OPTNOLUT-NEXT: i32 2, label %[[CASE2:.*]]
; OPTNOLUT-NEXT: i32 3, label %[[CASE3:.*]]
; OPTNOLUT-NEXT: ]
; OPTNOLUT: [[CASE0]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[CASE1]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[CASE2]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[CASE3]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[END]]:
; OPTNOLUT-NEXT: [[IDX:%.*]] = phi i32 [ 1, %[[CASE0]] ], [ 4, %[[CASE1]] ], [ 7, %[[CASE2]] ], [ 10, %[[CASE3]] ], [ 13, %[[ENTRY]] ]
; OPTNOLUT-NEXT: ret i32 [[IDX]]
;
; TTINOLUT-LABEL: define i32 @linear_transform_with_default(
; TTINOLUT-SAME: i32 [[X:%.*]]) {
; TTINOLUT-NEXT: [[ENTRY:.*]]:
; TTINOLUT-NEXT: [[TMP0:%.*]] = icmp ult i32 [[X]], 4
; TTINOLUT-NEXT: br i1 [[TMP0]], label %[[SWITCH_LOOKUP:.*]], label %[[END:.*]]
; TTINOLUT: [[SWITCH_LOOKUP]]:
; TTINOLUT-NEXT: [[SWITCH_IDX_MULT:%.*]] = mul nsw i32 [[X]], 3
; TTINOLUT-NEXT: [[SWITCH_OFFSET:%.*]] = add nsw i32 [[SWITCH_IDX_MULT]], 1
; TTINOLUT-NEXT: br label %[[END]]
; TTINOLUT: [[END]]:
; TTINOLUT-NEXT: [[IDX:%.*]] = phi i32 [ 13, %[[ENTRY]] ], [ [[SWITCH_OFFSET]], %[[SWITCH_LOOKUP]] ]
; TTINOLUT-NEXT: ret i32 [[IDX]]
;
entry:
switch i32 %x, label %end [
i32 0, label %case0
i32 1, label %case1
i32 2, label %case2
i32 3, label %case3
]
case0:
br label %end
case1:
br label %end
case2:
br label %end
case3:
br label %end
end:
%idx = phi i32 [ 1, %case0 ], [ 4, %case1 ], [ 7, %case2 ], [ 10, %case3 ], [ 13, %entry ]
ret i32 %idx
}
define i32 @linear_transform_with_outlier(i32 %x) {
; OPTNOLUT-LABEL: define i32 @linear_transform_with_outlier(
; OPTNOLUT-SAME: i32 [[X:%.*]]) {
; OPTNOLUT-NEXT: [[ENTRY:.*]]:
; OPTNOLUT-NEXT: switch i32 [[X]], label %[[END:.*]] [
; OPTNOLUT-NEXT: i32 0, label %[[CASE0:.*]]
; OPTNOLUT-NEXT: i32 1, label %[[CASE1:.*]]
; OPTNOLUT-NEXT: i32 2, label %[[CASE2:.*]]
; OPTNOLUT-NEXT: i32 3, label %[[CASE3:.*]]
; OPTNOLUT-NEXT: i32 4, label %[[CASE4:.*]]
; OPTNOLUT-NEXT: ]
; OPTNOLUT: [[CASE0]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[CASE1]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[CASE2]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[CASE3]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[CASE4]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[END]]:
; OPTNOLUT-NEXT: [[IDX:%.*]] = phi i32 [ 0, %[[CASE0]] ], [ 3, %[[CASE1]] ], [ 6, %[[CASE2]] ], [ 9, %[[CASE3]] ], [ 13, %[[CASE4]] ], [ 12, %[[ENTRY]] ]
; OPTNOLUT-NEXT: ret i32 [[IDX]]
;
; TTINOLUT-LABEL: define i32 @linear_transform_with_outlier(
; TTINOLUT-SAME: i32 [[X:%.*]]) {
; TTINOLUT-NEXT: [[ENTRY:.*]]:
; TTINOLUT-NEXT: switch i32 [[X]], label %[[END:.*]] [
; TTINOLUT-NEXT: i32 0, label %[[CASE0:.*]]
; TTINOLUT-NEXT: i32 1, label %[[CASE1:.*]]
; TTINOLUT-NEXT: i32 2, label %[[CASE2:.*]]
; TTINOLUT-NEXT: i32 3, label %[[CASE3:.*]]
; TTINOLUT-NEXT: i32 4, label %[[CASE4:.*]]
; TTINOLUT-NEXT: ]
; TTINOLUT: [[CASE0]]:
; TTINOLUT-NEXT: br label %[[END]]
; TTINOLUT: [[CASE1]]:
; TTINOLUT-NEXT: br label %[[END]]
; TTINOLUT: [[CASE2]]:
; TTINOLUT-NEXT: br label %[[END]]
; TTINOLUT: [[CASE3]]:
; TTINOLUT-NEXT: br label %[[END]]
; TTINOLUT: [[CASE4]]:
; TTINOLUT-NEXT: br label %[[END]]
; TTINOLUT: [[END]]:
; TTINOLUT-NEXT: [[IDX:%.*]] = phi i32 [ 0, %[[CASE0]] ], [ 3, %[[CASE1]] ], [ 6, %[[CASE2]] ], [ 9, %[[CASE3]] ], [ 13, %[[CASE4]] ], [ 12, %[[ENTRY]] ]
; TTINOLUT-NEXT: ret i32 [[IDX]]
;
entry:
switch i32 %x, label %end [
i32 0, label %case0
i32 1, label %case1
i32 2, label %case2
i32 3, label %case3
i32 4, label %case4
]
case0:
br label %end
case1:
br label %end
case2:
br label %end
case3:
br label %end
case4:
br label %end
end:
%idx = phi i32 [ 0, %case0 ], [ 3, %case1 ], [ 6, %case2 ], [ 9, %case3 ], [ 13, %case4 ], [ 12, %entry ]
ret i32 %idx
}
define i32 @linear_transform_no_default(i32 %x) {
; OPTNOLUT-LABEL: define i32 @linear_transform_no_default(
; OPTNOLUT-SAME: i32 [[X:%.*]]) {
; OPTNOLUT-NEXT: [[ENTRY:.*]]:
; OPTNOLUT-NEXT: switch i32 [[X]], label %[[DEFAULT:.*]] [
; OPTNOLUT-NEXT: i32 0, label %[[END:.*]]
; OPTNOLUT-NEXT: i32 1, label %[[CASE1:.*]]
; OPTNOLUT-NEXT: i32 2, label %[[CASE2:.*]]
; OPTNOLUT-NEXT: i32 3, label %[[CASE3:.*]]
; OPTNOLUT-NEXT: i32 4, label %[[CASE4:.*]]
; OPTNOLUT-NEXT: ]
; OPTNOLUT: [[CASE1]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[CASE2]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[CASE3]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[CASE4]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[DEFAULT]]:
; OPTNOLUT-NEXT: unreachable
; OPTNOLUT: [[END]]:
; OPTNOLUT-NEXT: [[SWITCH_IDX_MULT:%.*]] = phi i32 [ 3, %[[CASE1]] ], [ 6, %[[CASE2]] ], [ 9, %[[CASE3]] ], [ 12, %[[CASE4]] ], [ 0, %[[ENTRY]] ]
; OPTNOLUT-NEXT: ret i32 [[SWITCH_IDX_MULT]]
;
; TTINOLUT-LABEL: define i32 @linear_transform_no_default(
; TTINOLUT-SAME: i32 [[X:%.*]]) {
; TTINOLUT-NEXT: [[ENTRY:.*:]]
; TTINOLUT-NEXT: [[IDX:%.*]] = mul nsw i32 [[X]], 3
; TTINOLUT-NEXT: ret i32 [[IDX]]
;
entry:
switch i32 %x, label %default [
i32 0, label %case0
i32 1, label %case1
i32 2, label %case2
i32 3, label %case3
i32 4, label %case4
]
case0:
br label %end
case1:
br label %end
case2:
br label %end
case3:
br label %end
case4:
br label %end
default:
unreachable
end:
%idx = phi i32 [ 0, %case0 ], [ 3, %case1 ], [ 6, %case2 ], [ 9, %case3 ], [ 12, %case4 ]
ret i32 %idx
}
define i4 @bitmap_no_default(i32 %x) {
; OPTNOLUT-LABEL: define i4 @bitmap_no_default(
; OPTNOLUT-SAME: i32 [[X:%.*]]) {
; OPTNOLUT-NEXT: [[ENTRY:.*]]:
; OPTNOLUT-NEXT: switch i32 [[X]], label %[[DEFAULT:.*]] [
; OPTNOLUT-NEXT: i32 0, label %[[END:.*]]
; OPTNOLUT-NEXT: i32 1, label %[[CASE1:.*]]
; OPTNOLUT-NEXT: i32 2, label %[[CASE2:.*]]
; OPTNOLUT-NEXT: i32 3, label %[[CASE3:.*]]
; OPTNOLUT-NEXT: ]
; OPTNOLUT: [[CASE1]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[CASE2]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[CASE3]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[DEFAULT]]:
; OPTNOLUT-NEXT: unreachable
; OPTNOLUT: [[END]]:
; OPTNOLUT-NEXT: [[SWITCH_MASKED:%.*]] = phi i4 [ 2, %[[CASE1]] ], [ 4, %[[CASE2]] ], [ -8, %[[CASE3]] ], [ 0, %[[ENTRY]] ]
; OPTNOLUT-NEXT: ret i4 [[SWITCH_MASKED]]
;
; TTINOLUT-LABEL: define i4 @bitmap_no_default(
; TTINOLUT-SAME: i32 [[X:%.*]]) {
; TTINOLUT-NEXT: [[ENTRY:.*:]]
; TTINOLUT-NEXT: [[SWITCH_CAST:%.*]] = trunc i32 [[X]] to i16
; TTINOLUT-NEXT: [[SWITCH_SHIFTAMT:%.*]] = mul nuw nsw i16 [[SWITCH_CAST]], 4
; TTINOLUT-NEXT: [[SWITCH_DOWNSHIFT:%.*]] = lshr i16 -31712, [[SWITCH_SHIFTAMT]]
; TTINOLUT-NEXT: [[IDX:%.*]] = trunc i16 [[SWITCH_DOWNSHIFT]] to i4
; TTINOLUT-NEXT: ret i4 [[IDX]]
;
entry:
switch i32 %x, label %default [
i32 0, label %case0
i32 1, label %case1
i32 2, label %case2
i32 3, label %case3
]
case0:
br label %end
case1:
br label %end
case2:
br label %end
case3:
br label %end
default:
unreachable
end:
%idx = phi i4 [ 0, %case0 ], [ 2, %case1 ], [ 4, %case2 ], [ 8, %case3 ]
ret i4 %idx
}
define i4 @bitmap_with_default(i32 %x) {
; OPTNOLUT-LABEL: define i4 @bitmap_with_default(
; OPTNOLUT-SAME: i32 [[X:%.*]]) {
; OPTNOLUT-NEXT: [[ENTRY:.*]]:
; OPTNOLUT-NEXT: switch i32 [[X]], label %[[DEFAULT:.*]] [
; OPTNOLUT-NEXT: i32 0, label %[[END:.*]]
; OPTNOLUT-NEXT: i32 1, label %[[CASE1:.*]]
; OPTNOLUT-NEXT: i32 2, label %[[CASE2:.*]]
; OPTNOLUT-NEXT: i32 3, label %[[CASE3:.*]]
; OPTNOLUT-NEXT: ]
; OPTNOLUT: [[CASE1]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[CASE2]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[CASE3]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[DEFAULT]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[END]]:
; OPTNOLUT-NEXT: [[IDX:%.*]] = phi i4 [ 2, %[[CASE1]] ], [ 4, %[[CASE2]] ], [ -8, %[[CASE3]] ], [ -1, %[[DEFAULT]] ], [ 0, %[[ENTRY]] ]
; OPTNOLUT-NEXT: ret i4 [[IDX]]
;
; TTINOLUT-LABEL: define i4 @bitmap_with_default(
; TTINOLUT-SAME: i32 [[X:%.*]]) {
; TTINOLUT-NEXT: [[ENTRY:.*]]:
; TTINOLUT-NEXT: [[TMP0:%.*]] = icmp ult i32 [[X]], 4
; TTINOLUT-NEXT: br i1 [[TMP0]], label %[[SWITCH_LOOKUP:.*]], label %[[END:.*]]
; TTINOLUT: [[SWITCH_LOOKUP]]:
; TTINOLUT-NEXT: [[SWITCH_CAST:%.*]] = trunc i32 [[X]] to i16
; TTINOLUT-NEXT: [[SWITCH_SHIFTAMT:%.*]] = mul nuw nsw i16 [[SWITCH_CAST]], 4
; TTINOLUT-NEXT: [[SWITCH_DOWNSHIFT:%.*]] = lshr i16 -31712, [[SWITCH_SHIFTAMT]]
; TTINOLUT-NEXT: [[SWITCH_MASKED:%.*]] = trunc i16 [[SWITCH_DOWNSHIFT]] to i4
; TTINOLUT-NEXT: br label %[[END]]
; TTINOLUT: [[END]]:
; TTINOLUT-NEXT: [[IDX:%.*]] = phi i4 [ [[SWITCH_MASKED]], %[[SWITCH_LOOKUP]] ], [ -1, %[[ENTRY]] ]
; TTINOLUT-NEXT: ret i4 [[IDX]]
;
entry:
switch i32 %x, label %default [
i32 0, label %case0
i32 1, label %case1
i32 2, label %case2
i32 3, label %case3
]
case0:
br label %end
case1:
br label %end
case2:
br label %end
case3:
br label %end
default:
br label %end
end:
%idx = phi i4 [ 0, %case0 ], [ 2, %case1 ], [ 4, %case2 ], [ 8, %case3 ], [15, %default]
ret i4 %idx
}
define i32 @single_value_no_default(i32 %x) {
; OPTNOLUT-LABEL: define i32 @single_value_no_default(
; OPTNOLUT-SAME: i32 [[X:%.*]]) {
; OPTNOLUT-NEXT: [[ENTRY:.*:]]
; OPTNOLUT-NEXT: ret i32 2
;
; TTINOLUT-LABEL: define i32 @single_value_no_default(
; TTINOLUT-SAME: i32 [[X:%.*]]) {
; TTINOLUT-NEXT: [[ENTRY:.*:]]
; TTINOLUT-NEXT: ret i32 2
;
entry:
switch i32 %x, label %default [
i32 0, label %case0
i32 1, label %case1
i32 2, label %case2
i32 3, label %case3
i32 4, label %case4
]
case0:
br label %end
case1:
br label %end
case2:
br label %end
case3:
br label %end
case4:
br label %end
default:
unreachable
end:
%idx = phi i32 [ 2, %case0 ], [ 2, %case1 ], [ 2, %case2 ], [ 2, %case3 ], [ 2, %case4 ]
ret i32 %idx
}
define i32 @single_value_withdefault(i32 %x) {
; OPTNOLUT-LABEL: define i32 @single_value_withdefault(
; OPTNOLUT-SAME: i32 [[X:%.*]]) {
; OPTNOLUT-NEXT: [[ENTRY:.*]]:
; OPTNOLUT-NEXT: switch i32 [[X]], label %[[DEFAULT:.*]] [
; OPTNOLUT-NEXT: i32 0, label %[[END:.*]]
; OPTNOLUT-NEXT: i32 1, label %[[END]]
; OPTNOLUT-NEXT: i32 2, label %[[END]]
; OPTNOLUT-NEXT: i32 3, label %[[END]]
; OPTNOLUT-NEXT: i32 4, label %[[END]]
; OPTNOLUT-NEXT: ]
; OPTNOLUT: [[DEFAULT]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[END]]:
; OPTNOLUT-NEXT: [[DOT:%.*]] = phi i32 [ 3, %[[DEFAULT]] ], [ 2, %[[ENTRY]] ], [ 2, %[[ENTRY]] ], [ 2, %[[ENTRY]] ], [ 2, %[[ENTRY]] ], [ 2, %[[ENTRY]] ]
; OPTNOLUT-NEXT: ret i32 [[DOT]]
;
; TTINOLUT-LABEL: define i32 @single_value_withdefault(
; TTINOLUT-SAME: i32 [[X:%.*]]) {
; TTINOLUT-NEXT: [[ENTRY:.*:]]
; TTINOLUT-NEXT: [[TMP0:%.*]] = icmp ult i32 [[X]], 5
; TTINOLUT-NEXT: [[IDX:%.*]] = select i1 [[TMP0]], i32 2, i32 3
; TTINOLUT-NEXT: ret i32 [[IDX]]
;
entry:
switch i32 %x, label %default [
i32 0, label %case0
i32 1, label %case1
i32 2, label %case2
i32 3, label %case3
i32 4, label %case4
]
case0:
br label %end
case1:
br label %end
case2:
br label %end
case3:
br label %end
case4:
br label %end
default:
br label %end
end:
%idx = phi i32 [ 2, %case0 ], [ 2, %case1 ], [ 2, %case2 ], [ 2, %case3 ], [ 2, %case4 ], [ 3, %default ]
ret i32 %idx
}
define i32 @single_value_no_jump_tables(i32 %x) "no-jump-tables"="true" {
; OPTNOLUT-LABEL: define i32 @single_value_no_jump_tables(
; OPTNOLUT-SAME: i32 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
; OPTNOLUT-NEXT: [[ENTRY:.*]]:
; OPTNOLUT-NEXT: switch i32 [[X]], label %[[DEFAULT:.*]] [
; OPTNOLUT-NEXT: i32 0, label %[[END:.*]]
; OPTNOLUT-NEXT: i32 1, label %[[END]]
; OPTNOLUT-NEXT: i32 2, label %[[END]]
; OPTNOLUT-NEXT: i32 3, label %[[END]]
; OPTNOLUT-NEXT: i32 4, label %[[END]]
; OPTNOLUT-NEXT: ]
; OPTNOLUT: [[DEFAULT]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[END]]:
; OPTNOLUT-NEXT: [[IDX:%.*]] = phi i32 [ 3, %[[DEFAULT]] ], [ 2, %[[ENTRY]] ], [ 2, %[[ENTRY]] ], [ 2, %[[ENTRY]] ], [ 2, %[[ENTRY]] ], [ 2, %[[ENTRY]] ]
; OPTNOLUT-NEXT: ret i32 [[IDX]]
;
; TTINOLUT-LABEL: define i32 @single_value_no_jump_tables(
; TTINOLUT-SAME: i32 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
; TTINOLUT-NEXT: [[ENTRY:.*:]]
; TTINOLUT-NEXT: [[TMP0:%.*]] = icmp ult i32 [[X]], 5
; TTINOLUT-NEXT: [[IDX:%.*]] = select i1 [[TMP0]], i32 2, i32 3
; TTINOLUT-NEXT: ret i32 [[IDX]]
;
entry:
switch i32 %x, label %default [
i32 0, label %case0
i32 1, label %case1
i32 2, label %case2
i32 3, label %case3
i32 4, label %case4
]
case0:
br label %end
case1:
br label %end
case2:
br label %end
case3:
br label %end
case4:
br label %end
default:
br label %end
end:
%idx = phi i32 [ 2, %case0 ], [ 2, %case1 ], [ 2, %case2 ], [ 2, %case3 ], [ 2, %case4 ], [ 3, %default ]
ret i32 %idx
}
define i32 @lookup_table(i32 %x) {
; OPTNOLUT-LABEL: define i32 @lookup_table(
; OPTNOLUT-SAME: i32 [[X:%.*]]) {
; OPTNOLUT-NEXT: [[ENTRY:.*]]:
; OPTNOLUT-NEXT: switch i32 [[X]], label %[[END:.*]] [
; OPTNOLUT-NEXT: i32 0, label %[[CASE0:.*]]
; OPTNOLUT-NEXT: i32 1, label %[[CASE1:.*]]
; OPTNOLUT-NEXT: i32 2, label %[[CASE2:.*]]
; OPTNOLUT-NEXT: i32 3, label %[[CASE3:.*]]
; OPTNOLUT-NEXT: ]
; OPTNOLUT: [[CASE0]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[CASE1]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[CASE2]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[CASE3]]:
; OPTNOLUT-NEXT: br label %[[END]]
; OPTNOLUT: [[END]]:
; OPTNOLUT-NEXT: [[IDX:%.*]] = phi i32 [ 13, %[[CASE0]] ], [ 3, %[[CASE1]] ], [ 11, %[[CASE2]] ], [ 8, %[[CASE3]] ], [ 24, %[[ENTRY]] ]
; OPTNOLUT-NEXT: ret i32 [[IDX]]
;
; TTINOLUT-LABEL: define i32 @lookup_table(
; TTINOLUT-SAME: i32 [[X:%.*]]) {
; TTINOLUT-NEXT: [[ENTRY:.*]]:
; TTINOLUT-NEXT: switch i32 [[X]], label %[[END:.*]] [
; TTINOLUT-NEXT: i32 0, label %[[CASE0:.*]]
; TTINOLUT-NEXT: i32 1, label %[[CASE1:.*]]
; TTINOLUT-NEXT: i32 2, label %[[CASE2:.*]]
; TTINOLUT-NEXT: i32 3, label %[[CASE3:.*]]
; TTINOLUT-NEXT: ]
; TTINOLUT: [[CASE0]]:
; TTINOLUT-NEXT: br label %[[END]]
; TTINOLUT: [[CASE1]]:
; TTINOLUT-NEXT: br label %[[END]]
; TTINOLUT: [[CASE2]]:
; TTINOLUT-NEXT: br label %[[END]]
; TTINOLUT: [[CASE3]]:
; TTINOLUT-NEXT: br label %[[END]]
; TTINOLUT: [[END]]:
; TTINOLUT-NEXT: [[IDX:%.*]] = phi i32 [ 13, %[[CASE0]] ], [ 3, %[[CASE1]] ], [ 11, %[[CASE2]] ], [ 8, %[[CASE3]] ], [ 24, %[[ENTRY]] ]
; TTINOLUT-NEXT: ret i32 [[IDX]]
;
entry:
switch i32 %x, label %end [
i32 0, label %case0
i32 1, label %case1
i32 2, label %case2
i32 3, label %case3
]
case0:
br label %end
case1:
br label %end
case2:
br label %end
case3:
br label %end
end:
%idx = phi i32 [ 13, %case0 ], [ 3, %case1 ], [ 11, %case2 ], [ 8, %case3 ], [ 24, %entry ]
ret i32 %idx
}