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

Reply via email to