422 lines · cpp
1// RUN: %clang_cc1 -std=c++98 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s2// RUN: %clang_cc1 -std=c++11 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s3// RUN: %clang_cc1 -std=c++14 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s4// RUN: %clang_cc1 -std=c++17 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s5// RUN: %clang_cc1 -std=c++20 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s6 7// Check -ffinite-loops option in combination with various standard versions.8// RUN: %clang_cc1 -std=c++98 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=FINITE %s9// RUN: %clang_cc1 -std=c++11 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s10// RUN: %clang_cc1 -std=c++14 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s11// RUN: %clang_cc1 -std=c++17 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s12// RUN: %clang_cc1 -std=c++20 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s13 14// Check -fno-finite-loops option in combination with various standard versions.15// RUN: %clang_cc1 -std=c++98 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s16// RUN: %clang_cc1 -std=c++11 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s17// RUN: %clang_cc1 -std=c++14 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s18// RUN: %clang_cc1 -std=c++17 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s19// RUN: %clang_cc1 -std=c++20 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s20 21int a = 0;22int b = 0;23 24// CHECK: datalayout25 26// CXX98-NOT: mustprogress27// CXX11-NOT: mustprogress28// FINITE-NOT: mustprogress29// CHECK-LABEL: @_Z2f0v(30// CHECK-NEXT: entry:31// CHECK-NEXT: br label %for.cond32// CHECK: for.cond:33// CXX98-NOT: br {{.*}} llvm.loop34// CXX11-NOT: br {{.*}} llvm.loop35// FINITE-NOT: br {{.*}} llvm.loop36void f0() {37 for (; ;) ;38}39 40// CXX98-NOT: mustprogress41// CXX11-NOT: mustprogress42// FINITE-NOT: mustprogress43// CHECK-LABEL: @_Z2f1v(44// CHECK-NEXT: entry:45// CHECK-NEXT: br label %for.cond46// CHECK: for.cond:47// CHECK-NEXT: br i1 true, label %for.body, label %for.end48// CHECK: for.body:49// CXX98-NOT: br {{.*}}, !llvm.loop50// CXX11-NOT: br {{.*}} llvm.loop51// FINITE-NOT: br {{.*}} llvm.loop52// CHECK: for.end:53// CHECK-NEXT: ret void54//55void f1() {56 for (; 1;)57 ;58}59 60// CXX98-NOT: mustprogress61// CXX11: mustprogress62// FINITE-NOT: mustprogress63// CHECK-LABEL: @_Z2f2v(64// CHECK-NEXT: entry:65// CHECK-NEXT: br label %for.cond66// CHECK: for.cond:67// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 468// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 469// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]70// CHECK-NEXT: br i1 [[CMP]], label %for.body, label %for.end71// CHECK: for.body:72// CXX98-NOT: br {{.*}}, !llvm.loop73// CXX11: br label %for.cond, !llvm.loop [[LOOP3:!.*]]74// FINITE-NEXT: br label %for.cond, !llvm.loop [[LOOP3:!.*]]75// CHECK: for.end:76// CHECK-NEXT: ret void77//78void f2() {79 for (; a == b;)80 ;81}82 83// CXX98-NOT: mustprogress84// CXX11-NOT: mustprogress85// FINITE-NOT: mustprogress86// CHECK-LABEL: @_Z1Fv(87// CHECK-NEXT: entry:88// CHECK-NEXT: br label %for.cond89// CHECK: for.cond:90// CHECK-NEXT: br i1 true, label %for.body, label %for.end91// CHECK: for.body:92// CXX98-NOT: br {{.*}}, !llvm.loop93// CXX11-NOT: br {{.*}}, !llvm.loop94// FINITE-NOT: br {{.*}}, !llvm.loop95// CHECK: for.end:96// CHECK-NEXT: br label %for.cond197// CHECK: for.cond1:98// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 499// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4100// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]101// CHECK-NEXT: br i1 [[CMP]], label %for.body2, label %for.end3102// CHECK: for.body2:103// CXX98-NOT: br {{.*}}, !llvm.loop104// CXX11-NEXT: br label %for.cond1, !llvm.loop [[LOOP5:!.*]]105// FINITE-NEXT: br label %for.cond1, !llvm.loop [[LOOP5:!.*]]106// CHECK: for.end3:107// CHECK-NEXT: ret void108//109void F() {110 for (; 1;)111 ;112 for (; a == b;)113 ;114}115 116// CXX98-NOT: mustprogress117// CXX11-NOT: mustprogress118// FINITE-NOT: mustprogress119// CHECK-LABEL: @_Z2F2v(120// CHECK-NEXT: entry:121// CHECK-NEXT: br label %for.cond122// CHECK: for.cond:123// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4124// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4125// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]126// CHECK-NEXT: br i1 [[CMP]], label %for.body, label %for.end127// CHECK: for.body:128// CXX98-NOT: br {{.*}} !llvm.loop129// CXX11-NEXT: br label %for.cond, !llvm.loop [[LOOP6:!.*]]130// FINITE-NEXT: br label %for.cond, !llvm.loop [[LOOP6:!.*]]131// CHECK: for.end:132// CHECK-NEXT: br label %for.cond1133// CHECK: for.cond1:134// CHECK-NEXT: br i1 true, label %for.body2, label %for.end3135// CHECK: for.body2:136// CXX98-NOT: br {{.*}}, !llvm.loop137// CXX11-NOT: br {{.*}}, !llvm.loop138// FINITE-NOT: br {{.*}}, !llvm.loop139// CHECK: for.end3:140// CHECK-NEXT: ret void141//142void F2() {143 for (; a == b;)144 ;145 for (; 1;)146 ;147}148 149// CXX98-NOT: mustprogress150// CXX11-NOT: mustprogress151// FINITE-NOT: mustprogress152// CHECK-LABEL: @_Z2w1v(153// CHECK-NEXT: entry:154// CHECK-NEXT: br label %while.body155// CHECK: while.body:156// CXX98-NOT: br {{.*}}, !llvm.loop157// CXX11-NOT: br {{.*}}, !llvm.loop158// FINITE-NOT: br {{.*}}, !llvm.loop159//160void w1() {161 while (1)162 ;163}164 165// CXX98-NOT: mustprogress166// CXX11: mustprogress167// FINITE-NOT: mustprogress168// CHECK-LABEL: @_Z2w2v(169// CHECK-NEXT: entry:170// CHECK-NEXT: br label %while.cond171// CHECK: while.cond:172// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4173// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4174// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]175// CHECK-NEXT: br i1 [[CMP]], label %while.body, label %while.end176// CHECK: while.body:177// CXX98-NOT: br {{.*}}, !llvm.loop178// CXX11-NEXT: br label %while.cond, !llvm.loop [[LOOP9:!.*]]179// FINITE-NEXT: br label %while.cond, !llvm.loop [[LOOP9:!.*]]180// CHECK: while.end:181// CHECK-NEXT: ret void182//183void w2() {184 while (a == b)185 ;186}187 188// CXX98-NOT: mustprogress189// CXX11-NOT: mustprogress190// FINITE-NOT: mustprogress191// CHECK-LABEL: @_Z1Wv(192// CHECK-NEXT: entry:193// CHECK-NEXT: br label %while.cond194// CHECK: while.cond:195// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4196// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4197// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]198// CHECK-NEXT: br i1 [[CMP]], label %while.body, label %while.end199// CHECK: while.body:200// CXX98-NOT: br {{.*}}, !llvm.loop201// CXX11-NEXT: br label %while.cond, !llvm.loop [[LOOP10:!.*]]202// FINITE-NEXT: br label %while.cond, !llvm.loop [[LOOP10:!.*]]203// CHECK: while.end:204// CHECK-NEXT: br label %while.body2205// CHECK: while.body2:206// CXX98-NOT: br {{.*}}, !llvm.loop207// CXX11-NOT: br {{.*}}, !llvm.loop208// FINITE-NOT: br {{.*}}, !llvm.loop209//210void W() {211 while (a == b)212 ;213 while (1)214 ;215}216 217// CXX98-NOT: mustprogress218// CXX11-NOT: mustprogress219// FINITE-NOT: mustprogress220// CHECK-LABEL: @_Z2W2v(221// CHECK-NEXT: entry:222// CHECK-NEXT: br label %while.body223// CHECK: while.body:224// CXX98-NOT: br {{.*}}, !llvm.loop225// CXX11-NOT: br {{.*}}, !llvm.loop226// FINITE-NOT: br {{.*}}, !llvm.loop227//228void W2() {229 while (1)230 ;231 while (a == b)232 ;233}234 235// CXX98-NOT: mustprogress236// CXX11-NOT: mustprogress237// FINITE-NOT: mustprogress238// CHECK-LABEL: @_Z2d1v(239// CHECK-NEXT: entry:240// CHECK-NEXT: br label %do.body241// CHECK: do.body:242// CHECK-NEXT: br label %do.cond243// CHECK: do.cond:244// CXX98-NOT: br {{.*}}, !llvm.loop245// CXX11-NOT: br {{.*}}, !llvm.loop246// FINITE-NOT: br {{.*}}, !llvm.loop247// CHECK: do.end:248// CHECK-NEXT: ret void249//250void d1() {251 do252 ;253 while (1);254}255 256// CXX98-NOT: mustprogress257// CXX11: mustprogress258// FINITE-NOT: mustprogress259// CHECK-LABEL: @_Z2d2v(260// CHECK-NEXT: entry:261// CHECK-NEXT: br label %do.body262// CHECK: do.body:263// CHECK-NEXT: br label %do.cond264// CHECK: do.cond:265// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4266// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4267// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]268// CXX98-NOT: br {{.*}}, !llvm.loop269// CXX11-NEXT: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP14:!.*]]270// FINITE-NEXT: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP14:!.*]]271// CHECK: do.end:272// CHECK-NEXT: ret void273//274void d2() {275 do276 ;277 while (a == b);278}279 280// CXX98-NOT: mustprogress281// CXX11-NOT: mustprogress282// FINITE-NOT: mustprogress283// CHECK-LABEL: @_Z1Dv(284// CHECK-NEXT: entry:285// CHECK-NEXT: br label %do.body286// CHECK: do.body:287// CHECK-NEXT: br label %do.cond288// CHECK: do.cond:289// CXX98-NOT: br {{.*}}, !llvm.loop290// CXX11-NOT: br {{.*}}, !llvm.loop291// FINITE-NOT: br {{.*}}, !llvm.loop292// CHECK: do.end:293// CHECK-NEXT: br label %do.body1294// CHECK: do.body1:295// CHECK-NEXT: br label %do.cond2296// CHECK: do.cond2:297// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4298// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4299// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]300// CXX98-NOT: br {{.*}}, !llvm.loop301// CXX11-NEXT: br i1 [[CMP]], label %do.body1, label %do.end3, !llvm.loop [[LOOP16:!.*]]302// FINITE-NEXT: br i1 [[CMP]], label %do.body1, label %do.end3, !llvm.loop [[LOOP16:!.*]]303// CHECK: do.end3:304// CHECK-NEXT: ret void305//306void D() {307 do308 ;309 while (1);310 do311 ;312 while (a == b);313}314 315// CXX98-NOT: mustprogress316// CXX11-NOT: mustprogress317// FINITE-NOT: mustprogress318// CHECK-LABEL: @_Z2D2v(319// CHECK-NEXT: entry:320// CHECK-NEXT: br label %do.body321// CHECK: do.body:322// CHECK-NEXT: br label %do.cond323// CHECK: do.cond:324// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4325// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4326// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]327// CXX98-NOT: br {{.*}}, !llvm.loop328// CXX11-NEXT: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP17:!.*]]329// FINITE-NEXT: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP17:!.*]]330// CHECK: do.end:331// CHECK-NEXT: br label %do.body1332// CHECK: do.body1:333// CHECK-NEXT: br label %do.cond2334// CHECK: do.cond2:335// CXX98-NOT: br {{.*}}, !llvm.loop336// CXX11-NOT: br {{.*}}, !llvm.loop337// FINITE-NOT: br {{.*}}, !llvm.loop338// CHECK: do.end3:339// CHECK-NEXT: ret void340//341void D2() {342 do343 ;344 while (a == b);345 do346 ;347 while (1);348}349 350// CXX98-NOT: mustprogress351// CXX11-NOT: mustprogress352// FINITE-NOT: mustprogress353// CHECK-LABEL: @_Z9compound0v(354// CHECK-NEXT: entry:355// CHECK-NEXT: br label %for.cond356// CHECK: for.cond:357// CXX98-NOT: br {{.*}}, !llvm.loop358// CXX11-NOT: br {{.*}}, !llvm.loop359// FINITE-NOT: br {{.*}}, !llvm.loop360void compound0() {361 for (; ;) {}362}363 364// CXX98-NOT: mustprogress365// CXX11-NOT: mustprogress366// FINITE-NOT: mustprogress367// CHECK-LABEL: @_Z9compound1v(368// CHECK-NEXT: entry:369// CHECK-NEXT: br label %for.cond370// CHECK: for.cond:371// CXX98-NOT: br {{.*}}, llvm.loop372// CXX11-NOT: br {{.*}}, llvm.loop373// FINITE-NOT: br {{.*}}, !llvm.loop374void compound1() {375 for (; ;) {/*! */}376}377 378// CXX98-NOT: mustprogress379// CXX11-NOT: mustprogress380// FINITE-NOT: mustprogress381// CHECK-LABEL: @_Z9compound2v(382// CHECK-NEXT: entry:383// CHECK-NEXT: br label %do.body384// CHECK: do.body:385// CHECK-NEXT: br label %do.cond386// CHECK: do.cond:387// CXX98-NOT: br {{.*}}, !llvm.loop388// CXX11-NOT: br {{.*}}, !llvm.loop389// FINITE-NOT: br {{.*}}, !llvm.loop390// CHECK: do.end:391// CHECK-NEXT: ret void392//393void compound2() {394 do {} while (1+1);395}396 397// CXX98-NOT: mustprogress398// CXX11 : mustprogress399// FINITE : mustprogress400// CHECK-LABEL: @_Z5Falsev(401// CHECK-NEXT: entry:402// CHECK-NEXT: br label %do.body403// CHECK: do.body:404// CHECK-NEXT: br label %do.end405// CHECK: do.end:406// CHECK-NEXT: ret void407//408void False() {409 do {} while (1-1);410}411 412 413// CXX11: [[LOOP3]] = distinct !{[[LOOP3]], [[MP:.*]]}414// CXX11: [[MP]] = !{!"llvm.loop.mustprogress"}415// CXX11: [[LOOP5]] = distinct !{[[LOOP5]], [[MP]]}416// CXX11: [[LOOP6]] = distinct !{[[LOOP6]], [[MP]]}417// CXX11: [[LOOP9]] = distinct !{[[LOOP9]], [[MP]]}418// CXX11: [[LOOP10]] = distinct !{[[LOOP10]], [[MP]]}419// CXX11: [[LOOP14]] = distinct !{[[LOOP14]], [[MP]]}420// CXX11: [[LOOP16]] = distinct !{[[LOOP16]], [[MP]]}421// CXX11: [[LOOP17]] = distinct !{[[LOOP17]], [[MP]]}422