1 // RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-linux-gnu | FileCheck %s 2 3 extern volatile int i; 4 5 void OneCaseL() { 6 // CHECK-LABEL: define{{.*}}OneCaseL 7 // CHECK: switch 8 // CHECK: {{.*}} !prof !6 9 switch (i) { 10 [[likely]] case 1: break; 11 } 12 } 13 14 void OneCaseU() { 15 // CHECK-LABEL: define{{.*}}OneCaseU 16 // CHECK: switch 17 // CHECK: {{.*}} !prof !7 18 switch (i) { 19 [[unlikely]] case 1: ++i; break; 20 } 21 } 22 23 void TwoCasesLN() { 24 // CHECK-LABEL: define{{.*}}TwoCasesLN 25 // CHECK: switch 26 // CHECK: {{.*}} !prof !8 27 switch (i) { 28 [[likely]] case 1: break; 29 case 2: break; 30 } 31 } 32 33 void TwoCasesUN() { 34 // CHECK-LABEL: define{{.*}}TwoCasesUN 35 // CHECK: switch 36 // CHECK: {{.*}} !prof !9 37 switch (i) { 38 [[unlikely]] case 1: break; 39 case 2: break; 40 } 41 } 42 43 void TwoCasesLU() { 44 // CHECK-LABEL: define{{.*}}TwoCasesLU 45 // CHECK: switch 46 // CHECK: {{.*}} !prof !10 47 switch (i) { 48 [[likely]] case 1: break; 49 [[unlikely]] case 2: break; 50 } 51 } 52 53 void CasesFallthroughNNLN() { 54 // CHECK-LABEL: define{{.*}}CasesFallthroughNNLN 55 // CHECK: switch 56 // CHECK: {{.*}} !prof !11 57 switch (i) { 58 case 1: 59 case 2: 60 [[likely]] case 3: 61 case 4: break; 62 } 63 } 64 65 void CasesFallthroughNNUN() { 66 // CHECK-LABEL: define{{.*}}CasesFallthroughNNUN 67 // CHECK: switch 68 // CHECK: {{.*}} !prof !12 69 switch (i) { 70 case 1: 71 case 2: 72 [[unlikely]] case 3: 73 case 4: break; 74 } 75 } 76 77 void CasesFallthroughRangeSmallLN() { 78 // CHECK-LABEL: define{{.*}}CasesFallthroughRangeSmallLN 79 // CHECK: switch 80 // CHECK: {{.*}} !prof !13 81 switch (i) { 82 case 1 ... 5: ++i; 83 case 102: 84 [[likely]] case 103: 85 case 104: break; 86 } 87 } 88 89 void CasesFallthroughRangeSmallUN() { 90 // CHECK-LABEL: define{{.*}}CasesFallthroughRangeSmallUN 91 // CHECK: switch 92 // CHECK: {{.*}} !prof !14 93 switch (i) { 94 case 1 ... 5: ++i; 95 case 102: 96 [[unlikely]] case 103: 97 case 104: break; 98 } 99 } 100 101 void CasesFallthroughRangeLargeLLN() { 102 // CHECK-LABEL: define{{.*}}CasesFallthroughRangeLargeLLN 103 // CHECK: switch 104 // CHECK: {{.*}} !prof !8 105 // CHECK: caserange 106 // CHECK: br{{.*}} !prof !15 107 switch (i) { 108 [[likely]] case 0 ... 64: 109 [[likely]] case 1003: 110 case 104: break; 111 } 112 } 113 114 void CasesFallthroughRangeLargeUUN() { 115 // CHECK-LABEL: define{{.*}}CasesFallthroughRangeLargeUUN 116 // CHECK: switch 117 // CHECK: {{.*}} !prof !9 118 // CHECK: caserange 119 // CHECK: br{{.*}} !prof !16 120 switch (i) { 121 [[unlikely]] case 0 ... 64: 122 [[unlikely]] case 1003: 123 case 104: break; 124 } 125 } 126 127 void OneCaseDefaultL() { 128 // CHECK-LABEL: define{{.*}}OneCaseDefaultL 129 // CHECK: switch 130 // CHECK: {{.*}} !prof !17 131 switch (i) { 132 case 1: break; 133 [[likely]] default: break; 134 } 135 } 136 137 void OneCaseDefaultU() { 138 // CHECK-LABEL: define{{.*}}OneCaseDefaultU 139 // CHECK: switch 140 // CHECK: {{.*}} !prof !18 141 switch (i) { 142 case 1: break; 143 [[unlikely]] default: break; 144 } 145 } 146 147 void TwoCasesDefaultLNL() { 148 // CHECK-LABEL: define{{.*}}TwoCasesDefaultLNL 149 // CHECK: switch 150 // CHECK: {{.*}} !prof !19 151 switch (i) { 152 [[likely]] case 1: break; 153 case 2: break; 154 [[likely]] default: break; 155 } 156 } 157 158 void TwoCasesDefaultLNN() { 159 // CHECK-LABEL: define{{.*}}TwoCasesDefaultLNN 160 // CHECK: switch 161 // CHECK: {{.*}} !prof !8 162 switch (i) { 163 [[likely]] case 1: break; 164 case 2: break; 165 default: break; 166 } 167 } 168 169 void TwoCasesDefaultLNU() { 170 // CHECK-LABEL: define{{.*}}TwoCasesDefaultLNU 171 // CHECK: switch 172 // CHECK: {{.*}} !prof !20 173 switch (i) { 174 [[likely]] case 1: break; 175 case 2: break; 176 [[unlikely]] default: break; 177 } 178 } 179 180 // CHECK: !6 = !{!"branch_weights", i32 357913942, i32 715827883} 181 // CHECK: !7 = !{!"branch_weights", i32 536870912, i32 1} 182 // CHECK: !8 = !{!"branch_weights", i32 238609295, i32 715827883, i32 238609295} 183 // CHECK: !9 = !{!"branch_weights", i32 357913942, i32 1, i32 357913942} 184 // CHECK: !10 = !{!"branch_weights", i32 357913942, i32 715827883, i32 1} 185 // CHECK: !11 = !{!"branch_weights", i32 143165577, i32 143165577, i32 143165577, i32 715827883, i32 143165577} 186 // CHECK: !12 = !{!"branch_weights", i32 214748365, i32 214748365, i32 214748365, i32 1, i32 214748365} 187 // CHECK: !13 = !{!"branch_weights", i32 79536432, i32 79536432, i32 79536432, i32 79536432, i32 79536432, i32 79536432, i32 79536432, i32 715827883, i32 79536432} 188 // CHECK: !14 = !{!"branch_weights", i32 119304648, i32 119304648, i32 119304648, i32 119304648, i32 119304648, i32 119304648, i32 119304648, i32 1, i32 119304648} 189 // CHECK: !15 = !{!"branch_weights", i32 2000, i32 1} 190 // CHECK: !16 = !{!"branch_weights", i32 1, i32 2000} 191 // CHECK: !17 = !{!"branch_weights", i32 715827883, i32 357913942} 192 // CHECK: !18 = !{!"branch_weights", i32 1, i32 536870912} 193 // CHECK: !19 = !{!"branch_weights", i32 536870912, i32 536870912, i32 268435456} 194 // CHECK: !20 = !{!"branch_weights", i32 1, i32 715827883, i32 357913942} 195