[Beignet] [PATCH 2/3] GBE: Skip non-kernel functions in backend passes.
Ruiling Song
ruiling.song at intel.com
Wed Oct 16 00:38:07 PDT 2013
As non-kernel functions hit many assert in the backend, simply
skip them as we already inline all function calls.
Signed-off-by: Ruiling Song <ruiling.song at intel.com>
---
backend/src/llvm/llvm_gen_backend.cpp | 4 ++++
backend/src/llvm/llvm_gen_backend.hpp | 3 +++
backend/src/llvm/llvm_passes.cpp | 17 +++++++++++++++++
backend/src/llvm/llvm_scalarize.cpp | 4 ++++
4 files changed, 28 insertions(+)
diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp
index 5fb4f49..7519ff1 100644
--- a/backend/src/llvm/llvm_gen_backend.cpp
+++ b/backend/src/llvm/llvm_gen_backend.cpp
@@ -472,6 +472,10 @@ namespace gbe
if (F.hasAvailableExternallyLinkage())
return false;
+ // As we inline all function calls, so skip non-kernel functions
+ bool bKernel = isKernelFunction(F);
+ if(!bKernel) return false;
+
LI = &getAnalysis<LoopInfo>();
emitFunction(F);
diff --git a/backend/src/llvm/llvm_gen_backend.hpp b/backend/src/llvm/llvm_gen_backend.hpp
index 2ad879e..d6c98dd 100644
--- a/backend/src/llvm/llvm_gen_backend.hpp
+++ b/backend/src/llvm/llvm_gen_backend.hpp
@@ -75,6 +75,9 @@ namespace gbe
/*! Get the type size in bytes */
uint32_t getTypeByteSize(const ir::Unit &unit, llvm::Type* Ty);
+ /*! whether this is a kernel function */
+ bool isKernelFunction(const llvm::Function &f);
+
/*! Create a Gen-IR unit */
llvm::FunctionPass *createGenPass(ir::Unit &unit);
diff --git a/backend/src/llvm/llvm_passes.cpp b/backend/src/llvm/llvm_passes.cpp
index 4bafc0d..60c9df1 100644
--- a/backend/src/llvm/llvm_passes.cpp
+++ b/backend/src/llvm/llvm_passes.cpp
@@ -105,6 +105,23 @@ using namespace llvm;
namespace gbe
{
+ bool isKernelFunction(const llvm::Function &F) {
+ 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;
+ uint32_t ops = md.getNumOperands();
+ for(uint32_t x = 0; x < ops; x++) {
+ MDNode* node = md.getOperand(x);
+ Value * op = node->getOperand(0);
+ if(op == &F) bKernel = true;
+ }
+ }
+ return bKernel;
+ }
+
uint32_t getPadding(uint32_t offset, uint32_t align) {
return (align - (offset % align)) % align;
}
diff --git a/backend/src/llvm/llvm_scalarize.cpp b/backend/src/llvm/llvm_scalarize.cpp
index 7a40616..edfc369 100644
--- a/backend/src/llvm/llvm_scalarize.cpp
+++ b/backend/src/llvm/llvm_scalarize.cpp
@@ -767,6 +767,10 @@ namespace gbe {
default: GBE_ASSERTM(false, "Unsupported calling convention");
}
+ // As we inline all function calls, so skip non-kernel functions
+ bool bKernel = isKernelFunction(F);
+ if(!bKernel) return false;
+
bool changed = false;
module = F.getParent();
intTy = IntegerType::get(module->getContext(), 32);
--
1.7.9.5
More information about the Beignet
mailing list