Skip to content
This repository was archived by the owner on Nov 1, 2021. It is now read-only.

Commit 4944bbc

Browse files
committed
[OPENMP] Fix DSA analysis for threadprivates after deserialization.
If threadprivate vaible is deserialized, it is not marked as threadprivate in DSAStack. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@318194 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 723b459 commit 4944bbc

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

lib/Sema/SemaOpenMP.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,12 @@ DSAStackTy::DSAVarData DSAStackTy::getTopDSA(ValueDecl *D, bool FromParent) {
966966
DVar.RefExpr = TI->getSecond().RefExpr.getPointer();
967967
DVar.CKind = OMPC_threadprivate;
968968
return DVar;
969+
} else if (VD && VD->hasAttr<OMPThreadPrivateDeclAttr>()) {
970+
DVar.RefExpr = buildDeclRefExpr(
971+
SemaRef, VD, D->getType().getNonReferenceType(),
972+
VD->getAttr<OMPThreadPrivateDeclAttr>()->getLocation());
973+
DVar.CKind = OMPC_threadprivate;
974+
addDSA(D, DVar.RefExpr, OMPC_threadprivate);
969975
}
970976

971977
if (isStackEmpty())

test/OpenMP/parallel_ast_print.cpp

+7-4
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ struct S {
135135
// CHECK-NEXT: #pragma omp threadprivate(S<long>::TS)
136136
// CHECK-NEXT: }
137137

138+
int thrp;
139+
#pragma omp threadprivate(thrp)
140+
138141
template <typename T, int C>
139142
T tmain(T argc, T *argv) {
140143
T b = argc, c, d, e, f, g;
@@ -143,7 +146,7 @@ T tmain(T argc, T *argv) {
143146
T arr[C][10], arr1[C];
144147
#pragma omp parallel
145148
a=2;
146-
#pragma omp parallel default(none), private(argc,b) firstprivate(argv) shared (d) if (parallel:argc > 0) num_threads(C) copyin(S<T>::TS) proc_bind(master) reduction(+:c, arr1[argc]) reduction(max:e, arr[:C][0:10])
149+
#pragma omp parallel default(none), private(argc,b) firstprivate(argv) shared (d) if (parallel:argc > 0) num_threads(C) copyin(S<T>::TS, thrp) proc_bind(master) reduction(+:c, arr1[argc]) reduction(max:e, arr[:C][0:10])
147150
foo();
148151
#pragma omp parallel if (C) num_threads(s) proc_bind(close) reduction(^:e, f, arr[0:C][:argc]) reduction(&& : g)
149152
foo();
@@ -157,7 +160,7 @@ T tmain(T argc, T *argv) {
157160
// CHECK-NEXT: T arr[C][10], arr1[C];
158161
// CHECK-NEXT: #pragma omp parallel
159162
// CHECK-NEXT: a = 2;
160-
// CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(C) copyin(S<T>::TS) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:C][0:10])
163+
// CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(C) copyin(S<T>::TS,thrp) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:C][0:10])
161164
// CHECK-NEXT: foo()
162165
// CHECK-NEXT: #pragma omp parallel if(C) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:C][:argc]) reduction(&&: g)
163166
// CHECK-NEXT: foo()
@@ -168,7 +171,7 @@ T tmain(T argc, T *argv) {
168171
// CHECK-NEXT: int arr[5][10], arr1[5];
169172
// CHECK-NEXT: #pragma omp parallel
170173
// CHECK-NEXT: a = 2;
171-
// CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(5) copyin(S<int>::TS) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:5][0:10])
174+
// CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(5) copyin(S<int>::TS,thrp) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:5][0:10])
172175
// CHECK-NEXT: foo()
173176
// CHECK-NEXT: #pragma omp parallel if(5) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:5][:argc]) reduction(&&: g)
174177
// CHECK-NEXT: foo()
@@ -179,7 +182,7 @@ T tmain(T argc, T *argv) {
179182
// CHECK-NEXT: long arr[1][10], arr1[1];
180183
// CHECK-NEXT: #pragma omp parallel
181184
// CHECK-NEXT: a = 2;
182-
// CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(1) copyin(S<long>::TS) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:1][0:10])
185+
// CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(1) copyin(S<long>::TS,thrp) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:1][0:10])
183186
// CHECK-NEXT: foo()
184187
// CHECK-NEXT: #pragma omp parallel if(1) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:1][:argc]) reduction(&&: g)
185188
// CHECK-NEXT: foo()

0 commit comments

Comments
 (0)