246 lines · c
1// RUN: %clang_cc1 -std=c89 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C99 %s2// RUN: %clang_cc1 -std=c99 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C99 %s3// RUN: %clang_cc1 -std=c11 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C11 %s4// RUN: %clang_cc1 -std=c18 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C11 %s5// RUN: %clang_cc1 -std=c2x -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C11 %s6//7// Check -ffinite-loops option in combination with various standard versions.8// RUN: %clang_cc1 -std=c89 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=FINITE %s9// RUN: %clang_cc1 -std=c99 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=FINITE %s10// RUN: %clang_cc1 -std=c11 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=FINITE %s11// RUN: %clang_cc1 -std=c18 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=FINITE %s12// RUN: %clang_cc1 -std=c2x -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=FINITE %s13//14// Check -fno-finite-loops option in combination with various standard versions.15// RUN: %clang_cc1 -std=c89 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C99 %s16// RUN: %clang_cc1 -std=c99 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C99 %s17// RUN: %clang_cc1 -std=c11 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C99 %s18// RUN: %clang_cc1 -std=c18 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C99 %s19// RUN: %clang_cc1 -std=c2x -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=C99 %s20 21int a = 0;22int b = 0;23 24// CHECK: datalayout25//26// CHECK-NOT: mustprogress27// CHECK-LABEL: @f0(28// CHECK-NEXT: entry:29// CHECK-NEXT: br label %for.cond30// CHECK: for.cond:31// C99-NOT: br {{.*}}!llvm.loop32// C11-NOT: br {{.*}}!llvm.loop33// FINITE-NOR: br {{.*}}!llvm.loop34//35void f0(void) {36 for (; ;) ;37}38 39// CHECK-NOT: mustprogress40// CHECK-LABEL: @f1(41// CHECK-NEXT: entry:42// CHECK-NEXT: br label %for.cond43// CHECK: for.cond:44// CHECK-NEXT: br i1 true, label %for.body, label %for.end45// CHECK: for.body:46// C99-NOT: br {{.*}}, !llvm.loop47// C11-NOT: br {{.*}}, !llvm.loop48// FINITE-NOT: br {{.*}}, !llvm.loop49// CHECK: for.end:50// CHECK-NEXT: ret void51//52void f1(void) {53 for (; 1;) {54 }55}56 57// CHECK-NOT: mustprogress58// CHECK-LABEL: @f2(59// CHECK-NEXT: entry:60// CHECK-NEXT: br label %for.cond61// CHECK: for.cond:62// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 463// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 464// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]65// CHECK-NEXT: br i1 [[CMP]], label %for.body, label %for.end66// CHECK: for.body:67// C99-NOT: br {{.*}} !llvm.loop68// C11: br label %for.cond, !llvm.loop [[LOOP1:!.*]]69// FINITE: br label %for.cond, !llvm.loop [[LOOP1:!.*]]70// CHECK: for.end:71// CHECK-NEXT: ret void72//73void f2(void) {74 for (; a == b;) {75 }76}77 78// CHECK-NOT: mustprogress79// CHECK-LABEL: @F(80// CHECK-NEXT: entry:81// CHECK-NEXT: br label %for.cond82// CHECK: for.cond:83// CHECK-NEXT: br i1 true, label %for.body, label %for.end84// CHECK: for.body:85// C99-NOT: br {{.*}}, !llvm.loop86// C11-NOT: br {{.*}}, !llvm.loop87// FINITE-NOT: br {{.*}}, !llvm.loop88// CHECK: for.end:89// CHECK-NEXT: br label %for.cond190// CHECK: for.cond1:91// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 492// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 493// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]94// CHECK-NEXT: br i1 [[CMP]], label %for.body2, label %for.end395// CHECK: for.body2:96// C99-NOT: br {{.*}}, !llvm.loop97// C11: br label %for.cond1, !llvm.loop [[LOOP2:!.*]]98// FINITE: br label %for.cond1, !llvm.loop [[LOOP2:!.*]]99// CHECK: for.end3:100// CHECK-NEXT: ret void101//102void F(void) {103 for (; 1;) {104 }105 for (; a == b;) {106 }107}108 109// CHECK-NOT: mustprogress110// CHECK-LABEL: @w1(111// CHECK-NEXT: entry:112// CHECK-NEXT: br label %while.body113// CHECK: while.body:114// C99-NOT: br {{.*}}, !llvm.loop115// C11-NOT: br {{.*}}, !llvm.loop116// FINITE-NOT: br {{.*}}, !llvm.loop117//118void w1(void) {119 while (1) {120 }121}122 123// CHECK-NOT: mustprogress124// CHECK-LABEL: @w2(125// CHECK-NEXT: entry:126// CHECK-NEXT: br label %while.cond127// CHECK: while.cond:128// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4129// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4130// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]131// CHECK-NEXT: br i1 [[CMP]], label %while.body, label %while.end132// CHECK: while.body:133// C99-NOT: br {{.*}}, !llvm.loop134// C11: br label %while.cond, !llvm.loop [[LOOP3:!.*]]135// FINITE: br label %while.cond, !llvm.loop [[LOOP3:!.*]]136// CHECK: while.end:137// CHECK-NEXT: ret void138//139void w2(void) {140 while (a == b) {141 }142}143 144// CHECK-NOT: mustprogress145// CHECK-LABEL: @W(146// CHECK-NEXT: entry:147// CHECK-NEXT: br label [[WHILE_COND:%.*]]148// CHECK: while.cond:149// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4150// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4151// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]152// CHECK-NEXT: br i1 [[CMP]], label %while.body, label %while.end153// CHECK: while.body:154// C99-NOT: br {{.*}} !llvm.loop155// C11-NEXT: br label %while.cond, !llvm.loop [[LOOP4:!.*]]156// FINITE-NEXT: br label %while.cond, !llvm.loop [[LOOP4:!.*]]157// CHECK: while.end:158// CHECK-NEXT: br label %while.body2159// CHECK: while.body2:160// C99-NOT: br {{.*}} !llvm.loop161// C11-NOT: br {{.*}} !llvm.loop162// FINITE-NOT: br {{.*}} !llvm.loop163//164void W(void) {165 while (a == b) {166 }167 while (1) {168 }169}170 171// CHECK-NOT: mustprogress172// CHECK-LABEL: @d1(173// CHECK-NEXT: entry:174// CHECK-NEXT: br label %do.body175// CHECK: do.body:176// CHECK-NEXT: br label %do.cond177// CHECK: do.cond:178// C99-NOT: br {{.*}}, !llvm.loop179// C11-NOT: br {{.*}}, !llvm.loop180// FINITE-NOT: br {{.*}}, !llvm.loop181// CHECK: do.end:182// CHECK-NEXT: ret void183//184void d1(void) {185 do {186 } while (1);187}188 189// CHECK-NOT: mustprogress190// CHECK-LABEL: @d2(191// CHECK-NEXT: entry:192// CHECK-NEXT: br label %do.body193// CHECK: do.body:194// CHECK-NEXT: br label %do.cond195// CHECK: do.cond:196// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4197// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4198// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]199// C99-NOT: br {{.*}}, !llvm.loop200// C11: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP5:!.*]]201// FINITE: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP5:!.*]]202// CHECK: do.end:203// CHECK-NEXT: ret void204//205void d2(void) {206 do {207 } while (a == b);208}209 210// CHECK-NOT: mustprogress211// CHECK-LABEL: @D(212// CHECK-NEXT: entry:213// CHECK-NEXT: br label %do.body214// CHECK: do.body:215// CHECK-NEXT: br label %do.cond216// CHECK: do.cond:217// CHECK-NOT: br label {{.*}}, !llvm.loop218// CHECK: do.end:219// CHECK-NEXT: br label %do.body1220// CHECK: do.body1:221// CHECK-NEXT: br label %do.cond2222// CHECK: do.cond2:223// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4224// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4225// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]226// C99-NOT: br {{.*}}, !llvm.loop227// C11: br i1 [[CMP]], label %do.body1, label %do.end3, !llvm.loop [[LOOP6:!.*]]228// FINITE: br i1 [[CMP]], label %do.body1, label %do.end3, !llvm.loop [[LOOP6:!.*]]229// CHECK: do.end3:230// CHECK-NEXT: ret void231//232void D(void) {233 do {234 } while (1);235 do {236 } while (a == b);237}238 239// C11: [[LOOP1]] = distinct !{[[LOOP1]], [[MP:!.*]]}240// C11: [[MP]] = !{!"llvm.loop.mustprogress"}241// C11: [[LOOP2]] = distinct !{[[LOOP2]], [[MP]]}242// C11: [[LOOP3]] = distinct !{[[LOOP3]], [[MP]]}243// C11: [[LOOP4]] = distinct !{[[LOOP4]], [[MP]]}244// C11: [[LOOP5]] = distinct !{[[LOOP5]], [[MP]]}245// C11: [[LOOP6]] = distinct !{[[LOOP6]], [[MP]]}246