Skip to content

Commit 538005a

Browse files
authored
Update decorations for global variables (#2174)
This change is basically an update of #1389 for spec changes. Implementation of the feature was based on Intel extension which was not officially published to Khronos. Now it has been split, updated, and published to Khronos by KhronosGroup/SPIRV-Registry#205 Summary of the things that have changed: Capability names and a new capability was added Values for decorations have been updated to enums Decoration names and IDs have been changed Specs: https://github.com/KhronosGroup/SPIRV-Registry/blob/main/extensions/INTEL/SPV_INTEL_global_variable_fpga_decorations.asciidoc https://github.com/KhronosGroup/SPIRV-Registry/blob/main/extensions/INTEL/SPV_INTEL_global_variable_host_access.asciidoc
1 parent d009cd4 commit 538005a

File tree

15 files changed

+300
-130
lines changed

15 files changed

+300
-130
lines changed

include/LLVMSPIRVExtensions.inc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ EXT(SPV_INTEL_arithmetic_fence)
5454
EXT(SPV_INTEL_bfloat16_conversion)
5555
EXT(SPV_INTEL_joint_matrix)
5656
EXT(SPV_INTEL_hw_thread_queries)
57-
EXT(SPV_INTEL_global_variable_decorations)
57+
EXT(SPV_INTEL_global_variable_host_access)
58+
EXT(SPV_INTEL_global_variable_fpga_decorations)
5859
EXT(SPV_INTEL_complex_float_mul_div)
5960
EXT(SPV_INTEL_split_barrier)
6061
EXT(SPV_INTEL_masked_gather_scatter)

lib/SPIRV/SPIRVReader.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3863,7 +3863,7 @@ transDecorationsToMetadataList(llvm::LLVMContext *Context,
38633863
OPs.push_back(LinkTypeMD);
38643864
break;
38653865
}
3866-
case spv::internal::DecorationHostAccessINTEL: {
3866+
case DecorationHostAccessINTEL: {
38673867
const auto *const HostAccDeco =
38683868
static_cast<const SPIRVDecorateHostAccessINTEL *>(Deco);
38693869
auto *const AccModeMD = ConstantAsMetadata::get(ConstantInt::get(

lib/SPIRV/SPIRVWriter.cpp

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2572,7 +2572,8 @@ static void transMetadataDecorations(Metadata *MD, SPIRVEntry *Target) {
25722572
Target, Name->getString().str(), TypeKind));
25732573
break;
25742574
}
2575-
case spv::internal::DecorationHostAccessINTEL: {
2575+
2576+
case DecorationHostAccessINTEL: {
25762577
checkIsGlobalVar(Target, DecoKind);
25772578

25782579
ErrLog.checkError(NumOperands == 3, SPIRVEC_InvalidLlvmModule,
@@ -2583,16 +2584,20 @@ static void transMetadataDecorations(Metadata *MD, SPIRVEntry *Target) {
25832584
ErrLog.checkError(
25842585
AccessMode, SPIRVEC_InvalidLlvmModule,
25852586
"HostAccessINTEL requires first extra operand to be an int");
2587+
2588+
HostAccessQualifier Q =
2589+
static_cast<HostAccessQualifier>(AccessMode->getZExtValue());
25862590
auto *Name = dyn_cast<MDString>(DecoMD->getOperand(2));
25872591
ErrLog.checkError(
25882592
Name, SPIRVEC_InvalidLlvmModule,
25892593
"HostAccessINTEL requires second extra operand to be a string");
25902594

2591-
Target->addDecorate(new SPIRVDecorateHostAccessINTEL(
2592-
Target, AccessMode->getZExtValue(), Name->getString().str()));
2595+
Target->addDecorate(
2596+
new SPIRVDecorateHostAccessINTEL(Target, Q, Name->getString().str()));
25932597
break;
25942598
}
2595-
case spv::internal::DecorationInitModeINTEL: {
2599+
2600+
case DecorationInitModeINTEL: {
25962601
checkIsGlobalVar(Target, DecoKind);
25972602
ErrLog.checkError(static_cast<SPIRVVariable *>(Target)->getInitializer(),
25982603
SPIRVEC_InvalidLlvmModule,
@@ -2602,27 +2607,32 @@ static void transMetadataDecorations(Metadata *MD, SPIRVEntry *Target) {
26022607
ErrLog.checkError(NumOperands == 2, SPIRVEC_InvalidLlvmModule,
26032608
"InitModeINTEL requires exactly 1 extra operand");
26042609
auto *Trigger = mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(1));
2605-
ErrLog.checkError(
2606-
Trigger, SPIRVEC_InvalidLlvmModule,
2607-
"InitModeINTEL requires extra operand to be an integer");
2610+
ErrLog.checkError(Trigger, SPIRVEC_InvalidLlvmModule,
2611+
"InitModeINTEL requires extra operand to be an int");
2612+
2613+
InitializationModeQualifier Q =
2614+
static_cast<InitializationModeQualifier>(Trigger->getZExtValue());
2615+
2616+
Target->addDecorate(new SPIRVDecorateInitModeINTEL(Target, Q));
26082617

2609-
Target->addDecorate(
2610-
new SPIRVDecorateInitModeINTEL(Target, Trigger->getZExtValue()));
26112618
break;
26122619
}
2613-
case spv::internal::DecorationImplementInCSRINTEL: {
2620+
case DecorationImplementInRegisterMapINTEL: {
26142621
checkIsGlobalVar(Target, DecoKind);
2615-
ErrLog.checkError(NumOperands == 2, SPIRVEC_InvalidLlvmModule,
2616-
"ImplementInCSRINTEL requires exactly 1 extra operand");
2617-
auto *Value = mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(1));
26182622
ErrLog.checkError(
2619-
Value, SPIRVEC_InvalidLlvmModule,
2620-
"ImplementInCSRINTEL requires extra operand to be an integer");
2623+
NumOperands == 2, SPIRVEC_InvalidLlvmModule,
2624+
"ImplementInRegisterMapINTEL requires exactly 1 extra operand");
2625+
auto *Value = mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(1));
2626+
ErrLog.checkError(Value, SPIRVEC_InvalidLlvmModule,
2627+
"ImplementInRegisterMapINTEL requires extra operand to "
2628+
"be an integer");
2629+
2630+
Target->addDecorate(new SPIRVDecorateImplementInRegisterMapINTEL(
2631+
Target, Value->getZExtValue()));
26212632

2622-
Target->addDecorate(
2623-
new SPIRVDecorateImplementInCSRINTEL(Target, Value->getZExtValue()));
26242633
break;
26252634
}
2635+
26262636
case spv::internal::DecorationCacheControlLoadINTEL: {
26272637
ErrLog.checkError(
26282638
NumOperands == 3, SPIRVEC_InvalidLlvmModule,

lib/SPIRV/libSPIRV/SPIRVDecorate.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,12 @@ void SPIRVDecorate::encode(spv_ostream &O) const {
124124
case DecorationUserSemantic:
125125
SPIRVDecorateUserSemanticAttr::encodeLiterals(Encoder, Literals);
126126
break;
127-
case spv::internal::DecorationHostAccessINTEL:
127+
case DecorationHostAccessINTEL:
128128
SPIRVDecorateHostAccessINTEL::encodeLiterals(Encoder, Literals);
129129
break;
130+
case DecorationInitModeINTEL:
131+
SPIRVDecorateInitModeINTEL::encodeLiterals(Encoder, Literals);
132+
break;
130133
default:
131134
Encoder << Literals;
132135
}
@@ -153,7 +156,7 @@ void SPIRVDecorate::decode(std::istream &I) {
153156
case DecorationUserSemantic:
154157
SPIRVDecorateUserSemanticAttr::decodeLiterals(Decoder, Literals);
155158
break;
156-
case spv::internal::DecorationHostAccessINTEL:
159+
case DecorationHostAccessINTEL:
157160
SPIRVDecorateHostAccessINTEL::decodeLiterals(Decoder, Literals);
158161
break;
159162
default:

lib/SPIRV/libSPIRV/SPIRVDecorate.h

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -184,10 +184,12 @@ class SPIRVDecorate : public SPIRVDecorateGeneric {
184184
return ExtensionID::SPV_INTEL_fpga_invocation_pipelining_attributes;
185185
case internal::DecorationRuntimeAlignedINTEL:
186186
return ExtensionID::SPV_INTEL_runtime_aligned;
187-
case internal::DecorationHostAccessINTEL:
188-
case internal::DecorationInitModeINTEL:
189-
case internal::DecorationImplementInCSRINTEL:
190-
return ExtensionID::SPV_INTEL_global_variable_decorations;
187+
case DecorationInitModeINTEL:
188+
case DecorationImplementInRegisterMapINTEL:
189+
return ExtensionID::SPV_INTEL_global_variable_fpga_decorations;
190+
case DecorationHostAccessINTEL:
191+
return ExtensionID::SPV_INTEL_global_variable_host_access;
192+
191193
case DecorationConduitKernelArgumentINTEL:
192194
case DecorationRegisterMapKernelArgumentINTEL:
193195
case DecorationStableKernelArgumentINTEL:
@@ -730,9 +732,10 @@ class SPIRVDecoratePipelineEnableINTEL : public SPIRVDecorate {
730732
class SPIRVDecorateHostAccessINTEL : public SPIRVDecorate {
731733
public:
732734
// Complete constructor for SPIRVHostAccessINTEL
733-
SPIRVDecorateHostAccessINTEL(SPIRVEntry *TheTarget, SPIRVWord AccessMode,
735+
SPIRVDecorateHostAccessINTEL(SPIRVEntry *TheTarget,
736+
HostAccessQualifier AccessMode,
734737
const std::string &VarName)
735-
: SPIRVDecorate(spv::internal::DecorationHostAccessINTEL, TheTarget) {
738+
: SPIRVDecorate(DecorationHostAccessINTEL, TheTarget) {
736739
Literals.push_back(AccessMode);
737740
for (auto &I : getVec(VarName))
738741
Literals.push_back(I);
@@ -748,7 +751,7 @@ class SPIRVDecorateHostAccessINTEL : public SPIRVDecorate {
748751
const std::vector<SPIRVWord> &Literals) {
749752
#ifdef _SPIRV_SUPPORT_TEXT_FMT
750753
if (SPIRVUseTextFormat) {
751-
Encoder << Literals.front();
754+
Encoder << (HostAccessQualifier)Literals.front();
752755
std::string Name = getString(Literals.cbegin() + 1, Literals.cend());
753756
Encoder << Name;
754757
} else
@@ -760,7 +763,7 @@ class SPIRVDecorateHostAccessINTEL : public SPIRVDecorate {
760763
std::vector<SPIRVWord> &Literals) {
761764
#ifdef _SPIRV_SUPPORT_TEXT_FMT
762765
if (SPIRVUseTextFormat) {
763-
SPIRVWord Mode;
766+
HostAccessQualifier Mode;
764767
Decoder >> Mode;
765768
std::string Name;
766769
Decoder >> Name;
@@ -777,17 +780,42 @@ class SPIRVDecorateHostAccessINTEL : public SPIRVDecorate {
777780
class SPIRVDecorateInitModeINTEL : public SPIRVDecorate {
778781
public:
779782
// Complete constructor for SPIRVInitModeINTEL
780-
SPIRVDecorateInitModeINTEL(SPIRVEntry *TheTarget, SPIRVWord Trigger)
781-
: SPIRVDecorate(spv::internal::DecorationInitModeINTEL, TheTarget,
782-
Trigger) {}
783+
SPIRVDecorateInitModeINTEL(SPIRVEntry *TheTarget,
784+
InitializationModeQualifier Trigger)
785+
: SPIRVDecorate(DecorationInitModeINTEL, TheTarget) {
786+
Literals.push_back(Trigger);
787+
WordCount += Literals.size();
788+
}
789+
static void encodeLiterals(SPIRVEncoder &Encoder,
790+
const std::vector<SPIRVWord> &Literals) {
791+
#ifdef _SPIRV_SUPPORT_TEXT_FMT
792+
if (SPIRVUseTextFormat) {
793+
Encoder << (InitializationModeQualifier)Literals.back();
794+
} else
795+
#endif
796+
Encoder << Literals;
797+
}
798+
799+
static void decodeLiterals(SPIRVDecoder &Decoder,
800+
std::vector<SPIRVWord> &Literals) {
801+
#ifdef _SPIRV_SUPPORT_TEXT_FMT
802+
if (SPIRVUseTextFormat) {
803+
InitializationModeQualifier Q;
804+
Decoder >> Q;
805+
Literals.back() = Q;
806+
} else
807+
#endif
808+
Decoder >> Literals;
809+
}
783810
};
784811

785-
class SPIRVDecorateImplementInCSRINTEL : public SPIRVDecorate {
812+
class SPIRVDecorateImplementInRegisterMapINTEL : public SPIRVDecorate {
786813
public:
787814
// Complete constructor for SPIRVImplementInCSRINTEL
788-
SPIRVDecorateImplementInCSRINTEL(SPIRVEntry *TheTarget, SPIRVWord Value)
789-
: SPIRVDecorate(spv::internal::DecorationImplementInCSRINTEL, TheTarget,
790-
Value) {}
815+
SPIRVDecorateImplementInRegisterMapINTEL(SPIRVEntry *TheTarget,
816+
SPIRVWord Value)
817+
: SPIRVDecorate(DecorationImplementInRegisterMapINTEL, TheTarget, Value) {
818+
}
791819
};
792820

793821
class SPIRVDecorateCacheControlLoadINTEL : public SPIRVDecorate {

lib/SPIRV/libSPIRV/SPIRVEnum.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -463,12 +463,12 @@ template <> inline void SPIRVMap<Decoration, SPIRVCapVec>::init() {
463463
{CapabilityFPGAInvocationPipeliningAttributesINTEL});
464464
ADD_VEC_INIT(internal::DecorationRuntimeAlignedINTEL,
465465
{CapabilityRuntimeAlignedAttributeINTEL});
466-
ADD_VEC_INIT(internal::DecorationHostAccessINTEL,
467-
{internal::CapabilityGlobalVariableDecorationsINTEL});
468-
ADD_VEC_INIT(internal::DecorationInitModeINTEL,
469-
{internal::CapabilityGlobalVariableDecorationsINTEL});
470-
ADD_VEC_INIT(internal::DecorationImplementInCSRINTEL,
471-
{internal::CapabilityGlobalVariableDecorationsINTEL});
466+
ADD_VEC_INIT(DecorationHostAccessINTEL,
467+
{CapabilityGlobalVariableHostAccessINTEL});
468+
ADD_VEC_INIT(DecorationInitModeINTEL,
469+
{CapabilityGlobalVariableFPGADecorationsINTEL});
470+
ADD_VEC_INIT(DecorationImplementInRegisterMapINTEL,
471+
{CapabilityGlobalVariableFPGADecorationsINTEL});
472472
ADD_VEC_INIT(internal::DecorationArgumentAttributeINTEL,
473473
{CapabilityFunctionPointersINTEL});
474474
ADD_VEC_INIT(internal::DecorationCacheControlLoadINTEL,

lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,12 +200,13 @@ template <> inline void SPIRVMap<Decoration, std::string>::init() {
200200
add(DecorationLatencyControlConstraintINTEL, "LatencyControlConstraintINTEL");
201201
add(DecorationFPMaxErrorDecorationINTEL, "FPMaxErrorDecorationINTEL");
202202

203+
add(DecorationHostAccessINTEL, "HostAccessINTEL");
204+
add(DecorationInitModeINTEL, "InitModeINTEL");
205+
add(DecorationImplementInRegisterMapINTEL, "ImplementInRegisterMapINTEL");
206+
203207
// From spirv_internal.hpp
204208
add(internal::DecorationCallableFunctionINTEL, "CallableFunctionINTEL");
205209
add(internal::DecorationRuntimeAlignedINTEL, "RuntimeAlignedINTEL");
206-
add(internal::DecorationHostAccessINTEL, "HostAccessINTEL");
207-
add(internal::DecorationInitModeINTEL, "InitModeINTEL");
208-
add(internal::DecorationImplementInCSRINTEL, "ImplementInCSRINTEL");
209210
add(internal::DecorationArgumentAttributeINTEL, "ArgumentAttributeINTEL");
210211
add(internal::DecorationCacheControlLoadINTEL, "CacheControlLoadINTEL");
211212
add(internal::DecorationCacheControlStoreINTEL, "CacheControlStoreINTEL");
@@ -616,6 +617,9 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
616617
add(CapabilityAtomicFloat16AddEXT, "AtomicFloat16AddEXT");
617618
add(CapabilityDebugInfoModuleINTEL, "DebugInfoModuleINTEL");
618619
add(CapabilitySplitBarrierINTEL, "SplitBarrierINTEL");
620+
add(CapabilityGlobalVariableFPGADecorationsINTEL,
621+
"GlobalVariableFPGADecorationsINTEL");
622+
add(CapabilityGlobalVariableHostAccessINTEL, "GlobalVariableHostAccessINTEL");
619623
add(CapabilityGroupUniformArithmeticKHR, "GroupUniformArithmeticKHR");
620624
add(CapabilityFPGADSPControlINTEL, "FPGADSPControlINTEL");
621625
add(CapabilityFPGAInvocationPipeliningAttributesINTEL,
@@ -633,8 +637,6 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
633637
add(internal::CapabilityBfloat16ConversionINTEL, "Bfloat16ConversionINTEL");
634638
add(internal::CapabilityJointMatrixINTEL, "JointMatrixINTEL");
635639
add(internal::CapabilityHWThreadQueryINTEL, "HWThreadQueryINTEL");
636-
add(internal::CapabilityGlobalVariableDecorationsINTEL,
637-
"GlobalVariableDecorationsINTEL");
638640
add(internal::CapabilityComplexFloatMulDivINTEL, "ComplexFloatMulDivINTEL");
639641
add(internal::CapabilityMaskedGatherScatterINTEL, "MaskedGatherScatterINTEL");
640642
add(internal::CapabilityTensorFloat32RoundingINTEL,
@@ -653,6 +655,26 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
653655
}
654656
SPIRV_DEF_NAMEMAP(Capability, SPIRVCapabilityNameMap)
655657

658+
template <>
659+
inline void SPIRVMap<InitializationModeQualifier, std::string>::init() {
660+
add(InitializationModeQualifierInitOnDeviceReprogramINTEL,
661+
"InitOnDeviceReprogramINTEL");
662+
add(InitializationModeQualifierInitOnDeviceResetINTEL,
663+
"InitOnDeviceResetINTEL");
664+
add(InitializationModeQualifierMax, "Max");
665+
}
666+
SPIRV_DEF_NAMEMAP(InitializationModeQualifier,
667+
SPIRVInitializationModeQualifierNameMap)
668+
669+
template <> inline void SPIRVMap<HostAccessQualifier, std::string>::init() {
670+
add(HostAccessQualifierNoneINTEL, "NoneINTEL");
671+
add(HostAccessQualifierReadINTEL, "ReadINTEL");
672+
add(HostAccessQualifierWriteINTEL, "WriteINTEL");
673+
add(HostAccessQualifierReadWriteINTEL, "ReadWriteINTEL");
674+
add(HostAccessQualifierMax, "Max");
675+
}
676+
SPIRV_DEF_NAMEMAP(HostAccessQualifier, SPIRVHostAccessQualifierNameMap)
677+
656678
} /* namespace SPIRV */
657679

658680
#endif // SPIRV_LIBSPIRV_SPIRVNAMEMAPENUM_H

lib/SPIRV/libSPIRV/SPIRVStream.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ SPIRV_DEF_ENCDEC(Decoration)
145145
SPIRV_DEF_ENCDEC(OCLExtOpKind)
146146
SPIRV_DEF_ENCDEC(SPIRVDebugExtOpKind)
147147
SPIRV_DEF_ENCDEC(NonSemanticAuxDataOpKind)
148+
SPIRV_DEF_ENCDEC(InitializationModeQualifier)
149+
SPIRV_DEF_ENCDEC(HostAccessQualifier)
148150
SPIRV_DEF_ENCDEC(LinkageType)
149151

150152
// Read a string with padded 0's at the end so that they form a stream of

lib/SPIRV/libSPIRV/SPIRVStream.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@ SPIRV_DEC_ENCDEC(Decoration)
229229
SPIRV_DEC_ENCDEC(OCLExtOpKind)
230230
SPIRV_DEC_ENCDEC(SPIRVDebugExtOpKind)
231231
SPIRV_DEC_ENCDEC(NonSemanticAuxDataOpKind)
232+
SPIRV_DEC_ENCDEC(InitializationModeQualifier)
233+
SPIRV_DEC_ENCDEC(HostAccessQualifier)
232234
SPIRV_DEC_ENCDEC(LinkageType)
233235

234236
const SPIRVEncoder &operator<<(const SPIRVEncoder &O, const std::string &Str);

lib/SPIRV/libSPIRV/spirv_internal.hpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,6 @@ enum InternalOp {
8484
enum InternalDecoration {
8585
IDecRuntimeAlignedINTEL = 5940,
8686
IDecCallableFunctionINTEL = 6087,
87-
IDecHostAccessINTEL = 6147,
88-
IDecInitModeINTEL = 6148,
89-
IDecImplementInCSRINTEL = 6149,
9087
IDecArgumentAttributeINTEL = 6409,
9188
IDecCacheControlLoadINTEL = 6442,
9289
IDecCacheControlStoreINTEL = 6443
@@ -245,12 +242,6 @@ constexpr Decoration DecorationCallableFunctionINTEL =
245242
static_cast<Decoration>(IDecCallableFunctionINTEL);
246243
constexpr Decoration DecorationRuntimeAlignedINTEL =
247244
static_cast<Decoration>(IDecRuntimeAlignedINTEL);
248-
constexpr Decoration DecorationHostAccessINTEL =
249-
static_cast<Decoration>(IDecHostAccessINTEL);
250-
constexpr Decoration DecorationInitModeINTEL =
251-
static_cast<Decoration>(IDecInitModeINTEL);
252-
constexpr Decoration DecorationImplementInCSRINTEL =
253-
static_cast<Decoration>(IDecImplementInCSRINTEL);
254245
constexpr Decoration DecorationArgumentAttributeINTEL =
255246
static_cast<Decoration>(IDecArgumentAttributeINTEL);
256247
constexpr Decoration DecorationCacheControlLoadINTEL =

0 commit comments

Comments
 (0)