Skip to content

Commit ff21367

Browse files
committed
[clang][OpenMP][SPIR-V] Fix addrspace of globals
Signed-off-by: Sarnie, Nick <[email protected]>
1 parent 61d04f1 commit ff21367

File tree

8 files changed

+101
-21
lines changed

8 files changed

+101
-21
lines changed

clang/lib/Basic/Targets/SPIR.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,11 @@ static const unsigned SPIRDefIsPrivMap[] = {
5757
// Used by both the SPIR and SPIR-V targets.
5858
static const unsigned SPIRDefIsGenMap[] = {
5959
4, // Default
60-
// OpenCL address space values for this map are dummy and they can't be used
61-
0, // opencl_global
60+
// Some OpenCL address space values for this map are dummy and they can't be
61+
// used
62+
1, // opencl_global
6263
0, // opencl_local
63-
0, // opencl_constant
64+
2, // opencl_constant
6465
0, // opencl_private
6566
0, // opencl_generic
6667
0, // opencl_global_device
@@ -216,7 +217,7 @@ class LLVM_LIBRARY_VISIBILITY BaseSPIRTargetInfo : public TargetInfo {
216217
/*DefaultIsGeneric=*/Opts.SYCLIsDevice ||
217218
// The address mapping from HIP/CUDA language for device code is only
218219
// defined for SPIR-V.
219-
(getTriple().isSPIRV() && Opts.CUDAIsDevice));
220+
(getTriple().isSPIRV() && (Opts.CUDAIsDevice || Opts.OpenMPIsTargetDevice)));
220221
}
221222

222223
void setSupportedOpenCLOpts() override {

clang/lib/CodeGen/CGOpenMPRuntime.cpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2524,6 +2524,16 @@ void CGOpenMPRuntime::emitForDispatchInit(
25242524
Args);
25252525
}
25262526

2527+
llvm::Value *CGOpenMPRuntime::createRuntimeFunctionArgAddrSpaceCast(
2528+
CodeGenFunction &CGF, llvm::FunctionCallee RuntimeFcn, size_t ArgIdx,
2529+
llvm::Value *Arg) {
2530+
llvm::Type *ParamTy = RuntimeFcn.getFunctionType()->getParamType(ArgIdx);
2531+
llvm::Type *ArgTy = Arg->getType();
2532+
if (!ParamTy->isPointerTy())
2533+
return Arg;
2534+
return CGF.Builder.CreateAddrSpaceCast(Arg, ParamTy);
2535+
}
2536+
25272537
void CGOpenMPRuntime::emitForDispatchDeinit(CodeGenFunction &CGF,
25282538
SourceLocation Loc) {
25292539
if (!CGF.HaveInsertPoint())
@@ -2572,12 +2582,18 @@ static void emitForStaticInitCall(
25722582
ThreadId,
25732583
CGF.Builder.getInt32(addMonoNonMonoModifier(CGF.CGM, Schedule, M1,
25742584
M2)), // Schedule type
2575-
Values.IL.emitRawPointer(CGF), // &isLastIter
2576-
Values.LB.emitRawPointer(CGF), // &LB
2577-
Values.UB.emitRawPointer(CGF), // &UB
2578-
Values.ST.emitRawPointer(CGF), // &Stride
2579-
CGF.Builder.getIntN(Values.IVSize, 1), // Incr
2580-
Chunk // Chunk
2585+
CGOpenMPRuntime::createRuntimeFunctionArgAddrSpaceCast(
2586+
CGF, ForStaticInitFunction, 3,
2587+
Values.IL.emitRawPointer(CGF)), // &isLastIter
2588+
CGOpenMPRuntime::createRuntimeFunctionArgAddrSpaceCast(
2589+
CGF, ForStaticInitFunction, 4, Values.LB.emitRawPointer(CGF)), // &LB
2590+
CGOpenMPRuntime::createRuntimeFunctionArgAddrSpaceCast(
2591+
CGF, ForStaticInitFunction, 5, Values.UB.emitRawPointer(CGF)), // &UB
2592+
CGOpenMPRuntime::createRuntimeFunctionArgAddrSpaceCast(
2593+
CGF, ForStaticInitFunction, 6,
2594+
Values.ST.emitRawPointer(CGF)), // &Stride
2595+
CGF.Builder.getIntN(Values.IVSize, 1), // Incr
2596+
Chunk // Chunk
25812597
};
25822598
CGF.EmitRuntimeCall(ForStaticInitFunction, Args);
25832599
}

clang/lib/CodeGen/CGOpenMPRuntime.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1657,6 +1657,11 @@ class CGOpenMPRuntime {
16571657

16581658
/// Returns true if the variable is a local variable in untied task.
16591659
bool isLocalVarInUntiedTask(CodeGenFunction &CGF, const VarDecl *VD) const;
1660+
1661+
static llvm::Value *
1662+
createRuntimeFunctionArgAddrSpaceCast(CodeGenFunction &CGF,
1663+
llvm::FunctionCallee RuntimeFcn,
1664+
size_t ArgIdx, llvm::Value *Arg);
16601665
};
16611666

16621667
/// Class supports emissionof SIMD-only code.

clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,11 +1217,13 @@ void CGOpenMPRuntimeGPU::emitParallelCall(CodeGenFunction &CGF,
12171217
CGBuilderTy &Bld = CGF.Builder;
12181218
llvm::Value *NumThreadsVal = NumThreads;
12191219
llvm::Function *WFn = WrapperFunctionsMap[OutlinedFn];
1220+
llvm::FunctionCallee RuntimeFn = OMPBuilder.getOrCreateRuntimeFunction(
1221+
CGM.getModule(), OMPRTL___kmpc_parallel_51);
12201222
llvm::Value *ID = llvm::ConstantPointerNull::get(CGM.Int8PtrTy);
12211223
if (WFn)
12221224
ID = Bld.CreateBitOrPointerCast(WFn, CGM.Int8PtrTy);
1223-
llvm::Value *FnPtr = Bld.CreateBitOrPointerCast(OutlinedFn, CGM.Int8PtrTy);
1224-
1225+
llvm::Value *FnPtr = Bld.CreateAddrSpaceCast(OutlinedFn, CGM.Int8PtrTy);
1226+
FnPtr = Bld.CreateBitOrPointerCast(FnPtr, CGM.Int8PtrTy);
12251227
// Create a private scope that will globalize the arguments
12261228
// passed from the outside of the target region.
12271229
// TODO: Is that needed?
@@ -1268,14 +1270,15 @@ void CGOpenMPRuntimeGPU::emitParallelCall(CodeGenFunction &CGF,
12681270
IfCondVal,
12691271
NumThreadsVal,
12701272
llvm::ConstantInt::get(CGF.Int32Ty, -1),
1271-
FnPtr,
1272-
ID,
1273-
Bld.CreateBitOrPointerCast(CapturedVarsAddrs.emitRawPointer(CGF),
1274-
CGF.VoidPtrPtrTy),
1273+
createRuntimeFunctionArgAddrSpaceCast(CGF, RuntimeFn, 5, FnPtr),
1274+
createRuntimeFunctionArgAddrSpaceCast(CGF, RuntimeFn, 6, ID),
1275+
createRuntimeFunctionArgAddrSpaceCast(
1276+
CGF, RuntimeFn, 7,
1277+
Bld.CreateBitOrPointerCast(CapturedVarsAddrs.emitRawPointer(CGF),
1278+
CGF.VoidPtrPtrTy)),
12751279
llvm::ConstantInt::get(CGM.SizeTy, CapturedVars.size())};
1276-
CGF.EmitRuntimeCall(OMPBuilder.getOrCreateRuntimeFunction(
1277-
CGM.getModule(), OMPRTL___kmpc_parallel_51),
1278-
Args);
1280+
1281+
CGF.EmitRuntimeCall(RuntimeFn, Args);
12791282
};
12801283

12811284
RegionCodeGenTy RCG(ParallelGen);

clang/lib/CodeGen/CGStmtOpenMP.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,8 @@ static llvm::Function *emitOutlinedFunctionPrologue(
585585
F->removeFnAttr(llvm::Attribute::NoInline);
586586
F->addFnAttr(llvm::Attribute::AlwaysInline);
587587
}
588+
if (CGM.getTriple().isSPIRV())
589+
F->setCallingConv(llvm::CallingConv::SPIR_FUNC);
588590

589591
// Generate the function.
590592
CGF.StartFunction(CD, Ctx.VoidTy, F, FuncInfo, TargetArgs,
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-unknown-unknown -fopenmp-targets=spirv64 -emit-llvm-bc %s -o %t-host.bc
2+
// RUN: %clang_cc1 -fopenmp -fopenmp-targets=spirv64 -fopenmp-is-target-device -triple spirv64 -fopenmp-host-ir-file-path %t-host.bc -emit-llvm %s -o - | FileCheck %s
3+
4+
extern int fcn(const char[]);
5+
6+
#pragma omp declare target
7+
// CHECK: @global = addrspace(1) global i32 0, align 4
8+
// CHECK: @.str = private unnamed_addr addrspace(1) constant [4 x i8] c"foo\00", align 1
9+
int global = 0;
10+
#pragma omp end declare target
11+
int main() {
12+
// CHECK: = call i32 @__kmpc_target_init(ptr addrspacecast (ptr addrspace(1) @__omp_offloading_{{.*}}_kernel_environment to ptr), ptr %{{.*}})
13+
#pragma omp target
14+
{
15+
for(int i = 0; i < 1024; i++)
16+
global++;
17+
fcn("foo");
18+
}
19+
return global;
20+
}
21+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-unknown-unknown -fopenmp-targets=spirv64 -emit-llvm-bc %s -o %t-host.bc
2+
// RUN: %clang_cc1 -fopenmp -fopenmp-targets=spirv64 -fopenmp-is-target-device -triple spirv64 -fopenmp-host-ir-file-path %t-host.bc -emit-llvm %s -o - | FileCheck %s
3+
4+
int main() {
5+
int x = 0;
6+
7+
#pragma omp target teams distribute parallel for simd
8+
for(int i = 0; i < 1024; i++)
9+
x+=i;
10+
return x;
11+
}
12+
13+
// CHECK: @[[#STRLOC:]] = private unnamed_addr addrspace(1) constant [{{.*}} x i8] c{{.*}}, align 1
14+
// CHECK: @[[#IDENT:]] = private unnamed_addr addrspace(1) constant %struct.ident_t { i32 {{.*}}, i32 2050, i32 {{.*}}, i32 {{.*}}, ptr addrspacecast (ptr addrspace(1) @[[#STRLOC]] to ptr) }, align 8
15+
// CHECK: define internal spir_func void @__omp_offloading_{{.*}}_omp_outlined(ptr addrspace(4) noalias noundef {{.*}}., ptr addrspace(4) noalias noundef {{.*}}, i64 noundef {{.*}}) #{{.*}} {
16+
// CHECK: = load ptr addrspace(4), ptr addrspace(4) %{{.*}}, align 8
17+
// CHECK: = load i32, ptr addrspace(4) %{{.*}}, align 4
18+
// CHECK: = addrspacecast ptr addrspace(4) %{{.*}} to ptr
19+
// CHECK: = addrspacecast ptr addrspace(4) %{{.*}} to ptr
20+
// CHECK: = addrspacecast ptr addrspace(4) %{{.*}} to ptr
21+
// CHECK: = addrspacecast ptr addrspace(4) %{{.*}} to ptr
22+
// CHECK: call spir_func void @__kmpc_distribute_static_init{{.*}}(ptr addrspacecast (ptr addrspace(1) @[[#IDENT]] to ptr), i32 %{{.*}}, i32 {{.*}}, ptr %{{.*}}, ptr %{{.*}}, ptr %{{.*}}, ptr %{{.*}}, i32 {{.*}}, i32 %{{.*}})
23+
// CHECK: call spir_func void @__kmpc_distribute_static_fini{{.*}}(ptr addrspacecast (ptr addrspace(1) @[[#IDENT]] to ptr), i32 %{{.*}})

llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -910,6 +910,14 @@ Constant *OpenMPIRBuilder::getOrCreateIdent(Constant *SrcLocStr,
910910
ConstantInt::get(Int32, uint32_t(LocFlags)),
911911
ConstantInt::get(Int32, Reserve2Flags),
912912
ConstantInt::get(Int32, SrcLocStrSize), SrcLocStr};
913+
914+
size_t SrcLocStrArgIdx = 4;
915+
if (OpenMPIRBuilder::Ident->getElementType(SrcLocStrArgIdx)
916+
->getPointerAddressSpace() !=
917+
IdentData[SrcLocStrArgIdx]->getType()->getPointerAddressSpace())
918+
IdentData[SrcLocStrArgIdx] = ConstantExpr::getAddrSpaceCast(
919+
SrcLocStr, OpenMPIRBuilder::Ident->getElementType(SrcLocStrArgIdx));
920+
913921
Constant *Initializer =
914922
ConstantStruct::get(OpenMPIRBuilder::Ident, IdentData);
915923

@@ -950,8 +958,9 @@ Constant *OpenMPIRBuilder::getOrCreateSrcLocStr(StringRef LocStr,
950958
GV.getInitializer() == Initializer)
951959
return SrcLocStr = ConstantExpr::getPointerCast(&GV, Int8Ptr);
952960

953-
SrcLocStr = Builder.CreateGlobalString(LocStr, /* Name */ "",
954-
/* AddressSpace */ 0, &M);
961+
SrcLocStr = Builder.CreateGlobalString(
962+
LocStr, /* Name */ "",
963+
M.getDataLayout().getDefaultGlobalsAddressSpace(), &M);
955964
}
956965
return SrcLocStr;
957966
}

0 commit comments

Comments
 (0)