Skip to content

Commit 4538818

Browse files
authored
[OpenMP][OMPIRBuilder] Use runtime CC for runtime calls (#168608)
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]>
1 parent 89bb99d commit 4538818

File tree

7 files changed

+151
-111
lines changed

7 files changed

+151
-111
lines changed

clang/lib/CodeGen/CGOpenMPRuntime.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1040,6 +1040,7 @@ CGOpenMPRuntime::CGOpenMPRuntime(CodeGenModule &CGM)
10401040
hasRequiresUnifiedSharedMemory(), /*HasRequiresDynamicAllocators*/ false);
10411041
Config.setDefaultTargetAS(
10421042
CGM.getContext().getTargetInfo().getTargetAddressSpace(LangAS::Default));
1043+
Config.setRuntimeCC(CGM.getRuntimeCC());
10431044

10441045
OMPBuilder.setConfig(Config);
10451046
OMPBuilder.initialize();

clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -871,6 +871,8 @@ CGOpenMPRuntimeGPU::CGOpenMPRuntimeGPU(CodeGenModule &CGM)
871871
hasRequiresUnifiedSharedMemory(), /*HasRequiresDynamicAllocators*/ false);
872872
Config.setDefaultTargetAS(
873873
CGM.getContext().getTargetInfo().getTargetAddressSpace(LangAS::Default));
874+
Config.setRuntimeCC(CGM.getRuntimeCC());
875+
874876
OMPBuilder.setConfig(Config);
875877

876878
if (!CGM.getLangOpts().OpenMPIsTargetDevice)

clang/test/OpenMP/spirv_target_codegen_basic.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99
// CHECK: @"_gomp_critical_user_$var" = common addrspace(1) global [8 x i32] zeroinitializer, align 8
1010

1111
// CHECK: define weak_odr protected spir_kernel void @__omp_offloading_{{.*}}
12-
12+
// CHECK: call spir_func addrspace(9) i32 @__kmpc_target_init(
1313
// 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)))
1414
// 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)))
15+
// CHECK: call spir_func addrspace(9) void @__kmpc_target_deinit(
1516

1617
int main() {
1718
int ret = 0;

llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "llvm/Frontend/Atomic/Atomic.h"
1818
#include "llvm/Frontend/OpenMP/OMPConstants.h"
1919
#include "llvm/Frontend/OpenMP/OMPGridValues.h"
20+
#include "llvm/IR/CallingConv.h"
2021
#include "llvm/IR/DebugLoc.h"
2122
#include "llvm/IR/IRBuilder.h"
2223
#include "llvm/IR/Module.h"
@@ -138,6 +139,8 @@ class OpenMPIRBuilderConfig {
138139
// Default address space for the target.
139140
unsigned DefaultTargetAS = 0;
140141

142+
CallingConv::ID RuntimeCC = llvm::CallingConv::C;
143+
141144
LLVM_ABI OpenMPIRBuilderConfig();
142145
LLVM_ABI OpenMPIRBuilderConfig(bool IsTargetDevice, bool IsGPU,
143146
bool OpenMPOffloadMandatory,
@@ -170,6 +173,8 @@ class OpenMPIRBuilderConfig {
170173

171174
unsigned getDefaultTargetAS() const { return DefaultTargetAS; }
172175

176+
CallingConv::ID getRuntimeCC() const { return RuntimeCC; }
177+
173178
bool hasRequiresFlags() const { return RequiresFlags; }
174179
LLVM_ABI bool hasRequiresReverseOffload() const;
175180
LLVM_ABI bool hasRequiresUnifiedAddress() const;
@@ -208,6 +213,7 @@ class OpenMPIRBuilderConfig {
208213
void setSeparator(StringRef S) { Separator = S; }
209214
void setGridValue(omp::GV G) { GridValue = G; }
210215
void setDefaultTargetAS(unsigned AS) { DefaultTargetAS = AS; }
216+
void setRuntimeCC(CallingConv::ID CC) { RuntimeCC = CC; }
211217

212218
LLVM_ABI void setHasRequiresReverseOffload(bool Value);
213219
LLVM_ABI void setHasRequiresUnifiedAddress(bool Value);
@@ -2132,6 +2138,10 @@ class OpenMPIRBuilder {
21322138

21332139
LLVM_ABI Function *getOrCreateRuntimeFunctionPtr(omp::RuntimeFunction FnID);
21342140

2141+
CallInst *createRuntimeFunctionCall(FunctionCallee Callee,
2142+
ArrayRef<Value *> Args,
2143+
StringRef Name = "");
2144+
21352145
/// Return the (LLVM-IR) string describing the source location \p LocStr.
21362146
LLVM_ABI Constant *getOrCreateSrcLocStr(StringRef LocStr,
21372147
uint32_t &SrcLocStrSize);

0 commit comments

Comments
 (0)