blob: cbb8869114c14c891196eabd83b5c8a79082c554 [file] [edit]
; 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"}
;.