282 lines · c
1// RUN: %clang_cc1 -std=c2y -triple x86_64-unknown-linux -emit-llvm -o - %s | FileCheck %s2 3bool g1();4bool g2();5bool g3();6 7// CHECK-LABEL: define {{.*}} void @f1()8// CHECK: entry:9// CHECK: br label %l110// CHECK: l1:11// CHECK: br label %while.body12// CHECK: while.body:13// CHECK: br label %while.end14// CHECK: while.end:15// CHECK: br label %l216// CHECK: l2:17// CHECK: br label %while.body118// CHECK: while.body1:19// CHECK: br label %while.body120void f1() {21 l1: while (true) break l1;22 l2: while (true) continue l2;23}24 25// CHECK-LABEL: define {{.*}} void @f2()26// CHECK: entry:27// CHECK: br label %l128// CHECK: l1:29// CHECK: br label %for.cond30// CHECK: for.cond:31// CHECK: br label %for.end32// CHECK: for.end:33// CHECK: br label %l234// CHECK: l2:35// CHECK: br label %for.cond136// CHECK: for.cond1:37// CHECK: br label %for.cond138void f2() {39 l1: for (;;) break l1;40 l2: for (;;) continue l2;41}42 43// CHECK-LABEL: define {{.*}} void @f3()44// CHECK: entry:45// CHECK: br label %l146// CHECK: l1:47// CHECK: br label %do.body48// CHECK: do.body:49// CHECK: br label %do.end50// CHECK: do.cond:51// CHECK: br i1 true, label %do.body, label %do.end52// CHECK: do.end:53// CHECK: br label %l254// CHECK: l2:55// CHECK: br label %do.body156// CHECK: do.body1:57// CHECK: br label %do.cond258// CHECK: do.cond2:59// CHECK: br i1 true, label %do.body1, label %do.end360// CHECK: do.end3:61// CHECK: ret void62void f3() {63 l1: do { break l1; } while (true);64 l2: do { continue l2; } while (true);65}66 67// CHECK-LABEL: define {{.*}} void @f4()68// CHECK: entry:69// CHECK: br label %l170// CHECK: l1:71// CHECK: br label %while.cond72// CHECK: while.cond:73// CHECK: %call = call {{.*}} i1 @g1()74// CHECK: br i1 %call, label %while.body, label %while.end1475// CHECK: while.body:76// CHECK: br label %l277// CHECK: l2:78// CHECK: br label %while.cond179// CHECK: while.cond1:80// CHECK: %call2 = call {{.*}} i1 @g2()81// CHECK: br i1 %call2, label %while.body3, label %while.end82// CHECK: while.body3:83// CHECK: %call4 = call {{.*}} i1 @g3()84// CHECK: br i1 %call4, label %if.then, label %if.end85// CHECK: if.then:86// CHECK: br label %while.end1487// CHECK: if.end:88// CHECK: %call5 = call {{.*}} i1 @g3()89// CHECK: br i1 %call5, label %if.then6, label %if.end790// CHECK: if.then6:91// CHECK: br label %while.end92// CHECK: if.end7:93// CHECK: %call8 = call {{.*}} i1 @g3()94// CHECK: br i1 %call8, label %if.then9, label %if.end1095// CHECK: if.then9:96// CHECK: br label %while.cond97// CHECK: if.end10:98// CHECK: %call11 = call {{.*}} i1 @g3()99// CHECK: br i1 %call11, label %if.then12, label %if.end13100// CHECK: if.then12:101// CHECK: br label %while.cond1102// CHECK: if.end13:103// CHECK: br label %while.cond1104// CHECK: while.end:105// CHECK: br label %while.cond106// CHECK: while.end14:107// CHECK: ret void108void f4() {109 l1: while (g1()) {110 l2: while (g2()) {111 if (g3()) break l1;112 if (g3()) break l2;113 if (g3()) continue l1;114 if (g3()) continue l2;115 }116 }117}118 119// CHECK-LABEL: define {{.*}} void @f5()120// CHECK: entry:121// CHECK: br label %l1122// CHECK: l1:123// CHECK: br label %while.cond124// CHECK: while.cond:125// CHECK: %call = call {{.*}} i1 @g1()126// CHECK: br i1 %call, label %while.body, label %while.end127// CHECK: while.body:128// CHECK: br label %l2129// CHECK: l2:130// CHECK: %call1 = call {{.*}} i1 @g2()131// CHECK: %conv = zext i1 %call1 to i32132// CHECK: switch i32 %conv, label %sw.epilog [133// CHECK: i32 1, label %sw.bb134// CHECK: i32 2, label %sw.bb2135// CHECK: i32 3, label %sw.bb3136// CHECK: ]137// CHECK: sw.bb:138// CHECK: br label %while.end139// CHECK: sw.bb2:140// CHECK: br label %sw.epilog141// CHECK: sw.bb3:142// CHECK: br label %while.cond143// CHECK: sw.epilog:144// CHECK: br label %while.cond145// CHECK: while.end:146// CHECK: ret void147void f5() {148 l1: while (g1()) {149 l2: switch (g2()) {150 case 1: break l1;151 case 2: break l2;152 case 3: continue l1;153 }154 }155}156 157// CHECK-LABEL: define {{.*}} void @f6()158// CHECK: entry:159// CHECK: br label %l1160// CHECK: l1:161// CHECK: br label %while.cond162// CHECK: while.cond:163// CHECK: %call = call {{.*}} i1 @g1()164// CHECK: br i1 %call, label %while.body, label %while.end28165// CHECK: while.body:166// CHECK: br label %l2167// CHECK: l2:168// CHECK: br label %for.cond169// CHECK: for.cond:170// CHECK: %call1 = call {{.*}} i1 @g1()171// CHECK: br i1 %call1, label %for.body, label %for.end172// CHECK: for.body:173// CHECK: br label %l3174// CHECK: l3:175// CHECK: br label %do.body176// CHECK: do.body:177// CHECK: br label %l4178// CHECK: l4:179// CHECK: br label %while.cond2180// CHECK: while.cond2:181// CHECK: %call3 = call {{.*}} i1 @g1()182// CHECK: br i1 %call3, label %while.body4, label %while.end183// CHECK: while.body4:184// CHECK: %call5 = call {{.*}} i1 @g2()185// CHECK: br i1 %call5, label %if.then, label %if.end186// CHECK: if.then:187// CHECK: br label %while.end28188// CHECK: if.end:189// CHECK: %call6 = call {{.*}} i1 @g2()190// CHECK: br i1 %call6, label %if.then7, label %if.end8191// CHECK: if.then7:192// CHECK: br label %for.end193// CHECK: if.end8:194// CHECK: %call9 = call {{.*}} i1 @g2()195// CHECK: br i1 %call9, label %if.then10, label %if.end11196// CHECK: if.then10:197// CHECK: br label %do.end198// CHECK: if.end11:199// CHECK: %call12 = call {{.*}} i1 @g2()200// CHECK: br i1 %call12, label %if.then13, label %if.end14201// CHECK: if.then13:202// CHECK: br label %while.end203// CHECK: if.end14:204// CHECK: %call15 = call {{.*}} i1 @g2()205// CHECK: br i1 %call15, label %if.then16, label %if.end17206// CHECK: if.then16:207// CHECK: br label %while.cond208// CHECK: if.end17:209// CHECK: %call18 = call {{.*}} i1 @g2()210// CHECK: br i1 %call18, label %if.then19, label %if.end20211// CHECK: if.then19:212// CHECK: br label %for.cond213// CHECK: if.end20:214// CHECK: %call21 = call {{.*}} i1 @g2()215// CHECK: br i1 %call21, label %if.then22, label %if.end23216// CHECK: if.then22:217// CHECK: br label %do.cond218// CHECK: if.end23:219// CHECK: %call24 = call {{.*}} i1 @g2()220// CHECK: br i1 %call24, label %if.then25, label %if.end26221// CHECK: if.then25:222// CHECK: br label %while.cond2223// CHECK: if.end26:224// CHECK: br label %while.cond2225// CHECK: while.end:226// CHECK: br label %do.cond227// CHECK: do.cond:228// CHECK: %call27 = call {{.*}} i1 @g1()229// CHECK: br i1 %call27, label %do.body, label %do.end230// CHECK: do.end:231// CHECK: br label %for.cond232// CHECK: for.end:233// CHECK: br label %while.cond234// CHECK: while.end28:235// CHECK: ret void236void f6() {237 l1: while (g1()) {238 l2: for (; g1();) {239 l3: do {240 l4: while (g1()) {241 if (g2()) break l1;242 if (g2()) break l2;243 if (g2()) break l3;244 if (g2()) break l4;245 if (g2()) continue l1;246 if (g2()) continue l2;247 if (g2()) continue l3;248 if (g2()) continue l4;249 }250 } while (g1());251 }252 }253}254 255// CHECK-LABEL: define {{.*}} void @f7()256// CHECK: entry:257// CHECK: br label %loop258// CHECK: loop:259// CHECK: br label %while.cond260// CHECK: while.cond:261// CHECK: %call = call {{.*}} i1 @g1()262// CHECK: br i1 %call, label %while.body, label %while.end263// CHECK: while.body:264// CHECK: %call1 = call {{.*}} i1 @g2()265// CHECK: %conv = zext i1 %call1 to i32266// CHECK: switch i32 %conv, label %sw.epilog [267// CHECK: i32 1, label %sw.bb268// CHECK: ]269// CHECK: sw.bb:270// CHECK: br label %while.end271// CHECK: sw.epilog:272// CHECK: br label %while.cond273// CHECK: while.end:274// CHECK: ret void275void f7() {276 loop: while (g1()) {277 switch (g2()) {278 case 1: break loop;279 }280 }281}282