blob: bb6f5bb248e3eaa64f4be3f26412ac678c3aad21 [file] [log] [blame]
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 6
// RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-linux-gnu | FileCheck %s
extern volatile int i;
// CHECK-LABEL: define dso_local void @_Z8OneCaseLv(
// CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2:![0-9]+]]
// CHECK-NEXT: switch i32 [[TMP0]], label %[[SW_EPILOG:.*]] [
// CHECK-NEXT: i32 1, label %[[SW_EPILOG]]
// CHECK-NEXT: ], !prof [[PROF6:![0-9]+]]
// CHECK: [[SW_EPILOG]]:
// CHECK-NEXT: ret void
//
void OneCaseL() {
switch (i) {
[[likely]] case 1: break;
}
}
// CHECK-LABEL: define dso_local void @_Z8OneCaseUv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: switch i32 [[TMP0]], label %[[SW_EPILOG:.*]] [
// CHECK-NEXT: i32 1, label %[[SW_BB:.*]]
// CHECK-NEXT: ], !prof [[PROF7:![0-9]+]]
// CHECK: [[SW_BB]]:
// CHECK-NEXT: [[TMP1:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP1]], 1
// CHECK-NEXT: store volatile i32 [[INC]], ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: br label %[[SW_EPILOG]]
// CHECK: [[SW_EPILOG]]:
// CHECK-NEXT: ret void
//
void OneCaseU() {
switch (i) {
[[unlikely]] case 1: ++i; break;
}
}
// CHECK-LABEL: define dso_local void @_Z10TwoCasesLNv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: switch i32 [[TMP0]], label %[[SW_EPILOG:.*]] [
// CHECK-NEXT: i32 1, label %[[SW_EPILOG]]
// CHECK-NEXT: i32 2, label %[[SW_EPILOG]]
// CHECK-NEXT: ], !prof [[PROF8:![0-9]+]]
// CHECK: [[SW_EPILOG]]:
// CHECK-NEXT: ret void
//
void TwoCasesLN() {
switch (i) {
[[likely]] case 1: break;
case 2: break;
}
}
// CHECK-LABEL: define dso_local void @_Z10TwoCasesUNv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: switch i32 [[TMP0]], label %[[SW_EPILOG:.*]] [
// CHECK-NEXT: i32 1, label %[[SW_EPILOG]]
// CHECK-NEXT: i32 2, label %[[SW_EPILOG]]
// CHECK-NEXT: ], !prof [[PROF9:![0-9]+]]
// CHECK: [[SW_EPILOG]]:
// CHECK-NEXT: ret void
//
void TwoCasesUN() {
switch (i) {
[[unlikely]] case 1: break;
case 2: break;
}
}
// CHECK-LABEL: define dso_local void @_Z10TwoCasesLUv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: switch i32 [[TMP0]], label %[[SW_EPILOG:.*]] [
// CHECK-NEXT: i32 1, label %[[SW_EPILOG]]
// CHECK-NEXT: i32 2, label %[[SW_EPILOG]]
// CHECK-NEXT: ], !prof [[PROF10:![0-9]+]]
// CHECK: [[SW_EPILOG]]:
// CHECK-NEXT: ret void
//
void TwoCasesLU() {
switch (i) {
[[likely]] case 1: break;
[[unlikely]] case 2: break;
}
}
// CHECK-LABEL: define dso_local void @_Z20CasesFallthroughNNLNv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: switch i32 [[TMP0]], label %[[SW_EPILOG:.*]] [
// CHECK-NEXT: i32 1, label %[[SW_BB:.*]]
// CHECK-NEXT: i32 2, label %[[SW_BB]]
// CHECK-NEXT: i32 3, label %[[SW_BB1:.*]]
// CHECK-NEXT: i32 4, label %[[SW_BB1]]
// CHECK-NEXT: ], !prof [[PROF11:![0-9]+]]
// CHECK: [[SW_BB]]:
// CHECK-NEXT: br label %[[SW_BB1]]
// CHECK: [[SW_BB1]]:
// CHECK-NEXT: br label %[[SW_EPILOG]]
// CHECK: [[SW_EPILOG]]:
// CHECK-NEXT: ret void
//
void CasesFallthroughNNLN() {
switch (i) {
case 1:
case 2:
[[likely]] case 3:
case 4: break;
}
}
// CHECK-LABEL: define dso_local void @_Z20CasesFallthroughNNUNv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: switch i32 [[TMP0]], label %[[SW_EPILOG:.*]] [
// CHECK-NEXT: i32 1, label %[[SW_BB:.*]]
// CHECK-NEXT: i32 2, label %[[SW_BB]]
// CHECK-NEXT: i32 3, label %[[SW_BB1:.*]]
// CHECK-NEXT: i32 4, label %[[SW_BB1]]
// CHECK-NEXT: ], !prof [[PROF12:![0-9]+]]
// CHECK: [[SW_BB]]:
// CHECK-NEXT: br label %[[SW_BB1]]
// CHECK: [[SW_BB1]]:
// CHECK-NEXT: br label %[[SW_EPILOG]]
// CHECK: [[SW_EPILOG]]:
// CHECK-NEXT: ret void
//
void CasesFallthroughNNUN() {
switch (i) {
case 1:
case 2:
[[unlikely]] case 3:
case 4: break;
}
}
// CHECK-LABEL: define dso_local void @_Z28CasesFallthroughRangeSmallLNv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: switch i32 [[TMP0]], label %[[SW_EPILOG:.*]] [
// CHECK-NEXT: i32 1, label %[[SW_BB:.*]]
// CHECK-NEXT: i32 2, label %[[SW_BB]]
// CHECK-NEXT: i32 3, label %[[SW_BB]]
// CHECK-NEXT: i32 4, label %[[SW_BB]]
// CHECK-NEXT: i32 5, label %[[SW_BB]]
// CHECK-NEXT: i32 102, label %[[SW_BB1:.*]]
// CHECK-NEXT: i32 103, label %[[SW_BB2:.*]]
// CHECK-NEXT: i32 104, label %[[SW_BB2]]
// CHECK-NEXT: ], !prof [[PROF13:![0-9]+]]
// CHECK: [[SW_BB]]:
// CHECK-NEXT: [[TMP1:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP1]], 1
// CHECK-NEXT: store volatile i32 [[INC]], ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: br label %[[SW_BB1]]
// CHECK: [[SW_BB1]]:
// CHECK-NEXT: br label %[[SW_BB2]]
// CHECK: [[SW_BB2]]:
// CHECK-NEXT: br label %[[SW_EPILOG]]
// CHECK: [[SW_EPILOG]]:
// CHECK-NEXT: ret void
//
void CasesFallthroughRangeSmallLN() {
switch (i) {
case 1 ... 5: ++i;
case 102:
[[likely]] case 103:
case 104: break;
}
}
// CHECK-LABEL: define dso_local void @_Z28CasesFallthroughRangeSmallUNv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: switch i32 [[TMP0]], label %[[SW_EPILOG:.*]] [
// CHECK-NEXT: i32 1, label %[[SW_BB:.*]]
// CHECK-NEXT: i32 2, label %[[SW_BB]]
// CHECK-NEXT: i32 3, label %[[SW_BB]]
// CHECK-NEXT: i32 4, label %[[SW_BB]]
// CHECK-NEXT: i32 5, label %[[SW_BB]]
// CHECK-NEXT: i32 102, label %[[SW_BB1:.*]]
// CHECK-NEXT: i32 103, label %[[SW_BB2:.*]]
// CHECK-NEXT: i32 104, label %[[SW_BB2]]
// CHECK-NEXT: ], !prof [[PROF14:![0-9]+]]
// CHECK: [[SW_BB]]:
// CHECK-NEXT: [[TMP1:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP1]], 1
// CHECK-NEXT: store volatile i32 [[INC]], ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: br label %[[SW_BB1]]
// CHECK: [[SW_BB1]]:
// CHECK-NEXT: br label %[[SW_BB2]]
// CHECK: [[SW_BB2]]:
// CHECK-NEXT: br label %[[SW_EPILOG]]
// CHECK: [[SW_EPILOG]]:
// CHECK-NEXT: ret void
//
void CasesFallthroughRangeSmallUN() {
switch (i) {
case 1 ... 5: ++i;
case 102:
[[unlikely]] case 103:
case 104: break;
}
}
// CHECK-LABEL: define dso_local void @_Z29CasesFallthroughRangeLargeLLNv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: switch i32 [[TMP0]], label %[[SW_CASERANGE:.*]] [
// CHECK-NEXT: i32 1003, label %[[SW_BB1:.*]]
// CHECK-NEXT: i32 104, label %[[SW_BB1]]
// CHECK-NEXT: ], !prof [[PROF8]]
// CHECK: [[SW_BB:.*]]:
// CHECK-NEXT: br label %[[SW_BB1]]
// CHECK: [[SW_BB1]]:
// CHECK-NEXT: br label %[[SW_EPILOG:.*]]
// CHECK: [[SW_CASERANGE]]:
// CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], 0
// CHECK-NEXT: [[INBOUNDS:%.*]] = icmp ule i32 [[TMP1]], 64
// CHECK-NEXT: [[INBOUNDS_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[INBOUNDS]], i1 true)
// CHECK-NEXT: br i1 [[INBOUNDS_EXPVAL]], label %[[SW_BB]], label %[[SW_EPILOG]]
// CHECK: [[SW_EPILOG]]:
// CHECK-NEXT: ret void
//
void CasesFallthroughRangeLargeLLN() {
switch (i) {
[[likely]] case 0 ... 64:
[[likely]] case 1003:
case 104: break;
}
}
// CHECK-LABEL: define dso_local void @_Z29CasesFallthroughRangeLargeUUNv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: switch i32 [[TMP0]], label %[[SW_CASERANGE:.*]] [
// CHECK-NEXT: i32 1003, label %[[SW_BB1:.*]]
// CHECK-NEXT: i32 104, label %[[SW_BB1]]
// CHECK-NEXT: ], !prof [[PROF9]]
// CHECK: [[SW_BB:.*]]:
// CHECK-NEXT: br label %[[SW_BB1]]
// CHECK: [[SW_BB1]]:
// CHECK-NEXT: br label %[[SW_EPILOG:.*]]
// CHECK: [[SW_CASERANGE]]:
// CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], 0
// CHECK-NEXT: [[INBOUNDS:%.*]] = icmp ule i32 [[TMP1]], 64
// CHECK-NEXT: [[INBOUNDS_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[INBOUNDS]], i1 false)
// CHECK-NEXT: br i1 [[INBOUNDS_EXPVAL]], label %[[SW_BB]], label %[[SW_EPILOG]]
// CHECK: [[SW_EPILOG]]:
// CHECK-NEXT: ret void
//
void CasesFallthroughRangeLargeUUN() {
switch (i) {
[[unlikely]] case 0 ... 64:
[[unlikely]] case 1003:
case 104: break;
}
}
// CHECK-LABEL: define dso_local void @_Z15OneCaseDefaultLv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: switch i32 [[TMP0]], label %[[SW_DEFAULT:.*]] [
// CHECK-NEXT: i32 1, label %[[SW_EPILOG:.*]]
// CHECK-NEXT: ], !prof [[PROF15:![0-9]+]]
// CHECK: [[SW_DEFAULT]]:
// CHECK-NEXT: br label %[[SW_EPILOG]]
// CHECK: [[SW_EPILOG]]:
// CHECK-NEXT: ret void
//
void OneCaseDefaultL() {
switch (i) {
case 1: break;
[[likely]] default: break;
}
}
// CHECK-LABEL: define dso_local void @_Z15OneCaseDefaultUv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: switch i32 [[TMP0]], label %[[SW_DEFAULT:.*]] [
// CHECK-NEXT: i32 1, label %[[SW_EPILOG:.*]]
// CHECK-NEXT: ], !prof [[PROF16:![0-9]+]]
// CHECK: [[SW_DEFAULT]]:
// CHECK-NEXT: br label %[[SW_EPILOG]]
// CHECK: [[SW_EPILOG]]:
// CHECK-NEXT: ret void
//
void OneCaseDefaultU() {
switch (i) {
case 1: break;
[[unlikely]] default: break;
}
}
// CHECK-LABEL: define dso_local void @_Z18TwoCasesDefaultLNLv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: switch i32 [[TMP0]], label %[[SW_DEFAULT:.*]] [
// CHECK-NEXT: i32 1, label %[[SW_EPILOG:.*]]
// CHECK-NEXT: i32 2, label %[[SW_EPILOG]]
// CHECK-NEXT: ], !prof [[PROF17:![0-9]+]]
// CHECK: [[SW_DEFAULT]]:
// CHECK-NEXT: br label %[[SW_EPILOG]]
// CHECK: [[SW_EPILOG]]:
// CHECK-NEXT: ret void
//
void TwoCasesDefaultLNL() {
switch (i) {
[[likely]] case 1: break;
case 2: break;
[[likely]] default: break;
}
}
// CHECK-LABEL: define dso_local void @_Z18TwoCasesDefaultLNNv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: switch i32 [[TMP0]], label %[[SW_DEFAULT:.*]] [
// CHECK-NEXT: i32 1, label %[[SW_EPILOG:.*]]
// CHECK-NEXT: i32 2, label %[[SW_EPILOG]]
// CHECK-NEXT: ], !prof [[PROF8]]
// CHECK: [[SW_DEFAULT]]:
// CHECK-NEXT: br label %[[SW_EPILOG]]
// CHECK: [[SW_EPILOG]]:
// CHECK-NEXT: ret void
//
void TwoCasesDefaultLNN() {
switch (i) {
[[likely]] case 1: break;
case 2: break;
default: break;
}
}
// CHECK-LABEL: define dso_local void @_Z18TwoCasesDefaultLNUv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: switch i32 [[TMP0]], label %[[SW_DEFAULT:.*]] [
// CHECK-NEXT: i32 1, label %[[SW_EPILOG:.*]]
// CHECK-NEXT: i32 2, label %[[SW_EPILOG]]
// CHECK-NEXT: ], !prof [[PROF18:![0-9]+]]
// CHECK: [[SW_DEFAULT]]:
// CHECK-NEXT: br label %[[SW_EPILOG]]
// CHECK: [[SW_EPILOG]]:
// CHECK-NEXT: ret void
//
void TwoCasesDefaultLNU() {
switch (i) {
[[likely]] case 1: break;
case 2: break;
[[unlikely]] default: break;
}
}
//.
// CHECK: [[INT_TBAA2]] = !{[[META3:![0-9]+]], [[META3]], i64 0}
// CHECK: [[META3]] = !{!"int", [[META4:![0-9]+]], i64 0}
// CHECK: [[META4]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0}
// CHECK: [[META5]] = !{!"Simple C++ TBAA"}
// CHECK: [[PROF6]] = !{!"branch_weights", i32 357913942, i32 715827883}
// CHECK: [[PROF7]] = !{!"branch_weights", i32 536870912, i32 1}
// CHECK: [[PROF8]] = !{!"branch_weights", i32 238609295, i32 715827883, i32 238609295}
// CHECK: [[PROF9]] = !{!"branch_weights", i32 357913942, i32 1, i32 357913942}
// CHECK: [[PROF10]] = !{!"branch_weights", i32 357913942, i32 715827883, i32 1}
// CHECK: [[PROF11]] = !{!"branch_weights", i32 143165577, i32 143165577, i32 143165577, i32 715827883, i32 143165577}
// CHECK: [[PROF12]] = !{!"branch_weights", i32 214748365, i32 214748365, i32 214748365, i32 1, i32 214748365}
// CHECK: [[PROF13]] = !{!"branch_weights", i32 79536432, i32 79536432, i32 79536432, i32 79536432, i32 79536432, i32 79536432, i32 79536432, i32 715827883, i32 79536432}
// CHECK: [[PROF14]] = !{!"branch_weights", i32 119304648, i32 119304648, i32 119304648, i32 119304648, i32 119304648, i32 119304648, i32 119304648, i32 1, i32 119304648}
// CHECK: [[PROF15]] = !{!"branch_weights", i32 715827883, i32 357913942}
// CHECK: [[PROF16]] = !{!"branch_weights", i32 1, i32 536870912}
// CHECK: [[PROF17]] = !{!"branch_weights", i32 536870912, i32 536870912, i32 268435456}
// CHECK: [[PROF18]] = !{!"branch_weights", i32 1, i32 715827883, i32 357913942}
//.