@@ -265,3 +265,125 @@ void test_empty_while_true() {
265
265
// OGCG: br label %[[WHILE_BODY:.*]]
266
266
// OGCG: [[WHILE_BODY]]:
267
267
// OGCG: ret void
268
+
269
+ void unreachable_after_continue () {
270
+ for (;;) {
271
+ continue ;
272
+ int x = 1 ;
273
+ }
274
+ }
275
+
276
+ // CIR: cir.func @unreachable_after_continue
277
+ // CIR: cir.scope {
278
+ // CIR: cir.for : cond {
279
+ // CIR: %[[TRUE:.*]] = cir.const #true
280
+ // CIR: cir.condition(%[[TRUE]])
281
+ // CIR: } body {
282
+ // CIR: cir.scope {
283
+ // CIR: %[[X:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
284
+ // CIR: cir.continue
285
+ // CIR: ^bb1: // no predecessors
286
+ // CIR: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i
287
+ // CIR: cir.store %[[ONE]], %[[X]] : !s32i, !cir.ptr<!s32i>
288
+ // CIR: cir.yield
289
+ // CIR: }
290
+ // CIR: cir.yield
291
+ // CIR: } step {
292
+ // CIR: cir.yield
293
+ // CIR: }
294
+ // CIR: }
295
+ // CIR: cir.return
296
+ // CIR: }
297
+
298
+ // LLVM: define void @unreachable_after_continue()
299
+ // LLVM: %[[X:.*]] = alloca i32, i64 1, align 4
300
+ // LLVM: br label %[[LABEL1:.*]]
301
+ // LLVM: [[LABEL1]]:
302
+ // LLVM: br label %[[LABEL2:.*]]
303
+ // LLVM: [[LABEL2]]:
304
+ // LLVM: br i1 true, label %[[LABEL3:.*]], label %[[LABEL8:.*]]
305
+ // LLVM: [[LABEL3]]:
306
+ // LLVM: br label %[[LABEL4:.*]]
307
+ // LLVM: [[LABEL4]]:
308
+ // LLVM: br label %[[LABEL7:.*]]
309
+ // LLVM: [[LABEL5:.*]]:
310
+ // LLVM-SAME: ; No predecessors!
311
+ // LLVM: store i32 1, ptr %[[X]], align 4
312
+ // LLVM: br label %[[LABEL6:.*]]
313
+ // LLVM: [[LABEL6]]:
314
+ // LLVM: br label %[[LABEL7:.*]]
315
+ // LLVM: [[LABEL7]]:
316
+ // LLVM: br label %[[LABEL2]]
317
+ // LLVM: [[LABEL8]]:
318
+ // LLVM: br label %[[LABEL9:]]
319
+ // LLVM: [[LABEL9]]:
320
+ // LLVM: ret void
321
+
322
+ // OGCG: define{{.*}} void @_Z26unreachable_after_continuev()
323
+ // OGCG: entry:
324
+ // OGCG: %[[X:.*]] = alloca i32, align 4
325
+ // OGCG: br label %[[FOR_COND:.*]]
326
+ // OGCG: [[FOR_COND]]:
327
+ // OGCG: br label %[[FOR_COND]]
328
+
329
+ void unreachable_after_break () {
330
+ for (;;) {
331
+ break ;
332
+ int x = 1 ;
333
+ }
334
+ }
335
+
336
+ // CIR: cir.func @unreachable_after_break
337
+ // CIR: cir.scope {
338
+ // CIR: cir.for : cond {
339
+ // CIR: %[[TRUE:.*]] = cir.const #true
340
+ // CIR: cir.condition(%[[TRUE]])
341
+ // CIR: } body {
342
+ // CIR: cir.scope {
343
+ // CIR: %[[X:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
344
+ // CIR: cir.break
345
+ // CIR: ^bb1: // no predecessors
346
+ // CIR: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i
347
+ // CIR: cir.store %[[ONE]], %[[X]] : !s32i, !cir.ptr<!s32i>
348
+ // CIR: cir.yield
349
+ // CIR: }
350
+ // CIR: cir.yield
351
+ // CIR: } step {
352
+ // CIR: cir.yield
353
+ // CIR: }
354
+ // CIR: }
355
+ // CIR: cir.return
356
+ // CIR: }
357
+
358
+ // LLVM: define void @unreachable_after_break()
359
+ // LLVM: %[[X:.*]] = alloca i32, i64 1, align 4
360
+ // LLVM: br label %[[LABEL1:.*]]
361
+ // LLVM: [[LABEL1]]:
362
+ // LLVM: br label %[[LABEL2:.*]]
363
+ // LLVM: [[LABEL2]]:
364
+ // LLVM: br i1 true, label %[[LABEL3:.*]], label %[[LABEL8:.*]]
365
+ // LLVM: [[LABEL3]]:
366
+ // LLVM: br label %[[LABEL4:.*]]
367
+ // LLVM: [[LABEL4]]:
368
+ // LLVM: br label %[[LABEL8]]
369
+ // LLVM: [[LABEL5:.*]]:
370
+ // LLVM-SAME: ; No predecessors!
371
+ // LLVM: store i32 1, ptr %[[X]], align 4
372
+ // LLVM: br label %[[LABEL6:.*]]
373
+ // LLVM: [[LABEL6]]:
374
+ // LLVM: br label %[[LABEL7:.*]]
375
+ // LLVM: [[LABEL7]]:
376
+ // LLVM: br label %[[LABEL2]]
377
+ // LLVM: [[LABEL8]]:
378
+ // LLVM: br label %[[LABEL9:]]
379
+ // LLVM: [[LABEL9]]:
380
+ // LLVM: ret void
381
+
382
+ // OGCG: define{{.*}} void @_Z23unreachable_after_breakv()
383
+ // OGCG: entry:
384
+ // OGCG: %[[X:.*]] = alloca i32, align 4
385
+ // OGCG: br label %[[FOR_COND:.*]]
386
+ // OGCG: [[FOR_COND]]:
387
+ // OGCG: br label %[[FOR_END:.*]]
388
+ // OGCG: [[FOR_END]]:
389
+ // OGCG: ret void
0 commit comments