[clang] 5285748 - Fix assert on the variable which is used in omp clause is not marked

Jennifer Yu via cfe-commits cfe-commits at lists.llvm.org
Tue May 4 09:14:47 PDT 2021


Author: Jennifer Yu
Date: 2021-05-04T09:07:35-07:00
New Revision: 5285748c2c764c1d7fb3f882ba9f11ed79f676a1

URL: https://github.com/llvm/llvm-project/commit/5285748c2c764c1d7fb3f882ba9f11ed79f676a1
DIFF: https://github.com/llvm/llvm-project/commit/5285748c2c764c1d7fb3f882ba9f11ed79f676a1.diff

LOG: Fix assert on the variable which is used in omp clause is not marked
as used.

The problem only happens with constexpr variable, for constexpr variable,
variable is not marked during parser variable.   This is because compiler
might find some var's associate expressions may not actully an odr-used
later,  the variables get kept in MaybeODRUseExprs, in normal case, at
end of process fullExpr, the variable will be marked 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() in EndOpenMPClause
for each omp directive.

This to fix https://bugs.llvm.org/show_bug.cgi?id=50206

Differential Revision: https://reviews.llvm.org/D101781

Added: 
    

Modified: 
    clang/lib/Sema/SemaOpenMP.cpp
    clang/test/OpenMP/constexpr_capture.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 25ee46d95aa55..9ac3e48781849 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -2527,6 +2527,7 @@ void Sema::StartOpenMPClause(OpenMPClauseKind K) {
 
 void Sema::EndOpenMPClause() {
   DSAStack->setClauseParsingMode(/*K=*/OMPC_unknown);
+  CleanupVarDeclMarking();
 }
 
 static std::pair<ValueDecl *, bool>

diff  --git a/clang/test/OpenMP/constexpr_capture.cpp b/clang/test/OpenMP/constexpr_capture.cpp
index 9577f6e0c0fe2..ba404d7fdafd0 100644
--- a/clang/test/OpenMP/constexpr_capture.cpp
+++ b/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 decay {
 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_{{.+}}()


        


More information about the cfe-commits mailing list