@@ -90,3 +90,194 @@ void sw2(int a) {
90
90
// OGCG: br label %[[SW_EPILOG]]
91
91
// OGCG: [[SW_EPILOG]]:
92
92
// OGCG: ret void
93
+
94
+ void sw5 (int a) {
95
+ switch (a) {
96
+ case 1 :;
97
+ }
98
+ }
99
+
100
+ // CIR: cir.func @sw5
101
+ // CIR: cir.switch (%1 : !s32i) {
102
+ // CIR-NEXT: cir.case(equal, [#cir.int<1> : !s32i]) {
103
+ // CIR-NEXT: cir.yield
104
+ // CIR-NEXT: }
105
+ // CIR-NEXT: cir.yield
106
+ // CIR-NEXT: }
107
+
108
+ // OGCG: define dso_local void @_Z3sw5i
109
+ // OGCG: entry:
110
+ // OGCG: %[[A_ADDR:.*]] = alloca i32, align 4
111
+ // OGCG: %[[A_VAL:.*]] = load i32, ptr %[[A_ADDR]], align 4
112
+ // OGCG: switch i32 %[[A_VAL]], label %[[SW_EPILOG:.*]] [
113
+ // OGCG: i32 1, label %[[SW1:.*]]
114
+ // OGCG: ]
115
+ // OGCG: [[SW1]]:
116
+ // OGCG: br label %[[SW_EPILOG]]
117
+ // OGCG: [[SW_EPILOG]]:
118
+ // OGCG: ret void
119
+
120
+ void sw12 (int a) {
121
+ switch (a)
122
+ {
123
+ case 3 :
124
+ return ;
125
+ break ;
126
+ }
127
+ }
128
+
129
+ // CIR: cir.func @sw12
130
+ // CIR: cir.scope {
131
+ // CIR: cir.switch
132
+ // CIR-NEXT: cir.case(equal, [#cir.int<3> : !s32i]) {
133
+ // CIR-NEXT: cir.return
134
+ // CIR-NEXT: ^bb1: // no predecessors
135
+ // CIR-NEXT: cir.break
136
+ // CIR-NEXT: }
137
+
138
+ // OGCG: define dso_local void @_Z4sw12i
139
+ // OGCG: entry:
140
+ // OGCG: %[[A_ADDR:.*]] = alloca i32, align 4
141
+ // OGCG: %[[A_VAL:.*]] = load i32, ptr %[[A_ADDR]], align 4
142
+ // OGCG: switch i32 %[[A_VAL]], label %[[SW_DEFAULT:.*]] [
143
+ // OGCG: i32 3, label %[[SW3:.*]]
144
+ // OGCG: ]
145
+ // OGCG: [[SW3]]:
146
+ // OGCG: br label %[[SW_DEFAULT]]
147
+ // OGCG: [[SW_DEFAULT]]:
148
+ // OGCG: ret void
149
+
150
+ void sw13 (int a, int b) {
151
+ switch (a) {
152
+ case 1 :
153
+ switch (b) {
154
+ case 2 :
155
+ break ;
156
+ }
157
+ }
158
+ }
159
+
160
+ // CIR: cir.func @sw13
161
+ // CIR: cir.scope {
162
+ // CIR: cir.switch
163
+ // CIR-NEXT: cir.case(equal, [#cir.int<1> : !s32i]) {
164
+ // CIR-NEXT: cir.scope {
165
+ // CIR: cir.switch
166
+ // CIR-NEXT: cir.case(equal, [#cir.int<2> : !s32i]) {
167
+ // CIR-NEXT: cir.break
168
+ // CIR-NEXT: }
169
+ // CIR-NEXT: cir.yield
170
+ // CIR-NEXT: }
171
+ // CIR-NEXT: }
172
+ // CIR: cir.yield
173
+ // CIR: }
174
+ // CIR: cir.return
175
+
176
+ // OGCG: define dso_local void @_Z4sw13ii
177
+ // OGCG: entry:
178
+ // OGCG: %[[A_ADDR:.*]] = alloca i32, align 4
179
+ // OGCG: %[[B_ADDR:.*]] = alloca i32, align 4
180
+ // OGCG: %[[A_VAL:.*]] = load i32, ptr %[[A_ADDR]], align 4
181
+ // OGCG: switch i32 %[[A_VAL]], label %[[EPILOG2:.*]] [
182
+ // OGCG: i32 1, label %[[SW1:.*]]
183
+ // OGCG: ]
184
+ // OGCG: [[SW1]]:
185
+ // OGCG: %[[B_VAL:.*]] = load i32, ptr %[[B_ADDR]], align 4
186
+ // OGCG: switch i32 %[[B_VAL]], label %[[EPILOG:.*]] [
187
+ // OGCG: i32 2, label %[[SW12:.*]]
188
+ // OGCG: ]
189
+ // OGCG: [[SW12]]:
190
+ // OGCG: br label %[[EPILOG]]
191
+ // OGCG: [[EPILOG]]:
192
+ // OGCG: br label %[[EPILOG2]]
193
+ // OGCG: [[EPILOG2]]:
194
+ // OGCG: ret void
195
+
196
+ int nested_switch (int a) {
197
+ switch (int b = 1 ; a) {
198
+ case 0 :
199
+ b = b + 1 ;
200
+ case 1 :
201
+ return b;
202
+ case 2 : {
203
+ b = b + 1 ;
204
+ if (a > 1000 ) {
205
+ case 9 :
206
+ b = a + b;
207
+ }
208
+ if (a > 500 ) {
209
+ case 7 :
210
+ return a + b;
211
+ }
212
+ break ;
213
+ }
214
+ }
215
+
216
+ return 0 ;
217
+ }
218
+
219
+ // CIR: cir.switch (%6 : !s32i) {
220
+ // CIR: cir.case(equal, [#cir.int<0> : !s32i]) {
221
+ // CIR: cir.yield
222
+ // CIR: }
223
+ // CIR: cir.case(equal, [#cir.int<1> : !s32i]) {
224
+ // CIR: cir.return
225
+ // CIR: }
226
+ // CIR: cir.case(equal, [#cir.int<2> : !s32i]) {
227
+ // CIR: cir.scope {
228
+ // CIR: cir.scope {
229
+ // CIR: cir.if
230
+ // CIR: cir.case(equal, [#cir.int<9> : !s32i]) {
231
+ // CIR: cir.yield
232
+ // CIR: cir.scope {
233
+ // CIR: cir.if
234
+ // CIR: cir.case(equal, [#cir.int<7> : !s32i]) {
235
+ // CIR: cir.return
236
+
237
+ // OGCG: define dso_local noundef i32 @_Z13nested_switchi
238
+ // OGCG: entry:
239
+ // OGCG: %[[RETVAL:.*]] = alloca i32, align 4
240
+ // OGCG: %[[A_ADDR:.*]] = alloca i32, align 4
241
+ // OGCG: %[[B:.*]] = alloca i32, align 4
242
+ // OGCG: %[[A_VAL:.*]] = load i32, ptr %[[A_ADDR]], align 4
243
+ // OGCG: switch i32 %[[A_VAL]], label %[[EPILOG:.*]] [
244
+ // OGCG: i32 0, label %[[SW0:.*]]
245
+ // OGCG: i32 1, label %[[SW1:.*]]
246
+ // OGCG: i32 2, label %[[SW2:.*]]
247
+ // OGCG: i32 9, label %[[SW4:.*]]
248
+ // OGCG: i32 7, label %[[SW8:.*]]
249
+ // OGCG: ]
250
+ // OGCG: [[SW0]]:
251
+ // OGCG: %[[B_VAL0:.*]] = load i32, ptr %[[B]], align 4
252
+ // OGCG: %[[ADD0:.*]] = add nsw i32 %[[B_VAL0]], 1
253
+ // OGCG: br label %[[SW1]]
254
+ // OGCG: [[SW1]]:
255
+ // OGCG: %[[B_VAL1:.*]] = load i32, ptr %[[B]], align 4
256
+ // OGCG: br label %[[RETURN:.*]]
257
+ // OGCG: [[SW2]]:
258
+ // OGCG: %[[B_VAL2:.*]] = load i32, ptr %[[B]], align 4
259
+ // OGCG: %[[ADD2:.*]] = add nsw i32 %[[B_VAL2]], 1
260
+ // OGCG: %[[A_VAL2:.*]] = load i32, ptr %[[A_ADDR]], align 4
261
+ // OGCG: %[[CMP1000:.*]] = icmp sgt i32 %[[A_VAL2]], 1000
262
+ // OGCG: br i1 %[[CMP1000]], label %[[IFTHEN:.*]], label %[[IFEND:.*]]
263
+ // OGCG: [[IFTHEN]]:
264
+ // OGCG: br label %[[SW4]]
265
+ // OGCG: [[SW4]]:
266
+ // OGCG: %[[A_VAL4:.*]] = load i32, ptr %[[A_ADDR]], align 4
267
+ // OGCG: %[[B_VAL4:.*]] = load i32, ptr %[[B]], align 4
268
+ // OGCG: %[[ADD4:.*]] = add nsw i32 %[[A_VAL4]], %[[B_VAL4]]
269
+ // OGCG: br label %[[IFEND]]
270
+ // OGCG: [[IFEND]]:
271
+ // OGCG: %[[A_VAL5:.*]] = load i32, ptr %[[A_ADDR]], align 4
272
+ // OGCG: %[[CMP500:.*]] = icmp sgt i32 %[[A_VAL5]], 500
273
+ // OGCG: br i1 %[[CMP500]], label %[[IFTHEN7:.*]], label %[[IFEND10:.*]]
274
+ // OGCG: [[IFTHEN7]]:
275
+ // OGCG: br label %[[SW8]]
276
+ // OGCG: [[SW8]]:
277
+ // OGCG: %[[A_VAL8:.*]] = load i32, ptr %[[A_ADDR]], align 4
278
+ // OGCG: %[[B_VAL8:.*]] = load i32, ptr %[[B]], align 4
279
+ // OGCG: %[[ADD8:.*]] = add nsw i32 %[[A_VAL8]], %[[B_VAL8]]
280
+ // OGCG: br label %[[RETURN]]
281
+ // OGCG: [[IFEND10]]:
282
+ // OGCG: br label %[[EPILOG]]
283
+ // OGCG: [[EPILOG]]:
0 commit comments