| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: opt < %s -passes=jump-table-to-switch -S | FileCheck %s | |
| @table = constant [2 x ptr] [ptr @f0, ptr @f1] | |
| define i32 @f0() { | |
| ; CHECK-LABEL: define i32 @f0() { | |
| ; CHECK-NEXT: ret i32 10 | |
| ; | |
| ret i32 10 | |
| } | |
| define i32 @f1() { | |
| ; CHECK-LABEL: define i32 @f1() { | |
| ; CHECK-NEXT: ret i32 11 | |
| ; | |
| ret i32 11 | |
| } | |
| define i32 @test_no_flags(i64 %i) { | |
| ; CHECK-LABEL: define i32 @test_no_flags( | |
| ; CHECK-SAME: i64 [[I:%.*]]) { | |
| ; CHECK-NEXT: [[P:%.*]] = getelementptr [2 x ptr], ptr @table, i64 0, i64 [[I]] | |
| ; CHECK-NEXT: [[F:%.*]] = load ptr, ptr [[P]], align 8 | |
| ; CHECK-NEXT: [[R:%.*]] = call i32 [[F]]() | |
| ; CHECK-NEXT: ret i32 [[R]] | |
| ; | |
| %p = getelementptr [2 x ptr], ptr @table, i64 0, i64 %i | |
| %f = load ptr, ptr %p, align 8 | |
| %r = call i32 %f() | |
| ret i32 %r | |
| } | |
| define i32 @test_nusw(i64 %i) { | |
| ; CHECK-LABEL: define i32 @test_nusw( | |
| ; CHECK-SAME: i64 [[I:%.*]]) { | |
| ; CHECK-NEXT: [[P:%.*]] = getelementptr nusw [2 x ptr], ptr @table, i64 0, i64 [[I]] | |
| ; CHECK-NEXT: [[F:%.*]] = load ptr, ptr [[P]], align 8 | |
| ; CHECK-NEXT: switch i64 [[I]], label %[[DEFAULT_SWITCH_CASE_UNREACHABLE:.*]] [ | |
| ; CHECK-NEXT: i64 0, label %[[CALL_0:.*]] | |
| ; CHECK-NEXT: i64 1, label %[[CALL_1:.*]] | |
| ; CHECK-NEXT: ], !prof [[PROF0:![0-9]+]] | |
| ; CHECK: [[DEFAULT_SWITCH_CASE_UNREACHABLE]]: | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: [[CALL_0]]: | |
| ; CHECK-NEXT: [[TMP1:%.*]] = call i32 @f0() | |
| ; CHECK-NEXT: br label %[[DOTTAIL:.*]] | |
| ; CHECK: [[CALL_1]]: | |
| ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @f1() | |
| ; CHECK-NEXT: br label %[[DOTTAIL]] | |
| ; CHECK: [[DOTTAIL]]: | |
| ; CHECK-NEXT: [[TMP3:%.*]] = phi i32 [ [[TMP1]], %[[CALL_0]] ], [ [[TMP2]], %[[CALL_1]] ] | |
| ; CHECK-NEXT: ret i32 [[TMP3]] | |
| ; | |
| %p = getelementptr nusw [2 x ptr], ptr @table, i64 0, i64 %i | |
| %f = load ptr, ptr %p, align 8 | |
| %r = call i32 %f() | |
| ret i32 %r | |
| } | |
| define i32 @test_nuw(i64 %i) { | |
| ; CHECK-LABEL: define i32 @test_nuw( | |
| ; CHECK-SAME: i64 [[I:%.*]]) { | |
| ; CHECK-NEXT: [[P:%.*]] = getelementptr nuw [2 x ptr], ptr @table, i64 0, i64 [[I]] | |
| ; CHECK-NEXT: [[F:%.*]] = load ptr, ptr [[P]], align 8 | |
| ; CHECK-NEXT: switch i64 [[I]], label %[[DEFAULT_SWITCH_CASE_UNREACHABLE:.*]] [ | |
| ; CHECK-NEXT: i64 0, label %[[CALL_0:.*]] | |
| ; CHECK-NEXT: i64 1, label %[[CALL_1:.*]] | |
| ; CHECK-NEXT: ], !prof [[PROF0]] | |
| ; CHECK: [[DEFAULT_SWITCH_CASE_UNREACHABLE]]: | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: [[CALL_0]]: | |
| ; CHECK-NEXT: [[TMP1:%.*]] = call i32 @f0() | |
| ; CHECK-NEXT: br label %[[DOTTAIL:.*]] | |
| ; CHECK: [[CALL_1]]: | |
| ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @f1() | |
| ; CHECK-NEXT: br label %[[DOTTAIL]] | |
| ; CHECK: [[DOTTAIL]]: | |
| ; CHECK-NEXT: [[R:%.*]] = phi i32 [ [[TMP1]], %[[CALL_0]] ], [ [[TMP2]], %[[CALL_1]] ] | |
| ; CHECK-NEXT: ret i32 [[R]] | |
| ; | |
| %p = getelementptr nuw [2 x ptr], ptr @table, i64 0, i64 %i | |
| %f = load ptr, ptr %p, align 8 | |
| %r = call i32 %f() | |
| ret i32 %r | |
| } | |
| define i32 @test_inbounds(i64 %i) { | |
| ; CHECK-LABEL: define i32 @test_inbounds( | |
| ; CHECK-SAME: i64 [[I:%.*]]) { | |
| ; CHECK-NEXT: [[P:%.*]] = getelementptr inbounds [2 x ptr], ptr @table, i64 0, i64 [[I]] | |
| ; CHECK-NEXT: [[F:%.*]] = load ptr, ptr [[P]], align 8 | |
| ; CHECK-NEXT: switch i64 [[I]], label %[[DEFAULT_SWITCH_CASE_UNREACHABLE:.*]] [ | |
| ; CHECK-NEXT: i64 0, label %[[CALL_0:.*]] | |
| ; CHECK-NEXT: i64 1, label %[[CALL_1:.*]] | |
| ; CHECK-NEXT: ], !prof [[PROF0]] | |
| ; CHECK: [[DEFAULT_SWITCH_CASE_UNREACHABLE]]: | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: [[CALL_0]]: | |
| ; CHECK-NEXT: [[TMP1:%.*]] = call i32 @f0() | |
| ; CHECK-NEXT: br label %[[DOTTAIL:.*]] | |
| ; CHECK: [[CALL_1]]: | |
| ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @f1() | |
| ; CHECK-NEXT: br label %[[DOTTAIL]] | |
| ; CHECK: [[DOTTAIL]]: | |
| ; CHECK-NEXT: [[TMP3:%.*]] = phi i32 [ [[TMP1]], %[[CALL_0]] ], [ [[TMP2]], %[[CALL_1]] ] | |
| ; CHECK-NEXT: ret i32 [[TMP3]] | |
| ; | |
| %p = getelementptr inbounds [2 x ptr], ptr @table, i64 0, i64 %i | |
| %f = load ptr, ptr %p, align 8 | |
| %r = call i32 %f() | |
| ret i32 %r | |
| } | |
| ;. | |
| ; CHECK: [[PROF0]] = !{!"unknown", !"jump-table-to-switch"} | |
| ;. |