Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package intel-graphics-compiler for
openSUSE:Factory checked in at 2023-06-16 16:54:19
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/intel-graphics-compiler (Old)
and /work/SRC/openSUSE:Factory/.intel-graphics-compiler.new.15902 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "intel-graphics-compiler"
Fri Jun 16 16:54:19 2023 rev:5 rq:1093302 version:1.0.13822.6
Changes:
--------
---
/work/SRC/openSUSE:Factory/intel-graphics-compiler/intel-graphics-compiler.changes
2023-05-30 22:02:53.123166939 +0200
+++
/work/SRC/openSUSE:Factory/.intel-graphics-compiler.new.15902/intel-graphics-compiler.changes
2023-06-16 16:55:32.469954137 +0200
@@ -1,0 +2,7 @@
+Thu Jun 15 06:25:27 UTC 2023 - Patrik Jakobsson <[email protected]>
+
+- Update to version 1.0.13822.6
+ * Fixes a segfault happening for certain GPUs (bsc#1212193)
+- Update spirv-llvm-translator to a4e58ffda317221a15149f9d0d4f73424c9584fb
+
+-------------------------------------------------------------------
Old:
----
igc-1.0.13700.14.tar.gz
New:
----
igc-1.0.13822.6.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ intel-graphics-compiler.spec ++++++
--- /var/tmp/diff_new_pack.R5URJT/_old 2023-06-16 16:55:33.725961545 +0200
+++ /var/tmp/diff_new_pack.R5URJT/_new 2023-06-16 16:55:33.729961569 +0200
@@ -18,10 +18,10 @@
%global llvm_commit llvmorg-11.1.0
%global opencl_clang_commit 10237c7109d613ef1161065d140b76d92133062f
-%global spirv_llvm_translator_commit b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1
+%global spirv_llvm_translator_commit a4e58ffda317221a15149f9d0d4f73424c9584fb
%global vc_intrinsics_commit v0.12.3
Name: intel-graphics-compiler
-Version: 1.0.13700.14
+Version: 1.0.13822.6
Release: 1%{?dist}
Summary: Intel Graphics Compiler for OpenCL
License: MIT
++++++ igc-1.0.13700.14.tar.gz -> igc-1.0.13822.6.tar.gz ++++++
/work/SRC/openSUSE:Factory/intel-graphics-compiler/igc-1.0.13700.14.tar.gz
/work/SRC/openSUSE:Factory/.intel-graphics-compiler.new.15902/igc-1.0.13822.6.tar.gz
differ: char 13, line 1
++++++ spirv-llvm-translator.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/include/LLVMSPIRVExtensions.inc
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/include/LLVMSPIRVExtensions.inc
---
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/include/LLVMSPIRVExtensions.inc
2023-02-20 14:48:11.000000000 +0100
+++
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/include/LLVMSPIRVExtensions.inc
2023-03-18 21:49:42.000000000 +0100
@@ -45,3 +45,4 @@
EXT(SPV_INTEL_tensor_float32_conversion)
EXT(SPV_INTEL_hw_thread_queries)
EXT(SPV_EXT_relaxed_printf_string_address_space)
+EXT(SPV_INTEL_global_variable_decorations)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/SPIRVInternal.h
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/SPIRVInternal.h
---
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/SPIRVInternal.h
2023-02-20 14:48:11.000000000 +0100
+++
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/SPIRVInternal.h
2023-03-18 21:49:42.000000000 +0100
@@ -274,6 +274,9 @@
#define SPIR_MD_KERNEL_ARG_TYPE_QUAL "kernel_arg_type_qual"
#define SPIR_MD_KERNEL_ARG_NAME "kernel_arg_name"
+#define SPIRV_MD_PARAMETER_DECORATIONS "spirv.ParameterDecorations"
+#define SPIRV_MD_DECORATIONS "spirv.Decorations"
+
#define OCL_TYPE_NAME_SAMPLER_T "sampler_t"
#define SPIR_TYPE_NAME_EVENT_T "opencl.event_t"
#define SPIR_TYPE_NAME_CLK_EVENT_T "opencl.clk_event_t"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/SPIRVReader.cpp
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/SPIRVReader.cpp
---
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/SPIRVReader.cpp
2023-02-20 14:48:11.000000000 +0100
+++
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/SPIRVReader.cpp
2023-03-18 21:49:42.000000000 +0100
@@ -160,7 +160,7 @@
NamedMD->addOperand(MDNode::get(*Context, ValueVec));
}
-static void addOCLKernelArgumentMetadata(
+static void addKernelArgumentMetadata(
LLVMContext *Context, const std::string &MDName, SPIRVFunction *BF,
llvm::Function *Fn,
std::function<Metadata *(SPIRVFunctionParameter *)> Func) {
@@ -3443,6 +3443,82 @@
}
}
+static llvm::MDNode *
+transDecorationsToMetadataList(llvm::LLVMContext *Context,
+ std::vector<SPIRVDecorate const *> Decorates) {
+ SmallVector<Metadata *, 4> MDs;
+ MDs.reserve(Decorates.size());
+ for (const auto *Deco : Decorates) {
+ std::vector<Metadata *> OPs;
+ auto *KindMD = ConstantAsMetadata::get(
+ ConstantInt::get(Type::getInt32Ty(*Context), Deco->getDecorateKind()));
+ OPs.push_back(KindMD);
+ switch (static_cast<size_t>(Deco->getDecorateKind())) {
+ case DecorationLinkageAttributes: {
+ const auto *const LinkAttrDeco =
+ static_cast<const SPIRVDecorateLinkageAttr *>(Deco);
+ auto *const LinkNameMD =
+ MDString::get(*Context, LinkAttrDeco->getLinkageName());
+ auto *const LinkTypeMD = ConstantAsMetadata::get(ConstantInt::get(
+ Type::getInt32Ty(*Context), LinkAttrDeco->getLinkageType()));
+ OPs.push_back(LinkNameMD);
+ OPs.push_back(LinkTypeMD);
+ break;
+ }
+ case spv::internal::DecorationHostAccessINTEL: {
+ const auto *const HostAccDeco =
+ static_cast<const SPIRVDecorateHostAccessINTEL *>(Deco);
+ auto *const AccModeMD = ConstantAsMetadata::get(ConstantInt::get(
+ Type::getInt32Ty(*Context), HostAccDeco->getAccessMode()));
+ auto *const NameMD = MDString::get(*Context, HostAccDeco->getVarName());
+ OPs.push_back(AccModeMD);
+ OPs.push_back(NameMD);
+ break;
+ }
+ case DecorationMergeINTEL: {
+ const auto MergeAttrLits = Deco->getVecLiteral();
+ std::string FirstString = getString(MergeAttrLits);
+ std::string SecondString =
+ getString(MergeAttrLits.cbegin() + getVec(FirstString).size(),
+ MergeAttrLits.cend());
+ OPs.push_back(MDString::get(*Context, FirstString));
+ OPs.push_back(MDString::get(*Context, SecondString));
+ break;
+ }
+ case DecorationMemoryINTEL:
+ case DecorationUserSemantic: {
+ auto *const StrMD =
+ MDString::get(*Context, getString(Deco->getVecLiteral()));
+ OPs.push_back(StrMD);
+ break;
+ }
+ default: {
+ for (const SPIRVWord Lit : Deco->getVecLiteral()) {
+ auto *const LitMD = ConstantAsMetadata::get(
+ ConstantInt::get(Type::getInt32Ty(*Context), Lit));
+ OPs.push_back(LitMD);
+ }
+ break;
+ }
+ }
+ MDs.push_back(MDNode::get(*Context, OPs));
+ }
+ return MDNode::get(*Context, MDs);
+}
+
+void SPIRVToLLVM::transVarDecorationsToMetadata(SPIRVValue *BV, Value *V) {
+ if (!BV->isVariable())
+ return;
+
+ if (auto *GV = dyn_cast<GlobalVariable>(V)) {
+ std::vector<SPIRVDecorate const *> Decorates = BV->getDecorations();
+ if (!Decorates.empty()) {
+ MDNode *MDList = transDecorationsToMetadataList(Context, Decorates);
+ GV->setMetadata(SPIRV_MD_DECORATIONS, MDList);
+ }
+ }
+}
+
bool SPIRVToLLVM::transDecoration(SPIRVValue *BV, Value *V) {
if (!transAlign(BV, V))
return false;
@@ -3450,6 +3526,10 @@
transIntelFPGADecorations(BV, V);
transMemAliasingINTELDecorations(BV, V);
+ // Decoration metadata is only enabled in SPIR-V friendly mode
+ if (BM->getDesiredBIsRepresentation() == BIsRepresentation::SPIRVFriendlyIR)
+ transVarDecorationsToMetadata(BV, V);
+
DbgTran->transDbgInfo(BV, V);
return true;
}
@@ -3581,6 +3661,23 @@
return true;
}
+void SPIRVToLLVM::transFunctionDecorationsToMetadata(SPIRVFunction *BF,
+ Function *F) {
+ size_t TotalParameterDecorations = 0;
+ BF->foreachArgument([&](SPIRVFunctionParameter *Arg) {
+ TotalParameterDecorations += Arg->getNumDecorations();
+ });
+ if (TotalParameterDecorations == 0)
+ return;
+
+ // Generate metadata for spirv.ParameterDecorations
+ addKernelArgumentMetadata(Context, SPIRV_MD_PARAMETER_DECORATIONS, BF, F,
+ [=](SPIRVFunctionParameter *Arg) {
+ return transDecorationsToMetadataList(
+ Context, Arg->getDecorations());
+ });
+}
+
bool SPIRVToLLVM::transMetadata() {
SmallVector<Function *, 2> CtorKernels;
for (unsigned I = 0, E = BM->getNumFunctions(); I != E; ++I) {
@@ -3591,6 +3688,10 @@
transOCLMetadata(BF);
transVectorComputeMetadata(BF);
+ // Decoration metadata is only enabled in SPIR-V friendly mode
+ if (BM->getDesiredBIsRepresentation() ==
BIsRepresentation::SPIRVFriendlyIR)
+ transFunctionDecorationsToMetadata(BF, F);
+
if (BF->hasDecorate(DecorationCallableFunctionINTEL))
F->addFnAttr(kVCMetadata::VCCallable);
if (isKernel(BF) &&
@@ -3668,7 +3769,7 @@
return true;
// Generate metadata for kernel_arg_addr_space
- addOCLKernelArgumentMetadata(
+ addKernelArgumentMetadata(
Context, SPIR_MD_KERNEL_ARG_ADDR_SPACE, BF, F,
[=](SPIRVFunctionParameter *Arg) {
SPIRVType *ArgTy = Arg->getType();
@@ -3681,31 +3782,31 @@
ConstantInt::get(Type::getInt32Ty(*Context), AS));
});
// Generate metadata for kernel_arg_access_qual
- addOCLKernelArgumentMetadata(Context, SPIR_MD_KERNEL_ARG_ACCESS_QUAL, BF, F,
- [=](SPIRVFunctionParameter *Arg) {
- std::string Qual;
- auto T = Arg->getType();
- if (T->isTypeOCLImage()) {
- auto ST = static_cast<SPIRVTypeImage *>(T);
- Qual = transOCLImageTypeAccessQualifier(ST);
- } else if (T->isTypePipe()) {
- auto PT = static_cast<SPIRVTypePipe *>(T);
- Qual = transOCLPipeTypeAccessQualifier(PT);
- } else
- Qual = "none";
- return MDString::get(*Context, Qual);
- });
+ addKernelArgumentMetadata(Context, SPIR_MD_KERNEL_ARG_ACCESS_QUAL, BF, F,
+ [=](SPIRVFunctionParameter *Arg) {
+ std::string Qual;
+ auto *T = Arg->getType();
+ if (T->isTypeOCLImage()) {
+ auto *ST = static_cast<SPIRVTypeImage *>(T);
+ Qual = transOCLImageTypeAccessQualifier(ST);
+ } else if (T->isTypePipe()) {
+ auto *PT = static_cast<SPIRVTypePipe *>(T);
+ Qual = transOCLPipeTypeAccessQualifier(PT);
+ } else
+ Qual = "none";
+ return MDString::get(*Context, Qual);
+ });
// Generate metadata for kernel_arg_type
if (!transKernelArgTypeMedataFromString(Context, BM, F,
SPIR_MD_KERNEL_ARG_TYPE))
- addOCLKernelArgumentMetadata(Context, SPIR_MD_KERNEL_ARG_TYPE, BF, F,
- [=](SPIRVFunctionParameter *Arg) {
- return transOCLKernelArgTypeName(Arg);
- });
+ addKernelArgumentMetadata(Context, SPIR_MD_KERNEL_ARG_TYPE, BF, F,
+ [=](SPIRVFunctionParameter *Arg) {
+ return transOCLKernelArgTypeName(Arg);
+ });
// Generate metadata for kernel_arg_type_qual
if (!transKernelArgTypeMedataFromString(Context, BM, F,
SPIR_MD_KERNEL_ARG_TYPE_QUAL))
- addOCLKernelArgumentMetadata(
+ addKernelArgumentMetadata(
Context, SPIR_MD_KERNEL_ARG_TYPE_QUAL, BF, F,
[=](SPIRVFunctionParameter *Arg) {
std::string Qual;
@@ -3723,17 +3824,16 @@
return MDString::get(*Context, Qual);
});
// Generate metadata for kernel_arg_base_type
- addOCLKernelArgumentMetadata(Context, SPIR_MD_KERNEL_ARG_BASE_TYPE, BF, F,
- [=](SPIRVFunctionParameter *Arg) {
- return transOCLKernelArgTypeName(Arg);
- });
+ addKernelArgumentMetadata(Context, SPIR_MD_KERNEL_ARG_BASE_TYPE, BF, F,
+ [=](SPIRVFunctionParameter *Arg) {
+ return transOCLKernelArgTypeName(Arg);
+ });
// Generate metadata for kernel_arg_name
if (BM->isGenArgNameMDEnabled()) {
- addOCLKernelArgumentMetadata(Context, SPIR_MD_KERNEL_ARG_NAME, BF, F,
- [=](SPIRVFunctionParameter *Arg) {
- return MDString::get(*Context,
- Arg->getName());
- });
+ addKernelArgumentMetadata(Context, SPIR_MD_KERNEL_ARG_NAME, BF, F,
+ [=](SPIRVFunctionParameter *Arg) {
+ return MDString::get(*Context, Arg->getName());
+ });
}
// Generate metadata for kernel_arg_buffer_location
addBufferLocationMetadata(Context, BF, F, [=](SPIRVFunctionParameter *Arg) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/SPIRVReader.h
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/SPIRVReader.h
---
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/SPIRVReader.h
2023-02-20 14:48:11.000000000 +0100
+++
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/SPIRVReader.h
2023-03-18 21:49:42.000000000 +0100
@@ -233,6 +233,8 @@
SmallVectorImpl<Function *> &Funcs);
void transIntelFPGADecorations(SPIRVValue *BV, Value *V);
void transMemAliasingINTELDecorations(SPIRVValue *BV, Value *V);
+ void transVarDecorationsToMetadata(SPIRVValue *BV, Value *V);
+ void transFunctionDecorationsToMetadata(SPIRVFunction *BF, Function *F);
}; // class SPIRVToLLVM
} // namespace SPIRV
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/SPIRVToLLVMDbgTran.cpp
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/SPIRVToLLVMDbgTran.cpp
---
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/SPIRVToLLVMDbgTran.cpp
2023-02-20 14:48:11.000000000 +0100
+++
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/SPIRVToLLVMDbgTran.cpp
2023-03-18 21:49:42.000000000 +0100
@@ -522,7 +522,7 @@
SPIRVFunction *BF = static_cast<SPIRVFunction *>(E);
llvm::Function *F = SPIRVReader->transFunction(BF);
assert(F && "Translation of function failed!");
- if (!F->hasMetadata())
+ if (!F->hasMetadata("dbg"))
F->setMetadata("dbg", DIS);
}
return DIS;
@@ -631,7 +631,7 @@
SPIRVValue *V = BM->get<SPIRVValue>(Ops[VariableIdx]);
Value *Var = SPIRVReader->transValue(V, nullptr, nullptr);
llvm::GlobalVariable *GV = dyn_cast_or_null<llvm::GlobalVariable>(Var);
- if (GV && !GV->hasMetadata())
+ if (GV && !GV->hasMetadata("dbg"))
GV->addMetadata("dbg", *VarDecl);
}
return VarDecl;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/SPIRVWriter.cpp
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/SPIRVWriter.cpp
---
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/SPIRVWriter.cpp
2023-02-20 14:48:11.000000000 +0100
+++
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/SPIRVWriter.cpp
2023-03-18 21:49:42.000000000 +0100
@@ -106,6 +106,15 @@
}
}
+static void foreachKernelArgMD(
+ MDNode *MD, SPIRVFunction *BF,
+ std::function<void(Metadata *MDOp, SPIRVFunctionParameter *BA)> Func) {
+ for (unsigned I = 0, E = MD->getNumOperands(); I != E; ++I) {
+ SPIRVFunctionParameter *BA = BF->getArgument(I);
+ Func(MD->getOperand(I), BA);
+ }
+}
+
static SPIRVMemoryModelKind getMemoryModel(Module &M) {
auto *MemoryModelMD = M.getNamedMetadata(kSPIRVMD::MemoryModel);
if (MemoryModelMD && (MemoryModelMD->getNumOperands() > 0)) {
@@ -1901,6 +1910,186 @@
return BV;
}
+#define ONE_STRING_DECORATION_CASE(NAME, NAMESPACE)
\
+ case NAMESPACE::Decoration##NAME: {
\
+ assert(NumOperands == 2 && #NAME " requires exactly 1 extra operand");
\
+ auto *StrDecoEO = dyn_cast<MDString>(DecoMD->getOperand(1));
\
+ assert(StrDecoEO &&#NAME " requires extra operand to be a string");
\
+ Target->addDecorate(
\
+ new SPIRVDecorate##NAME##Attr(Target, StrDecoEO->getString().str()));
\
+ break;
\
+ }
+
+#define ONE_INT_DECORATION_CASE(NAME, NAMESPACE, TYPE)
\
+ case NAMESPACE::Decoration##NAME: {
\
+ assert(NumOperands == 2 && #NAME " requires exactly 1 extra operand");
\
+ auto *IntDecoEO =
\
+ mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(1));
\
+ assert(IntDecoEO &&#NAME " requires extra operand to be an integer");
\
+ Target->addDecorate(new SPIRVDecorate##NAME(
\
+ Target, static_cast<TYPE>(IntDecoEO->getZExtValue())));
\
+ break;
\
+ }
+
+#define TWO_INT_DECORATION_CASE(NAME, NAMESPACE, TYPE1, TYPE2)
\
+ case NAMESPACE::Decoration##NAME: {
\
+ assert(NumOperands == 3 && #NAME " requires exactly 2 extra operand");
\
+ auto *IntDecoEO1 =
\
+ mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(1));
\
+ assert(IntDecoEO1 &&#NAME
\
+ " requires first extra operand to be an integer");
\
+ auto *IntDecoEO2 =
\
+ mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(2));
\
+ assert(IntDecoEO2 &&#NAME
\
+ " requires second extra operand to be an integer");
\
+ Target->addDecorate(new SPIRVDecorate##NAME(
\
+ Target, static_cast<TYPE1>(IntDecoEO1->getZExtValue()),
\
+ static_cast<TYPE2>(IntDecoEO2->getZExtValue())));
\
+ break;
\
+ }
+
+void checkIsGlobalVar(SPIRVEntry *E, Decoration Dec) {
+ std::string ErrStr =
+ SPIRVDecorationNameMap::map(Dec) + " can only be applied to a variable";
+
+ E->getErrorLog().checkError(E->isVariable(), SPIRVEC_InvalidModule, ErrStr);
+
+ auto AddrSpace = SPIRSPIRVAddrSpaceMap::rmap(
+ static_cast<SPIRVVariable *>(E)->getStorageClass());
+ ErrStr += " in a global (module) scope";
+ E->getErrorLog().checkError(AddrSpace == SPIRAS_Global,
SPIRVEC_InvalidModule,
+ ErrStr);
+}
+
+static void transMetadataDecorations(Metadata *MD, SPIRVEntry *Target) {
+ auto *ArgDecoMD = dyn_cast<MDNode>(MD);
+ assert(ArgDecoMD && "Decoration list must be a metadata node");
+ for (unsigned I = 0, E = ArgDecoMD->getNumOperands(); I != E; ++I) {
+ auto *DecoMD = dyn_cast<MDNode>(ArgDecoMD->getOperand(I));
+ assert(DecoMD && "Decoration does not name metadata");
+ assert(DecoMD->getNumOperands() > 0 &&
+ "Decoration metadata must have at least one operand");
+ auto *DecoKindConst =
+ mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(0));
+ assert(DecoKindConst && "First operand of decoration must be the kind");
+ auto DecoKind = static_cast<Decoration>(DecoKindConst->getZExtValue());
+
+ const size_t NumOperands = DecoMD->getNumOperands();
+ switch (static_cast<size_t>(DecoKind)) {
+ ONE_STRING_DECORATION_CASE(MemoryINTEL, spv)
+ ONE_STRING_DECORATION_CASE(UserSemantic, spv)
+ ONE_INT_DECORATION_CASE(AliasScopeINTEL, spv::internal, SPIRVId)
+ ONE_INT_DECORATION_CASE(NoAliasINTEL, spv::internal, SPIRVId)
+ TWO_INT_DECORATION_CASE(FunctionRoundingModeINTEL, spv, SPIRVWord,
+ FPRoundingMode);
+ TWO_INT_DECORATION_CASE(FunctionDenormModeINTEL, spv, SPIRVWord,
+ FPDenormMode);
+ TWO_INT_DECORATION_CASE(FunctionFloatingPointModeINTEL, spv, SPIRVWord,
+ FPOperationMode);
+ case DecorationMergeINTEL: {
+ assert(NumOperands == 3 && "MergeINTEL requires exactly 3 extra
operand");
+ auto *Name = dyn_cast<MDString>(DecoMD->getOperand(1));
+ assert(Name && "MergeINTEL requires first extra operand to be a string");
+ auto *Direction = dyn_cast<MDString>(DecoMD->getOperand(2));
+ assert(Direction &&
+ "MergeINTEL requires second extra operand to be a string");
+ Target->addDecorate(new SPIRVDecorateMergeINTELAttr(
+ Target, Name->getString().str(), Direction->getString().str()));
+ break;
+ }
+ case DecorationLinkageAttributes: {
+ assert(NumOperands == 3 &&
+ "LinkageAttributes requires exactly 3 extra operand");
+ auto *Name = dyn_cast<MDString>(DecoMD->getOperand(1));
+ assert(Name &&
+ "LinkageAttributes requires first extra operand to be a string");
+ auto *Type = mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(2));
+ assert(Type &&
+ "LinkageAttributes requires second extra operand to be an int");
+ auto TypeKind = static_cast<SPIRVLinkageTypeKind>(Type->getZExtValue());
+ Target->addDecorate(new SPIRVDecorateLinkageAttr(
+ Target, Name->getString().str(), TypeKind));
+ break;
+ }
+ case spv::internal::DecorationHostAccessINTEL: {
+ checkIsGlobalVar(Target, DecoKind);
+
+ assert(NumOperands == 3 && "HostAccessINTEL requires 2 extra operands "
+ "after the decoration kind number");
+ auto *AccessMode =
+ mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(1));
+ assert(AccessMode &&
+ "HostAccessINTEL requires first extra operand to be an int");
+ auto *Name = dyn_cast<MDString>(DecoMD->getOperand(2));
+ assert(Name &&
+ "HostAccessINTEL requires second extra operand to be a string");
+
+ Target->addDecorate(new SPIRVDecorateHostAccessINTEL(
+ Target, AccessMode->getZExtValue(), Name->getString().str()));
+ break;
+ }
+ case spv::internal::DecorationInitModeINTEL: {
+ checkIsGlobalVar(Target, DecoKind);
+ assert(static_cast<SPIRVVariable *>(Target)->getInitializer() &&
+ "InitModeINTEL only be applied to a global (module scope) "
+ "variable which has an Initializer operand");
+
+ assert(NumOperands == 2 &&
+ "InitModeINTEL requires exactly 1 extra operand");
+ auto *Trigger = mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(1));
+ assert(Trigger &&
+ "InitModeINTEL requires extra operand to be an integer");
+
+ Target->addDecorate(
+ new SPIRVDecorateInitModeINTEL(Target, Trigger->getZExtValue()));
+ break;
+ }
+ case spv::internal::DecorationImplementInCSRINTEL: {
+ checkIsGlobalVar(Target, DecoKind);
+
+ assert(NumOperands == 2 &&
+ "ImplementInCSRINTEL requires exactly 1 extra operand");
+ auto *Value = mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(1));
+ assert(Value &&
+ "ImplementInCSRINTEL requires extra operand to be an integer");
+
+ Target->addDecorate(
+ new SPIRVDecorateImplementInCSRINTEL(Target, Value->getZExtValue()));
+ break;
+ }
+ default: {
+ if (NumOperands == 1) {
+ Target->addDecorate(new SPIRVDecorate(DecoKind, Target));
+ break;
+ }
+
+ auto *DecoValEO1 =
+ mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(1));
+ assert(DecoValEO1 &&
+ "First extra operand in default decoration case must be
integer.");
+ if (NumOperands == 2) {
+ Target->addDecorate(
+ new SPIRVDecorate(DecoKind, Target, DecoValEO1->getZExtValue()));
+ break;
+ }
+
+ auto *DecoValEO2 =
+ mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(2));
+ assert(DecoValEO2 &&
+ "First extra operand in default decoration case must be
integer.");
+ assert(NumOperands == 3 && "At most 2 extra operands expected.");
+ Target->addDecorate(new SPIRVDecorate(DecoKind, Target,
+ DecoValEO1->getZExtValue(),
+ DecoValEO2->getZExtValue()));
+ }
+ }
+ }
+}
+
+#undef ONE_STRING_DECORATION_CASE
+#undef ONE_INT_DECORATION_CASE
+#undef TWO_INT_DECORATION_CASE
+
bool LLVMToSPIRVBase::transDecoration(Value *V, SPIRVValue *BV) {
if (!transAlign(V, BV))
return false;
@@ -1964,6 +2153,10 @@
}
}
+ if (auto *GV = dyn_cast<GlobalVariable>(V))
+ if (auto *GVDecoMD = GV->getMetadata(SPIRV_MD_DECORATIONS))
+ transMetadataDecorations(GVDecoMD, BV);
+
return true;
}
@@ -3879,6 +4072,8 @@
BM->setName(BA, Str);
});
}
+ if (auto *KernArgDecoMD = F.getMetadata(SPIRV_MD_PARAMETER_DECORATIONS))
+ foreachKernelArgMD(KernArgDecoMD, BF, transMetadataDecorations);
}
return true;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/libSPIRV/SPIRVDecorate.cpp
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/libSPIRV/SPIRVDecorate.cpp
---
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/libSPIRV/SPIRVDecorate.cpp
2023-02-20 14:48:11.000000000 +0100
+++
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/libSPIRV/SPIRVDecorate.cpp
2023-03-18 21:49:42.000000000 +0100
@@ -101,7 +101,7 @@
void SPIRVDecorate::encode(spv_ostream &O) const {
SPIRVEncoder Encoder = getEncoder(O);
Encoder << Target << Dec;
- switch (Dec) {
+ switch (static_cast<size_t>(Dec)) {
case DecorationLinkageAttributes:
SPIRVDecorateLinkageAttr::encodeLiterals(Encoder, Literals);
break;
@@ -114,6 +114,9 @@
case DecorationUserSemantic:
SPIRVDecorateUserSemanticAttr::encodeLiterals(Encoder, Literals);
break;
+ case spv::internal::DecorationHostAccessINTEL:
+ SPIRVDecorateHostAccessINTEL::encodeLiterals(Encoder, Literals);
+ break;
default:
Encoder << Literals;
}
@@ -127,7 +130,7 @@
void SPIRVDecorate::decode(std::istream &I) {
SPIRVDecoder Decoder = getDecoder(I);
Decoder >> Target >> Dec;
- switch (Dec) {
+ switch (static_cast<size_t>(Dec)) {
case DecorationLinkageAttributes:
SPIRVDecorateLinkageAttr::decodeLiterals(Decoder, Literals);
break;
@@ -140,6 +143,9 @@
case DecorationUserSemantic:
SPIRVDecorateUserSemanticAttr::decodeLiterals(Decoder, Literals);
break;
+ case spv::internal::DecorationHostAccessINTEL:
+ SPIRVDecorateHostAccessINTEL::decodeLiterals(Decoder, Literals);
+ break;
default:
Decoder >> Literals;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/libSPIRV/SPIRVDecorate.h
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/libSPIRV/SPIRVDecorate.h
---
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/libSPIRV/SPIRVDecorate.h
2023-02-20 14:48:11.000000000 +0100
+++
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/libSPIRV/SPIRVDecorate.h
2023-03-18 21:49:42.000000000 +0100
@@ -188,6 +188,10 @@
return ExtensionID::SPV_INTEL_float_controls2;
case DecorationCallableFunctionINTEL:
return ExtensionID::SPV_INTEL_fast_composite;
+ case internal::DecorationHostAccessINTEL:
+ case internal::DecorationInitModeINTEL:
+ case internal::DecorationImplementInCSRINTEL:
+ return ExtensionID::SPV_INTEL_global_variable_decorations;
default:
return {};
}
@@ -662,6 +666,69 @@
AliasList){};
};
+class SPIRVDecorateHostAccessINTEL : public SPIRVDecorate {
+public:
+ // Complete constructor for SPIRVHostAccessINTEL
+ SPIRVDecorateHostAccessINTEL(SPIRVEntry *TheTarget, SPIRVWord AccessMode,
+ const std::string &VarName)
+ : SPIRVDecorate(spv::internal::DecorationHostAccessINTEL, TheTarget) {
+ Literals.push_back(AccessMode);
+ for (auto &I : getVec(VarName))
+ Literals.push_back(I);
+ WordCount += Literals.size();
+ };
+
+ SPIRVWord getAccessMode() const { return Literals.front(); }
+ std::string getVarName() const {
+ return getString(Literals.cbegin() + 1, Literals.cend());
+ }
+
+ static void encodeLiterals(SPIRVEncoder &Encoder,
+ const std::vector<SPIRVWord> &Literals) {
+#ifdef _SPIRV_SUPPORT_TEXT_FMT
+ if (SPIRVUseTextFormat) {
+ Encoder << Literals.front();
+ std::string Name = getString(Literals.cbegin() + 1, Literals.cend());
+ Encoder << Name;
+ } else
+#endif
+ Encoder << Literals;
+ }
+
+ static void decodeLiterals(SPIRVDecoder &Decoder,
+ std::vector<SPIRVWord> &Literals) {
+#ifdef _SPIRV_SUPPORT_TEXT_FMT
+ if (SPIRVUseTextFormat) {
+ SPIRVWord Mode;
+ Decoder >> Mode;
+ std::string Name;
+ Decoder >> Name;
+ Literals.front() = Mode;
+ std::copy_n(getVec(Name).begin(), Literals.size() - 1,
+ Literals.begin() + 1);
+
+ } else
+#endif
+ Decoder >> Literals;
+ }
+};
+
+class SPIRVDecorateInitModeINTEL : public SPIRVDecorate {
+public:
+ // Complete constructor for SPIRVInitModeINTEL
+ SPIRVDecorateInitModeINTEL(SPIRVEntry *TheTarget, SPIRVWord Trigger)
+ : SPIRVDecorate(spv::internal::DecorationInitModeINTEL, TheTarget,
+ Trigger){};
+};
+
+class SPIRVDecorateImplementInCSRINTEL : public SPIRVDecorate {
+public:
+ // Complete constructor for SPIRVImplementInCSRINTEL
+ SPIRVDecorateImplementInCSRINTEL(SPIRVEntry *TheTarget, SPIRVWord Value)
+ : SPIRVDecorate(spv::internal::DecorationImplementInCSRINTEL, TheTarget,
+ Value){};
+};
+
} // namespace SPIRV
#endif // SPIRV_LIBSPIRV_SPIRVDECORATE_H
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/libSPIRV/SPIRVEntry.cpp
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/libSPIRV/SPIRVEntry.cpp
---
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/libSPIRV/SPIRVEntry.cpp
2023-02-20 14:48:11.000000000 +0100
+++
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/libSPIRV/SPIRVEntry.cpp
2023-03-18 21:49:42.000000000 +0100
@@ -441,6 +441,14 @@
return Decors;
}
+std::vector<SPIRVDecorate const *> SPIRVEntry::getDecorations() const {
+ std::vector<SPIRVDecorate const *> Decors;
+ Decors.reserve(Decorates.size());
+ for (const auto &DecoPair : Decorates)
+ Decors.push_back(DecoPair.second);
+ return Decors;
+}
+
std::set<SPIRVId> SPIRVEntry::getDecorateId(Decoration Kind,
size_t Index) const {
auto Range = DecorateIds.equal_range(Kind);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/libSPIRV/SPIRVEntry.h
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/libSPIRV/SPIRVEntry.h
---
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/libSPIRV/SPIRVEntry.h
2023-02-20 14:48:11.000000000 +0100
+++
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/libSPIRV/SPIRVEntry.h
2023-03-18 21:49:42.000000000 +0100
@@ -297,6 +297,7 @@
return {};
}
const std::string &getName() const { return Name; }
+ size_t getNumDecorations() const { return Decorates.size(); }
bool hasDecorate(Decoration Kind, size_t Index = 0,
SPIRVWord *Result = 0) const;
bool hasDecorateId(Decoration Kind, size_t Index = 0,
@@ -314,6 +315,7 @@
SPIRVWord MemberNumber) const;
std::set<SPIRVWord> getDecorate(Decoration Kind, size_t Index = 0) const;
std::vector<SPIRVDecorate const *> getDecorations(Decoration Kind) const;
+ std::vector<SPIRVDecorate const *> getDecorations() const;
std::set<SPIRVId> getDecorateId(Decoration Kind, size_t Index = 0) const;
std::vector<SPIRVDecorateId const *> getDecorationIds(Decoration Kind) const;
bool hasId() const { return !(Attrib & SPIRVEA_NOID); }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/libSPIRV/SPIRVEnum.h
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/libSPIRV/SPIRVEnum.h
---
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/libSPIRV/SPIRVEnum.h
2023-02-20 14:48:11.000000000 +0100
+++
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/libSPIRV/SPIRVEnum.h
2023-03-18 21:49:42.000000000 +0100
@@ -429,6 +429,13 @@
{internal::CapabilityMemoryAccessAliasingINTEL});
ADD_VEC_INIT(internal::DecorationNoAliasINTEL,
{internal::CapabilityMemoryAccessAliasingINTEL});
+
+ ADD_VEC_INIT(internal::DecorationHostAccessINTEL,
+ {internal::CapabilityGlobalVariableDecorationsINTEL});
+ ADD_VEC_INIT(internal::DecorationInitModeINTEL,
+ {internal::CapabilityGlobalVariableDecorationsINTEL});
+ ADD_VEC_INIT(internal::DecorationImplementInCSRINTEL,
+ {internal::CapabilityGlobalVariableDecorationsINTEL});
}
template <> inline void SPIRVMap<BuiltIn, SPIRVCapVec>::init() {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
---
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
2023-02-20 14:48:11.000000000 +0100
+++
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
2023-03-18 21:49:42.000000000 +0100
@@ -174,6 +174,9 @@
add(internal::DecorationAliasScopeINTEL, "AliasScopeINTEL");
add(internal::DecorationNoAliasINTEL, "NoAliasINTEL");
+ add(internal::DecorationHostAccessINTEL, "HostAccessINTEL");
+ add(internal::DecorationInitModeINTEL, "InitModeINTEL");
+ add(internal::DecorationImplementInCSRINTEL, "ImplementInCSRINTEL");
add(DecorationMax, "Max");
}
@@ -578,6 +581,8 @@
add(internal::CapabilityTensorFloat32ConversionINTEL,
"TensorFloat32ConversionINTEL");
add(internal::CapabilityHWThreadQueryINTEL, "HWThreadQueryINTEL");
+ add(internal::CapabilityGlobalVariableDecorationsINTEL,
+ "GlobalVariableDecorationsINTEL");
}
SPIRV_DEF_NAMEMAP(Capability, SPIRVCapabilityNameMap)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/libSPIRV/spirv_internal.hpp
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/libSPIRV/spirv_internal.hpp
---
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/lib/SPIRV/libSPIRV/spirv_internal.hpp
2023-02-20 14:48:11.000000000 +0100
+++
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/lib/SPIRV/libSPIRV/spirv_internal.hpp
2023-03-18 21:49:42.000000000 +0100
@@ -49,7 +49,10 @@
enum InternalDecoration {
IDecAliasScopeINTEL = 5914,
- IDecNoAliasINTEL = 5915
+ IDecNoAliasINTEL = 5915,
+ IDecHostAccessINTEL = 6147,
+ IDecInitModeINTEL = 6148,
+ IDecImplementInCSRINTEL = 6149
};
enum InternalCapability {
@@ -60,6 +63,7 @@
ICapabilityTensorFloat32ConversionINTEL = 6425,
ICapabilityMaskedGatherScatterINTEL = 6427,
ICapabilityHWThreadQueryINTEL = 6134,
+ ICapGlobalVariableDecorationsINTEL = 6146
};
enum InternalFunctionControlMask { IFunctionControlOptNoneINTELMask = 0x10000
};
@@ -106,6 +110,13 @@
constexpr Decoration DecorationNoAliasINTEL =
static_cast<Decoration>(IDecNoAliasINTEL);
+constexpr Decoration DecorationHostAccessINTEL =
+ static_cast<Decoration>(IDecHostAccessINTEL);
+constexpr Decoration DecorationInitModeINTEL =
+ static_cast<Decoration>(IDecInitModeINTEL);
+constexpr Decoration DecorationImplementInCSRINTEL =
+ static_cast<Decoration>(IDecImplementInCSRINTEL);
+
constexpr Capability CapabilityOptNoneINTEL =
static_cast<Capability>(ICapOptNoneINTEL);
constexpr Capability CapabilityMemoryAccessAliasingINTEL =
@@ -114,6 +125,8 @@
static_cast<Capability>(ICapBfloat16ConversionINTEL);
constexpr Capability CapabilityDebugInfoModuleINTEL =
static_cast<Capability>(ICapDebugInfoModuleINTEL);
+constexpr Capability CapabilityGlobalVariableDecorationsINTEL =
+ static_cast<Capability>(ICapGlobalVariableDecorationsINTEL);
constexpr FunctionControlMask FunctionControlOptNoneINTELMask =
static_cast<FunctionControlMask>(IFunctionControlOptNoneINTELMask);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/test/spirv_global_variable_decoration.ll
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/test/spirv_global_variable_decoration.ll
---
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/test/spirv_global_variable_decoration.ll
1970-01-01 01:00:00.000000000 +0100
+++
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/test/spirv_global_variable_decoration.ll
2023-03-18 21:49:42.000000000 +0100
@@ -0,0 +1,38 @@
+; RUN: llvm-as %s -o %t.bc
+; RUN: llvm-spirv %t.bc -spirv-text -o - | FileCheck %s
--check-prefix=CHECK-SPIRV
+; RUN: llvm-spirv %t.bc -o %t.spv
+; RUN: llvm-spirv -r %t.spv --spirv-target-env=SPV-IR -o %t.rev.bc
+; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-SPV-IR
+; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
+; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
+
+target datalayout =
"e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir"
+
+@v1 = addrspace(1) global i32 42, !spirv.Decorations !2
+@v2 = addrspace(1) global float 1.0, !spirv.Decorations !4
+
+; CHECK-SPIRV: Decorate [[PId1:[0-9]+]] Constant
+; CHECK-SPIRV: Decorate [[PId2:[0-9]+]] Constant
+; CHECK-SPIRV: Decorate [[PId2]] Binding 1
+; CHECK-SPIRV: Variable {{[0-9]+}} [[PId1]]
+; CHECK-SPIRV: Variable {{[0-9]+}} [[PId2]]
+
+!1 = !{i32 22}
+!2 = !{!1}
+!3 = !{i32 33, i32 1}
+!4 = !{!1, !3}
+
+; CHECK-SPV-IR: @v1 = addrspace(1) constant i32 42, !spirv.Decorations
![[Var1DecosId:[0-9]+]]
+; CHECK-SPV-IR: @v2 = addrspace(1) constant float 1.000000e+00,
!spirv.Decorations ![[Var2DecosId:[0-9]+]]
+; CHECK-SPV-IR-DAG: ![[Var1DecosId]] = !{![[Deco1Id:[0-9]+]],
![[LinkageDeco1Id:[0-9]+]]}
+; CHECK-SPV-IR-DAG: ![[Var2DecosId]] = !{![[Deco1Id]], ![[Deco2Id:[0-9]+]],
![[LinkageDeco2Id:[0-9]+]]}
+; CHECK-SPV-IR-DAG: ![[Deco1Id]] = !{i32 22}
+; CHECK-SPV-IR-DAG: ![[Deco2Id]] = !{i32 33, i32 1}
+; CHECK-SPV-IR-DAG: ![[LinkageDeco1Id]] = !{i32 41, !"v1", i32 0}
+; CHECK-SPV-IR-DAG: ![[LinkageDeco2Id]] = !{i32 41, !"v2", i32 0}
+
+; CHECK-LLVM-NOT: @v1 = {{.*}}, !spirv.Decorations !{{[0-9]+}}
+; CHECK-LLVM-NOT: @v2 = {{.*}}, !spirv.Decorations !{{[0-9]+}}
+; CHECK-LLVM: @v1 = addrspace(1) constant i32 42
+; CHECK-LLVM: @v2 = addrspace(1) constant float 1.000000e+00
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/test/spirv_param_decorations.ll
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/test/spirv_param_decorations.ll
---
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/test/spirv_param_decorations.ll
1970-01-01 01:00:00.000000000 +0100
+++
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/test/spirv_param_decorations.ll
2023-03-18 21:49:42.000000000 +0100
@@ -0,0 +1,55 @@
+; RUN: llvm-as %s -o %t.bc
+; RUN: llvm-spirv %t.bc -spirv-text -o - | FileCheck %s
--check-prefix=CHECK-SPIRV
+; RUN: llvm-spirv %t.bc -o %t.spv
+; RUN: llvm-spirv -r %t.spv --spirv-target-env=SPV-IR -o %t.rev.bc
+; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-SPV-IR
+; RUN: llvm-spirv -r %t.spv --spirv-target-env=SPV-IR -o %t.rev.bc
+; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
+
+target datalayout =
"e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir"
+
+; Function Attrs: convergent nounwind
+define spir_kernel void @k(float %a, float %b, float %c) #0
!kernel_arg_addr_space !4 !kernel_arg_access_qual !5 !kernel_arg_type !6
!kernel_arg_type_qual !7 !kernel_arg_base_type !6 !spirv.ParameterDecorations
!14 {
+entry:
+ ret void
+}
+
+; CHECK-SPIRV: Decorate [[PId1:[0-9]+]] Restrict
+; CHECK-SPIRV: Decorate [[PId2:[0-9]+]] Volatile
+; CHECK-SPIRV: Decorate [[PId1]] FPRoundingMode 2
+; CHECK-SPIRV: FunctionParameter {{[0-9]+}} [[PId1]]
+; CHECK-SPIRV: FunctionParameter {{[0-9]+}} [[PId2]]
+
+!llvm.module.flags = !{!0}
+!opencl.ocl.version = !{!1}
+!opencl.spir.version = !{!2}
+!llvm.ident = !{!3}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{i32 1, i32 0}
+!2 = !{i32 1, i32 2}
+!3 = !{!"clang version 14.0.0"}
+!4 = !{i32 0, i32 0, i32 0}
+!5 = !{!"none", !"none", !"none"}
+!6 = !{!"float", !"float", !"float"}
+!7 = !{!"", !"", !""}
+!8 = !{i32 19}
+!9 = !{i32 39, i32 2}
+!10 = !{i32 21}
+!11 = !{!8, !9}
+!12 = !{}
+!13 = !{!10}
+!14 = !{!11, !12, !13}
+
+; CHECK-SPV-IR: define spir_kernel void @k(float %a, float %b, float %c)
{{.*}} !spirv.ParameterDecorations ![[ParamDecoListId:[0-9]+]] {
+; CHECK-SPV-IR-DAG: ![[ParamDecoListId]] = !{![[Param1DecoId:[0-9]+]],
![[Param2DecoId:[0-9]+]], ![[Param3DecoId:[0-9]+]]}
+; CHECK-SPV-IR-DAG: ![[Param1DecoId]] = !{![[Deco1Id:[0-9]+]],
![[Deco2Id:[0-9]+]]}
+; CHECK-SPV-IR-DAG: ![[Param2DecoId]] = !{}
+; CHECK-SPV-IR-DAG: ![[Param3DecoId]] = !{![[Deco3Id:[0-9]+]]}
+; CHECK-SPV-IR-DAG: ![[Deco1Id]] = !{i32 19}
+; CHECK-SPV-IR-DAG: ![[Deco2Id]] = !{i32 39, i32 2}
+; CHECK-SPV-IR-DAG: ![[Deco3Id]] = !{i32 21}
+
+; CHECK-LLVM-NOT: define spir_kernel void @k(float %a, float %b, float %c)
{{.*}} !spirv.ParameterDecorations ![[ParamDecoListId:[0-9]+]] {
+; CHECK-LLVM: define spir_kernel void @k(float %a, float %b, float %c) {{.*}} {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/test/spirv_param_decorations_quals.ll
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/test/spirv_param_decorations_quals.ll
---
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/test/spirv_param_decorations_quals.ll
1970-01-01 01:00:00.000000000 +0100
+++
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/test/spirv_param_decorations_quals.ll
2023-03-18 21:49:42.000000000 +0100
@@ -0,0 +1,50 @@
+; RUN: llvm-as %s -o %t.bc
+; RUN: llvm-spirv %t.bc -spirv-text -o - | FileCheck %s
--check-prefix=CHECK-SPIRV
+; RUN: llvm-spirv %t.bc -o %t.spv
+; RUN: llvm-spirv -r %t.spv --spirv-target-env=SPV-IR -o %t.rev.bc
+; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-SPV-IR
+; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
+; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
+
+target datalayout =
"e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir"
+
+; Function Attrs: convergent nounwind
+define spir_kernel void @k(i32 addrspace(1)* %a) #0 !kernel_arg_addr_space !4
!kernel_arg_access_qual !5 !kernel_arg_type !6 !kernel_arg_type_qual !7
!kernel_arg_base_type !6 !spirv.ParameterDecorations !10 {
+entry:
+ ret void
+}
+
+; CHECK-SPIRV: Decorate [[PId:[0-9]+]] Volatile
+; CHECK-SPIRV: Decorate [[PId]] FuncParamAttr 4
+; CHECK-SPIRV: FunctionParameter {{[0-9]+}} [[PId]]
+
+!llvm.module.flags = !{!0}
+!opencl.ocl.version = !{!1}
+!opencl.spir.version = !{!2}
+!llvm.ident = !{!3}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{i32 1, i32 0}
+!2 = !{i32 1, i32 2}
+!3 = !{!"clang version 14.0.0"}
+!4 = !{i32 0, i32 0, i32 0}
+!5 = !{!"none"}
+!6 = !{!"int*"}
+!7 = !{!"volatile"}
+!8 = !{i32 38, i32 4} ; FuncParamAttr NoAlias
+!9 = !{!8}
+!10 = !{!9}
+
+; CHECK-SPV-IR: define spir_kernel void @k(i32 addrspace(1)* %a)
+; CHECK-SPV-IR-SAME: !kernel_arg_type_qual ![[KernelArgTypeQual:[0-9]+]]
+; CHECK-SPV-IR-SAME: !spirv.ParameterDecorations ![[ParamDecoListId:[0-9]+]]
+; CHECK-SPV-IR-DAG: ![[ParamDecoListId]] = !{![[ParamDecoId:[0-9]+]]}
+; CHECK-SPV-IR-DAG: ![[ParamDecoId]] = !{![[VolatileDecoId:[0-9]+]],
![[NoAliasDecoId:[0-9]+]]}
+; CHECK-SPV-IR-DAG: ![[NoAliasDecoId]] = !{i32 38, i32 4}
+; CHECK-SPV-IR-DAG: ![[VolatileDecoId]] = !{i32 21}
+; CHECK-SPV-IR-DAG: ![[KernelArgTypeQual]] = !{!"volatile restrict"}
+
+; CHECK-LLVM-NOT: !spirv.ParameterDecorations
+; CHECK-LLVM: define spir_kernel void @k(i32 addrspace(1)* %a) {{.*}}
!kernel_arg_type_qual ![[KernelArgTypeQual:[0-9]+]] {{.*}} {
+; CHECK-LLVM-DAG: ![[KernelArgTypeQual]] = !{!"volatile restrict"}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/test/transcoding/SPV_INTEL_global_variable_decorations/global_var_decorations.ll
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/test/transcoding/SPV_INTEL_global_variable_decorations/global_var_decorations.ll
---
old/SPIRV-LLVM-Translator-b23efa4f0400f8ee10f1db0cc9ff2e081b581ca1/test/transcoding/SPV_INTEL_global_variable_decorations/global_var_decorations.ll
1970-01-01 01:00:00.000000000 +0100
+++
new/SPIRV-LLVM-Translator-a4e58ffda317221a15149f9d0d4f73424c9584fb/test/transcoding/SPV_INTEL_global_variable_decorations/global_var_decorations.ll
2023-03-18 21:49:42.000000000 +0100
@@ -0,0 +1,74 @@
+; RUN: llvm-as %s -o %t.bc
+; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_INTEL_global_variable_decorations -o
%t.spv
+; RUN: llvm-spirv %t.spv -to-text -o %t.spt
+; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
+
+; RUN: llvm-spirv -r %t.spv --spirv-target-env=SPV-IR -o %t.rev.bc
+; RUN: llvm-dis %t.rev.bc
+; RUN: FileCheck < %t.rev.ll %s --check-prefix=CHECK-SPV-IR
+
+; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
+; RUN: llvm-dis %t.rev.bc
+; RUN: FileCheck < %t.rev.ll %s --check-prefix=CHECK-LLVM
+
+; Expected to fail - the decorations require enabled extension to be
translated.
+; RUN: not llvm-spirv %t.bc -o %t.spv
+
+target datalayout =
"e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
+target triple = "spir64-unknown-unknown"
+
+@int_var = addrspace(1) global i32 42, !spirv.Decorations !1
+@float_var = addrspace(1) global float 1.0, !spirv.Decorations !6
+@bool_var = addrspace(1) global i1 0, !spirv.Decorations !9
+
+; CHECK-SPIRV: Capability GlobalVariableDecorationsINTEL
+; CHECK-SPIRV: Extension "SPV_INTEL_global_variable_decorations"
+; CHECK-SPIRV: Decorate [[#INT_VAR_ID:]] HostAccessINTEL 1 "IntVarName"
+; CHECK-SPIRV: Decorate [[#BOOL_VAR_ID:]] HostAccessINTEL 3 "BoolVarName"
+
+; CHECK-SPIRV: Decorate [[#INT_VAR_ID]] InitModeINTEL 0
+; CHECK-SPIRV: Decorate [[#BOOL_VAR_ID]] InitModeINTEL 0
+; CHECK-SPIRV: Decorate [[#FLOAT_VAR_ID:]] InitModeINTEL 1
+
+; CHECK-SPIRV: Decorate [[#BOOL_VAR_ID]] ImplementInCSRINTEL 0
+; CHECK-SPIRV: Decorate [[#INT_VAR_ID]] ImplementInCSRINTEL 1
+; CHECK-SPIRV: Decorate [[#FLOAT_VAR_ID]] ImplementInCSRINTEL 1
+
+
+; 5 is a global storage
+; CHECK-SPIRV: Variable [[#]] [[#INT_VAR_ID]] 5
+; CHECK-SPIRV: Variable [[#]] [[#FLOAT_VAR_ID]] 5
+; CHECK-SPIRV: Variable [[#]] [[#BOOL_VAR_ID]] 5
+
+!1 = !{!2, !3, !4}
+!2 = !{i32 6147, i32 1, !"IntVarName"} ; HostAccessINTEL 1 "IntVarName"
+!3 = !{i32 6149, i1 true} ; ImplementInCSRINTEL = true
+!4 = !{i32 6148, i32 0} ; InitModeINTEL = 0
+!5 = !{i32 6148, i32 1} ; InitModeINTEL = 1
+!6 = !{!3, !5}
+!7 = !{i32 6147, i32 3, !"BoolVarName"} ; HostAccessINTEL 3 "BoolVarName"
+!8 = !{i32 6149, i1 false} ; ImplementInCSRINTEL = false
+!9 = !{!7, !8, !4}
+
+; CHECK-SPV-IR: @int_var = addrspace(1) global i32 42, !spirv.Decorations
![[#INT_VAR_DEC:]]
+; CHECK-SPV-IR: @float_var = addrspace(1) global float 1.000000e+00,
!spirv.Decorations ![[#FLOAT_VAR_DEC:]]
+; CHECK-SPV-IR: @bool_var = addrspace(1) global i1 false, !spirv.Decorations
![[#BOOL_VAR_DEC:]]
+
+; CHECK-SPV-IR: ![[#INT_VAR_DEC]] = !{![[#]], ![[#MD_HOST_ACCESS_INTVAR:]],
![[#MD_INIT_0:]], ![[#MD_CSR_1:]]}
+; CHECK-SPV-IR: ![[#MD_HOST_ACCESS_INTVAR]] = !{i32 6147, i32 1, !"IntVarName"}
+; CHECK-SPV-IR: ![[#MD_INIT_0]] = !{i32 6148, i32 0}
+; CHECK-SPV-IR: ![[#MD_CSR_1]] = !{i32 6149, i32 1}
+; CHECK-SPV-IR: ![[#FLOAT_VAR_DEC]] = !{![[#]], ![[#MD_INIT_1:]],
![[#MD_CSR_1]]}
+; CHECK-SPV-IR: ![[#MD_INIT_1]] = !{i32 6148, i32 1}
+; CHECK-SPV-IR: ![[#BOOL_VAR_DEC]] = !{![[#]], ![[#MD_HOST_ACCESS_BOOLVAR:]],
![[#MD_INIT_0]], ![[#MD_CSR_0:]]}
+; CHECK-SPV-IR: ![[#MD_HOST_ACCESS_BOOLVAR]] = !{i32 6147, i32 3,
!"BoolVarName"}
+; CHECK-SPV-IR: ![[#MD_CSR_0]] = !{i32 6149, i32 0}
+
+
+; CHECK-LLVM-NOT: @int_var = {{.*}}, !spirv.Decorations ![[#]]
+; CHECK-LLVM-NOT: @float_var = {{.*}}, !spirv.Decorations ![[#]]
+; CHECK-LLVM-NOT: @bool_var = {{.*}}, !spirv.Decorations ![[#]]
+
+; CHECK-LLVM: @int_var = addrspace(1) global i32 42
+; CHECK-LLVM: @float_var = addrspace(1) global float 1.000000e+00
+; CHECK-LLVM: @bool_var = addrspace(1) global i1 false