summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPan Xiuli <xiuli.pan@intel.com>2016-09-27 13:11:09 +0800
committerYang Rong <rong.r.yang@intel.com>2016-10-21 12:39:52 +0800
commit1eab14249cf38f2ae614a5f243adda3d7b8e0f0d (patch)
treebdd1693339c1a85e4ab575c3006a4117d5cc3b1c
parent4767ac9c4106c1cccf9e2a9d15323f5861c49f4e (diff)
Backend: Add support for LLVM 3.9 release
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@intel.com> Reviewed-by: Ruiling Song <ruiling.song@intel.com>
-rw-r--r--backend/src/backend/gen_program.cpp13
-rw-r--r--backend/src/backend/program.cpp10
-rw-r--r--backend/src/ir/function.hpp12
-rw-r--r--backend/src/libocl/include/ocl.h75
-rw-r--r--backend/src/libocl/tmpl/ocl_defines.tmpl.h11
-rw-r--r--backend/src/llvm/llvm_bitcode_link.cpp26
-rw-r--r--backend/src/llvm/llvm_gen_backend.cpp119
-rw-r--r--backend/src/llvm/llvm_includes.hpp5
-rw-r--r--backend/src/llvm/llvm_passes.cpp6
-rw-r--r--backend/src/llvm/llvm_to_gen.cpp19
-rw-r--r--backend/src/llvm/llvm_to_gen.hpp6
11 files changed, 272 insertions, 30 deletions
diff --git a/backend/src/backend/gen_program.cpp b/backend/src/backend/gen_program.cpp
index 32f77945..4ef82d1d 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 b7dc00e3..22248804 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 ae0a7028..71a6d074 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 abb2bd43..5e3a788e 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 8c7d08ff..f840a82a 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 748a7fe5..a3f98865 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 7005d607..0570766b 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 d2deb900..0b809797 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 b925e5ff..02dd4bfb 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 02a69ec3..e108810d 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 e0a6145c..d3928c6b 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 */