mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-02 18:26:04 +00:00

region with implicit default inside the member function. This is to fix assert when field is referenced in OpenMP region with default (first|private) clause inside member function. The problem of assert is that the capture is not generated for the field. This patch is to generate capture when the field is used with implicit default, use it in the code, and save the capture off to make sure it is considered from that point and add first/private clauses. 1> Add new field ImplicitDefaultFirstprivateFDs in SharingMapTy, used to store generated capture fields info. 2> In function isOpenMPCaptureDecl: the caputer is generated and saved in ImplicitDefaultFirstprivateFDs. 3> Add new help functions: getImplicitFDCapExprDecl isImplicitDefaultFirstprivateFD addImplicitDefaultFirstprivateFD 4> Add addition argument in hasDSA to check default attribute for default(first|private). 5> The isImplicitDefaultFirstprivateFD is used in VisitDeclRefExpr to build the implicit clause. 6> Add new parameter "Context" for buildCaptureDecl, due to when capture field, the parent context is needed to be used. 7> Change in isOpenMPPrivateDecl where stop propagate the capture from the enclosing region for private variable. 8> In ActOnOpenMPFirstprivate/ActOnOpenMPPrivate, using captured info to generate first|private clause. 9> Add new function isOpenMPRebuildMemberExpr: use to determine if field needs to be rebuild during template instantiation. Differential Revision: https://reviews.llvm.org/D127803
168 lines
5.1 KiB
C++
168 lines
5.1 KiB
C++
// expected-no-diagnostics
|
|
|
|
//RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
|
|
//RUN: -x c++ -std=c++14 -fexceptions -fcxx-exceptions \
|
|
//RUN: -Wno-source-uses-openmp -Wno-openmp-clauses \
|
|
//RUN: -ast-print %s | FileCheck %s --check-prefix=PRINT
|
|
|
|
//RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
|
|
//RUN: -x c++ -std=c++14 -fexceptions -fcxx-exceptions \
|
|
//RUN: -Wno-source-uses-openmp -Wno-openmp-clauses \
|
|
//RUN: -ast-dump %s | FileCheck %s --check-prefix=DUMP
|
|
|
|
//RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
|
|
//RUN: -x c++ -std=c++14 -fexceptions -fcxx-exceptions \
|
|
//RUN: -Wno-source-uses-openmp -Wno-openmp-clauses \
|
|
//RUN: -emit-pch -o %t %s
|
|
|
|
//RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
|
|
//RUN: -x c++ -std=c++14 -fexceptions -fcxx-exceptions \
|
|
//RUN: -Wno-source-uses-openmp -Wno-openmp-clauses \
|
|
//RUN: -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT
|
|
|
|
//RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
|
|
//RUN: -x c++ -std=c++14 -fexceptions -fcxx-exceptions \
|
|
//RUN: -Wno-source-uses-openmp -Wno-openmp-clauses \
|
|
//RUN: -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP
|
|
|
|
#ifndef HEADER
|
|
#define HEADER
|
|
|
|
struct SomeKernel {
|
|
int targetDev;
|
|
float devPtr;
|
|
SomeKernel();
|
|
~SomeKernel();
|
|
|
|
template <unsigned int nRHS>
|
|
void apply() {
|
|
#pragma omp parallel default(firstprivate)
|
|
{
|
|
[=]() -> int {
|
|
return targetDev++;
|
|
}();
|
|
}
|
|
// PRINT: #pragma omp parallel default(firstprivate)
|
|
// PRINT-NEXT: {
|
|
// PRINT-NEXT: [=]() -> int {
|
|
// PRINT-NEXT: return this->targetDev++;
|
|
// PRINT-NEXT: }();
|
|
// PRINT-NEXT: }
|
|
// DUMP: -OMPParallelDirective
|
|
// DUMP-NEXT: -OMPDefaultClause
|
|
// DUMP-NOT: -OMPFirstprivateClause
|
|
}
|
|
// PRINT: template<> void apply<32U>()
|
|
// PRINT: #pragma omp parallel default(firstprivate)
|
|
// PRINT-NEXT: {
|
|
// PRINT-NEXT: [=]() -> int {
|
|
// PRINT-NEXT: return this->targetDev++;
|
|
// PRINT-NEXT: }();
|
|
// CHECK-NEXT: }
|
|
// DUMP: -OMPParallelDirective
|
|
// DUMP-NEXT: -OMPDefaultClause
|
|
// DUMP-NEXT: -OMPFirstprivateClause
|
|
// DUMP-NEXT: -DeclRefExpr {{.*}} 'targetDev'
|
|
};
|
|
|
|
void use_template() {
|
|
SomeKernel aKern;
|
|
aKern.apply<32>();
|
|
}
|
|
|
|
void foo() {
|
|
int a;
|
|
#pragma omp parallel default(firstprivate)
|
|
a++;
|
|
// PRINT: #pragma omp parallel default(firstprivate)
|
|
// PRINT-NEXT: a++;
|
|
// DUMP: -OMPParallelDirective
|
|
// DUMP-NEXT: -OMPDefaultClause
|
|
// DUMP-NEXT: -OMPFirstprivateClause {{.*}} <implicit>
|
|
// DUMP-NEXT: -DeclRefExpr {{.*}} 'a'
|
|
}
|
|
|
|
struct St {
|
|
int a, b;
|
|
static int y;
|
|
St() : a(0), b(0) {}
|
|
~St() {}
|
|
};
|
|
int St::y = 0;
|
|
void bar() {
|
|
St a = St();
|
|
static int yy = 0;
|
|
#pragma omp parallel default(firstprivate)
|
|
{
|
|
a.a += 1;
|
|
a.b += 1;
|
|
a.y++;
|
|
yy++;
|
|
St::y++;
|
|
}
|
|
// PRINT: #pragma omp parallel default(firstprivate)
|
|
// DUMP: -OMPParallelDirective
|
|
// DUMP-NEXT: -OMPDefaultClause
|
|
// DUMP-NEXT: -OMPFirstprivateClause {{.*}} <implicit>
|
|
// DUMP-NEXT: -DeclRefExpr {{.*}} 'a'
|
|
// DUMP-NEXT: -DeclRefExpr {{.*}} 'yy'
|
|
// DUMP-NEXT: -DeclRefExpr {{.*}} 'y'
|
|
}
|
|
void zoo(int);
|
|
struct A {
|
|
int z;
|
|
int f;
|
|
A();
|
|
~A();
|
|
void foo() {
|
|
#pragma omp parallel firstprivate(z) default(firstprivate)
|
|
{
|
|
z++;
|
|
f++;
|
|
zoo(z + f);
|
|
f++;
|
|
}
|
|
}
|
|
// PRINT: #pragma omp parallel firstprivate(this->z) default(firstprivate)
|
|
// DUMP: -OMPParallelDirective
|
|
// DUMP-NEXT: -OMPFirstprivateClause
|
|
// DUMP-NEXT: -DeclRefExpr {{.*}} 'z'
|
|
// DUMP-NEXT: -OMPDefaultClause
|
|
// DUMP-NEXT: -OMPFirstprivateClause {{.*}} <implicit>
|
|
// DUMP-NEXT: -DeclRefExpr {{.*}} 'f'
|
|
// DUMP: -CXXThisExpr {{.*}} 'A *' implicit this
|
|
// DUMP-NEXT: -DeclRefExpr {{.*}} 'z'
|
|
// DUMP-NEXT: -DeclRefExpr {{.*}} 'f'
|
|
void bar() {
|
|
#pragma omp parallel firstprivate(z) default(firstprivate)
|
|
{
|
|
#pragma omp parallel private(z) default(firstprivate)
|
|
{
|
|
z++;
|
|
f++;
|
|
zoo(z + f);
|
|
f++;
|
|
}
|
|
}
|
|
}
|
|
// PRINT: #pragma omp parallel firstprivate(this->z) default(firstprivate)
|
|
// PRINT: #pragma omp parallel private(this->z) default(firstprivate)
|
|
// DUMP: -OMPParallelDirective
|
|
// DUMP-NEXT: -OMPFirstprivateClause
|
|
// DUMP-NEXT: -DeclRefExpr {{.*}} 'z'
|
|
// DUMP-NEXT: -OMPDefaultClause
|
|
// DUMP: -OMPParallelDirective
|
|
// DUMP-NEXT: -OMPPrivateClaus
|
|
// DUMP-NEXT: -DeclRefExpr {{.*}} 'z'
|
|
// DUMP-NEXT: -OMPDefaultClause
|
|
// DUMP-NEXT: -OMPFirstprivateClause {{.*}} <implicit>
|
|
// DUMP-NEXT: -DeclRefExpr {{.*}} 'f'
|
|
// DUMP: -CXXThisExpr {{.*}} 'A *' implicit this
|
|
// DUMP-NEXT: -DeclRefExpr {{.*}} 'f'
|
|
// DUMP: -MemberExpr {{.*}}
|
|
// DUMP-NEXT: -CXXThisExpr
|
|
// DUMP: -CXXThisExpr {{.*}} 'A *' implicit this
|
|
// DUMP-NEXT: -DeclRefExpr {{.*}} 'z'
|
|
};
|
|
#endif // HEADER
|