// RUN: %clang_cc1 -std=c2y -triple x86_64-unknown-linux -emit-llvm -o - %s | FileCheck %s bool g1(); bool g2(); bool g3(); // CHECK-LABEL: define {{.*}} void @f1() // CHECK: entry: // CHECK: br label %l1 // CHECK: l1: // CHECK: br label %while.body // CHECK: while.body: // CHECK: br label %while.end // CHECK: while.end: // CHECK: br label %l2 // CHECK: l2: // CHECK: br label %while.body1 // CHECK: while.body1: // CHECK: br label %while.body1 void f1() { l1: while (true) break l1; l2: while (true) continue l2; } // CHECK-LABEL: define {{.*}} void @f2() // CHECK: entry: // CHECK: br label %l1 // CHECK: l1: // CHECK: br label %for.cond // CHECK: for.cond: // CHECK: br label %for.end // CHECK: for.end: // CHECK: br label %l2 // CHECK: l2: // CHECK: br label %for.cond1 // CHECK: for.cond1: // CHECK: br label %for.cond1 void f2() { l1: for (;;) break l1; l2: for (;;) continue l2; } // CHECK-LABEL: define {{.*}} void @f3() // CHECK: entry: // CHECK: br label %l1 // CHECK: l1: // CHECK: br label %do.body // CHECK: do.body: // CHECK: br label %do.end // CHECK: do.cond: // CHECK: br i1 true, label %do.body, label %do.end // CHECK: do.end: // CHECK: br label %l2 // CHECK: l2: // CHECK: br label %do.body1 // CHECK: do.body1: // CHECK: br label %do.cond2 // CHECK: do.cond2: // CHECK: br i1 true, label %do.body1, label %do.end3 // CHECK: do.end3: // CHECK: ret void void f3() { l1: do { break l1; } while (true); l2: do { continue l2; } while (true); } // CHECK-LABEL: define {{.*}} void @f4() // CHECK: entry: // CHECK: br label %l1 // CHECK: l1: // CHECK: br label %while.cond // CHECK: while.cond: // CHECK: %call = call {{.*}} i1 @g1() // CHECK: br i1 %call, label %while.body, label %while.end14 // CHECK: while.body: // CHECK: br label %l2 // CHECK: l2: // CHECK: br label %while.cond1 // CHECK: while.cond1: // CHECK: %call2 = call {{.*}} i1 @g2() // CHECK: br i1 %call2, label %while.body3, label %while.end // CHECK: while.body3: // CHECK: %call4 = call {{.*}} i1 @g3() // CHECK: br i1 %call4, label %if.then, label %if.end // CHECK: if.then: // CHECK: br label %while.end14 // CHECK: if.end: // CHECK: %call5 = call {{.*}} i1 @g3() // CHECK: br i1 %call5, label %if.then6, label %if.end7 // CHECK: if.then6: // CHECK: br label %while.end // CHECK: if.end7: // CHECK: %call8 = call {{.*}} i1 @g3() // CHECK: br i1 %call8, label %if.then9, label %if.end10 // CHECK: if.then9: // CHECK: br label %while.cond // CHECK: if.end10: // CHECK: %call11 = call {{.*}} i1 @g3() // CHECK: br i1 %call11, label %if.then12, label %if.end13 // CHECK: if.then12: // CHECK: br label %while.cond1 // CHECK: if.end13: // CHECK: br label %while.cond1 // CHECK: while.end: // CHECK: br label %while.cond // CHECK: while.end14: // CHECK: ret void void f4() { l1: while (g1()) { l2: while (g2()) { if (g3()) break l1; if (g3()) break l2; if (g3()) continue l1; if (g3()) continue l2; } } } // CHECK-LABEL: define {{.*}} void @f5() // CHECK: entry: // CHECK: br label %l1 // CHECK: l1: // CHECK: br label %while.cond // CHECK: while.cond: // CHECK: %call = call {{.*}} i1 @g1() // CHECK: br i1 %call, label %while.body, label %while.end // CHECK: while.body: // CHECK: br label %l2 // CHECK: l2: // CHECK: %call1 = call {{.*}} i1 @g2() // CHECK: %conv = zext i1 %call1 to i32 // CHECK: switch i32 %conv, label %sw.epilog [ // CHECK: i32 1, label %sw.bb // CHECK: i32 2, label %sw.bb2 // CHECK: i32 3, label %sw.bb3 // CHECK: ] // CHECK: sw.bb: // CHECK: br label %while.end // CHECK: sw.bb2: // CHECK: br label %sw.epilog // CHECK: sw.bb3: // CHECK: br label %while.cond // CHECK: sw.epilog: // CHECK: br label %while.cond // CHECK: while.end: // CHECK: ret void void f5() { l1: while (g1()) { l2: switch (g2()) { case 1: break l1; case 2: break l2; case 3: continue l1; } } } // CHECK-LABEL: define {{.*}} void @f6() // CHECK: entry: // CHECK: br label %l1 // CHECK: l1: // CHECK: br label %while.cond // CHECK: while.cond: // CHECK: %call = call {{.*}} i1 @g1() // CHECK: br i1 %call, label %while.body, label %while.end28 // CHECK: while.body: // CHECK: br label %l2 // CHECK: l2: // CHECK: br label %for.cond // CHECK: for.cond: // CHECK: %call1 = call {{.*}} i1 @g1() // CHECK: br i1 %call1, label %for.body, label %for.end // CHECK: for.body: // CHECK: br label %l3 // CHECK: l3: // CHECK: br label %do.body // CHECK: do.body: // CHECK: br label %l4 // CHECK: l4: // CHECK: br label %while.cond2 // CHECK: while.cond2: // CHECK: %call3 = call {{.*}} i1 @g1() // CHECK: br i1 %call3, label %while.body4, label %while.end // CHECK: while.body4: // CHECK: %call5 = call {{.*}} i1 @g2() // CHECK: br i1 %call5, label %if.then, label %if.end // CHECK: if.then: // CHECK: br label %while.end28 // CHECK: if.end: // CHECK: %call6 = call {{.*}} i1 @g2() // CHECK: br i1 %call6, label %if.then7, label %if.end8 // CHECK: if.then7: // CHECK: br label %for.end // CHECK: if.end8: // CHECK: %call9 = call {{.*}} i1 @g2() // CHECK: br i1 %call9, label %if.then10, label %if.end11 // CHECK: if.then10: // CHECK: br label %do.end // CHECK: if.end11: // CHECK: %call12 = call {{.*}} i1 @g2() // CHECK: br i1 %call12, label %if.then13, label %if.end14 // CHECK: if.then13: // CHECK: br label %while.end // CHECK: if.end14: // CHECK: %call15 = call {{.*}} i1 @g2() // CHECK: br i1 %call15, label %if.then16, label %if.end17 // CHECK: if.then16: // CHECK: br label %while.cond // CHECK: if.end17: // CHECK: %call18 = call {{.*}} i1 @g2() // CHECK: br i1 %call18, label %if.then19, label %if.end20 // CHECK: if.then19: // CHECK: br label %for.cond // CHECK: if.end20: // CHECK: %call21 = call {{.*}} i1 @g2() // CHECK: br i1 %call21, label %if.then22, label %if.end23 // CHECK: if.then22: // CHECK: br label %do.cond // CHECK: if.end23: // CHECK: %call24 = call {{.*}} i1 @g2() // CHECK: br i1 %call24, label %if.then25, label %if.end26 // CHECK: if.then25: // CHECK: br label %while.cond2 // CHECK: if.end26: // CHECK: br label %while.cond2 // CHECK: while.end: // CHECK: br label %do.cond // CHECK: do.cond: // CHECK: %call27 = call {{.*}} i1 @g1() // CHECK: br i1 %call27, label %do.body, label %do.end // CHECK: do.end: // CHECK: br label %for.cond // CHECK: for.end: // CHECK: br label %while.cond // CHECK: while.end28: // CHECK: ret void void f6() { l1: while (g1()) { l2: for (; g1();) { l3: do { l4: while (g1()) { if (g2()) break l1; if (g2()) break l2; if (g2()) break l3; if (g2()) break l4; if (g2()) continue l1; if (g2()) continue l2; if (g2()) continue l3; if (g2()) continue l4; } } while (g1()); } } } // CHECK-LABEL: define {{.*}} void @f7() // CHECK: entry: // CHECK: br label %loop // CHECK: loop: // CHECK: br label %while.cond // CHECK: while.cond: // CHECK: %call = call {{.*}} i1 @g1() // CHECK: br i1 %call, label %while.body, label %while.end // CHECK: while.body: // CHECK: %call1 = call {{.*}} i1 @g2() // CHECK: %conv = zext i1 %call1 to i32 // CHECK: switch i32 %conv, label %sw.epilog [ // CHECK: i32 1, label %sw.bb // CHECK: ] // CHECK: sw.bb: // CHECK: br label %while.end // CHECK: sw.epilog: // CHECK: br label %while.cond // CHECK: while.end: // CHECK: ret void void f7() { loop: while (g1()) { switch (g2()) { case 1: break loop; } } }