[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