Author: abataev Date: Fri Jun 21 08:08:30 2019 New Revision: 364061 URL: http://llvm.org/viewvc/llvm-project?rev=364061&view=rev Log: [OPENMP]Fix PR42159: do not capture threadprivate variables.
The threadprivate variables should not be captured in the outlined regions, otherwise it leads to the compiler crash. Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp cfe/trunk/test/OpenMP/parallel_copyin_codegen.cpp Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=364061&r1=364060&r2=364061&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original) +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Fri Jun 21 08:08:30 2019 @@ -1866,11 +1866,14 @@ VarDecl *Sema::isOpenMPCapturedDecl(Valu DSAStack->getTopDSA(D, DSAStack->isClauseParsingMode()); if (DVarPrivate.CKind != OMPC_unknown && isOpenMPPrivate(DVarPrivate.CKind)) return VD ? VD : cast<VarDecl>(DVarPrivate.PrivateCopy->getDecl()); + // Threadprivate variables must not be captured. + if (isOpenMPThreadPrivate(DVarPrivate.CKind)) + return nullptr; + // The variable is not private or it is the variable in the directive with + // default(none) clause and not used in any clause. DVarPrivate = DSAStack->hasDSA(D, isOpenMPPrivate, [](OpenMPDirectiveKind) { return true; }, DSAStack->isClauseParsingMode()); - // The variable is not private or it is the variable in the directive with - // default(none) clause and not used in any clause. if (DVarPrivate.CKind != OMPC_unknown || (VD && DSAStack->getDefaultDSA() == DSA_none)) return VD ? VD : cast<VarDecl>(DVarPrivate.PrivateCopy->getDecl()); Modified: cfe/trunk/test/OpenMP/parallel_copyin_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/parallel_copyin_codegen.cpp?rev=364061&r1=364060&r2=364061&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/parallel_copyin_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/parallel_copyin_codegen.cpp Fri Jun 21 08:08:30 2019 @@ -239,8 +239,8 @@ int main() { vec[0] = t_var; s_arr[0] = var; } -#pragma omp parallel copyin(t_var) - {} +#pragma omp parallel copyin(t_var) default(none) + ++t_var; return tmain<int>(); #endif } @@ -363,6 +363,7 @@ int main() { // TLS-CHECK: [[DONE]] // CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]]) +// CHECK: add nsw i32 %{{.+}}, 1 // CHECK: ret void // TLS-CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]], _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits