[PATCH] D94871: [Clang][OpenMP] Fixed an issue that clang crashed when compiling OpenMP program in device only mode without host IR
Shilei Tian via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sat Jan 16 19:00:07 PST 2021
tianshilei1992 created this revision.
tianshilei1992 added reviewers: jdoerfert, ABataev, grokos.
Herald added subscribers: guansong, yaxunl.
tianshilei1992 requested review of this revision.
Herald added subscribers: cfe-commits, sstefan1.
Herald added a project: clang.
D94745 <https://reviews.llvm.org/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.
In this patch, we updated the logic that if a declaration is in `declare target`,
and it is not in the map, we will first initialize it.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D94871
Files:
clang/lib/CodeGen/CGOpenMPRuntime.cpp
clang/lib/CodeGen/CGOpenMPRuntime.h
Index: clang/lib/CodeGen/CGOpenMPRuntime.h
===================================================================
--- clang/lib/CodeGen/CGOpenMPRuntime.h
+++ clang/lib/CodeGen/CGOpenMPRuntime.h
@@ -674,7 +674,8 @@
registerDeviceGlobalVarEntryInfo(StringRef VarName, llvm::Constant *Addr,
CharUnits VarSize,
OMPTargetGlobalVarEntryKind Flags,
- llvm::GlobalValue::LinkageTypes Linkage);
+ llvm::GlobalValue::LinkageTypes Linkage,
+ bool IsDeclareTargetDeclaration = false);
/// Checks if the variable with the given name has been registered already.
bool hasDeviceGlobalVarEntryInfo(StringRef VarName) const {
return OffloadEntriesDeviceGlobalVar.count(VarName) > 0;
Index: clang/lib/CodeGen/CGOpenMPRuntime.cpp
===================================================================
--- clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -3015,8 +3015,13 @@
registerDeviceGlobalVarEntryInfo(StringRef VarName, llvm::Constant *Addr,
CharUnits VarSize,
OMPTargetGlobalVarEntryKind Flags,
- llvm::GlobalValue::LinkageTypes Linkage) {
+ llvm::GlobalValue::LinkageTypes Linkage,
+ bool IsDeclareTargetDeclaration) {
if (CGM.getLangOpts().OpenMPIsDevice) {
+ // A global variable might be not in the map if it is declared in declare
+ // target and device compilation is invoked without host IR.
+ if (IsDeclareTargetDeclaration && !hasDeviceGlobalVarEntryInfo(VarName))
+ initializeDeviceGlobalVarEntryInfo(VarName, Flags, OffloadingEntriesNum);
auto &Entry = OffloadEntriesDeviceGlobalVar[VarName];
assert(Entry.isValid() && Entry.getFlags() == Flags &&
"Entry not initialized!");
@@ -10514,7 +10519,7 @@
}
OffloadEntriesInfoManager.registerDeviceGlobalVarEntryInfo(
- VarName, Addr, VarSize, Flags, Linkage);
+ VarName, Addr, VarSize, Flags, Linkage, static_cast<bool>(Res));
}
bool CGOpenMPRuntime::emitTargetGlobal(GlobalDecl GD) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D94871.317204.patch
Type: text/x-patch
Size: 2312 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210117/1c4db17d/attachment.bin>
More information about the cfe-commits
mailing list