summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuo Xionghu <xionghu.luo@intel.com>2015-11-26 13:59:57 +0800
committerYang Rong <rong.r.yang@intel.com>2015-12-09 11:42:09 +0800
commit6ce7d1faedcc3b6cd433f55ca0535d37a2ce3d9e (patch)
tree375a11519c1057ec7eb928dd0804d7ef39ed955d
parent73a3ff2563b44495eaf26fb095cd17bb6ec31b67 (diff)
gbe: use kernel_arg_base_type to recognize image arguments.
we use string compare function to recognize the image type, but image types could be defined to other type, so use kernel_arg_base_type to recognize image arguments. Signed-off-by: Luo Xionghu <xionghu.luo@intel.com> Reviewed-by: Yang Rong <rong.r.yang@intel.com>
-rw-r--r--backend/src/ir/function.hpp15
-rw-r--r--backend/src/llvm/llvm_gen_backend.cpp13
2 files changed, 21 insertions, 7 deletions
diff --git a/backend/src/ir/function.hpp b/backend/src/ir/function.hpp
index 265fdc39..b7853c17 100644
--- a/backend/src/ir/function.hpp
+++ b/backend/src/ir/function.hpp
@@ -177,27 +177,28 @@ namespace ir {
struct InfoFromLLVM { // All the info about passed by llvm, using -cl-kernel-arg-info
uint32_t addrSpace;
std::string typeName;
+ std::string typeBaseName;
std::string accessQual;
std::string typeQual;
std::string argName; // My different from arg->getName()
bool isImage1dT() const {
- return typeName.compare("image1d_t") == 0;
+ return typeBaseName.compare("image1d_t") == 0;
}
bool isImage1dArrayT() const {
- return typeName.compare("image1d_array_t") == 0;
+ return typeBaseName.compare("image1d_array_t") == 0;
}
bool isImage1dBufferT() const {
- return typeName.compare("image1d_buffer_t") == 0;
+ return typeBaseName.compare("image1d_buffer_t") == 0;
}
bool isImage2dT() const {
- return typeName.compare("image2d_t") == 0;
+ return typeBaseName.compare("image2d_t") == 0;
}
bool isImage2dArrayT() const {
- return typeName.compare("image2d_array_t") == 0;
+ return typeBaseName.compare("image2d_array_t") == 0;
}
bool isImage3dT() const {
- return typeName.compare("image3d_t") == 0;
+ return typeBaseName.compare("image3d_t") == 0;
}
bool isImageType() const {
@@ -206,7 +207,7 @@ namespace ir {
}
bool isSamplerType() const {
- return typeName.compare("sampler_t") == 0;
+ return typeBaseName.compare("sampler_t") == 0;
}
};
diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp
index 7f84240d..f011e1f9 100644
--- a/backend/src/llvm/llvm_gen_backend.cpp
+++ b/backend/src/llvm/llvm_gen_backend.cpp
@@ -1164,6 +1164,7 @@ namespace gbe
BtiMap.insert(std::make_pair(&v, getNewBti(&v, false)));
}
MDNode *typeNameNode = NULL;
+ MDNode *typeBaseNameNode = NULL;
MDNode *node = getKernelFunctionMetadata(&F);
for(uint j = 0; j < node->getNumOperands() - 1; j++) {
MDNode *attrNode = dyn_cast_or_null<MDNode>(node->getOperand(1 + j));
@@ -1173,12 +1174,18 @@ namespace gbe
if (attrName->getString() == "kernel_arg_type") {
typeNameNode = attrNode;
}
+ if (attrName->getString() == "kernel_arg_base_type") {
+ typeBaseNameNode = attrNode;
+ }
}
unsigned argID = 0;
ir::FunctionArgument::InfoFromLLVM llvmInfo;
for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I, argID++) {
llvmInfo.typeName= (cast<MDString>(typeNameNode->getOperand(1 + argID)))->getString();
+ if(typeBaseNameNode) {
+ llvmInfo.typeBaseName= (cast<MDString>(typeBaseNameNode->getOperand(1 + argID)))->getString();
+ }
bool isImage = llvmInfo.isImageType();
if (I->getType()->isPointerTy() || isImage) {
BtiMap.insert(std::make_pair(I, getNewBti(I, isImage)));
@@ -1891,6 +1898,7 @@ namespace gbe
ir::FunctionArgument::InfoFromLLVM llvmInfo;
MDNode *addrSpaceNode = NULL;
MDNode *typeNameNode = NULL;
+ MDNode *typeBaseNameNode = NULL;
MDNode *accessQualNode = NULL;
MDNode *typeQualNode = NULL;
MDNode *argNameNode = NULL;
@@ -1946,6 +1954,8 @@ namespace gbe
accessQualNode = attrNode;
} else if (attrName->getString() == "kernel_arg_type") {
typeNameNode = attrNode;
+ } else if (attrName->getString() == "kernel_arg_base_type") {
+ typeBaseNameNode = attrNode;
} else if (attrName->getString() == "kernel_arg_type_qual") {
typeQualNode = attrNode;
} else if (attrName->getString() == "kernel_arg_name") {
@@ -2007,6 +2017,9 @@ namespace gbe
llvmInfo.addrSpace = (mdconst::extract<ConstantInt>(addrSpaceNode->getOperand(1 + argID)))->getZExtValue();
#endif
llvmInfo.typeName = (cast<MDString>(typeNameNode->getOperand(1 + argID)))->getString();
+ if(typeBaseNameNode){
+ llvmInfo.typeBaseName = (cast<MDString>(typeBaseNameNode->getOperand(1 + argID)))->getString();
+ }
llvmInfo.accessQual = (cast<MDString>(accessQualNode->getOperand(1 + argID)))->getString();
llvmInfo.typeQual = (cast<MDString>(typeQualNode->getOperand(1 + argID)))->getString();
if(argNameNode){