jyu2 created this revision. jyu2 added reviewers: ABataev, jdoerfert, mikerice. jyu2 added a project: clang. jyu2 requested review of this revision. Herald added a subscriber: sstefan1.
The problem only happens with constexpr variable, for constexpr variable, variable is not marked during parser expression. This is because compiler might find some var's associate expressions may not actully an odr-used later, the Var get kept in MaybeODRUseExprs, in normal case, at end of process fullExpr, the variable will be mark during the call to CleanupVarDeclMarking(). Since we are processing expression of OpenMP clauses, and the ActOnFinishFullExpr is not getting called that casue variable is not get marked. One way to fix this is to call CleanupVarDeclMarking() at in EndOpenMPClause for each omp directive. This to fix https://bugs.llvm.org/show_bug.cgi?id=50206 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D101781 Files: clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/constexpr_capture.cpp Index: clang/test/OpenMP/constexpr_capture.cpp =================================================================== --- clang/test/OpenMP/constexpr_capture.cpp +++ clang/test/OpenMP/constexpr_capture.cpp @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-linux -S -emit-llvm %s -o - -std=c++11 2>&1 | FileCheck %s +// RUN: %clang_cc1 -verify -fopenmp -x c++ -fopenmp-targets=x86_64-pc-linux-gnu -triple powerpc64le-unknown-linux -S -emit-llvm %s -o - -std=c++11 2>&1 | FileCheck %s // expected-no-diagnostics template <int __v> struct integral_constant { @@ -12,10 +13,24 @@ struct V { template <typename TArg0 = int, typename = typename decay<TArg0>::type> V(); }; + +constexpr double h_chebyshev_coefs[] = { + 1.0000020784639703, 0.0021491446496202074}; + +void test(double *d_value) +{ +#pragma omp target map(tofrom \ + : d_value [0:1]) map(always, to \ + : h_chebyshev_coefs [0:2]) + *d_value = h_chebyshev_coefs[1]; return; +} + +// CHECK: void @__omp_offloading_{{.+}}test{{.+}}(double* %0) + int main() { #pragma omp target V v; return 0; } -// CHECK: call void @__omp_offloading_{{.+}}_main_l16() +// CHECK: call void @__omp_offloading_{{.+}}_main_{{.+}}() Index: clang/lib/Sema/SemaOpenMP.cpp =================================================================== --- clang/lib/Sema/SemaOpenMP.cpp +++ clang/lib/Sema/SemaOpenMP.cpp @@ -2527,6 +2527,7 @@ void Sema::EndOpenMPClause() { DSAStack->setClauseParsingMode(/*K=*/OMPC_unknown); + CleanupVarDeclMarking(); } static std::pair<ValueDecl *, bool>
Index: clang/test/OpenMP/constexpr_capture.cpp =================================================================== --- clang/test/OpenMP/constexpr_capture.cpp +++ clang/test/OpenMP/constexpr_capture.cpp @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-linux -S -emit-llvm %s -o - -std=c++11 2>&1 | FileCheck %s +// RUN: %clang_cc1 -verify -fopenmp -x c++ -fopenmp-targets=x86_64-pc-linux-gnu -triple powerpc64le-unknown-linux -S -emit-llvm %s -o - -std=c++11 2>&1 | FileCheck %s // expected-no-diagnostics template <int __v> struct integral_constant { @@ -12,10 +13,24 @@ struct V { template <typename TArg0 = int, typename = typename decay<TArg0>::type> V(); }; + +constexpr double h_chebyshev_coefs[] = { + 1.0000020784639703, 0.0021491446496202074}; + +void test(double *d_value) +{ +#pragma omp target map(tofrom \ + : d_value [0:1]) map(always, to \ + : h_chebyshev_coefs [0:2]) + *d_value = h_chebyshev_coefs[1]; return; +} + +// CHECK: void @__omp_offloading_{{.+}}test{{.+}}(double* %0) + int main() { #pragma omp target V v; return 0; } -// CHECK: call void @__omp_offloading_{{.+}}_main_l16() +// CHECK: call void @__omp_offloading_{{.+}}_main_{{.+}}() Index: clang/lib/Sema/SemaOpenMP.cpp =================================================================== --- clang/lib/Sema/SemaOpenMP.cpp +++ clang/lib/Sema/SemaOpenMP.cpp @@ -2527,6 +2527,7 @@ void Sema::EndOpenMPClause() { DSAStack->setClauseParsingMode(/*K=*/OMPC_unknown); + CleanupVarDeclMarking(); } static std::pair<ValueDecl *, bool>
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits