@@ -6,314 +6,158 @@ int foo() { return 200; }
6
6
void main () {
7
7
int result;
8
8
9
-
10
-
11
9
////////////////////////////
12
10
// The most basic case //
13
11
// Has a 'default' case //
14
12
// All cases have 'break' //
15
13
////////////////////////////
16
-
17
14
int a = 0 ;
18
- // CHECK: [[a:%[0-9]+]] = OpLoad %int %a
19
- // CHECK-NEXT: OpSelectionMerge %switch_merge None
20
- // CHECK-NEXT: OpSwitch [[a]] %switch_default -3 %switch_n3 0 %switch_0 1 %switch_1 2 %switch_2
21
15
switch (a) {
22
- // CHECK-NEXT: %switch_n3 = OpLabel
23
- // CHECK-NEXT: OpStore %result %int_n300
24
- // CHECK-NEXT: OpBranch %switch_merge
25
16
case -3 :
26
17
result = -300 ;
27
18
break ;
28
- // CHECK-NEXT: %switch_0 = OpLabel
29
- // CHECK-NEXT: OpStore %result %int_0
30
- // CHECK-NEXT: OpBranch %switch_merge
31
19
case 0 :
32
20
result = 0 ;
33
21
break ;
34
- // CHECK-NEXT: %switch_1 = OpLabel
35
- // CHECK-NEXT: OpStore %result %int_100
36
- // CHECK-NEXT: OpBranch %switch_merge
37
22
case 1 :
38
23
result = 100 ;
39
24
break ;
40
- // CHECK-NEXT: %switch_2 = OpLabel
41
- // CHECK-NEXT: [[foo:%[0-9]+]] = OpFunctionCall %int %foo
42
- // CHECK-NEXT: OpStore %result [[foo]]
43
- // CHECK-NEXT: OpBranch %switch_merge
44
25
case 2 :
45
26
result = foo ();
46
27
break ;
47
- // CHECK-NEXT: %switch_default = OpLabel
48
- // CHECK-NEXT: OpStore %result %int_777
49
- // CHECK-NEXT: OpBranch %switch_merge
50
28
default :
51
29
result = 777 ;
52
30
break ;
53
31
}
54
- // CHECK-NEXT: %switch_merge = OpLabel
55
-
56
-
57
32
58
33
////////////////////////////////////
59
34
// The selector is a statement //
60
35
// Does not have a 'default' case //
61
36
// All cases have 'break' //
62
37
////////////////////////////////////
63
38
64
- // CHECK-NEXT: [[a1:%[0-9]+]] = OpLoad %int %a
65
- // CHECK-NEXT: OpStore %c [[a1]]
66
- // CHECK-NEXT: [[c:%[0-9]+]] = OpLoad %int %c
67
- // CHECK-NEXT: OpSelectionMerge %switch_merge_0 None
68
- // CHECK-NEXT: OpSwitch [[c]] %switch_merge_0 -4 %switch_n4 4 %switch_4
69
39
switch (int c = a) {
70
- // CHECK-NEXT: %switch_n4 = OpLabel
71
- // CHECK-NEXT: OpStore %result %int_n400
72
- // CHECK-NEXT: OpBranch %switch_merge_0
73
40
case -4 :
74
41
result = -400 ;
75
42
break ;
76
- // CHECK-NEXT: %switch_4 = OpLabel
77
- // CHECK-NEXT: OpStore %result %int_400
78
- // CHECK-NEXT: OpBranch %switch_merge_0
79
43
case 4 :
80
44
result = 400 ;
81
45
break ;
82
46
}
83
- // CHECK-NEXT: %switch_merge_0 = OpLabel
84
-
85
-
86
47
87
48
///////////////////////////////////
88
49
// All cases are fall-through //
89
50
// The last case is fall-through //
90
51
///////////////////////////////////
91
-
92
- // CHECK-NEXT: [[a2:%[0-9]+]] = OpLoad %int %a
93
- // CHECK-NEXT: OpSelectionMerge %switch_merge_1 None
94
- // CHECK-NEXT: OpSwitch [[a2]] %switch_merge_1 -5 %switch_n5 5 %switch_5
95
52
switch (a) {
96
- // CHECK-NEXT: %switch_n5 = OpLabel
97
- // CHECK-NEXT: OpStore %result %int_n500
98
- // CHECK-NEXT: OpBranch %switch_5
99
53
case -5 :
100
54
result = -500 ;
101
- // CHECK-NEXT: %switch_5 = OpLabel
102
- // CHECK-NEXT: OpStore %result %int_500
103
- // CHECK-NEXT: OpBranch %switch_merge_1
104
55
case 5 :
105
56
result = 500 ;
106
57
}
107
- // CHECK-NEXT: %switch_merge_1 = OpLabel
108
-
109
-
110
58
111
59
///////////////////////////////////////
112
60
// Some cases are fall-through //
113
61
// The last case is not fall-through //
114
62
///////////////////////////////////////
115
63
116
- // CHECK-NEXT: [[a3:%[0-9]+]] = OpLoad %int %a
117
- // CHECK-NEXT: OpSelectionMerge %switch_merge_2 None
118
- // CHECK-NEXT: OpSwitch [[a3]] %switch_default_0 6 %switch_6 7 %switch_7 8 %switch_8
119
64
switch (a) {
120
- // CHECK-NEXT: %switch_6 = OpLabel
121
- // CHECK-NEXT: OpStore %result %int_600
122
- // CHECK-NEXT: OpBranch %switch_7
123
65
case 6 :
124
66
result = 600 ;
125
67
case 7 :
126
- // CHECK-NEXT: %switch_7 = OpLabel
127
- // CHECK-NEXT: OpStore %result %int_700
128
- // CHECK-NEXT: OpBranch %switch_8
129
68
result = 700 ;
130
- // CHECK-NEXT: %switch_8 = OpLabel
131
- // CHECK-NEXT: OpStore %result %int_800
132
- // CHECK-NEXT: OpBranch %switch_merge_2
133
69
case 8 :
134
70
result = 800 ;
135
71
break ;
136
- // CHECK-NEXT: %switch_default_0 = OpLabel
137
- // CHECK-NEXT: OpStore %result %int_777
138
- // CHECK-NEXT: OpBranch %switch_merge_2
139
72
default :
140
73
result = 777 ;
141
74
break ;
142
75
}
143
- // CHECK-NEXT: %switch_merge_2 = OpLabel
144
-
145
-
146
76
147
77
///////////////////////////////////////
148
78
// Fall-through cases with no body //
149
79
///////////////////////////////////////
150
80
151
- // CHECK-NEXT: [[a4:%[0-9]+]] = OpLoad %int %a
152
- // CHECK-NEXT: OpSelectionMerge %switch_merge_3 None
153
- // CHECK-NEXT: OpSwitch [[a4]] %switch_default_1 10 %switch_10 11 %switch_11 12 %switch_12
154
81
switch (a) {
155
- // CHECK-NEXT: %switch_10 = OpLabel
156
- // CHECK-NEXT: OpBranch %switch_11
157
82
case 10 :
158
- // CHECK-NEXT: %switch_11 = OpLabel
159
- // CHECK-NEXT: OpBranch %switch_default_1
160
83
case 11 :
161
- // CHECK-NEXT: %switch_default_1 = OpLabel
162
- // CHECK-NEXT: OpBranch %switch_12
163
84
default :
164
- // CHECK-NEXT: %switch_12 = OpLabel
165
- // CHECK-NEXT: OpStore %result %int_12
166
- // CHECK-NEXT: OpBranch %switch_merge_3
167
85
case 12 :
168
86
result = 12 ;
169
87
}
170
- // CHECK-NEXT: %switch_merge_3 = OpLabel
171
-
172
-
173
88
174
89
////////////////////////////////////////////////
175
90
// No-op. Two nested cases and a nested break //
176
91
////////////////////////////////////////////////
177
92
178
- // CHECK-NEXT: [[a5:%[0-9]+]] = OpLoad %int %a
179
- // CHECK-NEXT: OpSelectionMerge %switch_merge_4 None
180
- // CHECK-NEXT: OpSwitch [[a5]] %switch_merge_4 15 %switch_15 16 %switch_16
181
93
switch (a) {
182
- // CHECK-NEXT: %switch_15 = OpLabel
183
- // CHECK-NEXT: OpBranch %switch_16
184
94
case 15 :
185
- // CHECK-NEXT: %switch_16 = OpLabel
186
- // CHECK-NEXT: OpBranch %switch_merge_4
187
95
case 16 :
188
96
break ;
189
97
}
190
- // CHECK-NEXT: %switch_merge_4 = OpLabel
191
-
192
-
193
98
194
99
////////////////////////////////////////////////////////////////
195
100
// Using braces (compound statements) in various parts //
196
101
// Using breaks such that each AST configuration is different //
197
102
// Also uses 'forcecase' attribute //
198
103
////////////////////////////////////////////////////////////////
199
104
200
- // CHECK-NEXT: [[a6:%[0-9]+]] = OpLoad %int %a
201
- // CHECK-NEXT: OpSelectionMerge %switch_merge_5 None
202
- // CHECK-NEXT: OpSwitch [[a6]] %switch_merge_5 20 %switch_20 21 %switch_21 22 %switch_22 23 %switch_23 24 %switch_24 25 %switch_25 26 %switch_26 27 %switch_27 28 %switch_28 29 %switch_29
203
105
switch (a) {
204
- // CHECK-NEXT: %switch_20 = OpLabel
205
- // CHECK-NEXT: OpStore %result %int_20
206
- // CHECK-NEXT: OpBranch %switch_merge_5
207
106
case 20 : {
208
107
result = 20 ;
209
108
break ;
210
109
}
211
- // CHECK-NEXT: %switch_21 = OpLabel
212
- // CHECK-NEXT: OpStore %result %int_21
213
- // CHECK-NEXT: OpBranch %switch_merge_5
214
110
case 21 :
215
111
result = 21 ;
216
112
break ;
217
- // CHECK-NEXT: %switch_22 = OpLabel
218
- // CHECK-NEXT: OpBranch %switch_23
219
- // CHECK-NEXT: %switch_23 = OpLabel
220
- // CHECK-NEXT: OpBranch %switch_merge_5
221
113
case 22 :
222
114
case 23 :
223
115
break ;
224
- // CHECK-NEXT: %switch_24 = OpLabel
225
- // CHECK-NEXT: OpBranch %switch_25
226
- // CHECK-NEXT: %switch_25 = OpLabel
227
- // CHECK-NEXT: OpStore %result %int_25
228
- // CHECK-NEXT: OpBranch %switch_merge_5
229
116
case 24 :
230
117
case 25 : { result = 25 ; }
231
118
break ;
232
- // CHECK-NEXT: %switch_26 = OpLabel
233
- // CHECK-NEXT: OpBranch %switch_27
234
- // CHECK-NEXT: %switch_27 = OpLabel
235
- // CHECK-NEXT: OpBranch %switch_merge_5
236
119
case 26 :
237
120
case 27 : {
238
121
break ;
239
122
}
240
- // CHECK-NEXT: %switch_28 = OpLabel
241
- // CHECK-NEXT: OpStore %result %int_28
242
- // CHECK-NEXT: OpBranch %switch_merge_5
243
123
case 28 : {
244
124
result = 28 ;
245
125
{{break ;}}
246
126
}
247
- // CHECK-NEXT: %switch_29 = OpLabel
248
- // CHECK-NEXT: OpStore %result %int_29
249
- // CHECK-NEXT: OpBranch %switch_merge_5
250
127
case 29 : {
251
128
{
252
129
result = 29 ;
253
130
{break ;}
254
131
}
255
132
}
256
133
}
257
- // CHECK-NEXT: %switch_merge_5 = OpLabel
258
-
259
-
260
134
261
135
////////////////////////////////////////////////////////////////////////
262
136
// Nested Switch statements with mixed use of fall-through and braces //
263
137
////////////////////////////////////////////////////////////////////////
264
138
265
- // CHECK-NEXT: [[a7:%[0-9]+]] = OpLoad %int %a
266
- // CHECK-NEXT: OpSelectionMerge %switch_merge_7 None
267
- // CHECK-NEXT: OpSwitch [[a7]] %switch_merge_7 30 %switch_30
268
139
switch (a) {
269
- // CHECK-NEXT: %switch_30 = OpLabel
270
140
case 30 : {
271
- // CHECK-NEXT: OpStore %result %int_30
272
141
result = 30 ;
273
- // CHECK-NEXT: [[result:%[0-9]+]] = OpLoad %int %result
274
- // CHECK-NEXT: OpSelectionMerge %switch_merge_6 None
275
- // CHECK-NEXT: OpSwitch [[result]] %switch_default_2 50 %switch_50 51 %switch_51 52 %switch_52 53 %switch_53 54 %switch_54
276
142
switch (result) {
277
- // CHECK-NEXT: %switch_default_2 = OpLabel
278
- // CHECK-NEXT: OpStore %a %int_55
279
- // CHECK-NEXT: OpBranch %switch_50
280
143
default :
281
144
a = 55 ;
282
- // CHECK-NEXT: %switch_50 = OpLabel
283
- // CHECK-NEXT: OpStore %a %int_50
284
- // CHECK-NEXT: OpBranch %switch_merge_6
285
145
case 50 :
286
146
a = 50 ;
287
147
break ;
288
- // CHECK-NEXT: %switch_51 = OpLabel
289
- // CHECK-NEXT: OpBranch %switch_52
290
148
case 51 :
291
- // CHECK-NEXT: %switch_52 = OpLabel
292
- // CHECK-NEXT: OpStore %a %int_52
293
- // CHECK-NEXT: OpBranch %switch_53
294
149
case 52 :
295
150
a = 52 ;
296
- // CHECK-NEXT: %switch_53 = OpLabel
297
- // CHECK-NEXT: OpStore %a %int_53
298
- // CHECK-NEXT: OpBranch %switch_merge_6
299
151
case 53 :
300
152
a = 53 ;
301
153
break ;
302
- // CHECK-NEXT: %switch_54 = OpLabel
303
- // CHECK-NEXT: OpStore %a %int_54
304
- // CHECK-NEXT: OpBranch %switch_merge_6
305
154
case 54 : {
306
155
a = 54 ;
307
156
break ;
308
157
}
309
158
}
310
- // CHECK-NEXT: %switch_merge_6 = OpLabel
311
- // CHECK-NEXT: OpBranch %switch_merge_7
312
159
}
313
160
}
314
- // CHECK-NEXT: %switch_merge_7 = OpLabel
315
-
316
-
317
161
318
162
///////////////////////////////////////////////
319
163
// Constant integer variables as case values //
@@ -323,35 +167,19 @@ void main() {
323
167
const int s = 45 ;
324
168
const int t = 2 *r + s; // evaluates to 115.
325
169
326
- // CHECK: [[a8:%[0-9]+]] = OpLoad %int %a
327
- // CHECK-NEXT: OpSelectionMerge %switch_merge_8 None
328
- // CHECK-NEXT: OpSwitch [[a8]] %switch_merge_8 35 %switch_35 115 %switch_115
329
170
switch (a) {
330
- // CHECK-NEXT: %switch_35 = OpLabel
331
- // CHECK-NEXT: [[r:%[0-9]+]] = OpLoad %int %r
332
- // CHECK-NEXT: OpStore %result [[r]]
333
- // CHECK-NEXT: OpBranch %switch_115
334
171
case r:
335
172
result = r;
336
- // CHECK-NEXT: %switch_115 = OpLabel
337
- // CHECK-NEXT: [[t:%[0-9]+]] = OpLoad %int %t
338
- // CHECK-NEXT: OpStore %result [[t]]
339
- // CHECK-NEXT: OpBranch %switch_merge_8
340
173
case t:
341
174
result = t;
342
175
break ;
343
- // CHECK-NEXT: %switch_merge_8 = OpLabel
344
176
}
345
177
346
178
347
179
//////////////////////////////////////////////////////////////////
348
180
// Using float as selector results in multiple casts in the AST //
349
181
//////////////////////////////////////////////////////////////////
350
182
float sel;
351
- // CHECK: [[floatSelector:%[0-9]+]] = OpLoad %float %sel
352
- // CHECK-NEXT: [[sel:%[0-9]+]] = OpConvertFToS %int [[floatSelector]]
353
- // CHECK-NEXT: OpSelectionMerge %switch_merge_9 None
354
- // CHECK-NEXT: OpSwitch [[sel]] %switch_merge_9 0 %switch_0_0
355
183
switch ((int )sel) {
356
184
case 0 :
357
185
result = 0 ;
0 commit comments