yaxunl created this revision.
yaxunl added reviewers: tra, rjmccall.
Herald added a subscriber: guansong.
Herald added a reviewer: jdoerfert.
Herald added a project: clang.

CUDA/HIP program may be compiled with -fopenmp. In this case, -fopenmp is only 
passed to host compilation
to take advantages of multi-threads computation.

CUDA/HIP and OpenMP both use Sema::DeviceCallGraph to store functions to be 
analyzed and remove them
once they decide the function is sure to be emitted. CUDA/HIP and OpenMP have 
different functions to determine
of a function is sure to be emitted.

This patch fixes an assertion which happens when CUDA/HIP is compiled with 
-fopenmp.


Repository:
  rC Clang

https://reviews.llvm.org/D67837

Files:
  lib/Sema/Sema.cpp
  test/SemaCUDA/openmp-static-func.cu


Index: test/SemaCUDA/openmp-static-func.cu
===================================================================
--- /dev/null
+++ test/SemaCUDA/openmp-static-func.cu
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsyntax-only \
+// RUN:            -verify -fopenmp %s
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsyntax-only \
+// RUN:            -verify -fopenmp -x hip %s
+// expected-no-diagnostics
+
+// Tests there is no assertion in Sema::markKnownEmitted when fopenmp is used
+// with CUDA/HIP host compilation.
+
+static void f() {}
+
+static void g() { f(); }
+
+static void h() { g(); }
Index: lib/Sema/Sema.cpp
===================================================================
--- lib/Sema/Sema.cpp
+++ lib/Sema/Sema.cpp
@@ -1503,7 +1503,12 @@
     const llvm::function_ref<bool(Sema &, FunctionDecl *)> IsKnownEmitted) {
   // Nothing to do if we already know that FD is emitted.
   if (IsKnownEmitted(S, OrigCallee)) {
-    assert(!S.DeviceCallGraph.count(OrigCallee));
+    // CUDA/HIP and OpenMP both put functions in DeviceCallGraph. A function
+    // not sure to be emitted by one language may be found sure to be emitted
+    // by another language. In this case, just erase it from DeviceCallGraph.
+    auto Loc = S.DeviceCallGraph.find(OrigCallee);
+    if (Loc != S.DeviceCallGraph.end())
+      S.DeviceCallGraph.erase(Loc);
     return;
   }
 


Index: test/SemaCUDA/openmp-static-func.cu
===================================================================
--- /dev/null
+++ test/SemaCUDA/openmp-static-func.cu
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsyntax-only \
+// RUN:            -verify -fopenmp %s
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsyntax-only \
+// RUN:            -verify -fopenmp -x hip %s
+// expected-no-diagnostics
+
+// Tests there is no assertion in Sema::markKnownEmitted when fopenmp is used
+// with CUDA/HIP host compilation.
+
+static void f() {}
+
+static void g() { f(); }
+
+static void h() { g(); }
Index: lib/Sema/Sema.cpp
===================================================================
--- lib/Sema/Sema.cpp
+++ lib/Sema/Sema.cpp
@@ -1503,7 +1503,12 @@
     const llvm::function_ref<bool(Sema &, FunctionDecl *)> IsKnownEmitted) {
   // Nothing to do if we already know that FD is emitted.
   if (IsKnownEmitted(S, OrigCallee)) {
-    assert(!S.DeviceCallGraph.count(OrigCallee));
+    // CUDA/HIP and OpenMP both put functions in DeviceCallGraph. A function
+    // not sure to be emitted by one language may be found sure to be emitted
+    // by another language. In this case, just erase it from DeviceCallGraph.
+    auto Loc = S.DeviceCallGraph.find(OrigCallee);
+    if (Loc != S.DeviceCallGraph.end())
+      S.DeviceCallGraph.erase(Loc);
     return;
   }
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to