-
Notifications
You must be signed in to change notification settings - Fork 15.4k
[OpenMP][OMPIRBuilder] Use runtime CC for runtime calls #168608
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Signed-off-by: Nick Sarnie <[email protected]>
|
@llvm/pr-subscribers-clang-codegen @llvm/pr-subscribers-mlir-llvm Author: Nick Sarnie (sarnex) ChangesSome targets have a specific calling convention that should be used for generated calls to runtime functions. Pass that down and use it. Patch is 42.09 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/168608.diff 7 Files Affected:
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index 1224fa681cdc0..a8255ac74cfcf 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -1039,6 +1039,7 @@ CGOpenMPRuntime::CGOpenMPRuntime(CodeGenModule &CGM)
hasRequiresUnifiedSharedMemory(), /*HasRequiresDynamicAllocators*/ false);
Config.setDefaultTargetAS(
CGM.getContext().getTargetInfo().getTargetAddressSpace(LangAS::Default));
+ Config.setRuntimeCC(CGM.getRuntimeCC());
OMPBuilder.setConfig(Config);
OMPBuilder.initialize();
diff --git a/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp b/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
index fddeba98adccc..2f69a53787f0c 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
@@ -871,6 +871,8 @@ CGOpenMPRuntimeGPU::CGOpenMPRuntimeGPU(CodeGenModule &CGM)
hasRequiresUnifiedSharedMemory(), /*HasRequiresDynamicAllocators*/ false);
Config.setDefaultTargetAS(
CGM.getContext().getTargetInfo().getTargetAddressSpace(LangAS::Default));
+ Config.setRuntimeCC(CGM.getRuntimeCC());
+
OMPBuilder.setConfig(Config);
if (!CGM.getLangOpts().OpenMPIsTargetDevice)
diff --git a/clang/test/OpenMP/spirv_target_codegen_basic.cpp b/clang/test/OpenMP/spirv_target_codegen_basic.cpp
index 6e029fb93644d..ad0e110c0532a 100644
--- a/clang/test/OpenMP/spirv_target_codegen_basic.cpp
+++ b/clang/test/OpenMP/spirv_target_codegen_basic.cpp
@@ -9,9 +9,10 @@
// CHECK: @"_gomp_critical_user_$var" = common addrspace(1) global [8 x i32] zeroinitializer, align 8
// CHECK: define weak_odr protected spir_kernel void @__omp_offloading_{{.*}}
-
+// CHECK: call spir_func addrspace(9) i32 @__kmpc_target_init(
// CHECK: call spir_func addrspace(9) void @__kmpc_critical(ptr addrspace(4) addrspacecast (ptr addrspace(1) @{{.*}} to ptr addrspace(4)), i32 %{{.*}}, ptr addrspace(4) addrspacecast (ptr addrspace(1) @"_gomp_critical_user_$var" to ptr addrspace(4)))
// CHECK: call spir_func addrspace(9) void @__kmpc_end_critical(ptr addrspace(4) addrspacecast (ptr addrspace(1) @{{.*}} to ptr addrspace(4)), i32 %{{.*}}, ptr addrspace(4) addrspacecast (ptr addrspace(1) @"_gomp_critical_user_$var" to ptr addrspace(4)))
+// CHECK: call spir_func addrspace(9) void @__kmpc_target_deinit(
int main() {
int ret = 0;
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
index 9f77c24d0b27b..f864a895a1259 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
+++ b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
@@ -17,6 +17,7 @@
#include "llvm/Frontend/Atomic/Atomic.h"
#include "llvm/Frontend/OpenMP/OMPConstants.h"
#include "llvm/Frontend/OpenMP/OMPGridValues.h"
+#include "llvm/IR/CallingConv.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Module.h"
@@ -138,6 +139,8 @@ class OpenMPIRBuilderConfig {
// Default address space for the target.
unsigned DefaultTargetAS = 0;
+ CallingConv::ID RuntimeCC = llvm::CallingConv::C;
+
LLVM_ABI OpenMPIRBuilderConfig();
LLVM_ABI OpenMPIRBuilderConfig(bool IsTargetDevice, bool IsGPU,
bool OpenMPOffloadMandatory,
@@ -170,6 +173,8 @@ class OpenMPIRBuilderConfig {
unsigned getDefaultTargetAS() const { return DefaultTargetAS; }
+ CallingConv::ID getRuntimeCC() const { return RuntimeCC; }
+
bool hasRequiresFlags() const { return RequiresFlags; }
LLVM_ABI bool hasRequiresReverseOffload() const;
LLVM_ABI bool hasRequiresUnifiedAddress() const;
@@ -208,6 +213,7 @@ class OpenMPIRBuilderConfig {
void setSeparator(StringRef S) { Separator = S; }
void setGridValue(omp::GV G) { GridValue = G; }
void setDefaultTargetAS(unsigned AS) { DefaultTargetAS = AS; }
+ void setRuntimeCC(CallingConv::ID CC) { RuntimeCC = CC; }
LLVM_ABI void setHasRequiresReverseOffload(bool Value);
LLVM_ABI void setHasRequiresUnifiedAddress(bool Value);
@@ -2132,6 +2138,10 @@ class OpenMPIRBuilder {
LLVM_ABI Function *getOrCreateRuntimeFunctionPtr(omp::RuntimeFunction FnID);
+ CallInst *createRuntimeFunctionCall(FunctionCallee Callee,
+ ArrayRef<Value *> Args,
+ StringRef Name = "");
+
/// Return the (LLVM-IR) string describing the source location \p LocStr.
LLVM_ABI Constant *getOrCreateSrcLocStr(StringRef LocStr,
uint32_t &SrcLocStrSize);
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index ac86fa859967e..5101717526263 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -643,7 +643,7 @@ OpenMPIRBuilder::getOrCreateRuntimeFunction(Module &M, RuntimeFunction FnID) {
break;
#include "llvm/Frontend/OpenMP/OMPKinds.def"
}
-
+ Fn->setCallingConv(Config.getRuntimeCC());
// Add information if the runtime function takes a callback function
if (FnID == OMPRTL___kmpc_fork_call || FnID == OMPRTL___kmpc_fork_teams) {
if (!Fn->hasMetadata(LLVMContext::MD_callback)) {
@@ -682,6 +682,14 @@ Function *OpenMPIRBuilder::getOrCreateRuntimeFunctionPtr(RuntimeFunction FnID) {
return Fn;
}
+CallInst *OpenMPIRBuilder::createRuntimeFunctionCall(FunctionCallee Callee,
+ ArrayRef<Value *> Args,
+ StringRef Name) {
+ CallInst *Call = Builder.CreateCall(Callee, Args, Name);
+ Call->setCallingConv(Config.getRuntimeCC());
+ return Call;
+}
+
void OpenMPIRBuilder::initialize() { initializeTypes(M); }
static void raiseUserConstantDataAllocasToEntryBlock(IRBuilderBase &Builder,
@@ -1024,7 +1032,7 @@ Constant *OpenMPIRBuilder::getOrCreateSrcLocStr(const LocationDescription &Loc,
}
Value *OpenMPIRBuilder::getOrCreateThreadID(Value *Ident) {
- return Builder.CreateCall(
+ return createRuntimeFunctionCall(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_global_thread_num), Ident,
"omp_global_thread_num");
}
@@ -1069,11 +1077,11 @@ OpenMPIRBuilder::createBarrier(const LocationDescription &Loc, Directive Kind,
bool UseCancelBarrier =
!ForceSimpleCall && isLastFinalizationInfoCancellable(OMPD_parallel);
- Value *Result =
- Builder.CreateCall(getOrCreateRuntimeFunctionPtr(
- UseCancelBarrier ? OMPRTL___kmpc_cancel_barrier
- : OMPRTL___kmpc_barrier),
- Args);
+ Value *Result = createRuntimeFunctionCall(
+ getOrCreateRuntimeFunctionPtr(UseCancelBarrier
+ ? OMPRTL___kmpc_cancel_barrier
+ : OMPRTL___kmpc_barrier),
+ Args);
if (UseCancelBarrier && CheckCancelFlag)
if (Error Err = emitCancelationCheckImpl(Result, OMPD_parallel))
@@ -1112,7 +1120,7 @@ OpenMPIRBuilder::createCancel(const LocationDescription &Loc,
Constant *SrcLocStr = getOrCreateSrcLocStr(Loc, SrcLocStrSize);
Value *Ident = getOrCreateIdent(SrcLocStr, SrcLocStrSize);
Value *Args[] = {Ident, getOrCreateThreadID(Ident), CancelKind};
- Value *Result = Builder.CreateCall(
+ Value *Result = createRuntimeFunctionCall(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_cancel), Args);
auto ExitCB = [this, CanceledDirective, Loc](InsertPointTy IP) -> Error {
if (CanceledDirective == OMPD_parallel) {
@@ -1163,7 +1171,7 @@ OpenMPIRBuilder::createCancellationPoint(const LocationDescription &Loc,
Constant *SrcLocStr = getOrCreateSrcLocStr(Loc, SrcLocStrSize);
Value *Ident = getOrCreateIdent(SrcLocStr, SrcLocStrSize);
Value *Args[] = {Ident, getOrCreateThreadID(Ident), CancelKind};
- Value *Result = Builder.CreateCall(
+ Value *Result = createRuntimeFunctionCall(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_cancellationpoint), Args);
auto ExitCB = [this, CanceledDirective, Loc](InsertPointTy IP) -> Error {
if (CanceledDirective == OMPD_parallel) {
@@ -1212,7 +1220,7 @@ OpenMPIRBuilder::InsertPointTy OpenMPIRBuilder::emitTargetKernel(
SmallVector<Value *> OffloadingArgs{Ident, DeviceID, NumTeams,
NumThreads, HostPtr, KernelArgsPtr};
- Return = Builder.CreateCall(
+ Return = createRuntimeFunctionCall(
getOrCreateRuntimeFunction(M, OMPRTL___tgt_target_kernel),
OffloadingArgs);
@@ -1392,7 +1400,7 @@ static void targetParallelCallback(
FunctionCallee RTLFn =
OMPIRBuilder->getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_parallel_51);
- Builder.CreateCall(RTLFn, Parallel51CallArgs);
+ OMPIRBuilder->createRuntimeFunctionCall(RTLFn, Parallel51CallArgs);
LLVM_DEBUG(dbgs() << "With kmpc_parallel_51 placed: "
<< *Builder.GetInsertBlock()->getParent() << "\n");
@@ -1477,7 +1485,7 @@ hostParallelCallback(OpenMPIRBuilder *OMPIRBuilder, Function &OutlinedFn,
RealArgs.push_back(NullPtrValue);
}
- Builder.CreateCall(RTLFn, RealArgs);
+ OMPIRBuilder->createRuntimeFunctionCall(RTLFn, RealArgs);
LLVM_DEBUG(dbgs() << "With fork_call placed: "
<< *Builder.GetInsertBlock()->getParent() << "\n");
@@ -1523,7 +1531,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createParallel(
Value *Args[] = {
Ident, ThreadID,
Builder.CreateIntCast(NumThreads, Int32, /*isSigned*/ false)};
- Builder.CreateCall(
+ createRuntimeFunctionCall(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_push_num_threads), Args);
}
@@ -1532,7 +1540,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createParallel(
Value *Args[] = {
Ident, ThreadID,
ConstantInt::get(Int32, unsigned(ProcBind), /*isSigned=*/true)};
- Builder.CreateCall(
+ createRuntimeFunctionCall(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_push_proc_bind), Args);
}
@@ -1824,7 +1832,8 @@ void OpenMPIRBuilder::emitFlush(const LocationDescription &Loc) {
Constant *SrcLocStr = getOrCreateSrcLocStr(Loc, SrcLocStrSize);
Value *Args[] = {getOrCreateIdent(SrcLocStr, SrcLocStrSize)};
- Builder.CreateCall(getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_flush), Args);
+ createRuntimeFunctionCall(getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_flush),
+ Args);
}
void OpenMPIRBuilder::createFlush(const LocationDescription &Loc) {
@@ -1842,8 +1851,8 @@ void OpenMPIRBuilder::emitTaskwaitImpl(const LocationDescription &Loc) {
Value *Args[] = {Ident, getOrCreateThreadID(Ident)};
// Ignore return result until untied tasks are supported.
- Builder.CreateCall(getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_taskwait),
- Args);
+ createRuntimeFunctionCall(
+ getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_taskwait), Args);
}
void OpenMPIRBuilder::createTaskwait(const LocationDescription &Loc) {
@@ -1860,8 +1869,8 @@ void OpenMPIRBuilder::emitTaskyieldImpl(const LocationDescription &Loc) {
Constant *I32Null = ConstantInt::getNullValue(Int32);
Value *Args[] = {Ident, getOrCreateThreadID(Ident), I32Null};
- Builder.CreateCall(getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_taskyield),
- Args);
+ createRuntimeFunctionCall(
+ getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_taskyield), Args);
}
void OpenMPIRBuilder::createTaskyield(const LocationDescription &Loc) {
@@ -2059,7 +2068,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTask(
// Emit the @__kmpc_omp_task_alloc runtime call
// The runtime call returns a pointer to an area where the task captured
// variables must be copied before the task is run (TaskData)
- CallInst *TaskData = Builder.CreateCall(
+ CallInst *TaskData = createRuntimeFunctionCall(
TaskAllocFn, {/*loc_ref=*/Ident, /*gtid=*/ThreadID, /*flags=*/Flags,
/*sizeof_task=*/TaskSize, /*sizeof_shared=*/SharedsSize,
/*task_func=*/&OutlinedFn});
@@ -2071,7 +2080,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTask(
Function *TaskDetachFn = getOrCreateRuntimeFunctionPtr(
OMPRTL___kmpc_task_allow_completion_event);
llvm::Value *EventVal =
- Builder.CreateCall(TaskDetachFn, {Ident, ThreadID, TaskData});
+ createRuntimeFunctionCall(TaskDetachFn, {Ident, ThreadID, TaskData});
llvm::Value *EventHandleAddr =
Builder.CreatePointerBitCastOrAddrSpaceCast(EventHandle,
Builder.getPtrTy(0));
@@ -2148,7 +2157,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTask(
if (Dependencies.size()) {
Function *TaskWaitFn =
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_wait_deps);
- Builder.CreateCall(
+ createRuntimeFunctionCall(
TaskWaitFn,
{Ident, ThreadID, Builder.getInt32(Dependencies.size()), DepArray,
ConstantInt::get(Builder.getInt32Ty(), 0),
@@ -2158,21 +2167,21 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTask(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_task_begin_if0);
Function *TaskCompleteFn =
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_task_complete_if0);
- Builder.CreateCall(TaskBeginFn, {Ident, ThreadID, TaskData});
+ createRuntimeFunctionCall(TaskBeginFn, {Ident, ThreadID, TaskData});
CallInst *CI = nullptr;
if (HasShareds)
- CI = Builder.CreateCall(&OutlinedFn, {ThreadID, TaskData});
+ CI = createRuntimeFunctionCall(&OutlinedFn, {ThreadID, TaskData});
else
- CI = Builder.CreateCall(&OutlinedFn, {ThreadID});
+ CI = createRuntimeFunctionCall(&OutlinedFn, {ThreadID});
CI->setDebugLoc(StaleCI->getDebugLoc());
- Builder.CreateCall(TaskCompleteFn, {Ident, ThreadID, TaskData});
+ createRuntimeFunctionCall(TaskCompleteFn, {Ident, ThreadID, TaskData});
Builder.SetInsertPoint(ThenTI);
}
if (Dependencies.size()) {
Function *TaskFn =
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_task_with_deps);
- Builder.CreateCall(
+ createRuntimeFunctionCall(
TaskFn,
{Ident, ThreadID, TaskData, Builder.getInt32(Dependencies.size()),
DepArray, ConstantInt::get(Builder.getInt32Ty(), 0),
@@ -2181,7 +2190,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTask(
} else {
// Emit the @__kmpc_omp_task runtime call to spawn the task
Function *TaskFn = getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_task);
- Builder.CreateCall(TaskFn, {Ident, ThreadID, TaskData});
+ createRuntimeFunctionCall(TaskFn, {Ident, ThreadID, TaskData});
}
StaleCI->eraseFromParent();
@@ -2218,7 +2227,7 @@ OpenMPIRBuilder::createTaskgroup(const LocationDescription &Loc,
// Emit the @__kmpc_taskgroup runtime call to start the taskgroup
Function *TaskgroupFn =
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_taskgroup);
- Builder.CreateCall(TaskgroupFn, {Ident, ThreadID});
+ createRuntimeFunctionCall(TaskgroupFn, {Ident, ThreadID});
BasicBlock *TaskgroupExitBB = splitBB(Builder, true, "taskgroup.exit");
if (Error Err = BodyGenCB(AllocaIP, Builder.saveIP()))
@@ -2228,7 +2237,7 @@ OpenMPIRBuilder::createTaskgroup(const LocationDescription &Loc,
// Emit the @__kmpc_end_taskgroup runtime call to end the taskgroup
Function *EndTaskgroupFn =
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_end_taskgroup);
- Builder.CreateCall(EndTaskgroupFn, {Ident, ThreadID});
+ createRuntimeFunctionCall(EndTaskgroupFn, {Ident, ThreadID});
return Builder.saveIP();
}
@@ -2384,14 +2393,14 @@ static OpenMPIRBuilder::InsertPointTy getInsertPointAfterInstr(Instruction *I) {
}
Value *OpenMPIRBuilder::getGPUThreadID() {
- return Builder.CreateCall(
+ return createRuntimeFunctionCall(
getOrCreateRuntimeFunction(M,
OMPRTL___kmpc_get_hardware_thread_id_in_block),
{});
}
Value *OpenMPIRBuilder::getGPUWarpSize() {
- return Builder.CreateCall(
+ return createRuntimeFunctionCall(
getOrCreateRuntimeFunction(M, OMPRTL___kmpc_get_warp_size), {});
}
@@ -2450,7 +2459,7 @@ Value *OpenMPIRBuilder::createRuntimeShuffleFunction(InsertPointTy AllocaIP,
Value *WarpSizeCast =
Builder.CreateIntCast(WarpSize, Builder.getInt16Ty(), /*isSigned=*/true);
Value *ShuffleCall =
- Builder.CreateCall(ShuffleFunc, {ElemCast, Offset, WarpSizeCast});
+ createRuntimeFunctionCall(ShuffleFunc, {ElemCast, Offset, WarpSizeCast});
return castValueToType(AllocaIP, ShuffleCall, CastTy);
}
@@ -3016,7 +3025,7 @@ Function *OpenMPIRBuilder::emitShuffleAndReduceFunction(
ReduceList, Builder.getPtrTy());
Value *RemoteReduceListPtr = Builder.CreatePointerBitCastOrAddrSpaceCast(
RemoteListAddrCast, Builder.getPtrTy());
- Builder.CreateCall(ReduceFn, {LocalReduceListPtr, RemoteReduceListPtr})
+ createRuntimeFunctionCall(ReduceFn, {LocalReduceListPtr, RemoteReduceListPtr})
->addFnAttr(Attribute::NoUnwind);
Builder.CreateBr(MergeBB);
@@ -3237,7 +3246,7 @@ Function *OpenMPIRBuilder::emitListToGlobalReduceFunction(
// Call reduce_function(GlobalReduceList, ReduceList)
Value *ReduceList =
Builder.CreateLoad(Builder.getPtrTy(), ReduceListArgAddrCast);
- Builder.CreateCall(ReduceFn, {LocalReduceListAddrCast, ReduceList})
+ createRuntimeFunctionCall(ReduceFn, {LocalReduceListAddrCast, ReduceList})
->addFnAttr(Attribute::NoUnwind);
Builder.CreateRetVoid();
Builder.restoreIP(OldIP);
@@ -3428,7 +3437,7 @@ Function *OpenMPIRBuilder::emitGlobalToListReduceFunction(
// Call reduce_function(ReduceList, GlobalReduceList)
Value *ReduceList =
Builder.CreateLoad(Builder.getPtrTy(), ReduceListArgAddrCast);
- Builder.CreateCall(ReduceFn, {ReduceList, ReductionList})
+ createRuntimeFunctionCall(ReduceFn, {ReduceList, ReductionList})
->addFnAttr(Attribute::NoUnwind);
Builder.CreateRetVoid();
Builder.restoreIP(OldIP);
@@ -3682,7 +3691,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createReductionsGPU(
WcFuncCast};
Function *Pv2Ptr = getOrCreateRuntimeFunctionPtr(
RuntimeFunction::OMPRTL___kmpc_nvptx_parallel_reduce_nowait_v2);
- Res = Builder.CreateCall(Pv2Ptr, Args);
+ Res = createRuntimeFunctionCall(Pv2Ptr, Args);
} else {
CodeGenIP = Builder.saveIP();
StructType *ReductionsBufferTy = StructType::create(
@@ -3699,7 +3708,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createReductionsGPU(
ReductionInfos, ReductionFunc, ReductionsBufferTy, FuncAttrs);
Builder.restoreIP(CodeGenIP);
- Value *KernelTeamsReductionPtr = Builder.CreateCall(
+ Value *KernelTeamsReductionPtr = createRuntimeFunctionCall(
RedFixedBuferFn, {}, "_openmp_teams_reductions_buffer_$_$ptr");
Value *Args3[] = {SrcLocInfo,
@@ -3716,7 +3725,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createReductionsGPU(
Function *TeamsReduceFn = getOrCreateRuntimeFunctionPtr(
RuntimeFunction::OMPRTL___kmpc_nvptx_teams_reduce_nowait_v2);
- Res = Builder.CreateCall(TeamsReduceFn, Args3);
+ Res = createRuntimeFunctionCall(TeamsReduceFn, Args3);
}
// 5. Build if (res == 1)
@@ -3921,10 +3930,10 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createReductions(
IsNoWait ? RuntimeFunction::OMPRTL___kmpc_reduce_nowait
: RuntimeFunction::OMPRTL___kmpc_reduce);
CallInst *ReduceCall =
- Builder.CreateCall(ReduceFunc,
- {Ident, ThreadId, NumVariables, RedArraySize, RedArray,
- ReductionFunc, Lock},
- "reduce");
+ createRuntimeFunctionCall(ReduceFunc,
+ {Ident, ThreadId, NumVariables, RedArraySize,
+ RedArray, ReductionFunc, Lock},
+ "reduce");
// Create final reduction entry blocks for the atomic and non-atomic case.
// Emit IR that dispatches control flow to one of the blocks based on the
@@ -3971,7 +3980,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenM...
[truncated]
|
|
@llvm/pr-subscribers-mlir Author: Nick Sarnie (sarnex) ChangesSome targets have a specific calling convention that should be used for generated calls to runtime functions. Pass that down and use it. Patch is 42.09 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/168608.diff 7 Files Affected:
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index 1224fa681cdc0..a8255ac74cfcf 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -1039,6 +1039,7 @@ CGOpenMPRuntime::CGOpenMPRuntime(CodeGenModule &CGM)
hasRequiresUnifiedSharedMemory(), /*HasRequiresDynamicAllocators*/ false);
Config.setDefaultTargetAS(
CGM.getContext().getTargetInfo().getTargetAddressSpace(LangAS::Default));
+ Config.setRuntimeCC(CGM.getRuntimeCC());
OMPBuilder.setConfig(Config);
OMPBuilder.initialize();
diff --git a/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp b/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
index fddeba98adccc..2f69a53787f0c 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
@@ -871,6 +871,8 @@ CGOpenMPRuntimeGPU::CGOpenMPRuntimeGPU(CodeGenModule &CGM)
hasRequiresUnifiedSharedMemory(), /*HasRequiresDynamicAllocators*/ false);
Config.setDefaultTargetAS(
CGM.getContext().getTargetInfo().getTargetAddressSpace(LangAS::Default));
+ Config.setRuntimeCC(CGM.getRuntimeCC());
+
OMPBuilder.setConfig(Config);
if (!CGM.getLangOpts().OpenMPIsTargetDevice)
diff --git a/clang/test/OpenMP/spirv_target_codegen_basic.cpp b/clang/test/OpenMP/spirv_target_codegen_basic.cpp
index 6e029fb93644d..ad0e110c0532a 100644
--- a/clang/test/OpenMP/spirv_target_codegen_basic.cpp
+++ b/clang/test/OpenMP/spirv_target_codegen_basic.cpp
@@ -9,9 +9,10 @@
// CHECK: @"_gomp_critical_user_$var" = common addrspace(1) global [8 x i32] zeroinitializer, align 8
// CHECK: define weak_odr protected spir_kernel void @__omp_offloading_{{.*}}
-
+// CHECK: call spir_func addrspace(9) i32 @__kmpc_target_init(
// CHECK: call spir_func addrspace(9) void @__kmpc_critical(ptr addrspace(4) addrspacecast (ptr addrspace(1) @{{.*}} to ptr addrspace(4)), i32 %{{.*}}, ptr addrspace(4) addrspacecast (ptr addrspace(1) @"_gomp_critical_user_$var" to ptr addrspace(4)))
// CHECK: call spir_func addrspace(9) void @__kmpc_end_critical(ptr addrspace(4) addrspacecast (ptr addrspace(1) @{{.*}} to ptr addrspace(4)), i32 %{{.*}}, ptr addrspace(4) addrspacecast (ptr addrspace(1) @"_gomp_critical_user_$var" to ptr addrspace(4)))
+// CHECK: call spir_func addrspace(9) void @__kmpc_target_deinit(
int main() {
int ret = 0;
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
index 9f77c24d0b27b..f864a895a1259 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
+++ b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
@@ -17,6 +17,7 @@
#include "llvm/Frontend/Atomic/Atomic.h"
#include "llvm/Frontend/OpenMP/OMPConstants.h"
#include "llvm/Frontend/OpenMP/OMPGridValues.h"
+#include "llvm/IR/CallingConv.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Module.h"
@@ -138,6 +139,8 @@ class OpenMPIRBuilderConfig {
// Default address space for the target.
unsigned DefaultTargetAS = 0;
+ CallingConv::ID RuntimeCC = llvm::CallingConv::C;
+
LLVM_ABI OpenMPIRBuilderConfig();
LLVM_ABI OpenMPIRBuilderConfig(bool IsTargetDevice, bool IsGPU,
bool OpenMPOffloadMandatory,
@@ -170,6 +173,8 @@ class OpenMPIRBuilderConfig {
unsigned getDefaultTargetAS() const { return DefaultTargetAS; }
+ CallingConv::ID getRuntimeCC() const { return RuntimeCC; }
+
bool hasRequiresFlags() const { return RequiresFlags; }
LLVM_ABI bool hasRequiresReverseOffload() const;
LLVM_ABI bool hasRequiresUnifiedAddress() const;
@@ -208,6 +213,7 @@ class OpenMPIRBuilderConfig {
void setSeparator(StringRef S) { Separator = S; }
void setGridValue(omp::GV G) { GridValue = G; }
void setDefaultTargetAS(unsigned AS) { DefaultTargetAS = AS; }
+ void setRuntimeCC(CallingConv::ID CC) { RuntimeCC = CC; }
LLVM_ABI void setHasRequiresReverseOffload(bool Value);
LLVM_ABI void setHasRequiresUnifiedAddress(bool Value);
@@ -2132,6 +2138,10 @@ class OpenMPIRBuilder {
LLVM_ABI Function *getOrCreateRuntimeFunctionPtr(omp::RuntimeFunction FnID);
+ CallInst *createRuntimeFunctionCall(FunctionCallee Callee,
+ ArrayRef<Value *> Args,
+ StringRef Name = "");
+
/// Return the (LLVM-IR) string describing the source location \p LocStr.
LLVM_ABI Constant *getOrCreateSrcLocStr(StringRef LocStr,
uint32_t &SrcLocStrSize);
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index ac86fa859967e..5101717526263 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -643,7 +643,7 @@ OpenMPIRBuilder::getOrCreateRuntimeFunction(Module &M, RuntimeFunction FnID) {
break;
#include "llvm/Frontend/OpenMP/OMPKinds.def"
}
-
+ Fn->setCallingConv(Config.getRuntimeCC());
// Add information if the runtime function takes a callback function
if (FnID == OMPRTL___kmpc_fork_call || FnID == OMPRTL___kmpc_fork_teams) {
if (!Fn->hasMetadata(LLVMContext::MD_callback)) {
@@ -682,6 +682,14 @@ Function *OpenMPIRBuilder::getOrCreateRuntimeFunctionPtr(RuntimeFunction FnID) {
return Fn;
}
+CallInst *OpenMPIRBuilder::createRuntimeFunctionCall(FunctionCallee Callee,
+ ArrayRef<Value *> Args,
+ StringRef Name) {
+ CallInst *Call = Builder.CreateCall(Callee, Args, Name);
+ Call->setCallingConv(Config.getRuntimeCC());
+ return Call;
+}
+
void OpenMPIRBuilder::initialize() { initializeTypes(M); }
static void raiseUserConstantDataAllocasToEntryBlock(IRBuilderBase &Builder,
@@ -1024,7 +1032,7 @@ Constant *OpenMPIRBuilder::getOrCreateSrcLocStr(const LocationDescription &Loc,
}
Value *OpenMPIRBuilder::getOrCreateThreadID(Value *Ident) {
- return Builder.CreateCall(
+ return createRuntimeFunctionCall(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_global_thread_num), Ident,
"omp_global_thread_num");
}
@@ -1069,11 +1077,11 @@ OpenMPIRBuilder::createBarrier(const LocationDescription &Loc, Directive Kind,
bool UseCancelBarrier =
!ForceSimpleCall && isLastFinalizationInfoCancellable(OMPD_parallel);
- Value *Result =
- Builder.CreateCall(getOrCreateRuntimeFunctionPtr(
- UseCancelBarrier ? OMPRTL___kmpc_cancel_barrier
- : OMPRTL___kmpc_barrier),
- Args);
+ Value *Result = createRuntimeFunctionCall(
+ getOrCreateRuntimeFunctionPtr(UseCancelBarrier
+ ? OMPRTL___kmpc_cancel_barrier
+ : OMPRTL___kmpc_barrier),
+ Args);
if (UseCancelBarrier && CheckCancelFlag)
if (Error Err = emitCancelationCheckImpl(Result, OMPD_parallel))
@@ -1112,7 +1120,7 @@ OpenMPIRBuilder::createCancel(const LocationDescription &Loc,
Constant *SrcLocStr = getOrCreateSrcLocStr(Loc, SrcLocStrSize);
Value *Ident = getOrCreateIdent(SrcLocStr, SrcLocStrSize);
Value *Args[] = {Ident, getOrCreateThreadID(Ident), CancelKind};
- Value *Result = Builder.CreateCall(
+ Value *Result = createRuntimeFunctionCall(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_cancel), Args);
auto ExitCB = [this, CanceledDirective, Loc](InsertPointTy IP) -> Error {
if (CanceledDirective == OMPD_parallel) {
@@ -1163,7 +1171,7 @@ OpenMPIRBuilder::createCancellationPoint(const LocationDescription &Loc,
Constant *SrcLocStr = getOrCreateSrcLocStr(Loc, SrcLocStrSize);
Value *Ident = getOrCreateIdent(SrcLocStr, SrcLocStrSize);
Value *Args[] = {Ident, getOrCreateThreadID(Ident), CancelKind};
- Value *Result = Builder.CreateCall(
+ Value *Result = createRuntimeFunctionCall(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_cancellationpoint), Args);
auto ExitCB = [this, CanceledDirective, Loc](InsertPointTy IP) -> Error {
if (CanceledDirective == OMPD_parallel) {
@@ -1212,7 +1220,7 @@ OpenMPIRBuilder::InsertPointTy OpenMPIRBuilder::emitTargetKernel(
SmallVector<Value *> OffloadingArgs{Ident, DeviceID, NumTeams,
NumThreads, HostPtr, KernelArgsPtr};
- Return = Builder.CreateCall(
+ Return = createRuntimeFunctionCall(
getOrCreateRuntimeFunction(M, OMPRTL___tgt_target_kernel),
OffloadingArgs);
@@ -1392,7 +1400,7 @@ static void targetParallelCallback(
FunctionCallee RTLFn =
OMPIRBuilder->getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_parallel_51);
- Builder.CreateCall(RTLFn, Parallel51CallArgs);
+ OMPIRBuilder->createRuntimeFunctionCall(RTLFn, Parallel51CallArgs);
LLVM_DEBUG(dbgs() << "With kmpc_parallel_51 placed: "
<< *Builder.GetInsertBlock()->getParent() << "\n");
@@ -1477,7 +1485,7 @@ hostParallelCallback(OpenMPIRBuilder *OMPIRBuilder, Function &OutlinedFn,
RealArgs.push_back(NullPtrValue);
}
- Builder.CreateCall(RTLFn, RealArgs);
+ OMPIRBuilder->createRuntimeFunctionCall(RTLFn, RealArgs);
LLVM_DEBUG(dbgs() << "With fork_call placed: "
<< *Builder.GetInsertBlock()->getParent() << "\n");
@@ -1523,7 +1531,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createParallel(
Value *Args[] = {
Ident, ThreadID,
Builder.CreateIntCast(NumThreads, Int32, /*isSigned*/ false)};
- Builder.CreateCall(
+ createRuntimeFunctionCall(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_push_num_threads), Args);
}
@@ -1532,7 +1540,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createParallel(
Value *Args[] = {
Ident, ThreadID,
ConstantInt::get(Int32, unsigned(ProcBind), /*isSigned=*/true)};
- Builder.CreateCall(
+ createRuntimeFunctionCall(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_push_proc_bind), Args);
}
@@ -1824,7 +1832,8 @@ void OpenMPIRBuilder::emitFlush(const LocationDescription &Loc) {
Constant *SrcLocStr = getOrCreateSrcLocStr(Loc, SrcLocStrSize);
Value *Args[] = {getOrCreateIdent(SrcLocStr, SrcLocStrSize)};
- Builder.CreateCall(getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_flush), Args);
+ createRuntimeFunctionCall(getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_flush),
+ Args);
}
void OpenMPIRBuilder::createFlush(const LocationDescription &Loc) {
@@ -1842,8 +1851,8 @@ void OpenMPIRBuilder::emitTaskwaitImpl(const LocationDescription &Loc) {
Value *Args[] = {Ident, getOrCreateThreadID(Ident)};
// Ignore return result until untied tasks are supported.
- Builder.CreateCall(getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_taskwait),
- Args);
+ createRuntimeFunctionCall(
+ getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_taskwait), Args);
}
void OpenMPIRBuilder::createTaskwait(const LocationDescription &Loc) {
@@ -1860,8 +1869,8 @@ void OpenMPIRBuilder::emitTaskyieldImpl(const LocationDescription &Loc) {
Constant *I32Null = ConstantInt::getNullValue(Int32);
Value *Args[] = {Ident, getOrCreateThreadID(Ident), I32Null};
- Builder.CreateCall(getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_taskyield),
- Args);
+ createRuntimeFunctionCall(
+ getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_taskyield), Args);
}
void OpenMPIRBuilder::createTaskyield(const LocationDescription &Loc) {
@@ -2059,7 +2068,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTask(
// Emit the @__kmpc_omp_task_alloc runtime call
// The runtime call returns a pointer to an area where the task captured
// variables must be copied before the task is run (TaskData)
- CallInst *TaskData = Builder.CreateCall(
+ CallInst *TaskData = createRuntimeFunctionCall(
TaskAllocFn, {/*loc_ref=*/Ident, /*gtid=*/ThreadID, /*flags=*/Flags,
/*sizeof_task=*/TaskSize, /*sizeof_shared=*/SharedsSize,
/*task_func=*/&OutlinedFn});
@@ -2071,7 +2080,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTask(
Function *TaskDetachFn = getOrCreateRuntimeFunctionPtr(
OMPRTL___kmpc_task_allow_completion_event);
llvm::Value *EventVal =
- Builder.CreateCall(TaskDetachFn, {Ident, ThreadID, TaskData});
+ createRuntimeFunctionCall(TaskDetachFn, {Ident, ThreadID, TaskData});
llvm::Value *EventHandleAddr =
Builder.CreatePointerBitCastOrAddrSpaceCast(EventHandle,
Builder.getPtrTy(0));
@@ -2148,7 +2157,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTask(
if (Dependencies.size()) {
Function *TaskWaitFn =
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_wait_deps);
- Builder.CreateCall(
+ createRuntimeFunctionCall(
TaskWaitFn,
{Ident, ThreadID, Builder.getInt32(Dependencies.size()), DepArray,
ConstantInt::get(Builder.getInt32Ty(), 0),
@@ -2158,21 +2167,21 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTask(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_task_begin_if0);
Function *TaskCompleteFn =
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_task_complete_if0);
- Builder.CreateCall(TaskBeginFn, {Ident, ThreadID, TaskData});
+ createRuntimeFunctionCall(TaskBeginFn, {Ident, ThreadID, TaskData});
CallInst *CI = nullptr;
if (HasShareds)
- CI = Builder.CreateCall(&OutlinedFn, {ThreadID, TaskData});
+ CI = createRuntimeFunctionCall(&OutlinedFn, {ThreadID, TaskData});
else
- CI = Builder.CreateCall(&OutlinedFn, {ThreadID});
+ CI = createRuntimeFunctionCall(&OutlinedFn, {ThreadID});
CI->setDebugLoc(StaleCI->getDebugLoc());
- Builder.CreateCall(TaskCompleteFn, {Ident, ThreadID, TaskData});
+ createRuntimeFunctionCall(TaskCompleteFn, {Ident, ThreadID, TaskData});
Builder.SetInsertPoint(ThenTI);
}
if (Dependencies.size()) {
Function *TaskFn =
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_task_with_deps);
- Builder.CreateCall(
+ createRuntimeFunctionCall(
TaskFn,
{Ident, ThreadID, TaskData, Builder.getInt32(Dependencies.size()),
DepArray, ConstantInt::get(Builder.getInt32Ty(), 0),
@@ -2181,7 +2190,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTask(
} else {
// Emit the @__kmpc_omp_task runtime call to spawn the task
Function *TaskFn = getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_task);
- Builder.CreateCall(TaskFn, {Ident, ThreadID, TaskData});
+ createRuntimeFunctionCall(TaskFn, {Ident, ThreadID, TaskData});
}
StaleCI->eraseFromParent();
@@ -2218,7 +2227,7 @@ OpenMPIRBuilder::createTaskgroup(const LocationDescription &Loc,
// Emit the @__kmpc_taskgroup runtime call to start the taskgroup
Function *TaskgroupFn =
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_taskgroup);
- Builder.CreateCall(TaskgroupFn, {Ident, ThreadID});
+ createRuntimeFunctionCall(TaskgroupFn, {Ident, ThreadID});
BasicBlock *TaskgroupExitBB = splitBB(Builder, true, "taskgroup.exit");
if (Error Err = BodyGenCB(AllocaIP, Builder.saveIP()))
@@ -2228,7 +2237,7 @@ OpenMPIRBuilder::createTaskgroup(const LocationDescription &Loc,
// Emit the @__kmpc_end_taskgroup runtime call to end the taskgroup
Function *EndTaskgroupFn =
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_end_taskgroup);
- Builder.CreateCall(EndTaskgroupFn, {Ident, ThreadID});
+ createRuntimeFunctionCall(EndTaskgroupFn, {Ident, ThreadID});
return Builder.saveIP();
}
@@ -2384,14 +2393,14 @@ static OpenMPIRBuilder::InsertPointTy getInsertPointAfterInstr(Instruction *I) {
}
Value *OpenMPIRBuilder::getGPUThreadID() {
- return Builder.CreateCall(
+ return createRuntimeFunctionCall(
getOrCreateRuntimeFunction(M,
OMPRTL___kmpc_get_hardware_thread_id_in_block),
{});
}
Value *OpenMPIRBuilder::getGPUWarpSize() {
- return Builder.CreateCall(
+ return createRuntimeFunctionCall(
getOrCreateRuntimeFunction(M, OMPRTL___kmpc_get_warp_size), {});
}
@@ -2450,7 +2459,7 @@ Value *OpenMPIRBuilder::createRuntimeShuffleFunction(InsertPointTy AllocaIP,
Value *WarpSizeCast =
Builder.CreateIntCast(WarpSize, Builder.getInt16Ty(), /*isSigned=*/true);
Value *ShuffleCall =
- Builder.CreateCall(ShuffleFunc, {ElemCast, Offset, WarpSizeCast});
+ createRuntimeFunctionCall(ShuffleFunc, {ElemCast, Offset, WarpSizeCast});
return castValueToType(AllocaIP, ShuffleCall, CastTy);
}
@@ -3016,7 +3025,7 @@ Function *OpenMPIRBuilder::emitShuffleAndReduceFunction(
ReduceList, Builder.getPtrTy());
Value *RemoteReduceListPtr = Builder.CreatePointerBitCastOrAddrSpaceCast(
RemoteListAddrCast, Builder.getPtrTy());
- Builder.CreateCall(ReduceFn, {LocalReduceListPtr, RemoteReduceListPtr})
+ createRuntimeFunctionCall(ReduceFn, {LocalReduceListPtr, RemoteReduceListPtr})
->addFnAttr(Attribute::NoUnwind);
Builder.CreateBr(MergeBB);
@@ -3237,7 +3246,7 @@ Function *OpenMPIRBuilder::emitListToGlobalReduceFunction(
// Call reduce_function(GlobalReduceList, ReduceList)
Value *ReduceList =
Builder.CreateLoad(Builder.getPtrTy(), ReduceListArgAddrCast);
- Builder.CreateCall(ReduceFn, {LocalReduceListAddrCast, ReduceList})
+ createRuntimeFunctionCall(ReduceFn, {LocalReduceListAddrCast, ReduceList})
->addFnAttr(Attribute::NoUnwind);
Builder.CreateRetVoid();
Builder.restoreIP(OldIP);
@@ -3428,7 +3437,7 @@ Function *OpenMPIRBuilder::emitGlobalToListReduceFunction(
// Call reduce_function(ReduceList, GlobalReduceList)
Value *ReduceList =
Builder.CreateLoad(Builder.getPtrTy(), ReduceListArgAddrCast);
- Builder.CreateCall(ReduceFn, {ReduceList, ReductionList})
+ createRuntimeFunctionCall(ReduceFn, {ReduceList, ReductionList})
->addFnAttr(Attribute::NoUnwind);
Builder.CreateRetVoid();
Builder.restoreIP(OldIP);
@@ -3682,7 +3691,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createReductionsGPU(
WcFuncCast};
Function *Pv2Ptr = getOrCreateRuntimeFunctionPtr(
RuntimeFunction::OMPRTL___kmpc_nvptx_parallel_reduce_nowait_v2);
- Res = Builder.CreateCall(Pv2Ptr, Args);
+ Res = createRuntimeFunctionCall(Pv2Ptr, Args);
} else {
CodeGenIP = Builder.saveIP();
StructType *ReductionsBufferTy = StructType::create(
@@ -3699,7 +3708,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createReductionsGPU(
ReductionInfos, ReductionFunc, ReductionsBufferTy, FuncAttrs);
Builder.restoreIP(CodeGenIP);
- Value *KernelTeamsReductionPtr = Builder.CreateCall(
+ Value *KernelTeamsReductionPtr = createRuntimeFunctionCall(
RedFixedBuferFn, {}, "_openmp_teams_reductions_buffer_$_$ptr");
Value *Args3[] = {SrcLocInfo,
@@ -3716,7 +3725,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createReductionsGPU(
Function *TeamsReduceFn = getOrCreateRuntimeFunctionPtr(
RuntimeFunction::OMPRTL___kmpc_nvptx_teams_reduce_nowait_v2);
- Res = Builder.CreateCall(TeamsReduceFn, Args3);
+ Res = createRuntimeFunctionCall(TeamsReduceFn, Args3);
}
// 5. Build if (res == 1)
@@ -3921,10 +3930,10 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createReductions(
IsNoWait ? RuntimeFunction::OMPRTL___kmpc_reduce_nowait
: RuntimeFunction::OMPRTL___kmpc_reduce);
CallInst *ReduceCall =
- Builder.CreateCall(ReduceFunc,
- {Ident, ThreadId, NumVariables, RedArraySize, RedArray,
- ReductionFunc, Lock},
- "reduce");
+ createRuntimeFunctionCall(ReduceFunc,
+ {Ident, ThreadId, NumVariables, RedArraySize,
+ RedArray, ReductionFunc, Lock},
+ "reduce");
// Create final reduction entry blocks for the atomic and non-atomic case.
// Emit IR that dispatches control flow to one of the blocks based on the
@@ -3971,7 +3980,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenM...
[truncated]
|
|
@llvm/pr-subscribers-flang-openmp Author: Nick Sarnie (sarnex) ChangesSome targets have a specific calling convention that should be used for generated calls to runtime functions. Pass that down and use it. Patch is 42.09 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/168608.diff 7 Files Affected:
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index 1224fa681cdc0..a8255ac74cfcf 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -1039,6 +1039,7 @@ CGOpenMPRuntime::CGOpenMPRuntime(CodeGenModule &CGM)
hasRequiresUnifiedSharedMemory(), /*HasRequiresDynamicAllocators*/ false);
Config.setDefaultTargetAS(
CGM.getContext().getTargetInfo().getTargetAddressSpace(LangAS::Default));
+ Config.setRuntimeCC(CGM.getRuntimeCC());
OMPBuilder.setConfig(Config);
OMPBuilder.initialize();
diff --git a/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp b/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
index fddeba98adccc..2f69a53787f0c 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
@@ -871,6 +871,8 @@ CGOpenMPRuntimeGPU::CGOpenMPRuntimeGPU(CodeGenModule &CGM)
hasRequiresUnifiedSharedMemory(), /*HasRequiresDynamicAllocators*/ false);
Config.setDefaultTargetAS(
CGM.getContext().getTargetInfo().getTargetAddressSpace(LangAS::Default));
+ Config.setRuntimeCC(CGM.getRuntimeCC());
+
OMPBuilder.setConfig(Config);
if (!CGM.getLangOpts().OpenMPIsTargetDevice)
diff --git a/clang/test/OpenMP/spirv_target_codegen_basic.cpp b/clang/test/OpenMP/spirv_target_codegen_basic.cpp
index 6e029fb93644d..ad0e110c0532a 100644
--- a/clang/test/OpenMP/spirv_target_codegen_basic.cpp
+++ b/clang/test/OpenMP/spirv_target_codegen_basic.cpp
@@ -9,9 +9,10 @@
// CHECK: @"_gomp_critical_user_$var" = common addrspace(1) global [8 x i32] zeroinitializer, align 8
// CHECK: define weak_odr protected spir_kernel void @__omp_offloading_{{.*}}
-
+// CHECK: call spir_func addrspace(9) i32 @__kmpc_target_init(
// CHECK: call spir_func addrspace(9) void @__kmpc_critical(ptr addrspace(4) addrspacecast (ptr addrspace(1) @{{.*}} to ptr addrspace(4)), i32 %{{.*}}, ptr addrspace(4) addrspacecast (ptr addrspace(1) @"_gomp_critical_user_$var" to ptr addrspace(4)))
// CHECK: call spir_func addrspace(9) void @__kmpc_end_critical(ptr addrspace(4) addrspacecast (ptr addrspace(1) @{{.*}} to ptr addrspace(4)), i32 %{{.*}}, ptr addrspace(4) addrspacecast (ptr addrspace(1) @"_gomp_critical_user_$var" to ptr addrspace(4)))
+// CHECK: call spir_func addrspace(9) void @__kmpc_target_deinit(
int main() {
int ret = 0;
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
index 9f77c24d0b27b..f864a895a1259 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
+++ b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
@@ -17,6 +17,7 @@
#include "llvm/Frontend/Atomic/Atomic.h"
#include "llvm/Frontend/OpenMP/OMPConstants.h"
#include "llvm/Frontend/OpenMP/OMPGridValues.h"
+#include "llvm/IR/CallingConv.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Module.h"
@@ -138,6 +139,8 @@ class OpenMPIRBuilderConfig {
// Default address space for the target.
unsigned DefaultTargetAS = 0;
+ CallingConv::ID RuntimeCC = llvm::CallingConv::C;
+
LLVM_ABI OpenMPIRBuilderConfig();
LLVM_ABI OpenMPIRBuilderConfig(bool IsTargetDevice, bool IsGPU,
bool OpenMPOffloadMandatory,
@@ -170,6 +173,8 @@ class OpenMPIRBuilderConfig {
unsigned getDefaultTargetAS() const { return DefaultTargetAS; }
+ CallingConv::ID getRuntimeCC() const { return RuntimeCC; }
+
bool hasRequiresFlags() const { return RequiresFlags; }
LLVM_ABI bool hasRequiresReverseOffload() const;
LLVM_ABI bool hasRequiresUnifiedAddress() const;
@@ -208,6 +213,7 @@ class OpenMPIRBuilderConfig {
void setSeparator(StringRef S) { Separator = S; }
void setGridValue(omp::GV G) { GridValue = G; }
void setDefaultTargetAS(unsigned AS) { DefaultTargetAS = AS; }
+ void setRuntimeCC(CallingConv::ID CC) { RuntimeCC = CC; }
LLVM_ABI void setHasRequiresReverseOffload(bool Value);
LLVM_ABI void setHasRequiresUnifiedAddress(bool Value);
@@ -2132,6 +2138,10 @@ class OpenMPIRBuilder {
LLVM_ABI Function *getOrCreateRuntimeFunctionPtr(omp::RuntimeFunction FnID);
+ CallInst *createRuntimeFunctionCall(FunctionCallee Callee,
+ ArrayRef<Value *> Args,
+ StringRef Name = "");
+
/// Return the (LLVM-IR) string describing the source location \p LocStr.
LLVM_ABI Constant *getOrCreateSrcLocStr(StringRef LocStr,
uint32_t &SrcLocStrSize);
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index ac86fa859967e..5101717526263 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -643,7 +643,7 @@ OpenMPIRBuilder::getOrCreateRuntimeFunction(Module &M, RuntimeFunction FnID) {
break;
#include "llvm/Frontend/OpenMP/OMPKinds.def"
}
-
+ Fn->setCallingConv(Config.getRuntimeCC());
// Add information if the runtime function takes a callback function
if (FnID == OMPRTL___kmpc_fork_call || FnID == OMPRTL___kmpc_fork_teams) {
if (!Fn->hasMetadata(LLVMContext::MD_callback)) {
@@ -682,6 +682,14 @@ Function *OpenMPIRBuilder::getOrCreateRuntimeFunctionPtr(RuntimeFunction FnID) {
return Fn;
}
+CallInst *OpenMPIRBuilder::createRuntimeFunctionCall(FunctionCallee Callee,
+ ArrayRef<Value *> Args,
+ StringRef Name) {
+ CallInst *Call = Builder.CreateCall(Callee, Args, Name);
+ Call->setCallingConv(Config.getRuntimeCC());
+ return Call;
+}
+
void OpenMPIRBuilder::initialize() { initializeTypes(M); }
static void raiseUserConstantDataAllocasToEntryBlock(IRBuilderBase &Builder,
@@ -1024,7 +1032,7 @@ Constant *OpenMPIRBuilder::getOrCreateSrcLocStr(const LocationDescription &Loc,
}
Value *OpenMPIRBuilder::getOrCreateThreadID(Value *Ident) {
- return Builder.CreateCall(
+ return createRuntimeFunctionCall(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_global_thread_num), Ident,
"omp_global_thread_num");
}
@@ -1069,11 +1077,11 @@ OpenMPIRBuilder::createBarrier(const LocationDescription &Loc, Directive Kind,
bool UseCancelBarrier =
!ForceSimpleCall && isLastFinalizationInfoCancellable(OMPD_parallel);
- Value *Result =
- Builder.CreateCall(getOrCreateRuntimeFunctionPtr(
- UseCancelBarrier ? OMPRTL___kmpc_cancel_barrier
- : OMPRTL___kmpc_barrier),
- Args);
+ Value *Result = createRuntimeFunctionCall(
+ getOrCreateRuntimeFunctionPtr(UseCancelBarrier
+ ? OMPRTL___kmpc_cancel_barrier
+ : OMPRTL___kmpc_barrier),
+ Args);
if (UseCancelBarrier && CheckCancelFlag)
if (Error Err = emitCancelationCheckImpl(Result, OMPD_parallel))
@@ -1112,7 +1120,7 @@ OpenMPIRBuilder::createCancel(const LocationDescription &Loc,
Constant *SrcLocStr = getOrCreateSrcLocStr(Loc, SrcLocStrSize);
Value *Ident = getOrCreateIdent(SrcLocStr, SrcLocStrSize);
Value *Args[] = {Ident, getOrCreateThreadID(Ident), CancelKind};
- Value *Result = Builder.CreateCall(
+ Value *Result = createRuntimeFunctionCall(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_cancel), Args);
auto ExitCB = [this, CanceledDirective, Loc](InsertPointTy IP) -> Error {
if (CanceledDirective == OMPD_parallel) {
@@ -1163,7 +1171,7 @@ OpenMPIRBuilder::createCancellationPoint(const LocationDescription &Loc,
Constant *SrcLocStr = getOrCreateSrcLocStr(Loc, SrcLocStrSize);
Value *Ident = getOrCreateIdent(SrcLocStr, SrcLocStrSize);
Value *Args[] = {Ident, getOrCreateThreadID(Ident), CancelKind};
- Value *Result = Builder.CreateCall(
+ Value *Result = createRuntimeFunctionCall(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_cancellationpoint), Args);
auto ExitCB = [this, CanceledDirective, Loc](InsertPointTy IP) -> Error {
if (CanceledDirective == OMPD_parallel) {
@@ -1212,7 +1220,7 @@ OpenMPIRBuilder::InsertPointTy OpenMPIRBuilder::emitTargetKernel(
SmallVector<Value *> OffloadingArgs{Ident, DeviceID, NumTeams,
NumThreads, HostPtr, KernelArgsPtr};
- Return = Builder.CreateCall(
+ Return = createRuntimeFunctionCall(
getOrCreateRuntimeFunction(M, OMPRTL___tgt_target_kernel),
OffloadingArgs);
@@ -1392,7 +1400,7 @@ static void targetParallelCallback(
FunctionCallee RTLFn =
OMPIRBuilder->getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_parallel_51);
- Builder.CreateCall(RTLFn, Parallel51CallArgs);
+ OMPIRBuilder->createRuntimeFunctionCall(RTLFn, Parallel51CallArgs);
LLVM_DEBUG(dbgs() << "With kmpc_parallel_51 placed: "
<< *Builder.GetInsertBlock()->getParent() << "\n");
@@ -1477,7 +1485,7 @@ hostParallelCallback(OpenMPIRBuilder *OMPIRBuilder, Function &OutlinedFn,
RealArgs.push_back(NullPtrValue);
}
- Builder.CreateCall(RTLFn, RealArgs);
+ OMPIRBuilder->createRuntimeFunctionCall(RTLFn, RealArgs);
LLVM_DEBUG(dbgs() << "With fork_call placed: "
<< *Builder.GetInsertBlock()->getParent() << "\n");
@@ -1523,7 +1531,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createParallel(
Value *Args[] = {
Ident, ThreadID,
Builder.CreateIntCast(NumThreads, Int32, /*isSigned*/ false)};
- Builder.CreateCall(
+ createRuntimeFunctionCall(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_push_num_threads), Args);
}
@@ -1532,7 +1540,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createParallel(
Value *Args[] = {
Ident, ThreadID,
ConstantInt::get(Int32, unsigned(ProcBind), /*isSigned=*/true)};
- Builder.CreateCall(
+ createRuntimeFunctionCall(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_push_proc_bind), Args);
}
@@ -1824,7 +1832,8 @@ void OpenMPIRBuilder::emitFlush(const LocationDescription &Loc) {
Constant *SrcLocStr = getOrCreateSrcLocStr(Loc, SrcLocStrSize);
Value *Args[] = {getOrCreateIdent(SrcLocStr, SrcLocStrSize)};
- Builder.CreateCall(getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_flush), Args);
+ createRuntimeFunctionCall(getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_flush),
+ Args);
}
void OpenMPIRBuilder::createFlush(const LocationDescription &Loc) {
@@ -1842,8 +1851,8 @@ void OpenMPIRBuilder::emitTaskwaitImpl(const LocationDescription &Loc) {
Value *Args[] = {Ident, getOrCreateThreadID(Ident)};
// Ignore return result until untied tasks are supported.
- Builder.CreateCall(getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_taskwait),
- Args);
+ createRuntimeFunctionCall(
+ getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_taskwait), Args);
}
void OpenMPIRBuilder::createTaskwait(const LocationDescription &Loc) {
@@ -1860,8 +1869,8 @@ void OpenMPIRBuilder::emitTaskyieldImpl(const LocationDescription &Loc) {
Constant *I32Null = ConstantInt::getNullValue(Int32);
Value *Args[] = {Ident, getOrCreateThreadID(Ident), I32Null};
- Builder.CreateCall(getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_taskyield),
- Args);
+ createRuntimeFunctionCall(
+ getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_taskyield), Args);
}
void OpenMPIRBuilder::createTaskyield(const LocationDescription &Loc) {
@@ -2059,7 +2068,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTask(
// Emit the @__kmpc_omp_task_alloc runtime call
// The runtime call returns a pointer to an area where the task captured
// variables must be copied before the task is run (TaskData)
- CallInst *TaskData = Builder.CreateCall(
+ CallInst *TaskData = createRuntimeFunctionCall(
TaskAllocFn, {/*loc_ref=*/Ident, /*gtid=*/ThreadID, /*flags=*/Flags,
/*sizeof_task=*/TaskSize, /*sizeof_shared=*/SharedsSize,
/*task_func=*/&OutlinedFn});
@@ -2071,7 +2080,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTask(
Function *TaskDetachFn = getOrCreateRuntimeFunctionPtr(
OMPRTL___kmpc_task_allow_completion_event);
llvm::Value *EventVal =
- Builder.CreateCall(TaskDetachFn, {Ident, ThreadID, TaskData});
+ createRuntimeFunctionCall(TaskDetachFn, {Ident, ThreadID, TaskData});
llvm::Value *EventHandleAddr =
Builder.CreatePointerBitCastOrAddrSpaceCast(EventHandle,
Builder.getPtrTy(0));
@@ -2148,7 +2157,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTask(
if (Dependencies.size()) {
Function *TaskWaitFn =
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_wait_deps);
- Builder.CreateCall(
+ createRuntimeFunctionCall(
TaskWaitFn,
{Ident, ThreadID, Builder.getInt32(Dependencies.size()), DepArray,
ConstantInt::get(Builder.getInt32Ty(), 0),
@@ -2158,21 +2167,21 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTask(
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_task_begin_if0);
Function *TaskCompleteFn =
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_task_complete_if0);
- Builder.CreateCall(TaskBeginFn, {Ident, ThreadID, TaskData});
+ createRuntimeFunctionCall(TaskBeginFn, {Ident, ThreadID, TaskData});
CallInst *CI = nullptr;
if (HasShareds)
- CI = Builder.CreateCall(&OutlinedFn, {ThreadID, TaskData});
+ CI = createRuntimeFunctionCall(&OutlinedFn, {ThreadID, TaskData});
else
- CI = Builder.CreateCall(&OutlinedFn, {ThreadID});
+ CI = createRuntimeFunctionCall(&OutlinedFn, {ThreadID});
CI->setDebugLoc(StaleCI->getDebugLoc());
- Builder.CreateCall(TaskCompleteFn, {Ident, ThreadID, TaskData});
+ createRuntimeFunctionCall(TaskCompleteFn, {Ident, ThreadID, TaskData});
Builder.SetInsertPoint(ThenTI);
}
if (Dependencies.size()) {
Function *TaskFn =
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_task_with_deps);
- Builder.CreateCall(
+ createRuntimeFunctionCall(
TaskFn,
{Ident, ThreadID, TaskData, Builder.getInt32(Dependencies.size()),
DepArray, ConstantInt::get(Builder.getInt32Ty(), 0),
@@ -2181,7 +2190,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTask(
} else {
// Emit the @__kmpc_omp_task runtime call to spawn the task
Function *TaskFn = getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_omp_task);
- Builder.CreateCall(TaskFn, {Ident, ThreadID, TaskData});
+ createRuntimeFunctionCall(TaskFn, {Ident, ThreadID, TaskData});
}
StaleCI->eraseFromParent();
@@ -2218,7 +2227,7 @@ OpenMPIRBuilder::createTaskgroup(const LocationDescription &Loc,
// Emit the @__kmpc_taskgroup runtime call to start the taskgroup
Function *TaskgroupFn =
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_taskgroup);
- Builder.CreateCall(TaskgroupFn, {Ident, ThreadID});
+ createRuntimeFunctionCall(TaskgroupFn, {Ident, ThreadID});
BasicBlock *TaskgroupExitBB = splitBB(Builder, true, "taskgroup.exit");
if (Error Err = BodyGenCB(AllocaIP, Builder.saveIP()))
@@ -2228,7 +2237,7 @@ OpenMPIRBuilder::createTaskgroup(const LocationDescription &Loc,
// Emit the @__kmpc_end_taskgroup runtime call to end the taskgroup
Function *EndTaskgroupFn =
getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_end_taskgroup);
- Builder.CreateCall(EndTaskgroupFn, {Ident, ThreadID});
+ createRuntimeFunctionCall(EndTaskgroupFn, {Ident, ThreadID});
return Builder.saveIP();
}
@@ -2384,14 +2393,14 @@ static OpenMPIRBuilder::InsertPointTy getInsertPointAfterInstr(Instruction *I) {
}
Value *OpenMPIRBuilder::getGPUThreadID() {
- return Builder.CreateCall(
+ return createRuntimeFunctionCall(
getOrCreateRuntimeFunction(M,
OMPRTL___kmpc_get_hardware_thread_id_in_block),
{});
}
Value *OpenMPIRBuilder::getGPUWarpSize() {
- return Builder.CreateCall(
+ return createRuntimeFunctionCall(
getOrCreateRuntimeFunction(M, OMPRTL___kmpc_get_warp_size), {});
}
@@ -2450,7 +2459,7 @@ Value *OpenMPIRBuilder::createRuntimeShuffleFunction(InsertPointTy AllocaIP,
Value *WarpSizeCast =
Builder.CreateIntCast(WarpSize, Builder.getInt16Ty(), /*isSigned=*/true);
Value *ShuffleCall =
- Builder.CreateCall(ShuffleFunc, {ElemCast, Offset, WarpSizeCast});
+ createRuntimeFunctionCall(ShuffleFunc, {ElemCast, Offset, WarpSizeCast});
return castValueToType(AllocaIP, ShuffleCall, CastTy);
}
@@ -3016,7 +3025,7 @@ Function *OpenMPIRBuilder::emitShuffleAndReduceFunction(
ReduceList, Builder.getPtrTy());
Value *RemoteReduceListPtr = Builder.CreatePointerBitCastOrAddrSpaceCast(
RemoteListAddrCast, Builder.getPtrTy());
- Builder.CreateCall(ReduceFn, {LocalReduceListPtr, RemoteReduceListPtr})
+ createRuntimeFunctionCall(ReduceFn, {LocalReduceListPtr, RemoteReduceListPtr})
->addFnAttr(Attribute::NoUnwind);
Builder.CreateBr(MergeBB);
@@ -3237,7 +3246,7 @@ Function *OpenMPIRBuilder::emitListToGlobalReduceFunction(
// Call reduce_function(GlobalReduceList, ReduceList)
Value *ReduceList =
Builder.CreateLoad(Builder.getPtrTy(), ReduceListArgAddrCast);
- Builder.CreateCall(ReduceFn, {LocalReduceListAddrCast, ReduceList})
+ createRuntimeFunctionCall(ReduceFn, {LocalReduceListAddrCast, ReduceList})
->addFnAttr(Attribute::NoUnwind);
Builder.CreateRetVoid();
Builder.restoreIP(OldIP);
@@ -3428,7 +3437,7 @@ Function *OpenMPIRBuilder::emitGlobalToListReduceFunction(
// Call reduce_function(ReduceList, GlobalReduceList)
Value *ReduceList =
Builder.CreateLoad(Builder.getPtrTy(), ReduceListArgAddrCast);
- Builder.CreateCall(ReduceFn, {ReduceList, ReductionList})
+ createRuntimeFunctionCall(ReduceFn, {ReduceList, ReductionList})
->addFnAttr(Attribute::NoUnwind);
Builder.CreateRetVoid();
Builder.restoreIP(OldIP);
@@ -3682,7 +3691,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createReductionsGPU(
WcFuncCast};
Function *Pv2Ptr = getOrCreateRuntimeFunctionPtr(
RuntimeFunction::OMPRTL___kmpc_nvptx_parallel_reduce_nowait_v2);
- Res = Builder.CreateCall(Pv2Ptr, Args);
+ Res = createRuntimeFunctionCall(Pv2Ptr, Args);
} else {
CodeGenIP = Builder.saveIP();
StructType *ReductionsBufferTy = StructType::create(
@@ -3699,7 +3708,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createReductionsGPU(
ReductionInfos, ReductionFunc, ReductionsBufferTy, FuncAttrs);
Builder.restoreIP(CodeGenIP);
- Value *KernelTeamsReductionPtr = Builder.CreateCall(
+ Value *KernelTeamsReductionPtr = createRuntimeFunctionCall(
RedFixedBuferFn, {}, "_openmp_teams_reductions_buffer_$_$ptr");
Value *Args3[] = {SrcLocInfo,
@@ -3716,7 +3725,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createReductionsGPU(
Function *TeamsReduceFn = getOrCreateRuntimeFunctionPtr(
RuntimeFunction::OMPRTL___kmpc_nvptx_teams_reduce_nowait_v2);
- Res = Builder.CreateCall(TeamsReduceFn, Args3);
+ Res = createRuntimeFunctionCall(TeamsReduceFn, Args3);
}
// 5. Build if (res == 1)
@@ -3921,10 +3930,10 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createReductions(
IsNoWait ? RuntimeFunction::OMPRTL___kmpc_reduce_nowait
: RuntimeFunction::OMPRTL___kmpc_reduce);
CallInst *ReduceCall =
- Builder.CreateCall(ReduceFunc,
- {Ident, ThreadId, NumVariables, RedArraySize, RedArray,
- ReductionFunc, Lock},
- "reduce");
+ createRuntimeFunctionCall(ReduceFunc,
+ {Ident, ThreadId, NumVariables, RedArraySize,
+ RedArray, ReductionFunc, Lock},
+ "reduce");
// Create final reduction entry blocks for the atomic and non-atomic case.
// Emit IR that dispatches control flow to one of the blocks based on the
@@ -3971,7 +3980,7 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenM...
[truncated]
|
jhuber6
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Seems reasonable to me, maybe some of the Flang people have opinions
Some targets have a specific calling convention that should be used for generated calls to runtime functions. Pass that down and use it. Signed-off-by: Nick Sarnie <[email protected]>
Some targets have a specific calling convention that should be used for generated calls to runtime functions. Pass that down and use it. Signed-off-by: Nick Sarnie <[email protected]>
Some targets have a specific calling convention that should be used for generated calls to runtime functions. Pass that down and use it. Signed-off-by: Nick Sarnie <[email protected]>
Some targets have a specific calling convention that should be used for generated calls to runtime functions.
Pass that down and use it.