xref: /llvm-project/mlir/test/Target/Cpp/switch.mlir (revision 3ef90f843fee74ff811ef88246734475f50e2073)
1// RUN: mlir-translate -mlir-to-cpp %s | FileCheck --match-full-lines %s -check-prefix=CPP-DEFAULT
2// RUN: mlir-translate -mlir-to-cpp -declare-variables-at-top %s | FileCheck --match-full-lines %s -check-prefix=CPP-DECLTOP
3
4// CPP-DEFAULT-LABEL: void emitc_switch_ptrdiff_t() {
5// CPP-DEFAULT:         ptrdiff_t v1 = 1;
6// CPP-DEFAULT:         switch (v1) {
7// CPP-DEFAULT:         case 2: {
8// CPP-DEFAULT:           int32_t v2 = func_b();
9// CPP-DEFAULT:           break;
10// CPP-DEFAULT:         }
11// CPP-DEFAULT:         case 5: {
12// CPP-DEFAULT:           int32_t v3 = func_a();
13// CPP-DEFAULT:           break;
14// CPP-DEFAULT:         }
15// CPP-DEFAULT:         default: {
16// CPP-DEFAULT:           float v4 = 4.200000000e+01f;
17// CPP-DEFAULT:           func2(v4);
18// CPP-DEFAULT:           break;
19// CPP-DEFAULT:         }
20// CPP-DEFAULT:         }
21// CPP-DEFAULT:         return;
22// CPP-DEFAULT:       }
23
24// CPP-DECLTOP-LABEL: void emitc_switch_ptrdiff_t() {
25// CPP-DECLTOP:         ptrdiff_t v1;
26// CPP-DECLTOP:         float v2;
27// CPP-DECLTOP:         int32_t v3;
28// CPP-DECLTOP:         int32_t v4;
29// CPP-DECLTOP:         v1 = 1;
30// CPP-DECLTOP:         switch (v1) {
31// CPP-DECLTOP:         case 2: {
32// CPP-DECLTOP:           v3 = func_b();
33// CPP-DECLTOP:           break;
34// CPP-DECLTOP:         }
35// CPP-DECLTOP:         case 5: {
36// CPP-DECLTOP:           v4 = func_a();
37// CPP-DECLTOP:           break;
38// CPP-DECLTOP:         }
39// CPP-DECLTOP:         default: {
40// CPP-DECLTOP:           v2 = 4.200000000e+01f;
41// CPP-DECLTOP:           func2(v2);
42// CPP-DECLTOP:           break;
43// CPP-DECLTOP:         }
44// CPP-DECLTOP:         }
45// CPP-DECLTOP:         return;
46// CPP-DECLTOP:       }
47func.func @emitc_switch_ptrdiff_t() {
48  %0 = "emitc.constant"(){value = 1 : index} : () -> !emitc.ptrdiff_t
49
50  emitc.switch %0 : !emitc.ptrdiff_t
51  case 2 {
52    %1 = emitc.call_opaque "func_b" () : () -> i32
53    emitc.yield
54  }
55  case 5 {
56    %2 = emitc.call_opaque "func_a" () : () -> i32
57    emitc.yield
58  }
59  default {
60    %3 = "emitc.constant"(){value = 42.0 : f32} : () -> f32
61    emitc.call_opaque "func2" (%3) : (f32) -> ()
62  }
63  return
64}
65
66// CPP-DEFAULT-LABEL: void emitc_switch_ssize_t() {
67// CPP-DEFAULT:         ssize_t v1 = 1;
68// CPP-DEFAULT:         switch (v1) {
69// CPP-DEFAULT:         case 2: {
70// CPP-DEFAULT:           int32_t v2 = func_b();
71// CPP-DEFAULT:           break;
72// CPP-DEFAULT:         }
73// CPP-DEFAULT:         case 5: {
74// CPP-DEFAULT:           int32_t v3 = func_a();
75// CPP-DEFAULT:           break;
76// CPP-DEFAULT:         }
77// CPP-DEFAULT:         default: {
78// CPP-DEFAULT:           float v4 = 4.200000000e+01f;
79// CPP-DEFAULT:           func2(v4);
80// CPP-DEFAULT:           break;
81// CPP-DEFAULT:         }
82// CPP-DEFAULT:         }
83// CPP-DEFAULT:         return;
84// CPP-DEFAULT:       }
85
86// CPP-DECLTOP-LABEL: void emitc_switch_ssize_t() {
87// CPP-DECLTOP:         ssize_t v1;
88// CPP-DECLTOP:         float v2;
89// CPP-DECLTOP:         int32_t v3;
90// CPP-DECLTOP:         int32_t v4;
91// CPP-DECLTOP:         v1 = 1;
92// CPP-DECLTOP:         switch (v1) {
93// CPP-DECLTOP:         case 2: {
94// CPP-DECLTOP:           v3 = func_b();
95// CPP-DECLTOP:           break;
96// CPP-DECLTOP:         }
97// CPP-DECLTOP:         case 5: {
98// CPP-DECLTOP:           v4 = func_a();
99// CPP-DECLTOP:           break;
100// CPP-DECLTOP:         }
101// CPP-DECLTOP:         default: {
102// CPP-DECLTOP:           v2 = 4.200000000e+01f;
103// CPP-DECLTOP:           func2(v2);
104// CPP-DECLTOP:           break;
105// CPP-DECLTOP:         }
106// CPP-DECLTOP:         }
107// CPP-DECLTOP:         return;
108// CPP-DECLTOP:       }
109func.func @emitc_switch_ssize_t() {
110  %0 = "emitc.constant"(){value = 1 : index} : () -> !emitc.ssize_t
111
112  emitc.switch %0 : !emitc.ssize_t
113  case 2 {
114    %1 = emitc.call_opaque "func_b" () : () -> i32
115    emitc.yield
116  }
117  case 5 {
118    %2 = emitc.call_opaque "func_a" () : () -> i32
119    emitc.yield
120  }
121  default {
122    %3 = "emitc.constant"(){value = 42.0 : f32} : () -> f32
123    emitc.call_opaque "func2" (%3) : (f32) -> ()
124    emitc.yield
125  }
126  return
127}
128
129// CPP-DEFAULT-LABEL: void emitc_switch_size_t() {
130// CPP-DEFAULT:         size_t v1 = 1;
131// CPP-DEFAULT:         switch (v1) {
132// CPP-DEFAULT:         case 2: {
133// CPP-DEFAULT:           int32_t v2 = func_b();
134// CPP-DEFAULT:           break;
135// CPP-DEFAULT:         }
136// CPP-DEFAULT:         case 5: {
137// CPP-DEFAULT:           int32_t v3 = func_a();
138// CPP-DEFAULT:           break;
139// CPP-DEFAULT:         }
140// CPP-DEFAULT:         default: {
141// CPP-DEFAULT:           float v4 = 4.200000000e+01f;
142// CPP-DEFAULT:           func2(v4);
143// CPP-DEFAULT:           break;
144// CPP-DEFAULT:         }
145// CPP-DEFAULT:         }
146// CPP-DEFAULT:         return;
147// CPP-DEFAULT:       }
148
149// CPP-DECLTOP-LABEL: void emitc_switch_size_t() {
150// CPP-DECLTOP:         size_t v1;
151// CPP-DECLTOP:         float v2;
152// CPP-DECLTOP:         int32_t v3;
153// CPP-DECLTOP:         int32_t v4;
154// CPP-DECLTOP:         v1 = 1;
155// CPP-DECLTOP:         switch (v1) {
156// CPP-DECLTOP:         case 2: {
157// CPP-DECLTOP:           v3 = func_b();
158// CPP-DECLTOP:           break;
159// CPP-DECLTOP:         }
160// CPP-DECLTOP:         case 5: {
161// CPP-DECLTOP:           v4 = func_a();
162// CPP-DECLTOP:           break;
163// CPP-DECLTOP:         }
164// CPP-DECLTOP:         default: {
165// CPP-DECLTOP:           v2 = 4.200000000e+01f;
166// CPP-DECLTOP:           func2(v2);
167// CPP-DECLTOP:           break;
168// CPP-DECLTOP:         }
169// CPP-DECLTOP:         }
170// CPP-DECLTOP:         return;
171// CPP-DECLTOP:       }
172func.func @emitc_switch_size_t() {
173  %0 = "emitc.constant"(){value = 1 : index} : () -> !emitc.size_t
174
175  emitc.switch %0 : !emitc.size_t
176  case 2 {
177    %1 = emitc.call_opaque "func_b" () : () -> i32
178    emitc.yield
179  }
180  case 5 {
181    %2 = emitc.call_opaque "func_a" () : () -> i32
182    emitc.yield
183  }
184  default {
185    %3 = "emitc.constant"(){value = 42.0 : f32} : () -> f32
186    emitc.call_opaque "func2" (%3) : (f32) -> ()
187    emitc.yield
188  }
189  return
190}
191
192// CPP-DEFAULT-LABEL: void emitc_switch_index() {
193// CPP-DEFAULT:         size_t v1 = 1;
194// CPP-DEFAULT:         switch (v1) {
195// CPP-DEFAULT:         case 2: {
196// CPP-DEFAULT:           int32_t v2 = func_b();
197// CPP-DEFAULT:           break;
198// CPP-DEFAULT:         }
199// CPP-DEFAULT:         case 5: {
200// CPP-DEFAULT:           int32_t v3 = func_a();
201// CPP-DEFAULT:           break;
202// CPP-DEFAULT:         }
203// CPP-DEFAULT:         default: {
204// CPP-DEFAULT:           float v4 = 4.200000000e+01f;
205// CPP-DEFAULT:           func2(v4);
206// CPP-DEFAULT:           break;
207// CPP-DEFAULT:         }
208// CPP-DEFAULT:         }
209// CPP-DEFAULT:         return;
210// CPP-DEFAULT:       }
211
212// CPP-DECLTOP-LABEL: void emitc_switch_index() {
213// CPP-DECLTOP:         size_t v1;
214// CPP-DECLTOP:         float v2;
215// CPP-DECLTOP:         int32_t v3;
216// CPP-DECLTOP:         int32_t v4;
217// CPP-DECLTOP:         v1 = 1;
218// CPP-DECLTOP:         switch (v1) {
219// CPP-DECLTOP:         case 2: {
220// CPP-DECLTOP:           v3 = func_b();
221// CPP-DECLTOP:           break;
222// CPP-DECLTOP:         }
223// CPP-DECLTOP:         case 5: {
224// CPP-DECLTOP:           v4 = func_a();
225// CPP-DECLTOP:           break;
226// CPP-DECLTOP:         }
227// CPP-DECLTOP:         default: {
228// CPP-DECLTOP:           v2 = 4.200000000e+01f;
229// CPP-DECLTOP:           func2(v2);
230// CPP-DECLTOP:           break;
231// CPP-DECLTOP:         }
232// CPP-DECLTOP:         }
233// CPP-DECLTOP:         return;
234// CPP-DECLTOP:       }
235func.func @emitc_switch_index() {
236  %0 = "emitc.constant"(){value = 1 : index} : () -> index
237
238  emitc.switch %0 : index
239  case 2 {
240    %1 = emitc.call_opaque "func_b" () : () -> i32
241    emitc.yield
242  }
243  case 5 {
244    %2 = emitc.call_opaque "func_a" () : () -> i32
245    emitc.yield
246  }
247  default {
248    %3 = "emitc.constant"(){value = 42.0 : f32} : () -> f32
249    emitc.call_opaque "func2" (%3) : (f32) -> ()
250    emitc.yield
251  }
252  return
253}
254
255// CPP-DEFAULT-LABEL: void emitc_switch_opaque() {
256// CPP-DEFAULT:         size_t v1 = 1;
257// CPP-DEFAULT:         switch (v1) {
258// CPP-DEFAULT:         case 2: {
259// CPP-DEFAULT:           int32_t v2 = func_b();
260// CPP-DEFAULT:           break;
261// CPP-DEFAULT:         }
262// CPP-DEFAULT:         case 5: {
263// CPP-DEFAULT:           int32_t v3 = func_a();
264// CPP-DEFAULT:           break;
265// CPP-DEFAULT:         }
266// CPP-DEFAULT:         default: {
267// CPP-DEFAULT:           float v4 = 4.200000000e+01f;
268// CPP-DEFAULT:           func2(v4);
269// CPP-DEFAULT:           break;
270// CPP-DEFAULT:         }
271// CPP-DEFAULT:         }
272// CPP-DEFAULT:         return;
273// CPP-DEFAULT:       }
274
275// CPP-DECLTOP-LABEL: void emitc_switch_opaque() {
276// CPP-DECLTOP:         size_t v1;
277// CPP-DECLTOP:         float v2;
278// CPP-DECLTOP:         int32_t v3;
279// CPP-DECLTOP:         int32_t v4;
280// CPP-DECLTOP:         v1 = 1;
281// CPP-DECLTOP:         switch (v1) {
282// CPP-DECLTOP:         case 2: {
283// CPP-DECLTOP:           v3 = func_b();
284// CPP-DECLTOP:           break;
285// CPP-DECLTOP:         }
286// CPP-DECLTOP:         case 5: {
287// CPP-DECLTOP:           v4 = func_a();
288// CPP-DECLTOP:           break;
289// CPP-DECLTOP:         }
290// CPP-DECLTOP:         default: {
291// CPP-DECLTOP:           v2 = 4.200000000e+01f;
292// CPP-DECLTOP:           func2(v2);
293// CPP-DECLTOP:           break;
294// CPP-DECLTOP:         }
295// CPP-DECLTOP:         }
296// CPP-DECLTOP:         return;
297// CPP-DECLTOP:       }
298func.func @emitc_switch_opaque() {
299  %0 = "emitc.constant"() {value = #emitc.opaque<"1">}
300  : () -> !emitc.opaque<"size_t">
301
302  emitc.switch %0 : !emitc.opaque<"size_t">
303  case 2 {
304    %1 = emitc.call_opaque "func_b" () : () -> i32
305    emitc.yield
306  }
307  case 5 {
308    %2 = emitc.call_opaque "func_a" () : () -> i32
309    emitc.yield
310  }
311  default {
312    %3 = "emitc.constant"(){value = 42.0 : f32} : () -> f32
313    emitc.call_opaque "func2" (%3) : (f32) -> ()
314    emitc.yield
315  }
316  return
317}
318
319// CPP-DEFAULT-LABEL: void emitc_switch_i1() {
320// CPP-DEFAULT:         bool v1 = true;
321// CPP-DEFAULT:         switch (v1) {
322// CPP-DEFAULT:         case 2: {
323// CPP-DEFAULT:           int32_t v2 = func_b();
324// CPP-DEFAULT:           break;
325// CPP-DEFAULT:         }
326// CPP-DEFAULT:         case 5: {
327// CPP-DEFAULT:           int32_t v3 = func_a();
328// CPP-DEFAULT:           break;
329// CPP-DEFAULT:         }
330// CPP-DEFAULT:         default: {
331// CPP-DEFAULT:           float v4 = 4.200000000e+01f;
332// CPP-DEFAULT:           func2(v4);
333// CPP-DEFAULT:           break;
334// CPP-DEFAULT:         }
335// CPP-DEFAULT:         }
336// CPP-DEFAULT:         return;
337// CPP-DEFAULT:       }
338
339// CPP-DECLTOP-LABEL: void emitc_switch_i1() {
340// CPP-DECLTOP:         bool v1;
341// CPP-DECLTOP:         float v2;
342// CPP-DECLTOP:         int32_t v3;
343// CPP-DECLTOP:         int32_t v4;
344// CPP-DECLTOP:         v1 = true;
345// CPP-DECLTOP:         switch (v1) {
346// CPP-DECLTOP:         case 2: {
347// CPP-DECLTOP:           v3 = func_b();
348// CPP-DECLTOP:           break;
349// CPP-DECLTOP:         }
350// CPP-DECLTOP:         case 5: {
351// CPP-DECLTOP:           v4 = func_a();
352// CPP-DECLTOP:           break;
353// CPP-DECLTOP:         }
354// CPP-DECLTOP:         default: {
355// CPP-DECLTOP:           v2 = 4.200000000e+01f;
356// CPP-DECLTOP:           func2(v2);
357// CPP-DECLTOP:           break;
358// CPP-DECLTOP:         }
359// CPP-DECLTOP:         }
360// CPP-DECLTOP:         return;
361// CPP-DECLTOP:       }
362func.func @emitc_switch_i1() {
363  %0 = "emitc.constant"(){value = 1 : i1} : () -> i1
364
365  emitc.switch %0 : i1
366  case 2 {
367    %1 = emitc.call_opaque "func_b" () : () -> i32
368    emitc.yield
369  }
370  case 5 {
371    %2 = emitc.call_opaque "func_a" () : () -> i32
372    emitc.yield
373  }
374  default {
375    %3 = "emitc.constant"(){value = 42.0 : f32} : () -> f32
376    emitc.call_opaque "func2" (%3) : (f32) -> ()
377    emitc.yield
378  }
379  return
380}
381
382// CPP-DEFAULT-LABEL: void emitc_switch_i8() {
383// CPP-DEFAULT:         int8_t v1 = 1;
384// CPP-DEFAULT:         switch (v1) {
385// CPP-DEFAULT:         case 2: {
386// CPP-DEFAULT:           int32_t v2 = func_b();
387// CPP-DEFAULT:           break;
388// CPP-DEFAULT:         }
389// CPP-DEFAULT:         case 5: {
390// CPP-DEFAULT:           int32_t v3 = func_a();
391// CPP-DEFAULT:           break;
392// CPP-DEFAULT:         }
393// CPP-DEFAULT:         default: {
394// CPP-DEFAULT:           float v4 = 4.200000000e+01f;
395// CPP-DEFAULT:           func2(v4);
396// CPP-DEFAULT:           break;
397// CPP-DEFAULT:         }
398// CPP-DEFAULT:         }
399// CPP-DEFAULT:         return;
400// CPP-DEFAULT:       }
401
402// CPP-DECLTOP-LABEL: void emitc_switch_i8() {
403// CPP-DECLTOP:         int8_t v1;
404// CPP-DECLTOP:         float v2;
405// CPP-DECLTOP:         int32_t v3;
406// CPP-DECLTOP:         int32_t v4;
407// CPP-DECLTOP:         v1 = 1;
408// CPP-DECLTOP:         switch (v1) {
409// CPP-DECLTOP:         case 2: {
410// CPP-DECLTOP:           v3 = func_b();
411// CPP-DECLTOP:           break;
412// CPP-DECLTOP:         }
413// CPP-DECLTOP:         case 5: {
414// CPP-DECLTOP:           v4 = func_a();
415// CPP-DECLTOP:           break;
416// CPP-DECLTOP:         }
417// CPP-DECLTOP:         default: {
418// CPP-DECLTOP:           v2 = 4.200000000e+01f;
419// CPP-DECLTOP:           func2(v2);
420// CPP-DECLTOP:           break;
421// CPP-DECLTOP:         }
422// CPP-DECLTOP:         }
423// CPP-DECLTOP:         return;
424// CPP-DECLTOP:       }
425func.func @emitc_switch_i8() {
426  %0 = "emitc.constant"(){value = 1 : i8} : () -> i8
427
428  emitc.switch %0 : i8
429  case 2 {
430    %1 = emitc.call_opaque "func_b" () : () -> i32
431    emitc.yield
432  }
433  case 5 {
434    %2 = emitc.call_opaque "func_a" () : () -> i32
435    emitc.yield
436  }
437  default {
438    %3 = "emitc.constant"(){value = 42.0 : f32} : () -> f32
439    emitc.call_opaque "func2" (%3) : (f32) -> ()
440    emitc.yield
441  }
442  return
443}
444
445// CPP-DEFAULT-LABEL: void emitc_switch_ui8() {
446// CPP-DEFAULT:         uint8_t v1 = 1;
447// CPP-DEFAULT:         switch (v1) {
448// CPP-DEFAULT:         case 2: {
449// CPP-DEFAULT:           int32_t v2 = func_b();
450// CPP-DEFAULT:           break;
451// CPP-DEFAULT:         }
452// CPP-DEFAULT:         case 5: {
453// CPP-DEFAULT:           int32_t v3 = func_a();
454// CPP-DEFAULT:           break;
455// CPP-DEFAULT:         }
456// CPP-DEFAULT:         default: {
457// CPP-DEFAULT:           float v4 = 4.200000000e+01f;
458// CPP-DEFAULT:           func2(v4);
459// CPP-DEFAULT:           break;
460// CPP-DEFAULT:         }
461// CPP-DEFAULT:         }
462// CPP-DEFAULT:         return;
463// CPP-DEFAULT:       }
464
465// CPP-DECLTOP-LABEL: void emitc_switch_ui8() {
466// CPP-DECLTOP:         uint8_t v1;
467// CPP-DECLTOP:         float v2;
468// CPP-DECLTOP:         int32_t v3;
469// CPP-DECLTOP:         int32_t v4;
470// CPP-DECLTOP:         v1 = 1;
471// CPP-DECLTOP:         switch (v1) {
472// CPP-DECLTOP:         case 2: {
473// CPP-DECLTOP:           v3 = func_b();
474// CPP-DECLTOP:           break;
475// CPP-DECLTOP:         }
476// CPP-DECLTOP:         case 5: {
477// CPP-DECLTOP:           v4 = func_a();
478// CPP-DECLTOP:           break;
479// CPP-DECLTOP:         }
480// CPP-DECLTOP:         default: {
481// CPP-DECLTOP:           v2 = 4.200000000e+01f;
482// CPP-DECLTOP:           func2(v2);
483// CPP-DECLTOP:           break;
484// CPP-DECLTOP:         }
485// CPP-DECLTOP:         }
486// CPP-DECLTOP:         return;
487// CPP-DECLTOP:       }
488func.func @emitc_switch_ui8() {
489  %0 = "emitc.constant"(){value = 1 : ui8} : () -> ui8
490
491  emitc.switch %0 : ui8
492  case 2 {
493    %1 = emitc.call_opaque "func_b" () : () -> i32
494    emitc.yield
495  }
496  case 5 {
497    %2 = emitc.call_opaque "func_a" () : () -> i32
498    emitc.yield
499  }
500  default {
501    %3 = "emitc.constant"(){value = 42.0 : f32} : () -> f32
502    emitc.call_opaque "func2" (%3) : (f32) -> ()
503    emitc.yield
504  }
505  return
506}
507
508// CPP-DEFAULT-LABEL: void emitc_switch_i16() {
509// CPP-DEFAULT:         int16_t v1 = 1;
510// CPP-DEFAULT:         switch (v1) {
511// CPP-DEFAULT:         case 2: {
512// CPP-DEFAULT:           int32_t v2 = func_b();
513// CPP-DEFAULT:           break;
514// CPP-DEFAULT:         }
515// CPP-DEFAULT:         case 5: {
516// CPP-DEFAULT:           int32_t v3 = func_a();
517// CPP-DEFAULT:           break;
518// CPP-DEFAULT:         }
519// CPP-DEFAULT:         default: {
520// CPP-DEFAULT:           float v4 = 4.200000000e+01f;
521// CPP-DEFAULT:           func2(v4);
522// CPP-DEFAULT:           break;
523// CPP-DEFAULT:         }
524// CPP-DEFAULT:         }
525// CPP-DEFAULT:         return;
526// CPP-DEFAULT:       }
527
528// CPP-DECLTOP-LABEL: void emitc_switch_i16() {
529// CPP-DECLTOP:         int16_t v1;
530// CPP-DECLTOP:         float v2;
531// CPP-DECLTOP:         int32_t v3;
532// CPP-DECLTOP:         int32_t v4;
533// CPP-DECLTOP:         v1 = 1;
534// CPP-DECLTOP:         switch (v1) {
535// CPP-DECLTOP:         case 2: {
536// CPP-DECLTOP:           v3 = func_b();
537// CPP-DECLTOP:           break;
538// CPP-DECLTOP:         }
539// CPP-DECLTOP:         case 5: {
540// CPP-DECLTOP:           v4 = func_a();
541// CPP-DECLTOP:           break;
542// CPP-DECLTOP:         }
543// CPP-DECLTOP:         default: {
544// CPP-DECLTOP:           v2 = 4.200000000e+01f;
545// CPP-DECLTOP:           func2(v2);
546// CPP-DECLTOP:           break;
547// CPP-DECLTOP:         }
548// CPP-DECLTOP:         }
549// CPP-DECLTOP:         return;
550// CPP-DECLTOP:       }
551func.func @emitc_switch_i16() {
552  %0 = "emitc.constant"(){value = 1 : i16} : () -> i16
553
554  emitc.switch %0 : i16
555  case 2 {
556    %1 = emitc.call_opaque "func_b" () : () -> i32
557    emitc.yield
558  }
559  case 5 {
560    %2 = emitc.call_opaque "func_a" () : () -> i32
561    emitc.yield
562  }
563  default {
564    %3 = "emitc.constant"(){value = 42.0 : f32} : () -> f32
565    emitc.call_opaque "func2" (%3) : (f32) -> ()
566    emitc.yield
567  }
568  return
569}
570
571// CPP-DEFAULT-LABEL: void emitc_switch_ui16() {
572// CPP-DEFAULT:         uint16_t v1 = 1;
573// CPP-DEFAULT:         switch (v1) {
574// CPP-DEFAULT:         case 2: {
575// CPP-DEFAULT:           int32_t v2 = func_b();
576// CPP-DEFAULT:           break;
577// CPP-DEFAULT:         }
578// CPP-DEFAULT:         case 5: {
579// CPP-DEFAULT:           int32_t v3 = func_a();
580// CPP-DEFAULT:           break;
581// CPP-DEFAULT:         }
582// CPP-DEFAULT:         default: {
583// CPP-DEFAULT:           float v4 = 4.200000000e+01f;
584// CPP-DEFAULT:           func2(v4);
585// CPP-DEFAULT:           break;
586// CPP-DEFAULT:         }
587// CPP-DEFAULT:         }
588// CPP-DEFAULT:         return;
589// CPP-DEFAULT:       }
590
591// CPP-DECLTOP-LABEL: void emitc_switch_ui16() {
592// CPP-DECLTOP:         uint16_t v1;
593// CPP-DECLTOP:         float v2;
594// CPP-DECLTOP:         int32_t v3;
595// CPP-DECLTOP:         int32_t v4;
596// CPP-DECLTOP:         v1 = 1;
597// CPP-DECLTOP:         switch (v1) {
598// CPP-DECLTOP:         case 2: {
599// CPP-DECLTOP:           v3 = func_b();
600// CPP-DECLTOP:           break;
601// CPP-DECLTOP:         }
602// CPP-DECLTOP:         case 5: {
603// CPP-DECLTOP:           v4 = func_a();
604// CPP-DECLTOP:           break;
605// CPP-DECLTOP:         }
606// CPP-DECLTOP:         default: {
607// CPP-DECLTOP:           v2 = 4.200000000e+01f;
608// CPP-DECLTOP:           func2(v2);
609// CPP-DECLTOP:           break;
610// CPP-DECLTOP:         }
611// CPP-DECLTOP:         }
612// CPP-DECLTOP:         return;
613// CPP-DECLTOP:       }
614func.func @emitc_switch_ui16() {
615  %0 = "emitc.constant"(){value = 1 : ui16} : () -> ui16
616
617  emitc.switch %0 : ui16
618  case 2 {
619    %1 = emitc.call_opaque "func_b" () : () -> i32
620    emitc.yield
621  }
622  case 5 {
623    %2 = emitc.call_opaque "func_a" () : () -> i32
624    emitc.yield
625  }
626  default {
627    %3 = "emitc.constant"(){value = 42.0 : f32} : () -> f32
628    emitc.call_opaque "func2" (%3) : (f32) -> ()
629    emitc.yield
630  }
631  return
632}
633
634// CPP-DEFAULT-LABEL: void emitc_switch_i32() {
635// CPP-DEFAULT:         int32_t v1 = 1;
636// CPP-DEFAULT:         switch (v1) {
637// CPP-DEFAULT:         case 2: {
638// CPP-DEFAULT:           int32_t v2 = func_b();
639// CPP-DEFAULT:           break;
640// CPP-DEFAULT:         }
641// CPP-DEFAULT:         case 5: {
642// CPP-DEFAULT:           int32_t v3 = func_a();
643// CPP-DEFAULT:           break;
644// CPP-DEFAULT:         }
645// CPP-DEFAULT:         default: {
646// CPP-DEFAULT:           float v4 = 4.200000000e+01f;
647// CPP-DEFAULT:           func2(v4);
648// CPP-DEFAULT:           break;
649// CPP-DEFAULT:         }
650// CPP-DEFAULT:         }
651// CPP-DEFAULT:         return;
652// CPP-DEFAULT:       }
653
654// CPP-DECLTOP-LABEL: void emitc_switch_i32() {
655// CPP-DECLTOP:         int32_t v1;
656// CPP-DECLTOP:         float v2;
657// CPP-DECLTOP:         int32_t v3;
658// CPP-DECLTOP:         int32_t v4;
659// CPP-DECLTOP:         v1 = 1;
660// CPP-DECLTOP:         switch (v1) {
661// CPP-DECLTOP:         case 2: {
662// CPP-DECLTOP:           v3 = func_b();
663// CPP-DECLTOP:           break;
664// CPP-DECLTOP:         }
665// CPP-DECLTOP:         case 5: {
666// CPP-DECLTOP:           v4 = func_a();
667// CPP-DECLTOP:           break;
668// CPP-DECLTOP:         }
669// CPP-DECLTOP:         default: {
670// CPP-DECLTOP:           v2 = 4.200000000e+01f;
671// CPP-DECLTOP:           func2(v2);
672// CPP-DECLTOP:           break;
673// CPP-DECLTOP:         }
674// CPP-DECLTOP:         }
675// CPP-DECLTOP:         return;
676// CPP-DECLTOP:       }
677func.func @emitc_switch_i32() {
678  %0 = "emitc.constant"(){value = 1 : i32} : () -> i32
679
680  emitc.switch %0 : i32
681  case 2 {
682    %1 = emitc.call_opaque "func_b" () : () -> i32
683    emitc.yield
684  }
685  case 5 {
686    %2 = emitc.call_opaque "func_a" () : () -> i32
687    emitc.yield
688  }
689  default {
690    %3 = "emitc.constant"(){value = 42.0 : f32} : () -> f32
691    emitc.call_opaque "func2" (%3) : (f32) -> ()
692    emitc.yield
693  }
694  return
695}
696
697// CPP-DEFAULT-LABEL: void emitc_switch_ui32() {
698// CPP-DEFAULT:         uint32_t v1 = 1;
699// CPP-DEFAULT:         switch (v1) {
700// CPP-DEFAULT:         case 2: {
701// CPP-DEFAULT:           int32_t v2 = func_b();
702// CPP-DEFAULT:           break;
703// CPP-DEFAULT:         }
704// CPP-DEFAULT:         case 5: {
705// CPP-DEFAULT:           int32_t v3 = func_a();
706// CPP-DEFAULT:           break;
707// CPP-DEFAULT:         }
708// CPP-DEFAULT:         default: {
709// CPP-DEFAULT:           float v4 = 4.200000000e+01f;
710// CPP-DEFAULT:           func2(v4);
711// CPP-DEFAULT:           break;
712// CPP-DEFAULT:         }
713// CPP-DEFAULT:         }
714// CPP-DEFAULT:         return;
715// CPP-DEFAULT:       }
716
717// CPP-DECLTOP-LABEL: void emitc_switch_ui32() {
718// CPP-DECLTOP:         uint32_t v1;
719// CPP-DECLTOP:         float v2;
720// CPP-DECLTOP:         int32_t v3;
721// CPP-DECLTOP:         int32_t v4;
722// CPP-DECLTOP:         v1 = 1;
723// CPP-DECLTOP:         switch (v1) {
724// CPP-DECLTOP:         case 2: {
725// CPP-DECLTOP:           v3 = func_b();
726// CPP-DECLTOP:           break;
727// CPP-DECLTOP:         }
728// CPP-DECLTOP:         case 5: {
729// CPP-DECLTOP:           v4 = func_a();
730// CPP-DECLTOP:           break;
731// CPP-DECLTOP:         }
732// CPP-DECLTOP:         default: {
733// CPP-DECLTOP:           v2 = 4.200000000e+01f;
734// CPP-DECLTOP:           func2(v2);
735// CPP-DECLTOP:           break;
736// CPP-DECLTOP:         }
737// CPP-DECLTOP:         }
738// CPP-DECLTOP:         return;
739// CPP-DECLTOP:       }
740func.func @emitc_switch_ui32() {
741  %0 = "emitc.constant"(){value = 1 : ui32} : () -> ui32
742
743  emitc.switch %0 : ui32
744  case 2 {
745    %1 = emitc.call_opaque "func_b" () : () -> i32
746    emitc.yield
747  }
748  case 5 {
749    %2 = emitc.call_opaque "func_a" () : () -> i32
750    emitc.yield
751  }
752  default {
753    %3 = "emitc.constant"(){value = 42.0 : f32} : () -> f32
754    emitc.call_opaque "func2" (%3) : (f32) -> ()
755    emitc.yield
756  }
757  return
758}
759
760// CPP-DEFAULT-LABEL: void emitc_switch_i64() {
761// CPP-DEFAULT:         int64_t v1 = 1;
762// CPP-DEFAULT:         switch (v1) {
763// CPP-DEFAULT:         case 2: {
764// CPP-DEFAULT:           int32_t v2 = func_b();
765// CPP-DEFAULT:           break;
766// CPP-DEFAULT:         }
767// CPP-DEFAULT:         case 5: {
768// CPP-DEFAULT:           int32_t v3 = func_a();
769// CPP-DEFAULT:           break;
770// CPP-DEFAULT:         }
771// CPP-DEFAULT:         default: {
772// CPP-DEFAULT:           float v4 = 4.200000000e+01f;
773// CPP-DEFAULT:           func2(v4);
774// CPP-DEFAULT:           break;
775// CPP-DEFAULT:         }
776// CPP-DEFAULT:         }
777// CPP-DEFAULT:         return;
778// CPP-DEFAULT:       }
779
780// CPP-DECLTOP-LABEL: void emitc_switch_i64() {
781// CPP-DECLTOP:         int64_t v1;
782// CPP-DECLTOP:         float v2;
783// CPP-DECLTOP:         int32_t v3;
784// CPP-DECLTOP:         int32_t v4;
785// CPP-DECLTOP:         v1 = 1;
786// CPP-DECLTOP:         switch (v1) {
787// CPP-DECLTOP:         case 2: {
788// CPP-DECLTOP:           v3 = func_b();
789// CPP-DECLTOP:           break;
790// CPP-DECLTOP:         }
791// CPP-DECLTOP:         case 5: {
792// CPP-DECLTOP:           v4 = func_a();
793// CPP-DECLTOP:           break;
794// CPP-DECLTOP:         }
795// CPP-DECLTOP:         default: {
796// CPP-DECLTOP:           v2 = 4.200000000e+01f;
797// CPP-DECLTOP:           func2(v2);
798// CPP-DECLTOP:           break;
799// CPP-DECLTOP:         }
800// CPP-DECLTOP:         }
801// CPP-DECLTOP:         return;
802// CPP-DECLTOP:       }
803func.func @emitc_switch_i64() {
804  %0 = "emitc.constant"(){value = 1 : i64} : () -> i64
805
806  emitc.switch %0 : i64
807  case 2 {
808    %1 = emitc.call_opaque "func_b" () : () -> i32
809    emitc.yield
810  }
811  case 5 {
812    %2 = emitc.call_opaque "func_a" () : () -> i32
813    emitc.yield
814  }
815  default {
816    %3 = "emitc.constant"(){value = 42.0 : f32} : () -> f32
817    emitc.call_opaque "func2" (%3) : (f32) -> ()
818    emitc.yield
819  }
820  return
821}
822
823// CPP-DEFAULT-LABEL: void emitc_switch_ui64() {
824// CPP-DEFAULT:         uint64_t v1 = 1;
825// CPP-DEFAULT:         switch (v1) {
826// CPP-DEFAULT:         case 2: {
827// CPP-DEFAULT:           int32_t v2 = func_b();
828// CPP-DEFAULT:           break;
829// CPP-DEFAULT:         }
830// CPP-DEFAULT:         case 5: {
831// CPP-DEFAULT:           int32_t v3 = func_a();
832// CPP-DEFAULT:           break;
833// CPP-DEFAULT:         }
834// CPP-DEFAULT:         default: {
835// CPP-DEFAULT:           float v4 = 4.200000000e+01f;
836// CPP-DEFAULT:           func2(v4);
837// CPP-DEFAULT:           break;
838// CPP-DEFAULT:         }
839// CPP-DEFAULT:         }
840// CPP-DEFAULT:         return;
841// CPP-DEFAULT:       }
842
843// CPP-DECLTOP-LABEL: void emitc_switch_ui64() {
844// CPP-DECLTOP:         uint64_t v1;
845// CPP-DECLTOP:         float v2;
846// CPP-DECLTOP:         int32_t v3;
847// CPP-DECLTOP:         int32_t v4;
848// CPP-DECLTOP:         v1 = 1;
849// CPP-DECLTOP:         switch (v1) {
850// CPP-DECLTOP:         case 2: {
851// CPP-DECLTOP:           v3 = func_b();
852// CPP-DECLTOP:           break;
853// CPP-DECLTOP:         }
854// CPP-DECLTOP:         case 5: {
855// CPP-DECLTOP:           v4 = func_a();
856// CPP-DECLTOP:           break;
857// CPP-DECLTOP:         }
858// CPP-DECLTOP:         default: {
859// CPP-DECLTOP:           v2 = 4.200000000e+01f;
860// CPP-DECLTOP:           func2(v2);
861// CPP-DECLTOP:           break;
862// CPP-DECLTOP:         }
863// CPP-DECLTOP:         }
864// CPP-DECLTOP:         return;
865// CPP-DECLTOP:       }
866func.func @emitc_switch_ui64() {
867  %0 = "emitc.constant"(){value = 1 : ui64} : () -> ui64
868
869  emitc.switch %0 : ui64
870  case 2 {
871    %1 = emitc.call_opaque "func_b" () : () -> i32
872    emitc.yield
873  }
874  case 5 {
875    %2 = emitc.call_opaque "func_a" () : () -> i32
876    emitc.yield
877  }
878  default {
879    %3 = "emitc.constant"(){value = 42.0 : f32} : () -> f32
880    emitc.call_opaque "func2" (%3) : (f32) -> ()
881    emitc.yield
882  }
883  return
884}
885
886// CPP-DEFAULT-LABEL: void emitc_switch_expression() {
887// CPP-DEFAULT:         int64_t v1 = 42;
888// CPP-DEFAULT:         switch (-v1) {
889// CPP-DEFAULT:         default: {
890// CPP-DEFAULT:           break;
891// CPP-DEFAULT:         }
892// CPP-DEFAULT:         }
893// CPP-DEFAULT:         return;
894// CPP-DEFAULT:       }
895
896// CPP-DECLTOP-LABEL: void emitc_switch_expression() {
897// CPP-DECLTOP:         int64_t v1;
898// CPP-DECLTOP:         v1 = 42;
899// CPP-DECLTOP:         switch (-v1) {
900// CPP-DECLTOP:         default: {
901// CPP-DECLTOP:           break;
902// CPP-DECLTOP:         }
903// CPP-DECLTOP:         }
904// CPP-DECLTOP:         return;
905// CPP-DECLTOP:       }
906
907func.func @emitc_switch_expression() {
908  %x = "emitc.constant"(){value = 42 : i64} : () -> i64
909
910  %0 = emitc.expression : i64 {
911    %a = emitc.unary_minus %x : (i64) -> i64
912    emitc.yield %a : i64
913  }
914
915  emitc.switch %0 : i64
916  default {
917    emitc.yield
918  }
919  return
920}
921