Pushed, thanks.
> -----Original Message----- > From: Song, Ruiling > Sent: Tuesday, September 27, 2016 16:00 > To: Yang, Rong R <[email protected]> > Cc: Pan, Xiuli <[email protected]>; [email protected] > Subject: RE: [Beignet] [PATCH V2 5/5] Backend: Add support for LLVM 3.9 > release > > Hi Rong, > > The patchset is good, I think we can merge it. > > Thanks! > Ruiling > > > -----Original Message----- > > From: Beignet [mailto:[email protected]] On Behalf > > Of Xiuli Pan > > Sent: Tuesday, September 27, 2016 1:11 PM > > To: [email protected] > > Cc: Pan, Xiuli <[email protected]> > > Subject: [Beignet] [PATCH V2 5/5] Backend: Add support for LLVM 3.9 > > release > > > > From: Pan Xiuli <[email protected]> > > > > 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 <[email protected]> > > --- > > 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 > > [email protected] > > https://lists.freedesktop.org/mailman/listinfo/beignet _______________________________________________ Beignet mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/beignet
