| // RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-linux-gnu | FileCheck %s |
| |
| extern volatile int i; |
| |
| void OneCaseL() { |
| // CHECK-LABEL: define{{.*}}OneCaseL |
| // CHECK: switch |
| // CHECK: {{.*}} !prof !6 |
| switch (i) { |
| [[likely]] case 1: break; |
| } |
| } |
| |
| void OneCaseU() { |
| // CHECK-LABEL: define{{.*}}OneCaseU |
| // CHECK: switch |
| // CHECK: {{.*}} !prof !7 |
| switch (i) { |
| [[unlikely]] case 1: ++i; break; |
| } |
| } |
| |
| void TwoCasesLN() { |
| // CHECK-LABEL: define{{.*}}TwoCasesLN |
| // CHECK: switch |
| // CHECK: {{.*}} !prof !8 |
| switch (i) { |
| [[likely]] case 1: break; |
| case 2: break; |
| } |
| } |
| |
| void TwoCasesUN() { |
| // CHECK-LABEL: define{{.*}}TwoCasesUN |
| // CHECK: switch |
| // CHECK: {{.*}} !prof !9 |
| switch (i) { |
| [[unlikely]] case 1: break; |
| case 2: break; |
| } |
| } |
| |
| void TwoCasesLU() { |
| // CHECK-LABEL: define{{.*}}TwoCasesLU |
| // CHECK: switch |
| // CHECK: {{.*}} !prof !10 |
| switch (i) { |
| [[likely]] case 1: break; |
| [[unlikely]] case 2: break; |
| } |
| } |
| |
| void CasesFallthroughNNLN() { |
| // CHECK-LABEL: define{{.*}}CasesFallthroughNNLN |
| // CHECK: switch |
| // CHECK: {{.*}} !prof !11 |
| switch (i) { |
| case 1: |
| case 2: |
| [[likely]] case 3: |
| case 4: break; |
| } |
| } |
| |
| void CasesFallthroughNNUN() { |
| // CHECK-LABEL: define{{.*}}CasesFallthroughNNUN |
| // CHECK: switch |
| // CHECK: {{.*}} !prof !12 |
| switch (i) { |
| case 1: |
| case 2: |
| [[unlikely]] case 3: |
| case 4: break; |
| } |
| } |
| |
| void CasesFallthroughRangeSmallLN() { |
| // CHECK-LABEL: define{{.*}}CasesFallthroughRangeSmallLN |
| // CHECK: switch |
| // CHECK: {{.*}} !prof !13 |
| switch (i) { |
| case 1 ... 5: ++i; |
| case 102: |
| [[likely]] case 103: |
| case 104: break; |
| } |
| } |
| |
| void CasesFallthroughRangeSmallUN() { |
| // CHECK-LABEL: define{{.*}}CasesFallthroughRangeSmallUN |
| // CHECK: switch |
| // CHECK: {{.*}} !prof !14 |
| switch (i) { |
| case 1 ... 5: ++i; |
| case 102: |
| [[unlikely]] case 103: |
| case 104: break; |
| } |
| } |
| |
| void CasesFallthroughRangeLargeLLN() { |
| // CHECK-LABEL: define{{.*}}CasesFallthroughRangeLargeLLN |
| // CHECK: switch |
| // CHECK: {{.*}} !prof !8 |
| // CHECK: caserange |
| // CHECK: br{{.*}} !prof !15 |
| switch (i) { |
| [[likely]] case 0 ... 64: |
| [[likely]] case 1003: |
| case 104: break; |
| } |
| } |
| |
| void CasesFallthroughRangeLargeUUN() { |
| // CHECK-LABEL: define{{.*}}CasesFallthroughRangeLargeUUN |
| // CHECK: switch |
| // CHECK: {{.*}} !prof !9 |
| // CHECK: caserange |
| // CHECK: br{{.*}} !prof !16 |
| switch (i) { |
| [[unlikely]] case 0 ... 64: |
| [[unlikely]] case 1003: |
| case 104: break; |
| } |
| } |
| |
| void OneCaseDefaultL() { |
| // CHECK-LABEL: define{{.*}}OneCaseDefaultL |
| // CHECK: switch |
| // CHECK: {{.*}} !prof !17 |
| switch (i) { |
| case 1: break; |
| [[likely]] default: break; |
| } |
| } |
| |
| void OneCaseDefaultU() { |
| // CHECK-LABEL: define{{.*}}OneCaseDefaultU |
| // CHECK: switch |
| // CHECK: {{.*}} !prof !18 |
| switch (i) { |
| case 1: break; |
| [[unlikely]] default: break; |
| } |
| } |
| |
| void TwoCasesDefaultLNL() { |
| // CHECK-LABEL: define{{.*}}TwoCasesDefaultLNL |
| // CHECK: switch |
| // CHECK: {{.*}} !prof !19 |
| switch (i) { |
| [[likely]] case 1: break; |
| case 2: break; |
| [[likely]] default: break; |
| } |
| } |
| |
| void TwoCasesDefaultLNN() { |
| // CHECK-LABEL: define{{.*}}TwoCasesDefaultLNN |
| // CHECK: switch |
| // CHECK: {{.*}} !prof !8 |
| switch (i) { |
| [[likely]] case 1: break; |
| case 2: break; |
| default: break; |
| } |
| } |
| |
| void TwoCasesDefaultLNU() { |
| // CHECK-LABEL: define{{.*}}TwoCasesDefaultLNU |
| // CHECK: switch |
| // CHECK: {{.*}} !prof !20 |
| switch (i) { |
| [[likely]] case 1: break; |
| case 2: break; |
| [[unlikely]] default: break; |
| } |
| } |
| |
| // CHECK: !6 = !{!"branch_weights", i32 357913942, i32 715827883} |
| // CHECK: !7 = !{!"branch_weights", i32 536870912, i32 1} |
| // CHECK: !8 = !{!"branch_weights", i32 238609295, i32 715827883, i32 238609295} |
| // CHECK: !9 = !{!"branch_weights", i32 357913942, i32 1, i32 357913942} |
| // CHECK: !10 = !{!"branch_weights", i32 357913942, i32 715827883, i32 1} |
| // CHECK: !11 = !{!"branch_weights", i32 143165577, i32 143165577, i32 143165577, i32 715827883, i32 143165577} |
| // CHECK: !12 = !{!"branch_weights", i32 214748365, i32 214748365, i32 214748365, i32 1, i32 214748365} |
| // CHECK: !13 = !{!"branch_weights", i32 79536432, i32 79536432, i32 79536432, i32 79536432, i32 79536432, i32 79536432, i32 79536432, i32 715827883, i32 79536432} |
| // CHECK: !14 = !{!"branch_weights", i32 119304648, i32 119304648, i32 119304648, i32 119304648, i32 119304648, i32 119304648, i32 119304648, i32 1, i32 119304648} |
| // CHECK: !15 = !{!"branch_weights", i32 2000, i32 1} |
| // CHECK: !16 = !{!"branch_weights", i32 1, i32 2000} |
| // CHECK: !17 = !{!"branch_weights", i32 715827883, i32 357913942} |
| // CHECK: !18 = !{!"branch_weights", i32 1, i32 536870912} |
| // CHECK: !19 = !{!"branch_weights", i32 536870912, i32 536870912, i32 268435456} |
| // CHECK: !20 = !{!"branch_weights", i32 1, i32 715827883, i32 357913942} |