From be5b89253241a45460fe5c7429b75225c6e3aaf7 Mon Sep 17 00:00:00 2001 From: Alexander Musman Date: Mon, 16 Mar 2015 07:14:41 +0000 Subject: [PATCH] =?utf8?q?[OPENMP]=20Enable=20codegen=20of=20the=20?= =?utf8?q?=E2=80=98private=E2=80=99=20clause=20for=20=E2=80=98omp=20simd?= =?utf8?q?=E2=80=99=20directive?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@232353 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGStmtOpenMP.cpp | 10 +++++++--- test/OpenMP/simd_codegen.cpp | 24 ++++++++++++++++++++---- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/lib/CodeGen/CGStmtOpenMP.cpp b/lib/CodeGen/CGStmtOpenMP.cpp index e3c4384a4b..a7615ce10a 100644 --- a/lib/CodeGen/CGStmtOpenMP.cpp +++ b/lib/CodeGen/CGStmtOpenMP.cpp @@ -189,7 +189,7 @@ void CodeGenFunction::EmitOMPFirstprivateClause( EmitDecl(*VD); return GetAddrOfLocalVar(VD); }); - assert(IsRegistered && "counter already registered as private"); + assert(IsRegistered && "firstprivate var already registered as private"); // Silence the warning about unused variable. (void)IsRegistered; ++IRef, ++InitsRef; @@ -216,7 +216,7 @@ void CodeGenFunction::EmitOMPPrivateClause( EmitDecl(*VD); return GetAddrOfLocalVar(VD); }); - assert(IsRegistered && "counter already registered as private"); + assert(IsRegistered && "private var already registered as private"); // Silence the warning about unused variable. (void)IsRegistered; ++IRef; @@ -379,7 +379,6 @@ static void EmitPrivateLoopCounters(CodeGenFunction &CGF, // Silence the warning about unused variable. (void)IsRegistered; } - (void)LoopScope.Privatize(); } void CodeGenFunction::EmitOMPSimdDirective(const OMPSimdDirective &S) { @@ -456,6 +455,8 @@ void CodeGenFunction::EmitOMPSimdDirective(const OMPSimdDirective &S) { { OMPPrivateScope LoopScope(*this); EmitPrivateLoopCounters(*this, LoopScope, S.counters()); + EmitOMPPrivateClause(S, LoopScope); + (void)LoopScope.Privatize(); EmitOMPInnerLoop(S, LoopScope.requiresCleanups(), S.getCond(/*SeparateIter=*/true), S.getInc(), [&S, this]() { @@ -472,6 +473,8 @@ void CodeGenFunction::EmitOMPSimdDirective(const OMPSimdDirective &S) { { OMPPrivateScope LoopScope(*this); EmitPrivateLoopCounters(*this, LoopScope, S.counters()); + EmitOMPPrivateClause(S, LoopScope); + (void)LoopScope.Privatize(); EmitOMPInnerLoop(S, LoopScope.requiresCleanups(), S.getCond(/*SeparateIter=*/false), S.getInc(), [&S, this]() { @@ -670,6 +673,7 @@ void CodeGenFunction::EmitOMPWorksharingLoop(const OMPLoopDirective &S) { OMPPrivateScope LoopScope(*this); EmitPrivateLoopCounters(*this, LoopScope, S.counters()); + (void)LoopScope.Privatize(); // Detect the loop schedule kind and chunk. auto ScheduleKind = OMPC_SCHEDULE_unknown; diff --git a/test/OpenMP/simd_codegen.cpp b/test/OpenMP/simd_codegen.cpp index 4faf0513e0..4d1fef9dbf 100644 --- a/test/OpenMP/simd_codegen.cpp +++ b/test/OpenMP/simd_codegen.cpp @@ -362,15 +362,19 @@ void collapsed(float *a, float *b, float *c, float *d) { } extern char foo(); +extern double globalfloat; // CHECK-LABEL: define {{.*void}} @{{.*}}widened{{.*}} void widened(float *a, float *b, float *c, float *d) { int i; // outer loop counter short j; // inner loop counter + globalfloat = 1.0; + int localint = 1; +// CHECK: store double {{.+}}, double* [[GLOBALFLOAT:@.+]] // Counter is widened to 64 bits. // CHECK: store i64 0, i64* [[OMP_IV:[^,]+]] // - #pragma omp simd collapse(2) + #pragma omp simd collapse(2) private(globalfloat, localint) // CHECK: [[IV:%.+]] = load i64, i64* [[OMP_IV]]{{.+}}!llvm.mem.parallel_loop_access ![[WIDE1_LOOP_ID:[0-9]+]] // CHECK-NEXT: [[LI:%.+]] = load i64, i64* [[OMP_LI:%[^,]+]]{{.+}}!llvm.mem.parallel_loop_access ![[WIDE1_LOOP_ID]] @@ -388,19 +392,31 @@ void widened(float *a, float *b, float *c, float *d) { // CHECK: [[IV1_2:%.+]] = load i64, i64* [[OMP_IV]]{{.+}}!llvm.mem.parallel_loop_access ![[WIDE1_LOOP_ID]] // CHECK: store i16 {{[^,]+}}, i16* [[LC_J:.+]] // ... loop body ... -// End of body: store into a[i]: -// CHECK: store float [[RESULT:%.+]], float* [[RESULT_ADDR:%.+]]{{.+}}!llvm.mem.parallel_loop_access ![[WIDE1_LOOP_ID]] +// +// Here we expect store into private double var, not global +// CHECK-NOT: store double {{.+}}, double* [[GLOBALFLOAT]] + globalfloat = (float)j/i; float res = b[j] * c[j]; +// Store into a[i]: +// CHECK: store float [[RESULT:%.+]], float* [[RESULT_ADDR:%.+]]{{.+}}!llvm.mem.parallel_loop_access ![[WIDE1_LOOP_ID]] a[i] = res * d[i]; +// Then there's a store into private var localint: +// CHECK: store i32 {{.+}}, i32* [[LOCALINT:%[^,]+]]{{.+}}!llvm.mem.parallel_loop_access ![[WIDE1_LOOP_ID]] + localint = (int)j; // CHECK: [[IV2:%.+]] = load i64, i64* [[OMP_IV]]{{.*}}!llvm.mem.parallel_loop_access ![[WIDE1_LOOP_ID]] // CHECK-NEXT: [[ADD2:%.+]] = add nsw i64 [[IV2]], 1 // CHECK-NEXT: store i64 [[ADD2]], i64* [[OMP_IV]]{{.*}}!llvm.mem.parallel_loop_access ![[WIDE1_LOOP_ID]] +// // br label %{{[^,]+}}, !llvm.loop ![[WIDE1_LOOP_ID]] // CHECK: [[WIDE1_END]] } // i,j are updated. // CHECK: store i32 3, i32* [[I:%[^,]+]] // CHECK: store i16 +// +// Here we expect store into original localint, not its privatized version. +// CHECK-NOT: store i32 {{.+}}, i32* [[LOCALINT]] + localint = (int)j; // CHECK: ret void } @@ -421,6 +437,6 @@ void parallel_simd(float *a) { for (unsigned i = 131071; i <= 2147483647; i += 127) a[i] += bar(); } -// TERM_DEBUG: !{{[0-9]+}} = !MDLocation(line: 413, +// TERM_DEBUG: !{{[0-9]+}} = !MDLocation(line: [[@LINE-11]], #endif // HEADER -- 2.40.0