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