diff options
author | Luo Xionghu <xionghu.luo@intel.com> | 2015-12-08 14:11:09 +0800 |
---|---|---|
committer | Yang Rong <rong.r.yang@intel.com> | 2015-12-09 11:42:54 +0800 |
commit | bfa20bbcf4df90049a42fa65d6d0fc6c6ba4674c (patch) | |
tree | a9eb1c71f2d3c2b07c130f33fe53d3abce6e80cf | |
parent | ed3c8d856af7669c6ea7a6accf871093b6a7b71e (diff) |
gbe: add vec_type_hint's type into functionAttributes.
for SPIR kernel, user may call clGetKernelInfo with CL_KERNEL_ATTRIBUTES
to query the functionAttributes.
v2: remove debug code.
v3: fix llvm 3.5 build fail.
v4: only llvm-3.6 or later has kernel_arg_base_type in metadata.
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.hpp | 33 | ||||
-rw-r--r-- | backend/src/ir/type.cpp | 6 | ||||
-rw-r--r-- | backend/src/llvm/llvm_gen_backend.cpp | 72 |
3 files changed, 104 insertions, 7 deletions
diff --git a/backend/src/ir/function.hpp b/backend/src/ir/function.hpp index b7853c17..cbaa2083 100644 --- a/backend/src/ir/function.hpp +++ b/backend/src/ir/function.hpp @@ -182,6 +182,31 @@ namespace ir { std::string typeQual; std::string argName; // My different from arg->getName() + + // only llvm-3.6 or later has kernel_arg_base_type in metadata. +#if (LLVM_VERSION_MAJOR == 3) && (LLVM_VERSION_MINOR <= 5) + bool isImage1dT() const { + return typeName.compare("image1d_t") == 0; + } + bool isImage1dArrayT() const { + return typeName.compare("image1d_array_t") == 0; + } + bool isImage1dBufferT() const { + return typeName.compare("image1d_buffer_t") == 0; + } + bool isImage2dT() const { + return typeName.compare("image2d_t") == 0; + } + bool isImage2dArrayT() const { + return typeName.compare("image2d_array_t") == 0; + } + bool isImage3dT() const { + return typeName.compare("image3d_t") == 0; + } + bool isSamplerType() const { + return typeName.compare("sampler_t") == 0; + } +#else bool isImage1dT() const { return typeBaseName.compare("image1d_t") == 0; } @@ -200,16 +225,16 @@ namespace ir { bool isImage3dT() const { return typeBaseName.compare("image3d_t") == 0; } + bool isSamplerType() const { + return typeBaseName.compare("sampler_t") == 0; + } +#endif bool isImageType() const { return isImage1dT() || isImage1dArrayT() || isImage1dBufferT() || isImage2dT() || isImage2dArrayT() || isImage3dT(); } - bool isSamplerType() const { - return typeBaseName.compare("sampler_t") == 0; - } - }; /*! Create a function input argument */ diff --git a/backend/src/ir/type.cpp b/backend/src/ir/type.cpp index 450ba610..682757b0 100644 --- a/backend/src/ir/type.cpp +++ b/backend/src/ir/type.cpp @@ -32,11 +32,11 @@ namespace ir { case TYPE_S8: return out << "int8"; case TYPE_U8: return out << "uint8"; case TYPE_S16: return out << "int16"; - case TYPE_U16: return out << "uin16"; + case TYPE_U16: return out << "uint16"; case TYPE_S32: return out << "int32"; - case TYPE_U32: return out << "uin32"; + case TYPE_U32: return out << "uint32"; case TYPE_S64: return out << "int64"; - case TYPE_U64: return out << "uin64"; + case TYPE_U64: return out << "uint64"; case TYPE_HALF: return out << "half"; case TYPE_FLOAT: return out << "float"; case TYPE_DOUBLE: return out << "double"; diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp index f011e1f9..8d18c4ac 100644 --- a/backend/src/llvm/llvm_gen_backend.cpp +++ b/backend/src/llvm/llvm_gen_backend.cpp @@ -114,6 +114,46 @@ namespace gbe type->isPointerTy(); } + static std::string getTypeName(ir::Context &ctx, const Type *type, int sign) + { + GBE_ASSERT(isScalarType(type)); + if (type->isFloatTy() == true) + return "float"; + if (type->isHalfTy() == true) + return "half"; + if (type->isDoubleTy() == true) + return "double"; + + GBE_ASSERT(type->isIntegerTy() == true); + if(sign) { + if (type == Type::getInt1Ty(type->getContext())) + return "char"; + if (type == Type::getInt8Ty(type->getContext())) + return "char"; + if (type == Type::getInt16Ty(type->getContext())) + return "short"; + if (type == Type::getInt32Ty(type->getContext())) + return "int"; + if (type == Type::getInt64Ty(type->getContext())) + return "long"; + } + else + { + if (type == Type::getInt1Ty(type->getContext())) + return "uchar"; + if (type == Type::getInt8Ty(type->getContext())) + return "uchar"; + if (type == Type::getInt16Ty(type->getContext())) + return "ushort"; + if (type == Type::getInt32Ty(type->getContext())) + return "uint"; + if (type == Type::getInt64Ty(type->getContext())) + return "ulong"; + } + GBE_ASSERTM(false, "Unsupported type."); + return ""; + } + /*! LLVM IR Type to Gen IR type translation */ static ir::Type getType(ir::Context &ctx, const Type *type) { @@ -1963,6 +2003,38 @@ namespace gbe } else if (attrName->getString() == "vec_type_hint") { GBE_ASSERT(attrNode->getNumOperands() == 3); functionAttributes += attrName->getString(); +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR <= 5 + Value* V = attrNode->getOperand(1); +#else + auto *Op1 = cast<ValueAsMetadata>(attrNode->getOperand(1)); + Value *V = Op1 ? Op1->getValue() : NULL; +#endif +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR <= 5 + ConstantInt *sign = dyn_cast<ConstantInt>(attrNode->getOperand(2)); +#else + ConstantInt *sign = mdconst::extract<ConstantInt>(attrNode->getOperand(2)); +#endif + 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]; + param <<"("; + param << typeName; + if(vtype->isVectorTy()) + param << elemNum; + param <<")"; + param >> buffer; + functionAttributes += buffer; functionAttributes += " "; } else if (attrName->getString() == "work_group_size_hint") { GBE_ASSERT(attrNode->getNumOperands() == 4); |