<div dir="ltr"><a class="gmail_plusreply" id="plusReplyChip-1" href="mailto:tpopp@google.com" tabindex="-1">+Tres Popp</a> (FYI)<div><br></div><div>Hi Shilei,</div><div><br></div><div>The other openmp targets tests are all _cc1 tests. I don't think there's a reason for these to not also be cc1, would you mind updating this?</div><div><br></div><div>Thanks!</div><div><br></div><div>-eric</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jan 19, 2021 at 2:22 PM Shilei Tian via llvm-branch-commits <<a href="mailto:llvm-branch-commits@lists.llvm.org">llvm-branch-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Shilei Tian<br>
Date: 2021-01-19T14:18:42-05:00<br>
New Revision: 82e537a9d28a2c18bd1637e2eac0e0af658ed829<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/82e537a9d28a2c18bd1637e2eac0e0af658ed829" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/82e537a9d28a2c18bd1637e2eac0e0af658ed829</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/82e537a9d28a2c18bd1637e2eac0e0af658ed829.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/82e537a9d28a2c18bd1637e2eac0e0af658ed829.diff</a><br>
<br>
LOG: [Clang][OpenMP] Fixed an issue that clang crashed when compiling OpenMP program in device only mode without host IR<br>
<br>
D94745 rewrites the `deviceRTLs` using OpenMP and compiles it by directly<br>
calling the device compilation. `clang` crashes because entry in<br>
`OffloadEntriesDeviceGlobalVar` is unintialized. Current design supposes the<br>
device compilation can only be invoked after host compilation with the host IR<br>
such that `clang` can initialize `OffloadEntriesDeviceGlobalVar` from host IR.<br>
This avoids us using device compilation directly, especially when we only have<br>
code wrapped into `declare target` which are all device code. The same issue<br>
also exists for `OffloadEntriesInfoManager`.<br>
<br>
In this patch, we simply initialized an entry if it is not in the maps. Not sure<br>
we need an option to tell the device compiler that it is invoked standalone.<br>
<br>
Reviewed By: jdoerfert<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D94871" rel="noreferrer" target="_blank">https://reviews.llvm.org/D94871</a><br>
<br>
Added: <br>
    clang/test/OpenMP/declare_target_device_only_compilation.cpp<br>
<br>
Modified: <br>
    clang/lib/CodeGen/CGOpenMPRuntime.cpp<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp<br>
index a3b24039365b..17fa56fb06c8 100644<br>
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp<br>
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp<br>
@@ -2941,16 +2941,12 @@ void CGOpenMPRuntime::OffloadEntriesInfoManagerTy::<br>
   // If we are emitting code for a target, the entry is already initialized,<br>
   // only has to be registered.<br>
   if (CGM.getLangOpts().OpenMPIsDevice) {<br>
-    if (!hasTargetRegionEntryInfo(DeviceID, FileID, ParentName, LineNum)) {<br>
-      unsigned DiagID = CGM.getDiags().getCustomDiagID(<br>
-          DiagnosticsEngine::Error,<br>
-          "Unable to find target region on line '%0' in the device code.");<br>
-      CGM.getDiags().Report(DiagID) << LineNum;<br>
-      return;<br>
-    }<br>
+    // This could happen if the device compilation is invoked standalone.<br>
+    if (!hasTargetRegionEntryInfo(DeviceID, FileID, ParentName, LineNum))<br>
+      initializeTargetRegionEntryInfo(DeviceID, FileID, ParentName, LineNum,<br>
+                                      OffloadingEntriesNum);<br>
     auto &Entry =<br>
         OffloadEntriesTargetRegion[DeviceID][FileID][ParentName][LineNum];<br>
-    assert(Entry.isValid() && "Entry not initialized!");<br>
     Entry.setAddress(Addr);<br>
     Entry.setID(ID);<br>
     Entry.setFlags(Flags);<br>
@@ -3017,9 +3013,10 @@ void CGOpenMPRuntime::OffloadEntriesInfoManagerTy::<br>
                                      OMPTargetGlobalVarEntryKind Flags,<br>
                                      llvm::GlobalValue::LinkageTypes Linkage) {<br>
   if (CGM.getLangOpts().OpenMPIsDevice) {<br>
+    // This could happen if the device compilation is invoked standalone.<br>
+    if (!hasDeviceGlobalVarEntryInfo(VarName))<br>
+      initializeDeviceGlobalVarEntryInfo(VarName, Flags, OffloadingEntriesNum);<br>
     auto &Entry = OffloadEntriesDeviceGlobalVar[VarName];<br>
-    assert(Entry.isValid() && Entry.getFlags() == Flags &&<br>
-           "Entry not initialized!");<br>
     assert((!Entry.getAddress() || Entry.getAddress() == Addr) &&<br>
            "Resetting with the new address.");<br>
     if (Entry.getAddress() && hasDeviceGlobalVarEntryInfo(VarName)) {<br>
<br>
diff  --git a/clang/test/OpenMP/declare_target_device_only_compilation.cpp b/clang/test/OpenMP/declare_target_device_only_compilation.cpp<br>
new file mode 100644<br>
index 000000000000..280959540306<br>
--- /dev/null<br>
+++ b/clang/test/OpenMP/declare_target_device_only_compilation.cpp<br>
@@ -0,0 +1,15 @@<br>
+//==========================================================================///<br>
+// RUN: %clang -S -target powerpc64le-ibm-linux-gnu -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s<br>
+// RUN: %clang -S -target i386-pc-linux-gnu -fopenmp -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s<br>
+// RUN: %clang -S -target x86_64-unknown-linux-gnu -fopenmp -fopenmp-targets=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck %s<br>
+// expected-no-diagnostics<br>
+<br>
+#pragma omp declare target<br>
+#pragma omp begin declare variant match(device={kind(nohost)})<br>
+int G1;<br>
+#pragma omp end declare variant<br>
+#pragma omp end declare target<br>
+<br>
+// CHECK: @[[G:.+]] = hidden {{.*}}global i32 0, align 4<br>
+// CHECK: !<a href="http://omp_offload.info" rel="noreferrer" target="_blank">omp_offload.info</a> = !{!0}<br>
+// CHECK: !0 = !{i32 1, !"[[G]]", i32 0, i32 0}<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-branch-commits mailing list<br>
<a href="mailto:llvm-branch-commits@lists.llvm.org" target="_blank">llvm-branch-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits</a><br>
</blockquote></div>