|
| 1 | +From 0db501ebb43a5eec03469a226dc1822940e640b1 Mon Sep 17 00:00:00 2001 |
| 2 | +From: Ben Ashbaugh < [email protected]> |
| 3 | +Date: Wed, 23 Sep 2020 15:19:36 -0700 |
| 4 | +Subject: [PATCH] updates for OpenCL C 3.0 |
| 5 | + |
| 6 | +OpenCL C 3.0 is a derivative of OpenCL C 2.0 and not OpenCL C++. |
| 7 | +Run the OpenCL C++ passes for OpenCL 2.1 only, and run similar |
| 8 | +OpenCL C 2.0 passes for OpenCL C 3.0. |
| 9 | +--- |
| 10 | + lib/SPIRV/OCL20ToSPIRV.cpp | 5 +++-- |
| 11 | + lib/SPIRV/OCL21ToSPIRV.cpp | 2 +- |
| 12 | + lib/SPIRV/OCLUtil.h | 1 + |
| 13 | + lib/SPIRV/PreprocessMetadata.cpp | 4 ++-- |
| 14 | + 4 files changed, 7 insertions(+), 5 deletions(-) |
| 15 | + |
| 16 | +diff --git a/lib/SPIRV/OCL20ToSPIRV.cpp b/lib/SPIRV/OCL20ToSPIRV.cpp |
| 17 | +index 6137692..1262c48 100644 |
| 18 | +--- a/lib/SPIRV/OCL20ToSPIRV.cpp |
| 19 | ++++ b/lib/SPIRV/OCL20ToSPIRV.cpp |
| 20 | +@@ -346,7 +346,7 @@ bool OCL20ToSPIRV::runOnModule(Module &Module) { |
| 21 | + return false; |
| 22 | + |
| 23 | + CLVer = std::get<1>(Src); |
| 24 | +- if (CLVer > kOCLVer::CL20) |
| 25 | ++ if (CLVer == kOCLVer::CL21) |
| 26 | + return false; |
| 27 | + |
| 28 | + LLVM_DEBUG(dbgs() << "Enter OCL20ToSPIRV:\n"); |
| 29 | +@@ -426,7 +426,8 @@ void OCL20ToSPIRV::visitCallInst(CallInst &CI) { |
| 30 | + DemangledName == kOCLBuiltinName::AtomicCmpXchgStrong || |
| 31 | + DemangledName == kOCLBuiltinName::AtomicCmpXchgWeakExplicit || |
| 32 | + DemangledName == kOCLBuiltinName::AtomicCmpXchgStrongExplicit) { |
| 33 | +- assert(CLVer == kOCLVer::CL20 && "Wrong version of OpenCL"); |
| 34 | ++ assert((CLVer == kOCLVer::CL20 || CLVer == kOCLVer::CL30) && |
| 35 | ++ "Wrong version of OpenCL"); |
| 36 | + PCI = visitCallAtomicCmpXchg(PCI, DemangledName); |
| 37 | + } |
| 38 | + visitCallAtomicLegacy(PCI, MangledName, DemangledName); |
| 39 | +diff --git a/lib/SPIRV/OCL21ToSPIRV.cpp b/lib/SPIRV/OCL21ToSPIRV.cpp |
| 40 | +index 0cfc0b6..08215c1 100644 |
| 41 | +--- a/lib/SPIRV/OCL21ToSPIRV.cpp |
| 42 | ++++ b/lib/SPIRV/OCL21ToSPIRV.cpp |
| 43 | +@@ -109,7 +109,7 @@ bool OCL21ToSPIRV::runOnModule(Module &Module) { |
| 44 | + return false; |
| 45 | + |
| 46 | + CLVer = std::get<1>(Src); |
| 47 | +- if (CLVer < kOCLVer::CL21) |
| 48 | ++ if (CLVer != kOCLVer::CL21) |
| 49 | + return false; |
| 50 | + |
| 51 | + LLVM_DEBUG(dbgs() << "Enter OCL21ToSPIRV:\n"); |
| 52 | +diff --git a/lib/SPIRV/OCLUtil.h b/lib/SPIRV/OCLUtil.h |
| 53 | +index 6e9ce53..9e34d2d 100644 |
| 54 | +--- a/lib/SPIRV/OCLUtil.h |
| 55 | ++++ b/lib/SPIRV/OCLUtil.h |
| 56 | +@@ -256,6 +256,7 @@ namespace kOCLVer { |
| 57 | + const unsigned CL12 = 102000; |
| 58 | + const unsigned CL20 = 200000; |
| 59 | + const unsigned CL21 = 201000; |
| 60 | ++const unsigned CL30 = 300000; |
| 61 | + } // namespace kOCLVer |
| 62 | + |
| 63 | + namespace OclExt { |
| 64 | +diff --git a/lib/SPIRV/PreprocessMetadata.cpp b/lib/SPIRV/PreprocessMetadata.cpp |
| 65 | +index 0b908ac..e92ad36 100644 |
| 66 | +--- a/lib/SPIRV/PreprocessMetadata.cpp |
| 67 | ++++ b/lib/SPIRV/PreprocessMetadata.cpp |
| 68 | +@@ -208,8 +208,8 @@ void PreprocessMetadata::preprocessOCLMetadata(Module *M, SPIRVMDBuilder *B, |
| 69 | + // !{x} = !{i32 3, i32 102000} |
| 70 | + B->addNamedMD(kSPIRVMD::Source) |
| 71 | + .addOp() |
| 72 | +- .add(CLVer < kOCLVer::CL21 ? spv::SourceLanguageOpenCL_C |
| 73 | +- : spv::SourceLanguageOpenCL_CPP) |
| 74 | ++ .add(CLVer == kOCLVer::CL21 ? spv::SourceLanguageOpenCL_CPP |
| 75 | ++ : spv::SourceLanguageOpenCL_C) |
| 76 | + .add(CLVer) |
| 77 | + .done(); |
| 78 | + if (EraseOCLMD) |
| 79 | +-- |
| 80 | +2.20.1 |
| 81 | + |
0 commit comments