[Beignet] [PATCH V2 5/5] Backend: Add support for LLVM 3.9 release
Song, Ruiling
ruiling.song at intel.com
Tue Sep 27 07:59:35 UTC 2016
Hi Rong,
The patchset is good, I think we can merge it.
Thanks!
Ruiling
> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Xiuli Pan
> Sent: Tuesday, September 27, 2016 1:11 PM
> To: beignet at lists.freedesktop.org
> Cc: Pan, Xiuli <xiuli.pan at intel.com>
> Subject: [Beignet] [PATCH V2 5/5] Backend: Add support for LLVM 3.9 release
>
> From: Pan Xiuli <xiuli.pan at intel.com>
>
> LLVM 3.9 changes a lot from 3.8, modify on:
> 1. API getGlobalContext was removed, add GBEGetLLVMContext instead
> 2. API LLVMLinkModules was removed, use LLVMLinkModules2 instead.
> 3. LLVMLinkModules2 now will delete src module for default, clone all
> src module and kernel names.
> 4. Few LLVM pass refine, change include headers and creadpass API.
> 5. clang refine image type name, change llvminfo check for image.
> 6. clang change kernel arg info metadata and some other metadata to
> function metadata, refine metedata query function logic.
> 7. clang default define most cl_khr_* macro, need to undef them first.
> 8. SPIR mangle was changed by a fix patch for Itanium mangle, now most
> SPIR can not be recognized by LLVM 3.9.
>
> V2: Merge some code.
> Signed-off-by: Pan Xiuli <xiuli.pan at intel.com>
> ---
> backend/src/backend/gen_program.cpp | 13 +++-
> backend/src/backend/program.cpp | 10 +++
> backend/src/ir/function.hpp | 12 +--
> backend/src/libocl/include/ocl.h | 75 ++++++++++++++++++
> backend/src/libocl/tmpl/ocl_defines.tmpl.h | 11 ---
> backend/src/llvm/llvm_bitcode_link.cpp | 26 ++++++-
> backend/src/llvm/llvm_gen_backend.cpp | 119
> ++++++++++++++++++++++++++---
> backend/src/llvm/llvm_includes.hpp | 5 ++
> backend/src/llvm/llvm_passes.cpp | 6 +-
> backend/src/llvm/llvm_to_gen.cpp | 19 ++++-
> backend/src/llvm/llvm_to_gen.hpp | 6 ++
> 11 files changed, 272 insertions(+), 30 deletions(-)
>
> diff --git a/backend/src/backend/gen_program.cpp
> b/backend/src/backend/gen_program.cpp
> index 32f7794..4ef82d1 100644
> --- a/backend/src/backend/gen_program.cpp
> +++ b/backend/src/backend/gen_program.cpp
> @@ -334,7 +334,11 @@ namespace gbe {
> //the first byte stands for binary_type.
> binary_content.assign(binary+1, size-1);
> llvm::StringRef llvm_bin_str(binary_content);
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9
> + llvm::LLVMContext& c = GBEGetLLVMContext();
> +#else
> llvm::LLVMContext& c = llvm::getGlobalContext();
> +#endif
> llvm::SMDiagnostic Err;
> #if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 6
> std::unique_ptr<llvm::MemoryBuffer> memory_buffer =
> llvm::MemoryBuffer::getMemBuffer(llvm_bin_str, "llvm_bin_str");
> @@ -488,10 +492,17 @@ namespace gbe {
> #endif
> errSize = 0;
> }else{
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9
> + // Src now will be removed automatically. So clone it.
> + llvm::Module* src =
> llvm::CloneModule((llvm::Module*)((GenProgram*)src_program)-
> >module).release();
> +#else
> llvm::Module* src = (llvm::Module*)((GenProgram*)src_program)-
> >module;
> +#endif
> llvm::Module* dst = (llvm::Module*)((GenProgram*)dst_program)-
> >module;
>
> -#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9
> + if (LLVMLinkModules2(wrap(dst), wrap(src))) {
> +#elif LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> if (LLVMLinkModules(wrap(dst), wrap(src),
> LLVMLinkerPreserveSource_Removed, &errMsg)) {
> #else
> if (LLVMLinkModules(wrap(dst), wrap(src), LLVMLinkerPreserveSource,
> &errMsg)) {
> diff --git a/backend/src/backend/program.cpp
> b/backend/src/backend/program.cpp
> index b7dc00e..2224880 100644
> --- a/backend/src/backend/program.cpp
> +++ b/backend/src/backend/program.cpp
> @@ -133,7 +133,13 @@ namespace gbe {
> bool strictMath = true;
> if (fast_relaxed_math || !OCL_STRICT_CONFORMANCE)
> strictMath = false;
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9
> + llvm::Module * linked_module = module ?
> llvm::CloneModule((llvm::Module*)module).release() : NULL;
> + // Src now will be removed automatically. So clone it.
> + if (llvmToGen(*unit, fileName, linked_module, optLevel, strictMath,
> OCL_PROFILING_LOG, error) == false) {
> +#else
> if (llvmToGen(*unit, fileName, module, optLevel, strictMath,
> OCL_PROFILING_LOG, error) == false) {
> +#endif
> if (fileName)
> error = std::string(fileName) + " not found";
> delete unit;
> @@ -1057,7 +1063,11 @@ EXTEND_QUOTE:
> //FIXME: if use new allocated context to link two modules there would be
> context mismatch
> //for some functions, so we use global context now, need switch to new
> context later.
> llvm::Module * out_module;
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9
> + llvm::LLVMContext* llvm_ctx = &GBEGetLLVMContext();
> +#else
> llvm::LLVMContext* llvm_ctx = &llvm::getGlobalContext();
> +#endif
>
> if (buildModuleFromSource(source, &out_module, llvm_ctx,
> dumpLLVMFileName, dumpSPIRBinaryName, clOpt,
> stringSize, err, errSize)) {
> diff --git a/backend/src/ir/function.hpp b/backend/src/ir/function.hpp
> index ae0a702..71a6d07 100644
> --- a/backend/src/ir/function.hpp
> +++ b/backend/src/ir/function.hpp
> @@ -208,22 +208,22 @@ namespace ir {
> }
> #else
> bool isImage1dT() const {
> - return typeBaseName.compare("image1d_t") == 0;
> + return typeBaseName.find("image1d_t") !=std::string::npos;
> }
> bool isImage1dArrayT() const {
> - return typeBaseName.compare("image1d_array_t") == 0;
> + return typeBaseName.find("image1d_array_t") !=std::string::npos;
> }
> bool isImage1dBufferT() const {
> - return typeBaseName.compare("image1d_buffer_t") == 0;
> + return typeBaseName.find("image1d_buffer_t") !=std::string::npos;
> }
> bool isImage2dT() const {
> - return typeBaseName.compare("image2d_t") == 0;
> + return typeBaseName.find("image2d_t") !=std::string::npos;
> }
> bool isImage2dArrayT() const {
> - return typeBaseName.compare("image2d_array_t") == 0;
> + return typeBaseName.find("image2d_array_t") !=std::string::npos;
> }
> bool isImage3dT() const {
> - return typeBaseName.compare("image3d_t") == 0;
> + return typeBaseName.find("image3d_t") !=std::string::npos;
> }
> bool isSamplerType() const {
> return typeBaseName.compare("sampler_t") == 0;
> diff --git a/backend/src/libocl/include/ocl.h
> b/backend/src/libocl/include/ocl.h
> index abb2bd4..5e3a788 100644
> --- a/backend/src/libocl/include/ocl.h
> +++ b/backend/src/libocl/include/ocl.h
> @@ -18,6 +18,67 @@
> #ifndef __OCL_H__
> #define __OCL_H__
>
> +/* LLVM 3.9 has these pre defined undef them first */
> +#ifdef cl_khr_3d_image_writes
> +#undef cl_khr_3d_image_writes
> +#endif
> +#ifdef cl_khr_byte_addressable_store
> +#undef cl_khr_byte_addressable_store
> +#endif
> +#ifdef cl_khr_fp16
> +#undef cl_khr_fp16
> +#endif
> +#ifdef cl_khr_fp64
> +#undef cl_khr_fp64
> +#endif
> +#ifdef cl_khr_global_int32_base_atomics
> +#undef cl_khr_global_int32_base_atomics
> +#endif
> +#ifdef cl_khr_global_int32_extended_atomics
> +#undef cl_khr_global_int32_extended_atomics
> +#endif
> +#ifdef cl_khr_gl_sharing
> +#undef cl_khr_gl_sharing
> +#endif
> +#ifdef cl_khr_icd
> +#undef cl_khr_icd
> +#endif
> +#ifdef cl_khr_local_int32_base_atomics
> +#undef cl_khr_local_int32_base_atomics
> +#endif
> +#ifdef cl_khr_local_int32_extended_atomics
> +#undef cl_khr_local_int32_extended_atomics
> +#endif
> +
> +#ifdef cl_khr_d3d10_sharing
> +#undef cl_khr_d3d10_sharing
> +#endif
> +#ifdef cl_khr_gl_event
> +#undef cl_khr_gl_event
> +#endif
> +#ifdef cl_khr_int64_base_atomics
> +#undef cl_khr_int64_base_atomics
> +#endif
> +#ifdef cl_khr_int64_extended_atomics
> +#undef cl_khr_int64_extended_atomics
> +#endif
> +
> +#ifdef cl_khr_d3d11_sharing
> +#undef cl_khr_d3d11_sharing
> +#endif
> +#ifdef cl_khr_depth_images
> +#undef cl_khr_depth_images
> +#endif
> +#ifdef cl_khr_dx9_media_sharing
> +#undef cl_khr_dx9_media_sharing
> +#endif
> +#ifdef cl_khr_gl_depth_images
> +#undef cl_khr_gl_depth_images
> +#endif
> +#ifdef cl_khr_spir
> +#undef cl_khr_spir
> +#endif
> +
> #include "ocl_defines.h"
> #include "ocl_types.h"
> #include "ocl_as.h"
> @@ -40,6 +101,20 @@
> #include "ocl_workitem.h"
> #include "ocl_simd.h"
> #include "ocl_work_group.h"
> +
> +/* Move these out from ocl_defines.h for only one define */
> +#define cl_khr_global_int32_base_atomics
> +#define cl_khr_global_int32_extended_atomics
> +#define cl_khr_local_int32_base_atomics
> +#define cl_khr_local_int32_extended_atomics
> +#define cl_khr_byte_addressable_store
> +#define cl_khr_icd
> +#define cl_khr_gl_sharing
> +#define cl_khr_spir
> +#define cl_khr_fp16
> +#define cl_khr_3d_image_writes
> +#define cl_intel_subgroups
> +
> #pragma OPENCL EXTENSION cl_khr_fp64 : disable
> #pragma OPENCL EXTENSION cl_khr_fp16 : disable
> #endif
> diff --git a/backend/src/libocl/tmpl/ocl_defines.tmpl.h
> b/backend/src/libocl/tmpl/ocl_defines.tmpl.h
> index 8c7d08f..f840a82 100644
> --- a/backend/src/libocl/tmpl/ocl_defines.tmpl.h
> +++ b/backend/src/libocl/tmpl/ocl_defines.tmpl.h
> @@ -27,16 +27,5 @@
> #define __kernel_exec(X, TYPE) __kernel
> __attribute__((work_group_size_hint(X,1,1))) \
> __attribute__((vec_type_hint(TYPE)))
> #define kernel_exec(X, TYPE) __kernel_exec(X, TYPE)
> -#define cl_khr_global_int32_base_atomics
> -#define cl_khr_global_int32_extended_atomics
> -#define cl_khr_local_int32_base_atomics
> -#define cl_khr_local_int32_extended_atomics
> -#define cl_khr_byte_addressable_store
> -#define cl_khr_icd
> -#define cl_khr_gl_sharing
> -#define cl_khr_spir
> -#define cl_khr_fp16
> -#define cl_khr_3d_image_writes
> -#define cl_intel_subgroups
>
> #endif /* end of __OCL_COMMON_DEF_H__ */
> diff --git a/backend/src/llvm/llvm_bitcode_link.cpp
> b/backend/src/llvm/llvm_bitcode_link.cpp
> index 748a7fe..a3f9886 100644
> --- a/backend/src/llvm/llvm_bitcode_link.cpp
> +++ b/backend/src/llvm/llvm_bitcode_link.cpp
> @@ -145,6 +145,7 @@ namespace gbe
> return NULL;
>
> std::vector<const char *> kernels;
> + std::vector<const char *> kerneltmp;
> std::vector<const char *> builtinFuncs;
> /* Add the memset and memcpy functions here. */
> builtinFuncs.push_back("__gen_memcpy_gg");
> @@ -184,7 +185,12 @@ namespace gbe
> for (Module::iterator SF = mod->begin(), E = mod->end(); SF != E; ++SF) {
> if (SF->isDeclaration()) continue;
> if (!isKernelFunction(*SF)) continue;
> - kernels.push_back(SF->getName().data());
> + // mod will be deleted after link, copy the names.
> + const char *funcName = SF->getName().data();
> + char * tmp = new char[strlen(funcName)+1];
> + strcpy(tmp,funcName);
> + kernels.push_back(tmp);
> + kerneltmp.push_back(tmp);
>
> if (!materializedFuncCall(*mod, *clonedLib, *SF, materializedFuncs, Gvs))
> {
> delete clonedLib;
> @@ -273,7 +279,11 @@ namespace gbe
> /* We use beignet's bitcode as dst because it will have a lot of
> lazy functions which will not be loaded. */
> char* errorMsg;
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9
> + if(LLVMLinkModules2(wrap(clonedLib), wrap(mod))) {
> +#else
> if(LLVMLinkModules(wrap(clonedLib), wrap(mod),
> LLVMLinkerDestroySource, &errorMsg)) {
> +#endif
> delete clonedLib;
> printf("Fatal Error: link the bitcode error:\n%s\n", errorMsg);
> return NULL;
> @@ -284,11 +294,25 @@ namespace gbe
> llvm::PassManager passes;
> #endif
>
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >=9
> + auto PreserveKernel = [=](const GlobalValue &GV) {
> + for(size_t i = 0;i < kernels.size(); ++i)
> + if(strcmp(GV.getName().data(), kernels[i]))
> + return true;
> + return false;
> + };
> +
> + passes.add(createInternalizePass(PreserveKernel));
> +#else
> passes.add(createInternalizePass(kernels));
> +#endif
> passes.add(createGlobalDCEPass());
>
> passes.run(*clonedLib);
>
> + for(size_t i = 0;i < kerneltmp.size(); i++)
> + delete[] kerneltmp[i];
> +
> return clonedLib;
> }
>
> diff --git a/backend/src/llvm/llvm_gen_backend.cpp
> b/backend/src/llvm/llvm_gen_backend.cpp
> index 7005d60..0570766 100644
> --- a/backend/src/llvm/llvm_gen_backend.cpp
> +++ b/backend/src/llvm/llvm_gen_backend.cpp
> @@ -1230,6 +1230,10 @@ namespace gbe
> }
> MDNode *typeNameNode = NULL;
> MDNode *typeBaseNameNode = NULL;
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9
> + typeNameNode = F.getMetadata("kernel_arg_type");
> + typeBaseNameNode = F.getMetadata("kernel_arg_base_type");
> +#else
> MDNode *node = getKernelFunctionMetadata(&F);
> for(uint j = 0;node && j < node->getNumOperands() - 1; j++) {
> MDNode *attrNode = dyn_cast_or_null<MDNode>(node->getOperand(1
> + j));
> @@ -1243,15 +1247,21 @@ namespace gbe
> typeBaseNameNode = attrNode;
> }
> }
> +#endif
>
> unsigned argID = 0;
> ir::FunctionArgument::InfoFromLLVM llvmInfo;
> for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I,
> argID++) {
> + unsigned opID = argID;
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR < 9
> + opID += 1;
> +#endif
> +
> if(typeNameNode) {
> - llvmInfo.typeName= (cast<MDString>(typeNameNode->getOperand(1 +
> argID)))->getString();
> + llvmInfo.typeName= (cast<MDString>(typeNameNode-
> >getOperand(opID)))->getString();
> }
> if(typeBaseNameNode) {
> - llvmInfo.typeBaseName= (cast<MDString>(typeBaseNameNode-
> >getOperand(1 + argID)))->getString();
> + llvmInfo.typeBaseName= (cast<MDString>(typeBaseNameNode-
> >getOperand(opID)))->getString();
> }
> bool isImage = llvmInfo.isImageType();
> if (I->getType()->isPointerTy() || isImage) {
> @@ -1974,6 +1984,92 @@ namespace gbe
>
> std::string functionAttributes;
>
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9
> + /* LLVM 3.9 change kernel arg info as function metadata */
> + addrSpaceNode = F.getMetadata("kernel_arg_addr_space");
> + accessQualNode = F.getMetadata("kernel_arg_access_qual");
> + typeNameNode = F.getMetadata("kernel_arg_type");
> + typeBaseNameNode = F.getMetadata("kernel_arg_base_type");
> + typeQualNode = F.getMetadata("kernel_arg_type_qual");
> + argNameNode = F.getMetadata("kernel_arg_name");
> + MDNode *attrNode;
> + if ((attrNode = F.getMetadata("vec_type_hint"))) {
> + GBE_ASSERT(attrNode->getNumOperands() == 2);
> + functionAttributes += "vec_type_hint";
> + auto *Op1 = cast<ValueAsMetadata>(attrNode->getOperand(0));
> + Value *V = Op1 ? Op1->getValue() : NULL;
> + ConstantInt *sign =
> + mdconst::extract<ConstantInt>(attrNode->getOperand(1));
> + size_t signValue = sign->getZExtValue();
> + Type *vtype = V->getType();
> + Type *stype = vtype;
> + uint32_t elemNum = 0;
> + if (vtype->isVectorTy()) {
> + VectorType *vectorType = cast<VectorType>(vtype);
> + stype = vectorType->getElementType();
> + elemNum = vectorType->getNumElements();
> + }
> +
> + std::string typeName = getTypeName(ctx, stype, signValue);
> +
> + std::stringstream param;
> + char buffer[100] = {0};
> + param << "(";
> + param << typeName;
> + if (vtype->isVectorTy())
> + param << elemNum;
> + param << ")";
> + param >> buffer;
> + functionAttributes += buffer;
> + functionAttributes += " ";
> + }
> + if ((attrNode = F.getMetadata("reqd_work_group_size"))) {
> + GBE_ASSERT(attrNode->getNumOperands() == 3);
> + ConstantInt *x = mdconst::extract<ConstantInt>(attrNode-
> >getOperand(0));
> + ConstantInt *y = mdconst::extract<ConstantInt>(attrNode-
> >getOperand(1));
> + ConstantInt *z = mdconst::extract<ConstantInt>(attrNode-
> >getOperand(2));
> + GBE_ASSERT(x && y && z);
> + reqd_wg_sz[0] = x->getZExtValue();
> + reqd_wg_sz[1] = y->getZExtValue();
> + reqd_wg_sz[2] = z->getZExtValue();
> + functionAttributes += "reqd_work_group_size";
> + std::stringstream param;
> + char buffer[100] = {0};
> + param << "(";
> + param << reqd_wg_sz[0];
> + param << ",";
> + param << reqd_wg_sz[1];
> + param << ",";
> + param << reqd_wg_sz[2];
> + param << ")";
> + param >> buffer;
> + functionAttributes += buffer;
> + functionAttributes += " ";
> + }
> + if ((attrNode = F.getMetadata("work_group_size_hint"))) {
> + GBE_ASSERT(attrNode->getNumOperands() == 3);
> + ConstantInt *x = mdconst::extract<ConstantInt>(attrNode-
> >getOperand(0));
> + ConstantInt *y = mdconst::extract<ConstantInt>(attrNode-
> >getOperand(1));
> + ConstantInt *z = mdconst::extract<ConstantInt>(attrNode-
> >getOperand(2));
> + GBE_ASSERT(x && y && z);
> + hint_wg_sz[0] = x->getZExtValue();
> + hint_wg_sz[1] = y->getZExtValue();
> + hint_wg_sz[2] = z->getZExtValue();
> + functionAttributes += "work_group_size_hint";
> + std::stringstream param;
> + char buffer[100] = {0};
> + param << "(";
> + param << hint_wg_sz[0];
> + param << ",";
> + param << hint_wg_sz[1];
> + param << ",";
> + param << hint_wg_sz[2];
> + param << ")";
> + param >> buffer;
> + functionAttributes += buffer;
> + functionAttributes += " ";
> + }
> +#else
> /* First find the meta data belong to this function. */
> MDNode *node = getKernelFunctionMetadata(&F);
>
> @@ -2095,6 +2191,7 @@ namespace gbe
> functionAttributes += " ";
> }
> }
> +#endif /* LLVM 3.9 Function metadata */
>
> ctx.getFunction().setCompileWorkGroupSize(reqd_wg_sz[0],
> reqd_wg_sz[1], reqd_wg_sz[2]);
>
> @@ -2110,29 +2207,33 @@ namespace gbe
> const AttrListPtr &PAL = F.getAttributes();
> #endif /* LLVM_VERSION_MINOR <= 1 */
> for (; I != E; ++I, ++argID) {
> + uint32_t opID = argID;
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR < 9
> + opID += 1;
> +#endif
> const std::string &argName = I->getName().str();
> Type *type = I->getType();
> if(addrSpaceNode) {
> #if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR <= 5
> - llvmInfo.addrSpace = (cast<ConstantInt>(addrSpaceNode-
> >getOperand(1 + argID)))->getZExtValue();
> + llvmInfo.addrSpace = (cast<ConstantInt>(addrSpaceNode-
> >getOperand(opID)))->getZExtValue();
> #else
> - llvmInfo.addrSpace = (mdconst::extract<ConstantInt>(addrSpaceNode-
> >getOperand(1 + argID)))->getZExtValue();
> + llvmInfo.addrSpace =
> (mdconst::extract<ConstantInt>(addrSpaceNode->getOperand(opID)))-
> >getZExtValue();
> #endif
> }
> if(typeNameNode) {
> - llvmInfo.typeName = (cast<MDString>(typeNameNode->getOperand(1
> + argID)))->getString();
> + llvmInfo.typeName = (cast<MDString>(typeNameNode-
> >getOperand(opID)))->getString();
> }
> if(typeBaseNameNode){
> - llvmInfo.typeBaseName = (cast<MDString>(typeBaseNameNode-
> >getOperand(1 + argID)))->getString();
> + llvmInfo.typeBaseName = (cast<MDString>(typeBaseNameNode-
> >getOperand(opID)))->getString();
> }
> if(accessQualNode) {
> - llvmInfo.accessQual = (cast<MDString>(accessQualNode-
> >getOperand(1 + argID)))->getString();
> + llvmInfo.accessQual = (cast<MDString>(accessQualNode-
> >getOperand(opID)))->getString();
> }
> if(typeQualNode) {
> - llvmInfo.typeQual = (cast<MDString>(typeQualNode->getOperand(1 +
> argID)))->getString();
> + llvmInfo.typeQual = (cast<MDString>(typeQualNode-
> >getOperand(opID)))->getString();
> }
> if(argNameNode){
> - llvmInfo.argName = (cast<MDString>(argNameNode->getOperand(1 +
> argID)))->getString();
> + llvmInfo.argName = (cast<MDString>(argNameNode-
> >getOperand(opID)))->getString();
> }
>
> // function arguments are uniform values.
> diff --git a/backend/src/llvm/llvm_includes.hpp
> b/backend/src/llvm/llvm_includes.hpp
> index d2deb90..0b80979 100644
> --- a/backend/src/llvm/llvm_includes.hpp
> +++ b/backend/src/llvm/llvm_includes.hpp
> @@ -127,4 +127,9 @@
> #include "llvm/Analysis/TypeBasedAliasAnalysis.h"
> #endif
>
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9
> +#include "llvm/Transforms/IPO/FunctionAttrs.h"
> +#include "llvm/Transforms/Scalar/GVN.h"
> +#endif
> +
> #endif /* __GBE_IR_LLVM_INCLUDES_HPP__ */
> diff --git a/backend/src/llvm/llvm_passes.cpp
> b/backend/src/llvm/llvm_passes.cpp
> index b925e5f..02dd4bf 100644
> --- a/backend/src/llvm/llvm_passes.cpp
> +++ b/backend/src/llvm/llvm_passes.cpp
> @@ -41,9 +41,12 @@ using namespace llvm;
> namespace gbe
> {
> bool isKernelFunction(const llvm::Function &F) {
> + bool bKernel = false;
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9
> + bKernel = F.getMetadata("kernel_arg_name") != NULL;
> +#else
> const Module *module = F.getParent();
> const Module::NamedMDListType& globalMD = module-
> >getNamedMDList();
> - bool bKernel = false;
> for(auto i = globalMD.begin(); i != globalMD.end(); i++) {
> const NamedMDNode &md = *i;
> if(strcmp(md.getName().data(), "opencl.kernels") != 0) continue;
> @@ -58,6 +61,7 @@ namespace gbe
> if(op == &F) bKernel = true;
> }
> }
> +#endif
> return bKernel;
> }
>
> diff --git a/backend/src/llvm/llvm_to_gen.cpp
> b/backend/src/llvm/llvm_to_gen.cpp
> index 02a69ec..e108810 100644
> --- a/backend/src/llvm/llvm_to_gen.cpp
> +++ b/backend/src/llvm/llvm_to_gen.cpp
> @@ -46,6 +46,13 @@ namespace gbe
> BVAR(OCL_OUTPUT_CFG_GEN_IR, false);
> using namespace llvm;
>
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9
> + llvm::LLVMContext& GBEGetLLVMContext() {
> + static llvm::LLVMContext GBEContext;
> + return GBEContext;
> + }
> +#endif
> +
> #if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> #define TARGETLIBRARY TargetLibraryInfoImpl
> #else
> @@ -142,7 +149,9 @@ namespace gbe
> MPM.add(createBarrierNodupPass(false)); // remove noduplicate fnAttr
> before inlining.
> MPM.add(createFunctionInliningPass(20000));
> MPM.add(createBarrierNodupPass(true)); // restore noduplicate fnAttr
> after inlining.
> -#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 8
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9
> + MPM.add(createPostOrderFunctionAttrsLegacyPass());
> +#elif LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 8
> MPM.add(createPostOrderFunctionAttrsPass()); // Set
> readonly/readnone attrs
> #else
> MPM.add(createFunctionAttrsPass()); // Set readonly/readnone attrs
> @@ -294,7 +303,11 @@ namespace gbe
> if (module) {
> cl_mod = reinterpret_cast<Module*>(const_cast<void*>(module));
> } else if (fileName){
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9
> + llvm::LLVMContext& c = GBEGetLLVMContext();
> +#else
> llvm::LLVMContext& c = llvm::getGlobalContext();
> +#endif
> #if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 6
> cl_mod = parseIRFile(fileName, Err, c).release();
> #else
> @@ -349,7 +362,11 @@ namespace gbe
> passes.add(createIntrinsicLoweringPass());
> passes.add(createStripAttributesPass()); // Strip unsupported attributes
> and calling conventions.
> passes.add(createFunctionInliningPass(20000));
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7
> + passes.add(createSROAPass());
> +#else
> passes.add(createScalarReplAggregatesPass(64, true, -1, -1, 64));
> +#endif
> passes.add(createLoadStoreOptimizationPass());
> passes.add(createConstantPropagationPass());
> passes.add(createPromoteMemoryToRegisterPass());
> diff --git a/backend/src/llvm/llvm_to_gen.hpp
> b/backend/src/llvm/llvm_to_gen.hpp
> index e0a6145..d3928c6 100644
> --- a/backend/src/llvm/llvm_to_gen.hpp
> +++ b/backend/src/llvm/llvm_to_gen.hpp
> @@ -23,6 +23,9 @@
> */
> #ifndef __GBE_IR_LLVM_TO_GEN_HPP__
> #define __GBE_IR_LLVM_TO_GEN_HPP__
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9
> +#include "llvm/IR/LLVMContext.h"
> +#endif
>
> namespace gbe {
> namespace ir {
> @@ -34,6 +37,9 @@ namespace gbe {
> optLevel 0 equal to clang -O1 and 1 equal to clang -O2*/
> bool llvmToGen(ir::Unit &unit, const char *fileName, const void* module,
> int optLevel, bool strictMath, int profiling, std::string &errors);
> +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9
> + extern llvm::LLVMContext& GBEGetLLVMContext();
> +#endif
>
> } /* namespace gbe */
>
> --
> 2.7.4
>
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/beignet
More information about the Beignet
mailing list