@@ -207,12 +207,25 @@ void sw6(int a) {
207207
208208// CIR: cir.func @_Z3sw6i
209209// CIR: cir.switch (%1 : !s32i) {
210- // CIR-NEXT: cir.case(anyof , [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2 > : !s32i]) {
211- // CIR-NEXT: cir.break
210+ // CIR-NEXT: cir.case(equal , [#cir.int<0> : !s32i]) {
211+ // CIR-NEXT: cir.yield
212212// CIR-NEXT: }
213- // CIR-NEXT: cir.case(anyof, [#cir.int<3> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i]) {
214- // CIR-NEXT: cir.break
213+ // CIR-NEXT: cir.case(equal, [#cir.int<1> : !s32i]) {
214+ // CIR-NEXT: cir.yield
215+ // CIR-NEXT: }
216+ // CIR-NEXT: cir.case(equal, [#cir.int<2> : !s32i]) {
217+ // CIR-NEXT: cir.break
218+ // CIR-NEXT: }
219+ // CIR-NEXT: cir.case(equal, [#cir.int<3> : !s32i]) {
220+ // CIR-NEXT: cir.yield
221+ // CIR-NEXT: }
222+ // CIR-NEXT: cir.case(equal, [#cir.int<4> : !s32i]) {
223+ // CIR-NEXT: cir.yield
215224// CIR-NEXT: }
225+ // CIR-NEXT: cir.case(equal, [#cir.int<5> : !s32i]) {
226+ // CIR-NEXT: cir.break
227+ // CIR-NEXT: }
228+
216229
217230// OGCG: define dso_local void @_Z3sw6i
218231// OGCG: entry:
@@ -248,13 +261,24 @@ void sw7(int a) {
248261}
249262
250263// CIR: cir.func @_Z3sw7i
251- // CIR: cir.case(anyof , [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2 > : !s32i]) {
252- // CIR-NEXT: cir.yield
264+ // CIR: cir.case(equal , [#cir.int<0> : !s32i]) {
265+ // CIR-NEXT: cir.yield
253266// CIR-NEXT: }
254- // CIR-NEXT: cir.case(anyof, [#cir.int<3> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i]) {
255- // CIR-NEXT: cir.break
267+ // CIR-NEXT: cir.case(equal, [#cir.int<1> : !s32i]) {
268+ // CIR-NEXT: cir.yield
269+ // CIR-NEXT: }
270+ // CIR-NEXT: cir.case(equal, [#cir.int<2> : !s32i]) {
271+ // CIR-NEXT: cir.yield
272+ // CIR-NEXT: }
273+ // CIR-NEXT: cir.case(equal, [#cir.int<3> : !s32i]) {
274+ // CIR-NEXT: cir.yield
275+ // CIR-NEXT: }
276+ // CIR-NEXT: cir.case(equal, [#cir.int<4> : !s32i]) {
277+ // CIR-NEXT: cir.yield
278+ // CIR-NEXT: }
279+ // CIR-NEXT: cir.case(equal, [#cir.int<5> : !s32i]) {
280+ // CIR-NEXT: cir.break
256281// CIR-NEXT: }
257-
258282
259283// OGCG: define dso_local void @_Z3sw7i
260284// OGCG: entry:
@@ -419,13 +443,19 @@ void sw11(int a) {
419443// CIR: cir.case(equal, [#cir.int<3> : !s32i]) {
420444// CIR-NEXT: cir.break
421445// CIR-NEXT: }
422- // CIR-NEXT: cir.case(anyof, [#cir.int<4> : !s32i, #cir.int<5> : !s32i]) {
446+ // CIR-NEXT: cir.case(equal, [#cir.int<4> : !s32i]) {
447+ // CIR-NEXT: cir.yield
448+ // CIR-NEXT: }
449+ // CIR-NEXT: cir.case(equal, [#cir.int<5> : !s32i]) {
423450// CIR-NEXT: cir.yield
424451// CIR-NEXT: }
425452// CIR-NEXT: cir.case(default, []) {
426453// CIR-NEXT: cir.yield
427454// CIR-NEXT: }
428- // CIR-NEXT: cir.case(anyof, [#cir.int<6> : !s32i, #cir.int<7> : !s32i]) {
455+ // CIR-NEXT: cir.case(equal, [#cir.int<6> : !s32i]) {
456+ // CIR-NEXT: cir.yield
457+ // CIR-NEXT: }
458+ // CIR-NEXT: cir.case(equal, [#cir.int<7> : !s32i]) {
429459// CIR-NEXT: cir.break
430460// CIR-NEXT: }
431461
@@ -527,6 +557,114 @@ void sw13(int a, int b) {
527557// OGCG: [[EPILOG2]]:
528558// OGCG: ret void
529559
560+ void sw14 (int x) {
561+ switch (x) {
562+ case 1 :
563+ case 2 :
564+ case 3 ... 6 :
565+ case 7 :
566+ break ;
567+ default :
568+ break ;
569+ }
570+ }
571+
572+ // CIR: cir.func @_Z4sw14i
573+ // CIR: cir.switch
574+ // CIR-NEXT: cir.case(equal, [#cir.int<1> : !s32i]) {
575+ // CIR-NEXT: cir.yield
576+ // CIR-NEXT: }
577+ // CIR-NEXT: cir.case(equal, [#cir.int<2> : !s32i]) {
578+ // CIR-NEXT: cir.yield
579+ // CIR-NEXT: }
580+ // CIR-NEXT: cir.case(range, [#cir.int<3> : !s32i, #cir.int<6> : !s32i]) {
581+ // CIR-NEXT: cir.yield
582+ // CIR-NEXT: }
583+ // CIR-NEXT: cir.case(equal, [#cir.int<7> : !s32i]) {
584+ // CIR-NEXT: cir.break
585+ // CIR-NEXT: }
586+ // CIR-NEXT: cir.case(default, []) {
587+ // CIR-NEXT: cir.break
588+ // CIR-NEXT: }
589+
590+ // OGCG: define dso_local void @_Z4sw14i
591+ // OGCG: entry:
592+ // OGCG: %[[X_ADDR:.*]] = alloca i32, align 4
593+ // OGCG: store i32 %x, ptr %[[X_ADDR]], align 4
594+ // OGCG: %[[X_VAL:.*]] = load i32, ptr %[[X_ADDR]], align 4
595+
596+ // OGCG: switch i32 %[[X_VAL]], label %[[DEFAULT:.*]] [
597+ // OGCG-DAG: i32 1, label %[[BB1:.*]]
598+ // OGCG-DAG: i32 2, label %[[BB1]]
599+ // OGCG-DAG: i32 3, label %[[BB2:.*]]
600+ // OGCG-DAG: i32 4, label %[[BB2]]
601+ // OGCG-DAG: i32 5, label %[[BB2]]
602+ // OGCG-DAG: i32 6, label %[[BB2]]
603+ // OGCG-DAG: i32 7, label %[[BB3:.*]]
604+ // OGCG: ]
605+ // OGCG: [[BB1]]:
606+ // OGCG: br label %[[BB2]]
607+ // OGCG: [[BB2]]:
608+ // OGCG: br label %[[BB3]]
609+ // OGCG: [[BB3]]:
610+ // OGCG: br label %[[EPILOG:.*]]
611+ // OGCG: [[DEFAULT]]:
612+ // OGCG: br label %[[EPILOG]]
613+ // OGCG: [[EPILOG]]:
614+ // OGCG: ret void
615+
616+ void sw15 (int x) {
617+ int y;
618+ switch (x) {
619+ case 1 :
620+ case 2 :
621+ y = 0 ;
622+ case 3 :
623+ break ;
624+ default :
625+ break ;
626+ }
627+ }
628+
629+ // CIR: cir.func @_Z4sw15i
630+ // CIR: %[[Y:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["y"]
631+ // CIR: cir.switch
632+ // CIR-NEXT: cir.case(equal, [#cir.int<1> : !s32i]) {
633+ // CIR-NEXT: cir.yield
634+ // CIR-NEXT: }
635+ // CIR-NEXT: cir.case(equal, [#cir.int<2> : !s32i]) {
636+ // CIR-NEXT: %[[ZERO:.*]] = cir.const #cir.int<0> : !s32i
637+ // CIR-NEXT: cir.store %[[ZERO]], %[[Y]] : !s32i, !cir.ptr<!s32i>
638+ // CIR-NEXT: cir.yield
639+ // CIR-NEXT: }
640+ // CIR-NEXT: cir.case(equal, [#cir.int<3> : !s32i]) {
641+ // CIR-NEXT: cir.break
642+ // CIR-NEXT: }
643+ // CIR-NEXT: cir.case(default, []) {
644+ // CIR-NEXT: cir.break
645+ // CIR-NEXT: }
646+
647+ // OGCG: define dso_local void @_Z4sw15i
648+ // OGCG: entry:
649+ // OGCG: %[[X_ADDR:.*]] = alloca i32, align 4
650+ // OGCG: %[[Y:.*]] = alloca i32, align 4
651+ // OGCG: store i32 %x, ptr %[[X_ADDR]], align 4
652+ // OGCG: %[[X_VAL:.*]] = load i32, ptr %[[X_ADDR]], align 4
653+ // OGCG: switch i32 %[[X_VAL]], label %[[DEFAULT:.*]] [
654+ // OGCG-DAG: i32 1, label %[[BB0:.*]]
655+ // OGCG-DAG: i32 2, label %[[BB0]]
656+ // OGCG-DAG: i32 3, label %[[BB1:.*]]
657+ // OGCG: ]
658+ // OGCG: [[BB0]]:
659+ // OGCG: store i32 0, ptr %[[Y]], align 4
660+ // OGCG: br label %[[BB1]]
661+ // OGCG: [[BB1]]:
662+ // OGCG: br label %[[EPILOG:.*]]
663+ // OGCG: [[DEFAULT]]:
664+ // OGCG: br label %[[EPILOG]]
665+ // OGCG: [[EPILOG]]:
666+ // OGCG: ret void
667+
530668int nested_switch (int a) {
531669 switch (int b = 1 ; a) {
532670 case 0 :
0 commit comments