235 lines · plain
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals smart --include-generated-funcs2// Check that the CHECK lines are generated for clang-generated functions3// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fopenmp %s -emit-llvm -o - | FileCheck --check-prefix=OMP %s4// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu %s -emit-llvm -o - | FileCheck --check-prefix=NOOMP %s5 6const int size = 1024 * 1024 * 32;7 8double A[size];9 10void foo(void);11 12int main(void) {13 int i = 0;14 15#pragma omp parallel for16 for (i = 0; i < size; ++i) {17 A[i] = 0.0;18 }19 20 foo();21 22 return 0;23}24 25void foo(void) {26 int i = 0;27 28#pragma omp parallel for29 for (i = 0; i < size; ++i) {30 A[i] = 1.0;31 }32}33// OMP-LABEL: @main(34// OMP-NEXT: entry:35// OMP-NEXT: [[RETVAL:%.*]] = alloca i32, align 436// OMP-NEXT: [[I:%.*]] = alloca i32, align 437// OMP-NEXT: store i32 0, ptr [[RETVAL]], align 438// OMP-NEXT: store i32 0, ptr [[I]], align 439// OMP-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2:[0-9]+]], i32 0, ptr @main.omp_outlined)40// OMP-NEXT: call void @foo()41// OMP-NEXT: ret i32 042//43//44// OMP-LABEL: @main.omp_outlined(45// OMP-NEXT: entry:46// OMP-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 847// OMP-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 848// OMP-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 449// OMP-NEXT: [[TMP:%.*]] = alloca i32, align 450// OMP-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 451// OMP-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 452// OMP-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 453// OMP-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 454// OMP-NEXT: [[I:%.*]] = alloca i32, align 455// OMP-NEXT: store ptr [[DOTGLOBAL_TID_:%.*]], ptr [[DOTGLOBAL_TID__ADDR]], align 856// OMP-NEXT: store ptr [[DOTBOUND_TID_:%.*]], ptr [[DOTBOUND_TID__ADDR]], align 857// OMP-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 458// OMP-NEXT: store i32 33554431, ptr [[DOTOMP_UB]], align 459// OMP-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 460// OMP-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 461// OMP-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 862// OMP-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 463// OMP-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)64// OMP-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 465// OMP-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 3355443166// OMP-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]67// OMP: cond.true:68// OMP-NEXT: br label [[COND_END:%.*]]69// OMP: cond.false:70// OMP-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 471// OMP-NEXT: br label [[COND_END]]72// OMP: cond.end:73// OMP-NEXT: [[COND:%.*]] = phi i32 [ 33554431, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]74// OMP-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 475// OMP-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 476// OMP-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 477// OMP-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]78// OMP: omp.inner.for.cond:79// OMP-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 480// OMP-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 481// OMP-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]82// OMP-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]83// OMP: omp.inner.for.body:84// OMP-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 485// OMP-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 186// OMP-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]87// OMP-NEXT: store i32 [[ADD]], ptr [[I]], align 488// OMP-NEXT: [[TMP8:%.*]] = load i32, ptr [[I]], align 489// OMP-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP8]] to i6490// OMP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [33554432 x double], ptr @A, i64 0, i64 [[IDXPROM]]91// OMP-NEXT: store double 0.000000e+00, ptr [[ARRAYIDX]], align 892// OMP-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]93// OMP: omp.body.continue:94// OMP-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]95// OMP: omp.inner.for.inc:96// OMP-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 497// OMP-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP9]], 198// OMP-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 499// OMP-NEXT: br label [[OMP_INNER_FOR_COND]]100// OMP: omp.inner.for.end:101// OMP-NEXT: br label [[OMP_LOOP_EXIT:%.*]]102// OMP: omp.loop.exit:103// OMP-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])104// OMP-NEXT: ret void105//106//107// OMP-LABEL: @foo(108// OMP-NEXT: entry:109// OMP-NEXT: [[I:%.*]] = alloca i32, align 4110// OMP-NEXT: store i32 0, ptr [[I]], align 4111// OMP-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 0, ptr @foo.omp_outlined)112// OMP-NEXT: ret void113//114//115// OMP-LABEL: @foo.omp_outlined(116// OMP-NEXT: entry:117// OMP-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8118// OMP-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8119// OMP-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4120// OMP-NEXT: [[TMP:%.*]] = alloca i32, align 4121// OMP-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4122// OMP-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4123// OMP-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4124// OMP-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4125// OMP-NEXT: [[I:%.*]] = alloca i32, align 4126// OMP-NEXT: store ptr [[DOTGLOBAL_TID_:%.*]], ptr [[DOTGLOBAL_TID__ADDR]], align 8127// OMP-NEXT: store ptr [[DOTBOUND_TID_:%.*]], ptr [[DOTBOUND_TID__ADDR]], align 8128// OMP-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4129// OMP-NEXT: store i32 33554431, ptr [[DOTOMP_UB]], align 4130// OMP-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4131// OMP-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4132// OMP-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8133// OMP-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4134// OMP-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)135// OMP-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4136// OMP-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 33554431137// OMP-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]138// OMP: cond.true:139// OMP-NEXT: br label [[COND_END:%.*]]140// OMP: cond.false:141// OMP-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4142// OMP-NEXT: br label [[COND_END]]143// OMP: cond.end:144// OMP-NEXT: [[COND:%.*]] = phi i32 [ 33554431, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]145// OMP-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4146// OMP-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4147// OMP-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4148// OMP-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]149// OMP: omp.inner.for.cond:150// OMP-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4151// OMP-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4152// OMP-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]153// OMP-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]154// OMP: omp.inner.for.body:155// OMP-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4156// OMP-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1157// OMP-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]158// OMP-NEXT: store i32 [[ADD]], ptr [[I]], align 4159// OMP-NEXT: [[TMP8:%.*]] = load i32, ptr [[I]], align 4160// OMP-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP8]] to i64161// OMP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [33554432 x double], ptr @A, i64 0, i64 [[IDXPROM]]162// OMP-NEXT: store double 1.000000e+00, ptr [[ARRAYIDX]], align 8163// OMP-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]164// OMP: omp.body.continue:165// OMP-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]166// OMP: omp.inner.for.inc:167// OMP-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4168// OMP-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP9]], 1169// OMP-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4170// OMP-NEXT: br label [[OMP_INNER_FOR_COND]]171// OMP: omp.inner.for.end:172// OMP-NEXT: br label [[OMP_LOOP_EXIT:%.*]]173// OMP: omp.loop.exit:174// OMP-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])175// OMP-NEXT: ret void176//177//178// NOOMP-LABEL: @main(179// NOOMP-NEXT: entry:180// NOOMP-NEXT: [[RETVAL:%.*]] = alloca i32, align 4181// NOOMP-NEXT: [[I:%.*]] = alloca i32, align 4182// NOOMP-NEXT: store i32 0, ptr [[RETVAL]], align 4183// NOOMP-NEXT: store i32 0, ptr [[I]], align 4184// NOOMP-NEXT: store i32 0, ptr [[I]], align 4185// NOOMP-NEXT: br label [[FOR_COND:%.*]]186// NOOMP: for.cond:187// NOOMP-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4188// NOOMP-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], 33554432189// NOOMP-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]190// NOOMP: for.body:191// NOOMP-NEXT: [[TMP1:%.*]] = load i32, ptr [[I]], align 4192// NOOMP-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP1]] to i64193// NOOMP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [33554432 x double], ptr @A, i64 0, i64 [[IDXPROM]]194// NOOMP-NEXT: store double 0.000000e+00, ptr [[ARRAYIDX]], align 8195// NOOMP-NEXT: br label [[FOR_INC:%.*]]196// NOOMP: for.inc:197// NOOMP-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4198// NOOMP-NEXT: [[INC:%.*]] = add nsw i32 [[TMP2]], 1199// NOOMP-NEXT: store i32 [[INC]], ptr [[I]], align 4200// NOOMP-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP2:![0-9]+]]201// NOOMP: for.end:202// NOOMP-NEXT: call void @foo()203// NOOMP-NEXT: ret i32 0204//205//206// NOOMP-LABEL: @foo(207// NOOMP-NEXT: entry:208// NOOMP-NEXT: [[I:%.*]] = alloca i32, align 4209// NOOMP-NEXT: store i32 0, ptr [[I]], align 4210// NOOMP-NEXT: store i32 0, ptr [[I]], align 4211// NOOMP-NEXT: br label [[FOR_COND:%.*]]212// NOOMP: for.cond:213// NOOMP-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4214// NOOMP-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], 33554432215// NOOMP-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]216// NOOMP: for.body:217// NOOMP-NEXT: [[TMP1:%.*]] = load i32, ptr [[I]], align 4218// NOOMP-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP1]] to i64219// NOOMP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [33554432 x double], ptr @A, i64 0, i64 [[IDXPROM]]220// NOOMP-NEXT: store double 1.000000e+00, ptr [[ARRAYIDX]], align 8221// NOOMP-NEXT: br label [[FOR_INC:%.*]]222// NOOMP: for.inc:223// NOOMP-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4224// NOOMP-NEXT: [[INC:%.*]] = add nsw i32 [[TMP2]], 1225// NOOMP-NEXT: store i32 [[INC]], ptr [[I]], align 4226// NOOMP-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP4:![0-9]+]]227// NOOMP: for.end:228// NOOMP-NEXT: ret void229//230//.231// NOOMP: [[LOOP2]] = distinct !{[[LOOP2]], [[META3:![0-9]+]]}232// NOOMP: [[META3]] = !{!"llvm.loop.mustprogress"}233// NOOMP: [[LOOP4]] = distinct !{[[LOOP4]], [[META3]]}234//.235