brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.1 KiB · 896d4ed Raw
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