raghavendhra created this revision.
Herald added subscribers: sunshaoce, guansong, hiraditya, yaxunl.
Herald added a project: All.
raghavendhra requested review of this revision.
Herald added a reviewer: jdoerfert.
Herald added subscribers: llvm-commits, cfe-commits, jplehr, sstefan1.
Herald added projects: clang, LLVM.
Move setPropertyExecutionMode() from Clang to OpenMPIRBuilder and change the
references in Clang to use the function from OMPIRBuilder.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D155794
Files:
clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
clang/lib/CodeGen/CodeGenModule.h
llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
Index: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
===================================================================
--- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -4900,6 +4900,22 @@
emitBlock(ContBlock, CurFn, /*IsFinished=*/true);
}
+void OpenMPIRBuilder::setPropertyExecutionMode(
+ StringRef Name, bool Mode,
+ std::vector<llvm::WeakTrackingVH> *LLVMCompilerUsed) {
+ auto *GVMode = new llvm::GlobalVariable(
+ M, llvm::Type::getInt8Ty(M.getContext()), /*isConstant=*/true,
+ llvm::GlobalValue::WeakAnyLinkage,
+ llvm::ConstantInt::get(llvm::Type::getInt8Ty(M.getContext()),
+ Mode ? OMP_TGT_EXEC_MODE_SPMD
+ : OMP_TGT_EXEC_MODE_GENERIC),
+ Twine(Name, "_exec_mode"));
+ GVMode->setVisibility(llvm::GlobalVariable::ProtectedVisibility);
+ assert(!GVMode->isDeclaration() &&
+ "Only globals with definition can force usage.");
+ LLVMCompilerUsed->emplace_back(GVMode);
+}
+
bool OpenMPIRBuilder::checkAndEmitFlushAfterAtomic(
const LocationDescription &Loc, llvm::AtomicOrdering AO, AtomicKind AK) {
assert(!(AO == AtomicOrdering::NotAtomic ||
Index: llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
===================================================================
--- llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
+++ llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
@@ -1493,6 +1493,19 @@
void emitIfClause(Value *Cond, BodyGenCallbackTy ThenGen,
BodyGenCallbackTy ElseGen, InsertPointTy AllocaIP = {});
+ /// Create a unique global variable to indicate the execution mode of this
+ /// target region. The execution mode is either 'generic', or 'spmd' depending
+ /// on the target directive. This variable is picked up by the offload library
+ /// to setup the device appropriately before kernel launch. If the execution
+ /// mode is 'generic', the runtime reserves one warp for the master,
+ /// otherwise, all warps participate in parallel work. \param Name The symbol
+ /// name associated with the global. \param Mode Mode to indicate if the
+ /// kernel is an SPMD kernel or not. \param LLVMCompilerUsed List of global
+ /// values which are required to be present in the object file.
+ void
+ setPropertyExecutionMode(StringRef Name, bool Mode,
+ std::vector<llvm::WeakTrackingVH> *LLVMCompilerUsed);
+
/// Create the global variable holding the offload mappings information.
GlobalVariable *createOffloadMaptypes(SmallVectorImpl<uint64_t> &Mappings,
std::string VarName);
Index: clang/lib/CodeGen/CodeGenModule.h
===================================================================
--- clang/lib/CodeGen/CodeGenModule.h
+++ clang/lib/CodeGen/CodeGenModule.h
@@ -1005,6 +1005,10 @@
return EmittedGlobalBlocks.lookup(BE);
}
+ std::vector<llvm::WeakTrackingVH> *getLLVMCompilerUsed() {
+ return &LLVMCompilerUsed;
+ }
+
/// Notes that BE's global block is available via Addr. Asserts that BE
/// isn't already emitted.
void setAddrOfGlobalBlock(const BlockExpr *BE, llvm::Constant *Addr);
Index: clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
===================================================================
--- clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
+++ clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
@@ -833,24 +833,6 @@
IsInTTDRegion = false;
}
-// Create a unique global variable to indicate the execution mode of this target
-// region. The execution mode is either 'generic', or 'spmd' depending on the
-// target directive. This variable is picked up by the offload library to setup
-// the device appropriately before kernel launch. If the execution mode is
-// 'generic', the runtime reserves one warp for the master, otherwise, all
-// warps participate in parallel work.
-static void setPropertyExecutionMode(CodeGenModule &CGM, StringRef Name,
- bool Mode) {
- auto *GVMode = new llvm::GlobalVariable(
- CGM.getModule(), CGM.Int8Ty, /*isConstant=*/true,
- llvm::GlobalValue::WeakAnyLinkage,
- llvm::ConstantInt::get(CGM.Int8Ty, Mode ? OMP_TGT_EXEC_MODE_SPMD
- : OMP_TGT_EXEC_MODE_GENERIC),
- Twine(Name, "_exec_mode"));
- GVMode->setVisibility(llvm::GlobalVariable::ProtectedVisibility);
- CGM.addCompilerUsedGlobal(GVMode);
-}
-
void CGOpenMPRuntimeGPU::emitTargetOutlinedFunction(
const OMPExecutableDirective &D, StringRef ParentName,
llvm::Function *&OutlinedFn, llvm::Constant *&OutlinedFnID,
@@ -868,7 +850,9 @@
emitNonSPMDKernel(D, ParentName, OutlinedFn, OutlinedFnID, IsOffloadEntry,
CodeGen);
- setPropertyExecutionMode(CGM, OutlinedFn->getName(), Mode);
+ llvm::OpenMPIRBuilder &OMPBuilder = getOMPBuilder();
+ OMPBuilder.setPropertyExecutionMode(OutlinedFn->getName(), Mode,
+ CGM.getLLVMCompilerUsed());
}
CGOpenMPRuntimeGPU::CGOpenMPRuntimeGPU(CodeGenModule &CGM)
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits