| ; 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 |
| } |