197 lines · plain
1// RUN: cir-opt -cir-canonicalize -cir-simplify -o %t.cir %s2// RUN: FileCheck --input-file=%t.cir %s3 4!s32i = !cir.int<s, 32>5 6module {7 cir.func @foldCascade(%arg0: !s32i) {8 %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["a", init] {alignment = 4 : i64}9 cir.store %arg0, %0 : !s32i, !cir.ptr<!s32i>10 cir.scope {11 %1 = cir.load %0 : !cir.ptr<!s32i>, !s32i12 cir.switch (%1 : !s32i) {13 cir.case(equal, [#cir.int<1> : !s32i]) {14 cir.yield15 }16 cir.case(equal, [#cir.int<2> : !s32i]) {17 cir.yield18 }19 cir.case(equal, [#cir.int<3> : !s32i]) {20 %2 = cir.const #cir.int<2> : !s32i21 cir.store %2, %0 : !s32i, !cir.ptr<!s32i>22 cir.break23 }24 cir.yield25 }26 }27 cir.return28 }29 //CHECK: cir.func @foldCascade30 //CHECK: cir.switch (%[[COND:.*]] : !s32i) {31 //CHECK-NEXT: cir.case(anyof, [#cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i]) {32 //CHECK-NEXT: %[[TWO:.*]] = cir.const #cir.int<2> : !s32i33 //CHECK-NEXT: cir.store %[[TWO]], %[[ARG0:.*]] : !s32i, !cir.ptr<!s32i>34 //CHECK-NEXT: cir.break35 //CHECK-NEXT: }36 //CHECK-NEXT: cir.yield37 //CHECK-NEXT: }38 39 cir.func @foldCascade2(%arg0: !s32i) {40 %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["a", init] {alignment = 4 : i64}41 cir.store %arg0, %0 : !s32i, !cir.ptr<!s32i>42 cir.scope {43 %1 = cir.load %0 : !cir.ptr<!s32i>, !s32i44 cir.switch (%1 : !s32i) {45 cir.case(equal, [#cir.int<0> : !s32i]) {46 cir.yield47 }48 cir.case(equal, [#cir.int<2> : !s32i]) {49 cir.yield50 }51 cir.case(equal, [#cir.int<4> : !s32i]) {52 cir.break53 }54 cir.case(equal, [#cir.int<1> : !s32i]) {55 cir.yield56 }57 cir.case(equal, [#cir.int<3> : !s32i]) {58 cir.yield59 }60 cir.case(equal, [#cir.int<5> : !s32i]) {61 cir.break62 }63 cir.yield64 }65 }66 cir.return67 }68 //CHECK: @foldCascade269 //CHECK: cir.switch (%[[COND2:.*]] : !s32i) {70 //CHECK: cir.case(anyof, [#cir.int<0> : !s32i, #cir.int<2> : !s32i, #cir.int<4> : !s32i]) {71 //CHECK: cir.break72 //cehck: }73 //CHECK: cir.case(anyof, [#cir.int<1> : !s32i, #cir.int<3> : !s32i, #cir.int<5> : !s32i]) {74 //CHECK: cir.break75 //CHECK: }76 //CHECK: cir.yield77 //CHECK: }78 cir.func @foldCascade3(%arg0: !s32i ) {79 %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["a", init] {alignment = 4 : i64}80 cir.store %arg0, %0 : !s32i, !cir.ptr<!s32i>81 cir.scope {82 %1 = cir.alloca !s32i, !cir.ptr<!s32i>, ["x"] {alignment = 4 : i64}83 %2 = cir.load %0 : !cir.ptr<!s32i>, !s32i84 cir.switch (%2 : !s32i) {85 cir.case(equal, [#cir.int<0> : !s32i]) {86 cir.yield87 }88 cir.case(equal, [#cir.int<1> : !s32i]) {89 cir.yield90 }91 cir.case(equal, [#cir.int<2> : !s32i]) {92 cir.yield93 }94 cir.case(equal, [#cir.int<3> : !s32i]) {95 cir.yield96 }97 cir.case(equal, [#cir.int<4> : !s32i]) {98 cir.yield99 }100 cir.case(equal, [#cir.int<5> : !s32i]) {101 cir.break102 }103 cir.yield104 }105 }106 cir.return107 }108 //CHECK: cir.func @foldCascade3109 //CHECK: cir.switch (%[[COND3:.*]] : !s32i) {110 //CHECK: cir.case(anyof, [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i]) {111 //CHECK: cir.break112 //CHECK: }113 //CHECK: cir.yield114 //CHECK: }115 cir.func @foldCascadeWithDefault(%arg0: !s32i ) {116 %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["a", init] {alignment = 4 : i64}117 cir.store %arg0, %0 : !s32i, !cir.ptr<!s32i>118 cir.scope {119 %1 = cir.load %0 : !cir.ptr<!s32i>, !s32i120 cir.switch (%1 : !s32i) {121 cir.case(equal, [#cir.int<3> : !s32i]) {122 cir.break123 }124 cir.case(equal, [#cir.int<4> : !s32i]) {125 cir.yield126 }127 cir.case(equal, [#cir.int<5> : !s32i]) {128 cir.yield129 }130 cir.case(default, []) {131 cir.yield132 }133 cir.case(equal, [#cir.int<6> : !s32i]) {134 cir.yield135 }136 cir.case(equal, [#cir.int<7> : !s32i]) {137 cir.break138 }139 cir.yield140 }141 }142 cir.return143 }144 //CHECK: cir.func @foldCascadeWithDefault145 //CHECK: cir.switch (%[[COND:.*]] : !s32i) {146 //CHECK: cir.case(equal, [#cir.int<3> : !s32i]) {147 //CHECK: cir.break148 //CHECK: }149 //CHECK: cir.case(anyof, [#cir.int<4> : !s32i, #cir.int<5> : !s32i]) {150 //CHECK: cir.yield151 //CHECK: }152 //CHECK: cir.case(default, []) {153 //CHECK: cir.yield154 //CHECK: }155 //CHECK: cir.case(anyof, [#cir.int<6> : !s32i, #cir.int<7> : !s32i]) {156 //CHECK: cir.break157 //CHECK: }158 //CHECK: cir.yield159 //CHECK: }160 cir.func @foldAllCascade(%arg0: !s32i ) {161 %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["a", init] {alignment = 4 : i64}162 cir.store %arg0, %0 : !s32i, !cir.ptr<!s32i>163 cir.scope {164 %1 = cir.load %0 : !cir.ptr<!s32i>, !s32i165 cir.switch (%1 : !s32i) {166 cir.case(equal, [#cir.int<0> : !s32i]) {167 cir.yield168 }169 cir.case(equal, [#cir.int<1> : !s32i]) {170 cir.yield171 }172 cir.case(equal, [#cir.int<2> : !s32i]) {173 cir.yield174 }175 cir.case(equal, [#cir.int<3> : !s32i]) {176 cir.yield177 }178 cir.case(equal, [#cir.int<4> : !s32i]) {179 cir.yield180 }181 cir.case(equal, [#cir.int<5> : !s32i]) {182 cir.yield183 }184 cir.yield185 }186 }187 cir.return188 }189 //CHECK: cir.func @foldAllCascade190 //CHECK: cir.switch (%[[COND:.*]] : !s32i) {191 //CHECK: cir.case(anyof, [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i]) {192 //CHECK: cir.yield193 //CHECK: }194 //CHECK: cir.yield195 //CHECK: }196}197