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

Eric Christopher via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Jan 19 21:10:17 PST 2021


+Tres Popp <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> wrote:

>
> Author: Shilei Tian
> Date: 2021-01-19T14:18:42-05:00
> New Revision: 82e537a9d28a2c18bd1637e2eac0e0af658ed829
>
> URL:
> 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
>
> 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 = !{!0}
> +// CHECK: !0 = !{i32 1, !"[[G]]", i32 0, i32 0}
>
>
>
> _______________________________________________
> llvm-branch-commits mailing list
> llvm-branch-commits at lists.llvm.org
> 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/27b5f042/attachment.html>


More information about the llvm-branch-commits mailing list