@@ -265,3 +265,125 @@ void test_empty_while_true() {
265265// OGCG: br label %[[WHILE_BODY:.*]]
266266// OGCG: [[WHILE_BODY]]:
267267// 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