From 61a10b27604bc4a9f6840f8fad82b779e708a279 Mon Sep 17 00:00:00 2001 From: Ben Ashbaugh Date: Wed, 23 Sep 2020 15:19:36 -0700 Subject: [PATCH] updates for OpenCL C 3.0 OpenCL C 3.0 is a derivative of OpenCL C 2.0 and not OpenCL C++. Run the OpenCL C++ passes for OpenCL 2.1 only, and run similar OpenCL C 2.0 passes for OpenCL C 3.0. (cherry picked from commit 9ede94ccc038a54e6b308d594ffa341894f19369) --- lib/SPIRV/OCL20ToSPIRV.cpp | 5 +++-- lib/SPIRV/OCL21ToSPIRV.cpp | 2 +- lib/SPIRV/OCLUtil.h | 1 + lib/SPIRV/PreprocessMetadata.cpp | 4 ++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/SPIRV/OCL20ToSPIRV.cpp b/lib/SPIRV/OCL20ToSPIRV.cpp index c9796414c8..a5e1df7f92 100644 --- a/lib/SPIRV/OCL20ToSPIRV.cpp +++ b/lib/SPIRV/OCL20ToSPIRV.cpp @@ -330,7 +330,7 @@ bool OCL20ToSPIRV::runOnModule(Module &Module) { return false; CLVer = std::get<1>(Src); - if (CLVer > kOCLVer::CL20) + if (CLVer == kOCLVer::CL21) return false; LLVM_DEBUG(dbgs() << "Enter OCL20ToSPIRV:\n"); @@ -410,7 +410,8 @@ void OCL20ToSPIRV::visitCallInst(CallInst &CI) { DemangledName == kOCLBuiltinName::AtomicCmpXchgStrong || DemangledName == kOCLBuiltinName::AtomicCmpXchgWeakExplicit || DemangledName == kOCLBuiltinName::AtomicCmpXchgStrongExplicit) { - assert(CLVer == kOCLVer::CL20 && "Wrong version of OpenCL"); + assert((CLVer == kOCLVer::CL20 || CLVer == kOCLVer::CL30) && + "Wrong version of OpenCL"); PCI = visitCallAtomicCmpXchg(PCI); } visitCallAtomicLegacy(PCI, MangledName, DemangledName); diff --git a/lib/SPIRV/OCL21ToSPIRV.cpp b/lib/SPIRV/OCL21ToSPIRV.cpp index 6ec3a41b46..16cc1aaa0f 100644 --- a/lib/SPIRV/OCL21ToSPIRV.cpp +++ b/lib/SPIRV/OCL21ToSPIRV.cpp @@ -108,7 +108,7 @@ bool OCL21ToSPIRV::runOnModule(Module &Module) { return false; CLVer = std::get<1>(Src); - if (CLVer < kOCLVer::CL21) + if (CLVer != kOCLVer::CL21) return false; LLVM_DEBUG(dbgs() << "Enter OCL21ToSPIRV:\n"); diff --git a/lib/SPIRV/OCLUtil.h b/lib/SPIRV/OCLUtil.h index a6b5fbedcb..0e5af3c448 100644 --- a/lib/SPIRV/OCLUtil.h +++ b/lib/SPIRV/OCLUtil.h @@ -309,6 +309,7 @@ namespace kOCLVer { const unsigned CL12 = 102000; const unsigned CL20 = 200000; const unsigned CL21 = 201000; +const unsigned CL30 = 300000; } // namespace kOCLVer namespace OclExt { diff --git a/lib/SPIRV/PreprocessMetadata.cpp b/lib/SPIRV/PreprocessMetadata.cpp index 145b5f60e9..60e53f6816 100644 --- a/lib/SPIRV/PreprocessMetadata.cpp +++ b/lib/SPIRV/PreprocessMetadata.cpp @@ -212,8 +212,8 @@ void PreprocessMetadata::preprocessOCLMetadata(Module *M, SPIRVMDBuilder *B, // !{x} = !{i32 3, i32 102000} B->addNamedMD(kSPIRVMD::Source) .addOp() - .add(CLVer < kOCLVer::CL21 ? spv::SourceLanguageOpenCL_C - : spv::SourceLanguageOpenCL_CPP) + .add(CLVer == kOCLVer::CL21 ? spv::SourceLanguageOpenCL_CPP + : spv::SourceLanguageOpenCL_C) .add(CLVer) .done(); if (EraseOCLMD)