[llvm-branch-commits] [clang] 82e537a - [Clang][OpenMP] Fixed an issue that clang crashed when compiling OpenMP program in device only mode without host IR

Shilei Tian via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Wed Jan 20 10:01:16 PST 2021


Hi Eric,

Sure, will update it soon.

Regards,
Shilei

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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-branch-commits/attachments/20210120/541aeb6c/attachment-0001.html>


More information about the llvm-branch-commits mailing list