Skip to content

Commit a4d0957

Browse files
haonanya1sys-ce-bb
authored andcommitted
Set spirv.Source according to the opencl.ocl.version and opencl.cxx.version. (#2631)
Align with llvm/llvm-project@5fd5b8a. Co-authored-by: Sven van Haastregt <[email protected]> Original commit: KhronosGroup/SPIRV-LLVM-Translator@a84bfcaf829995c
1 parent feaa59c commit a4d0957

File tree

7 files changed

+94
-20
lines changed

7 files changed

+94
-20
lines changed

llvm-spirv/lib/SPIRV/OCLUtil.cpp

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -781,26 +781,39 @@ decodeOCLVer(unsigned Ver) {
781781
}
782782

783783
unsigned getOCLVersion(Module *M, bool AllowMulti) {
784-
NamedMDNode *NamedMD = M->getNamedMetadata(kSPIR2MD::OCLVer);
785-
if (!NamedMD)
784+
NamedMDNode *NamedMDOCLVer = M->getNamedMetadata(kSPIR2MD::OCLVer);
785+
NamedMDNode *NamedMDOCLCXXVer = M->getNamedMetadata(kSPIR2MD::OCLCXXVer);
786+
if (!NamedMDOCLVer && !NamedMDOCLCXXVer)
786787
return 0;
787-
assert(NamedMD->getNumOperands() > 0 && "Invalid SPIR");
788-
if (!AllowMulti && NamedMD->getNumOperands() != 1)
789-
report_fatal_error(
790-
llvm::Twine("Multiple OCL version metadata not allowed"));
791788

792789
// If the module was linked with another module, there may be multiple
793790
// operands.
794-
auto GetVer = [=](unsigned I) {
791+
auto GetVerPair = [](unsigned I, NamedMDNode *NamedMD) {
795792
auto *MD = NamedMD->getOperand(I);
796793
return std::make_pair(getMDOperandAsInt(MD, 0), getMDOperandAsInt(MD, 1));
797794
};
798-
auto Ver = GetVer(0);
799-
for (unsigned I = 1, E = NamedMD->getNumOperands(); I != E; ++I)
800-
if (Ver != GetVer(I))
801-
report_fatal_error(llvm::Twine("OCL version mismatch"));
802-
803-
return encodeOCLVer(Ver.first, Ver.second, 0);
795+
auto GetVer = [=](NamedMDNode *NamedMD) {
796+
assert(NamedMD->getNumOperands() && "Invalid SPIR");
797+
if (!AllowMulti && NamedMD->getNumOperands() != 1)
798+
report_fatal_error(
799+
llvm::Twine("Multiple OCL version metadata not allowed"));
800+
auto Ver = GetVerPair(0, NamedMD);
801+
for (unsigned I = 1, E = NamedMD->getNumOperands(); I != E; ++I)
802+
if (Ver != GetVerPair(I, NamedMD))
803+
report_fatal_error(llvm::Twine("OCL version mismatch"));
804+
return encodeOCLVer(Ver.first, Ver.second, 0);
805+
};
806+
unsigned OCLVer = NamedMDOCLVer ? GetVer(NamedMDOCLVer) : 0;
807+
unsigned OCLCXXVer = NamedMDOCLCXXVer ? GetVer(NamedMDOCLCXXVer) : 0;
808+
// Check if OCLCXXVer is compatible with OCLVer
809+
if (OCLVer && OCLCXXVer) {
810+
if ((OCLVer == kOCLVer::CL20 && OCLCXXVer == kOCLVer::CLCXX10) ||
811+
(OCLVer == kOCLVer::CL30 && OCLCXXVer == kOCLVer::CLCXX2021))
812+
return OCLCXXVer;
813+
report_fatal_error(llvm::Twine(
814+
"opencl cxx version is not compatible with opencl c version!"));
815+
}
816+
return OCLVer;
804817
}
805818

806819
SmallVector<unsigned, 3> decodeMDNode(MDNode *N) {

llvm-spirv/lib/SPIRV/OCLUtil.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,8 +351,9 @@ const OCLScopeKind OCLLegacyAtomicMemScope = OCLMS_work_group;
351351
namespace kOCLVer {
352352
const unsigned CL12 = 102000;
353353
const unsigned CL20 = 200000;
354-
const unsigned CL21 = 201000;
355354
const unsigned CL30 = 300000;
355+
const unsigned CLCXX10 = 100000;
356+
const unsigned CLCXX2021 = 202100000;
356357
} // namespace kOCLVer
357358

358359
namespace OclExt {

llvm-spirv/lib/SPIRV/PreprocessMetadata.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -295,12 +295,16 @@ void PreprocessMetadataBase::preprocessOCLMetadata(Module *M, SPIRVMDBuilder *B,
295295
// !{x} = !{i32 3, i32 102000}
296296
B->addNamedMD(kSPIRVMD::Source)
297297
.addOp()
298-
.add(CLVer == kOCLVer::CL21 ? spv::SourceLanguageOpenCL_CPP
299-
: spv::SourceLanguageOpenCL_C)
298+
.add(M->getNamedMetadata(kSPIR2MD::OCLCXXVer) &&
299+
(CLVer == kOCLVer::CLCXX10 || CLVer == kOCLVer::CLCXX2021)
300+
? spv::SourceLanguageCPP_for_OpenCL
301+
: spv::SourceLanguageOpenCL_C)
300302
.add(CLVer)
301303
.done();
302304
if (EraseOCLMD)
303-
B->eraseNamedMD(kSPIR2MD::OCLVer).eraseNamedMD(kSPIR2MD::SPIRVer);
305+
B->eraseNamedMD(kSPIR2MD::OCLVer)
306+
.eraseNamedMD(kSPIR2MD::SPIRVer)
307+
.eraseNamedMD(kSPIR2MD::OCLCXXVer);
304308

305309
// !spirv.MemoryModel = !{!x}
306310
// !{x} = !{i32 1, i32 2}

llvm-spirv/lib/SPIRV/SPIRVInternal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,7 @@ namespace kSPIR2MD {
402402
const static char Extensions[] = "opencl.used.extensions";
403403
const static char FPContract[] = "opencl.enable.FP_CONTRACT";
404404
const static char OCLVer[] = "opencl.ocl.version";
405+
const static char OCLCXXVer[] = "opencl.cxx.version";
405406
const static char OptFeatures[] = "opencl.used.optional.core.features";
406407
const static char SPIRVer[] = "opencl.spir.version";
407408
const static char VecTyHint[] = "vec_type_hint";

llvm-spirv/lib/SPIRV/SPIRVReader.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3475,7 +3475,8 @@ bool SPIRVToLLVM::translate() {
34753475
if (BM->getDesiredBIsRepresentation() == BIsRepresentation::SPIRVFriendlyIR) {
34763476
SPIRVWord SrcLangVer = 0;
34773477
BM->getSourceLanguage(&SrcLangVer);
3478-
bool IsCpp = SrcLangVer == kOCLVer::CL21;
3478+
bool IsCpp =
3479+
SrcLangVer == kOCLVer::CLCXX10 || SrcLangVer == kOCLVer::CLCXX2021;
34793480
if (!postProcessBuiltinsReturningStruct(M, IsCpp))
34803481
return false;
34813482
}
@@ -4821,7 +4822,7 @@ void SPIRVToLLVM::transSourceLanguage() {
48214822
SPIRVWord Ver = 0;
48224823
SourceLanguage Lang = BM->getSourceLanguage(&Ver);
48234824
if (Lang != SourceLanguageUnknown && // Allow unknown for debug info test
4824-
Lang != SourceLanguageOpenCL_C && Lang != SourceLanguageOpenCL_CPP)
4825+
Lang != SourceLanguageOpenCL_C && Lang != SourceLanguageCPP_for_OpenCL)
48254826
return;
48264827
unsigned short Major = 0;
48274828
unsigned char Minor = 0;
@@ -4835,7 +4836,15 @@ void SPIRVToLLVM::transSourceLanguage() {
48354836
else
48364837
addOCLVersionMetadata(Context, M, kSPIR2MD::SPIRVer, 2, 0);
48374838

4838-
addOCLVersionMetadata(Context, M, kSPIR2MD::OCLVer, Major, Minor);
4839+
if (Lang == SourceLanguageOpenCL_C) {
4840+
addOCLVersionMetadata(Context, M, kSPIR2MD::OCLVer, Major, Minor);
4841+
return;
4842+
}
4843+
if (Lang == SourceLanguageCPP_for_OpenCL) {
4844+
addOCLVersionMetadata(Context, M, kSPIR2MD::OCLCXXVer, Major, Minor);
4845+
addOCLVersionMetadata(Context, M, kSPIR2MD::OCLVer,
4846+
Ver == kOCLVer::CLCXX10 ? 2 : 3, 0);
4847+
}
48394848
}
48404849

48414850
bool SPIRVToLLVM::transSourceExtension() {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
; RUN: llvm-as < %s > %t.bc
2+
; RUN: llvm-spirv %t.bc -o %t.spv
3+
; RUN: llvm-spirv -to-text %t.spv -o %t.spt
4+
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
5+
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
6+
; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM
7+
8+
; CHECK-SPIRV: Source 3 200000
9+
; CHECK-LLVM-NOT: opencl.cxx.version
10+
; CHECK-LLVM: !spirv.Source = !{[[SPVSource:![0-9]+]]}
11+
; CHECK-LLVM: !opencl.ocl.version = !{[[OCLVer:![0-9]+]]}
12+
; CHECK-LLVM: [[SPVSource]] = !{i32 3, i32 200000}
13+
; CHECK-LLVM: [[OCLVer]] = !{i32 2, i32 0}
14+
15+
16+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-G1"
17+
target triple = "spir64-unknown-unknown"
18+
19+
!opencl.ocl.version = !{!0}
20+
!opencl.spir.version = !{!0}
21+
22+
!0 = !{i32 2, i32 0}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
; RUN: llvm-as < %s > %t.bc
2+
; RUN: llvm-spirv %t.bc -o %t.spv
3+
; RUN: llvm-spirv -to-text %t.spv -o %t.spt
4+
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
5+
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
6+
; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM
7+
8+
; CHECK-SPIRV: Source 6 100000
9+
; CHECK-LLVM: !spirv.Source = !{[[SPVSource:![0-9]+]]}
10+
; CHECK-LLVM: !opencl.cxx.version = !{[[OCLCXXVer:![0-9]+]]}
11+
; CHECK-LLVM: !opencl.ocl.version = !{[[OCLVer:![0-9]+]]}
12+
; CHECK-LLVM: [[SPVSource]] = !{i32 6, i32 100000}
13+
; CHECK-LLVM: [[OCLCXXVer]] = !{i32 1, i32 0}
14+
; CHECK-LLVM: [[OCLVer]] = !{i32 2, i32 0}
15+
16+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-G1"
17+
target triple = "spir64-unknown-unknown"
18+
19+
!opencl.ocl.version = !{!1}
20+
!opencl.cxx.version = !{!2}
21+
!opencl.spir.version = !{!1}
22+
23+
!1 = !{i32 2, i32 0}
24+
!2 = !{i32 1, i32 0}

0 commit comments

Comments
 (0)