| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --scrub-attributes --check-globals |
| ; RUN: opt -passes=simplifycfg --switch-to-lookup -S %s | FileCheck %s |
| target triple = "x86_64-unknown-linux-gnu" |
| |
| ;. |
| ; CHECK: @[[SWITCH_TABLE_SWITCH_TO_LOOKUP_I64:[a-zA-Z0-9_$"\\.-]+]] = private unnamed_addr constant [3 x i8] c"\03\01\02", align 1 |
| ; CHECK: @[[SWITCH_TABLE_SWITCH_TO_LOOKUP_I128:[a-zA-Z0-9_$"\\.-]+]] = private unnamed_addr constant [3 x i8] c"\03\01\02", align 1 |
| ;. |
| define i8 @switch_to_lookup_i64(i128 %x){ |
| ; CHECK-LABEL: @switch_to_lookup_i64( |
| ; CHECK-NEXT: start: |
| ; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i128 [[X:%.*]], 3 |
| ; CHECK-NEXT: br i1 [[TMP0]], label [[SWITCH_LOOKUP:%.*]], label [[COMMON_RET:%.*]] |
| ; CHECK: common.ret: |
| ; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i8 [ [[SWITCH_LOAD:%.*]], [[SWITCH_LOOKUP]] ], [ 10, [[START:%.*]] ] |
| ; CHECK-NEXT: ret i8 [[COMMON_RET_OP]] |
| ; CHECK: switch.lookup: |
| ; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [3 x i8], ptr @switch.table.switch_to_lookup_i64, i32 0, i128 [[X]] |
| ; CHECK-NEXT: [[SWITCH_LOAD]] = load i8, ptr [[SWITCH_GEP]], align 1 |
| ; CHECK-NEXT: br label [[COMMON_RET]] |
| ; |
| start: |
| switch i128 %x, label %default [ |
| i128 0, label %end |
| i128 1, label %bb1 |
| i128 2, label %bb2 |
| ] |
| |
| bb1: |
| br label %end |
| |
| bb2: |
| br label %end |
| |
| default: |
| ret i8 10 |
| |
| end: |
| %p = phi i8 [ 1, %bb1 ], [ 2, %bb2 ], [ 3, %start ] |
| ret i8 %p |
| } |
| |
| define i8 @switch_to_lookup_i128(i128 %x){ |
| ; CHECK-LABEL: @switch_to_lookup_i128( |
| ; CHECK-NEXT: start: |
| ; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i128 [[X:%.*]], 3 |
| ; CHECK-NEXT: br i1 [[TMP0]], label [[SWITCH_LOOKUP:%.*]], label [[COMMON_RET:%.*]] |
| ; CHECK: common.ret: |
| ; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i8 [ [[SWITCH_LOAD:%.*]], [[SWITCH_LOOKUP]] ], [ 10, [[START:%.*]] ] |
| ; CHECK-NEXT: ret i8 [[COMMON_RET_OP]] |
| ; CHECK: switch.lookup: |
| ; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [3 x i8], ptr @switch.table.switch_to_lookup_i128, i32 0, i128 [[X]] |
| ; CHECK-NEXT: [[SWITCH_LOAD]] = load i8, ptr [[SWITCH_GEP]], align 1 |
| ; CHECK-NEXT: br label [[COMMON_RET]] |
| ; |
| start: |
| switch i128 %x, label %default [ |
| i128 0, label %end |
| i128 1, label %bb1 |
| i128 2, label %bb2 |
| ] |
| |
| bb1: |
| br label %end |
| |
| bb2: |
| br label %end |
| |
| default: |
| ret i8 10 |
| |
| end: |
| %p = phi i8 [ 1, %bb1 ], [ 2, %bb2 ], [ 3, %start ] |
| ret i8 %p |
| } |