1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
2 // RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-linux-gnu | FileCheck %s
3 
4 extern volatile int i;
5 
6 // CHECK-LABEL: @_Z8OneCaseLv(
7 // CHECK-NEXT:  entry:
8 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2:![0-9]+]]
9 // CHECK-NEXT:    switch i32 [[TMP0]], label [[SW_EPILOG:%.*]] [
10 // CHECK-NEXT:    i32 1, label [[SW_EPILOG]]
11 // CHECK-NEXT:    ], !prof !6
12 // CHECK:       sw.epilog:
13 // CHECK-NEXT:    ret void
14 //
OneCaseL()15 void OneCaseL() {
16   switch (i) {
17     [[likely]] case 1: break;
18   }
19 }
20 
21 // CHECK-LABEL: @_Z8OneCaseUv(
22 // CHECK-NEXT:  entry:
23 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
24 // CHECK-NEXT:    switch i32 [[TMP0]], label [[SW_EPILOG:%.*]] [
25 // CHECK-NEXT:    i32 1, label [[SW_BB:%.*]]
26 // CHECK-NEXT:    ], !prof !7
27 // CHECK:       sw.bb:
28 // CHECK-NEXT:    [[TMP1:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
29 // CHECK-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP1]], 1
30 // CHECK-NEXT:    store volatile i32 [[INC]], i32* @i, align 4, !tbaa [[TBAA2]]
31 // CHECK-NEXT:    br label [[SW_EPILOG]]
32 // CHECK:       sw.epilog:
33 // CHECK-NEXT:    ret void
34 //
OneCaseU()35 void OneCaseU() {
36   switch (i) {
37     [[unlikely]] case 1: ++i; break;
38   }
39 }
40 
41 // CHECK-LABEL: @_Z10TwoCasesLNv(
42 // CHECK-NEXT:  entry:
43 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
44 // CHECK-NEXT:    switch i32 [[TMP0]], label [[SW_EPILOG:%.*]] [
45 // CHECK-NEXT:    i32 1, label [[SW_EPILOG]]
46 // CHECK-NEXT:    i32 2, label [[SW_EPILOG]]
47 // CHECK-NEXT:    ], !prof !8
48 // CHECK:       sw.epilog:
49 // CHECK-NEXT:    ret void
50 //
TwoCasesLN()51 void TwoCasesLN() {
52   switch (i) {
53     [[likely]] case 1: break;
54     case 2: break;
55   }
56 }
57 
58 // CHECK-LABEL: @_Z10TwoCasesUNv(
59 // CHECK-NEXT:  entry:
60 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
61 // CHECK-NEXT:    switch i32 [[TMP0]], label [[SW_EPILOG:%.*]] [
62 // CHECK-NEXT:    i32 1, label [[SW_EPILOG]]
63 // CHECK-NEXT:    i32 2, label [[SW_EPILOG]]
64 // CHECK-NEXT:    ], !prof !9
65 // CHECK:       sw.epilog:
66 // CHECK-NEXT:    ret void
67 //
TwoCasesUN()68 void TwoCasesUN() {
69   switch (i) {
70     [[unlikely]] case 1: break;
71     case 2: break;
72   }
73 }
74 
75 // CHECK-LABEL: @_Z10TwoCasesLUv(
76 // CHECK-NEXT:  entry:
77 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
78 // CHECK-NEXT:    switch i32 [[TMP0]], label [[SW_EPILOG:%.*]] [
79 // CHECK-NEXT:    i32 1, label [[SW_EPILOG]]
80 // CHECK-NEXT:    i32 2, label [[SW_EPILOG]]
81 // CHECK-NEXT:    ], !prof !10
82 // CHECK:       sw.epilog:
83 // CHECK-NEXT:    ret void
84 //
TwoCasesLU()85 void TwoCasesLU() {
86   switch (i) {
87     [[likely]] case 1: break;
88     [[unlikely]] case 2: break;
89   }
90 }
91 
92 // CHECK-LABEL: @_Z20CasesFallthroughNNLNv(
93 // CHECK-NEXT:  entry:
94 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
95 // CHECK-NEXT:    switch i32 [[TMP0]], label [[SW_EPILOG:%.*]] [
96 // CHECK-NEXT:    i32 1, label [[SW_BB:%.*]]
97 // CHECK-NEXT:    i32 2, label [[SW_BB]]
98 // CHECK-NEXT:    i32 3, label [[SW_BB1:%.*]]
99 // CHECK-NEXT:    i32 4, label [[SW_BB1]]
100 // CHECK-NEXT:    ], !prof !11
101 // CHECK:       sw.bb:
102 // CHECK-NEXT:    br label [[SW_BB1]]
103 // CHECK:       sw.bb1:
104 // CHECK-NEXT:    br label [[SW_EPILOG]]
105 // CHECK:       sw.epilog:
106 // CHECK-NEXT:    ret void
107 //
CasesFallthroughNNLN()108 void CasesFallthroughNNLN() {
109   switch (i) {
110     case 1:
111     case 2:
112     [[likely]] case 3:
113     case 4: break;
114   }
115 }
116 
117 // CHECK-LABEL: @_Z20CasesFallthroughNNUNv(
118 // CHECK-NEXT:  entry:
119 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
120 // CHECK-NEXT:    switch i32 [[TMP0]], label [[SW_EPILOG:%.*]] [
121 // CHECK-NEXT:    i32 1, label [[SW_BB:%.*]]
122 // CHECK-NEXT:    i32 2, label [[SW_BB]]
123 // CHECK-NEXT:    i32 3, label [[SW_BB1:%.*]]
124 // CHECK-NEXT:    i32 4, label [[SW_BB1]]
125 // CHECK-NEXT:    ], !prof !12
126 // CHECK:       sw.bb:
127 // CHECK-NEXT:    br label [[SW_BB1]]
128 // CHECK:       sw.bb1:
129 // CHECK-NEXT:    br label [[SW_EPILOG]]
130 // CHECK:       sw.epilog:
131 // CHECK-NEXT:    ret void
132 //
CasesFallthroughNNUN()133 void CasesFallthroughNNUN() {
134   switch (i) {
135     case 1:
136     case 2:
137     [[unlikely]] case 3:
138     case 4: break;
139   }
140 }
141 
142 // CHECK-LABEL: @_Z28CasesFallthroughRangeSmallLNv(
143 // CHECK-NEXT:  entry:
144 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
145 // CHECK-NEXT:    switch i32 [[TMP0]], label [[SW_EPILOG:%.*]] [
146 // CHECK-NEXT:    i32 1, label [[SW_BB:%.*]]
147 // CHECK-NEXT:    i32 2, label [[SW_BB]]
148 // CHECK-NEXT:    i32 3, label [[SW_BB]]
149 // CHECK-NEXT:    i32 4, label [[SW_BB]]
150 // CHECK-NEXT:    i32 5, label [[SW_BB]]
151 // CHECK-NEXT:    i32 102, label [[SW_BB1:%.*]]
152 // CHECK-NEXT:    i32 103, label [[SW_BB2:%.*]]
153 // CHECK-NEXT:    i32 104, label [[SW_BB2]]
154 // CHECK-NEXT:    ], !prof !13
155 // CHECK:       sw.bb:
156 // CHECK-NEXT:    [[TMP1:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
157 // CHECK-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP1]], 1
158 // CHECK-NEXT:    store volatile i32 [[INC]], i32* @i, align 4, !tbaa [[TBAA2]]
159 // CHECK-NEXT:    br label [[SW_BB1]]
160 // CHECK:       sw.bb1:
161 // CHECK-NEXT:    br label [[SW_BB2]]
162 // CHECK:       sw.bb2:
163 // CHECK-NEXT:    br label [[SW_EPILOG]]
164 // CHECK:       sw.epilog:
165 // CHECK-NEXT:    ret void
166 //
CasesFallthroughRangeSmallLN()167 void CasesFallthroughRangeSmallLN() {
168   switch (i) {
169     case 1 ... 5: ++i;
170     case 102:
171     [[likely]] case 103:
172     case 104: break;
173   }
174 }
175 
176 // CHECK-LABEL: @_Z28CasesFallthroughRangeSmallUNv(
177 // CHECK-NEXT:  entry:
178 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
179 // CHECK-NEXT:    switch i32 [[TMP0]], label [[SW_EPILOG:%.*]] [
180 // CHECK-NEXT:    i32 1, label [[SW_BB:%.*]]
181 // CHECK-NEXT:    i32 2, label [[SW_BB]]
182 // CHECK-NEXT:    i32 3, label [[SW_BB]]
183 // CHECK-NEXT:    i32 4, label [[SW_BB]]
184 // CHECK-NEXT:    i32 5, label [[SW_BB]]
185 // CHECK-NEXT:    i32 102, label [[SW_BB1:%.*]]
186 // CHECK-NEXT:    i32 103, label [[SW_BB2:%.*]]
187 // CHECK-NEXT:    i32 104, label [[SW_BB2]]
188 // CHECK-NEXT:    ], !prof !14
189 // CHECK:       sw.bb:
190 // CHECK-NEXT:    [[TMP1:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
191 // CHECK-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP1]], 1
192 // CHECK-NEXT:    store volatile i32 [[INC]], i32* @i, align 4, !tbaa [[TBAA2]]
193 // CHECK-NEXT:    br label [[SW_BB1]]
194 // CHECK:       sw.bb1:
195 // CHECK-NEXT:    br label [[SW_BB2]]
196 // CHECK:       sw.bb2:
197 // CHECK-NEXT:    br label [[SW_EPILOG]]
198 // CHECK:       sw.epilog:
199 // CHECK-NEXT:    ret void
200 //
CasesFallthroughRangeSmallUN()201 void CasesFallthroughRangeSmallUN() {
202   switch (i) {
203     case 1 ... 5: ++i;
204     case 102:
205     [[unlikely]] case 103:
206     case 104: break;
207   }
208 }
209 
210 // CHECK-LABEL: @_Z29CasesFallthroughRangeLargeLLNv(
211 // CHECK-NEXT:  entry:
212 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
213 // CHECK-NEXT:    switch i32 [[TMP0]], label [[SW_CASERANGE:%.*]] [
214 // CHECK-NEXT:    i32 1003, label [[SW_BB1:%.*]]
215 // CHECK-NEXT:    i32 104, label [[SW_BB1]]
216 // CHECK-NEXT:    ], !prof !8
217 // CHECK:       sw.bb:
218 // CHECK-NEXT:    br label [[SW_BB1]]
219 // CHECK:       sw.bb1:
220 // CHECK-NEXT:    br label [[SW_EPILOG:%.*]]
221 // CHECK:       sw.caserange:
222 // CHECK-NEXT:    [[TMP1:%.*]] = sub i32 [[TMP0]], 0
223 // CHECK-NEXT:    [[INBOUNDS:%.*]] = icmp ule i32 [[TMP1]], 64
224 // CHECK-NEXT:    [[INBOUNDS_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[INBOUNDS]], i1 true)
225 // CHECK-NEXT:    br i1 [[INBOUNDS_EXPVAL]], label [[SW_BB:%.*]], label [[SW_EPILOG]]
226 // CHECK:       sw.epilog:
227 // CHECK-NEXT:    ret void
228 //
CasesFallthroughRangeLargeLLN()229 void CasesFallthroughRangeLargeLLN() {
230   switch (i) {
231     [[likely]] case 0 ... 64:
232     [[likely]] case 1003:
233     case 104: break;
234   }
235 }
236 
237 // CHECK-LABEL: @_Z29CasesFallthroughRangeLargeUUNv(
238 // CHECK-NEXT:  entry:
239 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
240 // CHECK-NEXT:    switch i32 [[TMP0]], label [[SW_CASERANGE:%.*]] [
241 // CHECK-NEXT:    i32 1003, label [[SW_BB1:%.*]]
242 // CHECK-NEXT:    i32 104, label [[SW_BB1]]
243 // CHECK-NEXT:    ], !prof !9
244 // CHECK:       sw.bb:
245 // CHECK-NEXT:    br label [[SW_BB1]]
246 // CHECK:       sw.bb1:
247 // CHECK-NEXT:    br label [[SW_EPILOG:%.*]]
248 // CHECK:       sw.caserange:
249 // CHECK-NEXT:    [[TMP1:%.*]] = sub i32 [[TMP0]], 0
250 // CHECK-NEXT:    [[INBOUNDS:%.*]] = icmp ule i32 [[TMP1]], 64
251 // CHECK-NEXT:    [[INBOUNDS_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[INBOUNDS]], i1 false)
252 // CHECK-NEXT:    br i1 [[INBOUNDS_EXPVAL]], label [[SW_BB:%.*]], label [[SW_EPILOG]]
253 // CHECK:       sw.epilog:
254 // CHECK-NEXT:    ret void
255 //
CasesFallthroughRangeLargeUUN()256 void CasesFallthroughRangeLargeUUN() {
257   switch (i) {
258     [[unlikely]] case 0 ... 64:
259     [[unlikely]] case 1003:
260     case 104: break;
261   }
262 }
263 
264 // CHECK-LABEL: @_Z15OneCaseDefaultLv(
265 // CHECK-NEXT:  entry:
266 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
267 // CHECK-NEXT:    switch i32 [[TMP0]], label [[SW_DEFAULT:%.*]] [
268 // CHECK-NEXT:    i32 1, label [[SW_EPILOG:%.*]]
269 // CHECK-NEXT:    ], !prof !15
270 // CHECK:       sw.default:
271 // CHECK-NEXT:    br label [[SW_EPILOG]]
272 // CHECK:       sw.epilog:
273 // CHECK-NEXT:    ret void
274 //
OneCaseDefaultL()275 void OneCaseDefaultL() {
276   switch (i) {
277     case 1: break;
278     [[likely]] default: break;
279   }
280 }
281 
282 // CHECK-LABEL: @_Z15OneCaseDefaultUv(
283 // CHECK-NEXT:  entry:
284 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
285 // CHECK-NEXT:    switch i32 [[TMP0]], label [[SW_DEFAULT:%.*]] [
286 // CHECK-NEXT:    i32 1, label [[SW_EPILOG:%.*]]
287 // CHECK-NEXT:    ], !prof !16
288 // CHECK:       sw.default:
289 // CHECK-NEXT:    br label [[SW_EPILOG]]
290 // CHECK:       sw.epilog:
291 // CHECK-NEXT:    ret void
292 //
OneCaseDefaultU()293 void OneCaseDefaultU() {
294   switch (i) {
295     case 1: break;
296     [[unlikely]] default: break;
297   }
298 }
299 
300 // CHECK-LABEL: @_Z18TwoCasesDefaultLNLv(
301 // CHECK-NEXT:  entry:
302 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
303 // CHECK-NEXT:    switch i32 [[TMP0]], label [[SW_DEFAULT:%.*]] [
304 // CHECK-NEXT:    i32 1, label [[SW_EPILOG:%.*]]
305 // CHECK-NEXT:    i32 2, label [[SW_EPILOG]]
306 // CHECK-NEXT:    ], !prof !17
307 // CHECK:       sw.default:
308 // CHECK-NEXT:    br label [[SW_EPILOG]]
309 // CHECK:       sw.epilog:
310 // CHECK-NEXT:    ret void
311 //
TwoCasesDefaultLNL()312 void TwoCasesDefaultLNL() {
313   switch (i) {
314     [[likely]] case 1: break;
315     case 2: break;
316     [[likely]] default: break;
317   }
318 }
319 
320 // CHECK-LABEL: @_Z18TwoCasesDefaultLNNv(
321 // CHECK-NEXT:  entry:
322 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
323 // CHECK-NEXT:    switch i32 [[TMP0]], label [[SW_DEFAULT:%.*]] [
324 // CHECK-NEXT:    i32 1, label [[SW_EPILOG:%.*]]
325 // CHECK-NEXT:    i32 2, label [[SW_EPILOG]]
326 // CHECK-NEXT:    ], !prof !8
327 // CHECK:       sw.default:
328 // CHECK-NEXT:    br label [[SW_EPILOG]]
329 // CHECK:       sw.epilog:
330 // CHECK-NEXT:    ret void
331 //
TwoCasesDefaultLNN()332 void TwoCasesDefaultLNN() {
333   switch (i) {
334     [[likely]] case 1: break;
335     case 2: break;
336     default: break;
337   }
338 }
339 
340 // CHECK-LABEL: @_Z18TwoCasesDefaultLNUv(
341 // CHECK-NEXT:  entry:
342 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* @i, align 4, !tbaa [[TBAA2]]
343 // CHECK-NEXT:    switch i32 [[TMP0]], label [[SW_DEFAULT:%.*]] [
344 // CHECK-NEXT:    i32 1, label [[SW_EPILOG:%.*]]
345 // CHECK-NEXT:    i32 2, label [[SW_EPILOG]]
346 // CHECK-NEXT:    ], !prof !18
347 // CHECK:       sw.default:
348 // CHECK-NEXT:    br label [[SW_EPILOG]]
349 // CHECK:       sw.epilog:
350 // CHECK-NEXT:    ret void
351 //
TwoCasesDefaultLNU()352 void TwoCasesDefaultLNU() {
353   switch (i) {
354     [[likely]] case 1: break;
355     case 2: break;
356     [[unlikely]] default: break;
357   }
358 }
359