[PATCH] D67837: [CUDA][HIP] Fix assertion in Sema::markKnownEmitted with -fopenmp

Yaxun Liu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Sep 20 12:59:38 PDT 2019


yaxunl updated this revision to Diff 221097.
yaxunl added a comment.

reuse the call tree.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D67837/new/

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,8 +1503,13 @@
     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));
-    return;
+    // 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 that case, we will iterate the call graph and
+    // mark all the callees. Otherwise, do nothing.
+    auto Loc = S.DeviceCallGraph.find(OrigCallee);
+    if (Loc == S.DeviceCallGraph.end())
+      return;
   }
 
   // We've just discovered that OrigCallee is known-emitted.  Walk our call
@@ -1520,8 +1525,6 @@
   Seen.insert(OrigCallee);
   while (!Worklist.empty()) {
     CallInfo C = Worklist.pop_back_val();
-    assert(!IsKnownEmitted(S, C.Callee) &&
-           "Worklist should not contain known-emitted functions.");
     S.DeviceKnownEmittedFns[C.Callee] = {C.Caller, C.Loc};
     emitDeferredDiags(S, C.Callee, C.Caller);
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D67837.221097.patch
Type: text/x-patch
Size: 1857 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190920/204583d7/attachment-0001.bin>


More information about the cfe-commits mailing list