Skip to content

Commit 20388a8

Browse files
vmaksimosys-ce-bb
authored andcommitted
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 Original commit: KhronosGroup/SPIRV-LLVM-Translator@538005a
1 parent 54df1f0 commit 20388a8

File tree

14 files changed

+299
-129
lines changed

14 files changed

+299
-129
lines changed

llvm-spirv/include/LLVMSPIRVExtensions.inc

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

llvm-spirv/lib/SPIRV/SPIRVReader.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3849,7 +3849,7 @@ transDecorationsToMetadataList(llvm::LLVMContext *Context,
38493849
OPs.push_back(LinkTypeMD);
38503850
break;
38513851
}
3852-
case spv::internal::DecorationHostAccessINTEL: {
3852+
case DecorationHostAccessINTEL: {
38533853
const auto *const HostAccDeco =
38543854
static_cast<const SPIRVDecorateHostAccessINTEL *>(Deco);
38553855
auto *const AccModeMD = ConstantAsMetadata::get(ConstantInt::get(

llvm-spirv/lib/SPIRV/SPIRVWriter.cpp

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2662,7 +2662,8 @@ static void transMetadataDecorations(Metadata *MD, SPIRVEntry *Target) {
26622662
Target, Name->getString().str(), TypeKind));
26632663
break;
26642664
}
2665-
case spv::internal::DecorationHostAccessINTEL: {
2665+
2666+
case DecorationHostAccessINTEL: {
26662667
checkIsGlobalVar(Target, DecoKind);
26672668

26682669
ErrLog.checkError(NumOperands == 3, SPIRVEC_InvalidLlvmModule,
@@ -2673,16 +2674,20 @@ static void transMetadataDecorations(Metadata *MD, SPIRVEntry *Target) {
26732674
ErrLog.checkError(
26742675
AccessMode, SPIRVEC_InvalidLlvmModule,
26752676
"HostAccessINTEL requires first extra operand to be an int");
2677+
2678+
HostAccessQualifier Q =
2679+
static_cast<HostAccessQualifier>(AccessMode->getZExtValue());
26762680
auto *Name = dyn_cast<MDString>(DecoMD->getOperand(2));
26772681
ErrLog.checkError(
26782682
Name, SPIRVEC_InvalidLlvmModule,
26792683
"HostAccessINTEL requires second extra operand to be a string");
26802684

2681-
Target->addDecorate(new SPIRVDecorateHostAccessINTEL(
2682-
Target, AccessMode->getZExtValue(), Name->getString().str()));
2685+
Target->addDecorate(
2686+
new SPIRVDecorateHostAccessINTEL(Target, Q, Name->getString().str()));
26832687
break;
26842688
}
2685-
case spv::internal::DecorationInitModeINTEL: {
2689+
2690+
case DecorationInitModeINTEL: {
26862691
checkIsGlobalVar(Target, DecoKind);
26872692
ErrLog.checkError(static_cast<SPIRVVariable *>(Target)->getInitializer(),
26882693
SPIRVEC_InvalidLlvmModule,
@@ -2692,27 +2697,32 @@ static void transMetadataDecorations(Metadata *MD, SPIRVEntry *Target) {
26922697
ErrLog.checkError(NumOperands == 2, SPIRVEC_InvalidLlvmModule,
26932698
"InitModeINTEL requires exactly 1 extra operand");
26942699
auto *Trigger = mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(1));
2695-
ErrLog.checkError(
2696-
Trigger, SPIRVEC_InvalidLlvmModule,
2697-
"InitModeINTEL requires extra operand to be an integer");
2700+
ErrLog.checkError(Trigger, SPIRVEC_InvalidLlvmModule,
2701+
"InitModeINTEL requires extra operand to be an int");
2702+
2703+
InitializationModeQualifier Q =
2704+
static_cast<InitializationModeQualifier>(Trigger->getZExtValue());
2705+
2706+
Target->addDecorate(new SPIRVDecorateInitModeINTEL(Target, Q));
26982707

2699-
Target->addDecorate(
2700-
new SPIRVDecorateInitModeINTEL(Target, Trigger->getZExtValue()));
27012708
break;
27022709
}
2703-
case spv::internal::DecorationImplementInCSRINTEL: {
2710+
case DecorationImplementInRegisterMapINTEL: {
27042711
checkIsGlobalVar(Target, DecoKind);
2705-
ErrLog.checkError(NumOperands == 2, SPIRVEC_InvalidLlvmModule,
2706-
"ImplementInCSRINTEL requires exactly 1 extra operand");
2707-
auto *Value = mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(1));
27082712
ErrLog.checkError(
2709-
Value, SPIRVEC_InvalidLlvmModule,
2710-
"ImplementInCSRINTEL requires extra operand to be an integer");
2713+
NumOperands == 2, SPIRVEC_InvalidLlvmModule,
2714+
"ImplementInRegisterMapINTEL requires exactly 1 extra operand");
2715+
auto *Value = mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(1));
2716+
ErrLog.checkError(Value, SPIRVEC_InvalidLlvmModule,
2717+
"ImplementInRegisterMapINTEL requires extra operand to "
2718+
"be an integer");
2719+
2720+
Target->addDecorate(new SPIRVDecorateImplementInRegisterMapINTEL(
2721+
Target, Value->getZExtValue()));
27112722

2712-
Target->addDecorate(
2713-
new SPIRVDecorateImplementInCSRINTEL(Target, Value->getZExtValue()));
27142723
break;
27152724
}
2725+
27162726
case spv::internal::DecorationCacheControlLoadINTEL: {
27172727
ErrLog.checkError(
27182728
NumOperands == 3, SPIRVEC_InvalidLlvmModule,

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVDecorate.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,12 @@ void SPIRVDecorate::encode(spv_ostream &O) const {
127127
case internal::DecorationFuncParamDescINTEL:
128128
SPIRVDecorateFuncParamDescAttr::encodeLiterals(Encoder, Literals);
129129
break;
130-
case spv::internal::DecorationHostAccessINTEL:
130+
case DecorationHostAccessINTEL:
131131
SPIRVDecorateHostAccessINTEL::encodeLiterals(Encoder, Literals);
132132
break;
133+
case DecorationInitModeINTEL:
134+
SPIRVDecorateInitModeINTEL::encodeLiterals(Encoder, Literals);
135+
break;
133136
default:
134137
Encoder << Literals;
135138
}
@@ -159,7 +162,7 @@ void SPIRVDecorate::decode(std::istream &I) {
159162
case internal::DecorationFuncParamDescINTEL:
160163
SPIRVDecorateFuncParamDescAttr::decodeLiterals(Decoder, Literals);
161164
break;
162-
case spv::internal::DecorationHostAccessINTEL:
165+
case DecorationHostAccessINTEL:
163166
SPIRVDecorateHostAccessINTEL::decodeLiterals(Decoder, Literals);
164167
break;
165168
default:

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVDecorate.h

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -187,10 +187,12 @@ class SPIRVDecorate : public SPIRVDecorateGeneric {
187187
return ExtensionID::SPV_INTEL_fpga_invocation_pipelining_attributes;
188188
case internal::DecorationRuntimeAlignedINTEL:
189189
return ExtensionID::SPV_INTEL_runtime_aligned;
190-
case internal::DecorationHostAccessINTEL:
191-
case internal::DecorationInitModeINTEL:
192-
case internal::DecorationImplementInCSRINTEL:
193-
return ExtensionID::SPV_INTEL_global_variable_decorations;
190+
case DecorationInitModeINTEL:
191+
case DecorationImplementInRegisterMapINTEL:
192+
return ExtensionID::SPV_INTEL_global_variable_fpga_decorations;
193+
case DecorationHostAccessINTEL:
194+
return ExtensionID::SPV_INTEL_global_variable_host_access;
195+
194196
case DecorationConduitKernelArgumentINTEL:
195197
case DecorationRegisterMapKernelArgumentINTEL:
196198
case DecorationStableKernelArgumentINTEL:
@@ -745,9 +747,10 @@ class SPIRVDecoratePipelineEnableINTEL : public SPIRVDecorate {
745747
class SPIRVDecorateHostAccessINTEL : public SPIRVDecorate {
746748
public:
747749
// Complete constructor for SPIRVHostAccessINTEL
748-
SPIRVDecorateHostAccessINTEL(SPIRVEntry *TheTarget, SPIRVWord AccessMode,
750+
SPIRVDecorateHostAccessINTEL(SPIRVEntry *TheTarget,
751+
HostAccessQualifier AccessMode,
749752
const std::string &VarName)
750-
: SPIRVDecorate(spv::internal::DecorationHostAccessINTEL, TheTarget) {
753+
: SPIRVDecorate(DecorationHostAccessINTEL, TheTarget) {
751754
Literals.push_back(AccessMode);
752755
for (auto &I : getVec(VarName))
753756
Literals.push_back(I);
@@ -763,7 +766,7 @@ class SPIRVDecorateHostAccessINTEL : public SPIRVDecorate {
763766
const std::vector<SPIRVWord> &Literals) {
764767
#ifdef _SPIRV_SUPPORT_TEXT_FMT
765768
if (SPIRVUseTextFormat) {
766-
Encoder << Literals.front();
769+
Encoder << (HostAccessQualifier)Literals.front();
767770
std::string Name = getString(Literals.cbegin() + 1, Literals.cend());
768771
Encoder << Name;
769772
} else
@@ -775,7 +778,7 @@ class SPIRVDecorateHostAccessINTEL : public SPIRVDecorate {
775778
std::vector<SPIRVWord> &Literals) {
776779
#ifdef _SPIRV_SUPPORT_TEXT_FMT
777780
if (SPIRVUseTextFormat) {
778-
SPIRVWord Mode;
781+
HostAccessQualifier Mode;
779782
Decoder >> Mode;
780783
std::string Name;
781784
Decoder >> Name;
@@ -792,17 +795,42 @@ class SPIRVDecorateHostAccessINTEL : public SPIRVDecorate {
792795
class SPIRVDecorateInitModeINTEL : public SPIRVDecorate {
793796
public:
794797
// Complete constructor for SPIRVInitModeINTEL
795-
SPIRVDecorateInitModeINTEL(SPIRVEntry *TheTarget, SPIRVWord Trigger)
796-
: SPIRVDecorate(spv::internal::DecorationInitModeINTEL, TheTarget,
797-
Trigger) {}
798+
SPIRVDecorateInitModeINTEL(SPIRVEntry *TheTarget,
799+
InitializationModeQualifier Trigger)
800+
: SPIRVDecorate(DecorationInitModeINTEL, TheTarget) {
801+
Literals.push_back(Trigger);
802+
WordCount += Literals.size();
803+
}
804+
static void encodeLiterals(SPIRVEncoder &Encoder,
805+
const std::vector<SPIRVWord> &Literals) {
806+
#ifdef _SPIRV_SUPPORT_TEXT_FMT
807+
if (SPIRVUseTextFormat) {
808+
Encoder << (InitializationModeQualifier)Literals.back();
809+
} else
810+
#endif
811+
Encoder << Literals;
812+
}
813+
814+
static void decodeLiterals(SPIRVDecoder &Decoder,
815+
std::vector<SPIRVWord> &Literals) {
816+
#ifdef _SPIRV_SUPPORT_TEXT_FMT
817+
if (SPIRVUseTextFormat) {
818+
InitializationModeQualifier Q;
819+
Decoder >> Q;
820+
Literals.back() = Q;
821+
} else
822+
#endif
823+
Decoder >> Literals;
824+
}
798825
};
799826

800-
class SPIRVDecorateImplementInCSRINTEL : public SPIRVDecorate {
827+
class SPIRVDecorateImplementInRegisterMapINTEL : public SPIRVDecorate {
801828
public:
802829
// Complete constructor for SPIRVImplementInCSRINTEL
803-
SPIRVDecorateImplementInCSRINTEL(SPIRVEntry *TheTarget, SPIRVWord Value)
804-
: SPIRVDecorate(spv::internal::DecorationImplementInCSRINTEL, TheTarget,
805-
Value) {}
830+
SPIRVDecorateImplementInRegisterMapINTEL(SPIRVEntry *TheTarget,
831+
SPIRVWord Value)
832+
: SPIRVDecorate(DecorationImplementInRegisterMapINTEL, TheTarget, Value) {
833+
}
806834
};
807835

808836
class SPIRVDecorateCacheControlLoadINTEL : public SPIRVDecorate {

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVEnum.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -476,12 +476,12 @@ template <> inline void SPIRVMap<Decoration, SPIRVCapVec>::init() {
476476
{CapabilityFPGAInvocationPipeliningAttributesINTEL});
477477
ADD_VEC_INIT(internal::DecorationRuntimeAlignedINTEL,
478478
{CapabilityRuntimeAlignedAttributeINTEL});
479-
ADD_VEC_INIT(internal::DecorationHostAccessINTEL,
480-
{internal::CapabilityGlobalVariableDecorationsINTEL});
481-
ADD_VEC_INIT(internal::DecorationInitModeINTEL,
482-
{internal::CapabilityGlobalVariableDecorationsINTEL});
483-
ADD_VEC_INIT(internal::DecorationImplementInCSRINTEL,
484-
{internal::CapabilityGlobalVariableDecorationsINTEL});
479+
ADD_VEC_INIT(DecorationHostAccessINTEL,
480+
{CapabilityGlobalVariableHostAccessINTEL});
481+
ADD_VEC_INIT(DecorationInitModeINTEL,
482+
{CapabilityGlobalVariableFPGADecorationsINTEL});
483+
ADD_VEC_INIT(DecorationImplementInRegisterMapINTEL,
484+
{CapabilityGlobalVariableFPGADecorationsINTEL});
485485
ADD_VEC_INIT(internal::DecorationArgumentAttributeINTEL,
486486
{CapabilityFunctionPointersINTEL});
487487
ADD_VEC_INIT(internal::DecorationCacheControlLoadINTEL,

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -216,14 +216,15 @@ template <> inline void SPIRVMap<Decoration, std::string>::init() {
216216
add(DecorationLatencyControlConstraintINTEL, "LatencyControlConstraintINTEL");
217217
add(DecorationFPMaxErrorDecorationINTEL, "FPMaxErrorDecorationINTEL");
218218

219+
add(DecorationHostAccessINTEL, "HostAccessINTEL");
220+
add(DecorationInitModeINTEL, "InitModeINTEL");
221+
add(DecorationImplementInRegisterMapINTEL, "ImplementInRegisterMapINTEL");
222+
219223
// From spirv_internal.hpp
220224
add(internal::DecorationFuncParamKindINTEL, "FuncParamKindINTEL");
221225
add(internal::DecorationFuncParamDescINTEL, "FuncParamDescINTEL");
222226
add(internal::DecorationCallableFunctionINTEL, "CallableFunctionINTEL");
223227
add(internal::DecorationRuntimeAlignedINTEL, "RuntimeAlignedINTEL");
224-
add(internal::DecorationHostAccessINTEL, "HostAccessINTEL");
225-
add(internal::DecorationInitModeINTEL, "InitModeINTEL");
226-
add(internal::DecorationImplementInCSRINTEL, "ImplementInCSRINTEL");
227228
add(internal::DecorationArgumentAttributeINTEL, "ArgumentAttributeINTEL");
228229
add(internal::DecorationCacheControlLoadINTEL, "CacheControlLoadINTEL");
229230
add(internal::DecorationCacheControlStoreINTEL, "CacheControlStoreINTEL");
@@ -634,6 +635,9 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
634635
add(CapabilityAtomicFloat16AddEXT, "AtomicFloat16AddEXT");
635636
add(CapabilityDebugInfoModuleINTEL, "DebugInfoModuleINTEL");
636637
add(CapabilitySplitBarrierINTEL, "SplitBarrierINTEL");
638+
add(CapabilityGlobalVariableFPGADecorationsINTEL,
639+
"GlobalVariableFPGADecorationsINTEL");
640+
add(CapabilityGlobalVariableHostAccessINTEL, "GlobalVariableHostAccessINTEL");
637641
add(CapabilityGroupUniformArithmeticKHR, "GroupUniformArithmeticKHR");
638642
add(CapabilityFPGAArgumentInterfacesINTEL, "FPGAArgumentInterfacesINTEL");
639643
add(CapabilityFPGADSPControlINTEL, "FPGADSPControlINTEL");
@@ -652,8 +656,6 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
652656
add(internal::CapabilityBfloat16ConversionINTEL, "Bfloat16ConversionINTEL");
653657
add(internal::CapabilityJointMatrixINTEL, "JointMatrixINTEL");
654658
add(internal::CapabilityHWThreadQueryINTEL, "HWThreadQueryINTEL");
655-
add(internal::CapabilityGlobalVariableDecorationsINTEL,
656-
"GlobalVariableDecorationsINTEL");
657659
add(internal::CapabilityComplexFloatMulDivINTEL, "ComplexFloatMulDivINTEL");
658660
add(internal::CapabilityMaskedGatherScatterINTEL, "MaskedGatherScatterINTEL");
659661
add(internal::CapabilityTensorFloat32RoundingINTEL,
@@ -676,6 +678,26 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
676678
}
677679
SPIRV_DEF_NAMEMAP(Capability, SPIRVCapabilityNameMap)
678680

681+
template <>
682+
inline void SPIRVMap<InitializationModeQualifier, std::string>::init() {
683+
add(InitializationModeQualifierInitOnDeviceReprogramINTEL,
684+
"InitOnDeviceReprogramINTEL");
685+
add(InitializationModeQualifierInitOnDeviceResetINTEL,
686+
"InitOnDeviceResetINTEL");
687+
add(InitializationModeQualifierMax, "Max");
688+
}
689+
SPIRV_DEF_NAMEMAP(InitializationModeQualifier,
690+
SPIRVInitializationModeQualifierNameMap)
691+
692+
template <> inline void SPIRVMap<HostAccessQualifier, std::string>::init() {
693+
add(HostAccessQualifierNoneINTEL, "NoneINTEL");
694+
add(HostAccessQualifierReadINTEL, "ReadINTEL");
695+
add(HostAccessQualifierWriteINTEL, "WriteINTEL");
696+
add(HostAccessQualifierReadWriteINTEL, "ReadWriteINTEL");
697+
add(HostAccessQualifierMax, "Max");
698+
}
699+
SPIRV_DEF_NAMEMAP(HostAccessQualifier, SPIRVHostAccessQualifierNameMap)
700+
679701
} /* namespace SPIRV */
680702

681703
#endif // SPIRV_LIBSPIRV_SPIRVNAMEMAPENUM_H

llvm-spirv/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

llvm-spirv/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);

llvm-spirv/lib/SPIRV/libSPIRV/spirv_internal.hpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,6 @@ enum InternalOp {
8686
enum InternalDecoration {
8787
IDecRuntimeAlignedINTEL = 5940,
8888
IDecCallableFunctionINTEL = 6087,
89-
IDecHostAccessINTEL = 6147,
90-
IDecInitModeINTEL = 6148,
91-
IDecImplementInCSRINTEL = 6149,
9289
IDecArgumentAttributeINTEL = 6409,
9390
IDecCacheControlLoadINTEL = 6442,
9491
IDecCacheControlStoreINTEL = 6443,
@@ -257,12 +254,6 @@ constexpr Decoration DecorationCallableFunctionINTEL =
257254
static_cast<Decoration>(IDecCallableFunctionINTEL);
258255
constexpr Decoration DecorationRuntimeAlignedINTEL =
259256
static_cast<Decoration>(IDecRuntimeAlignedINTEL);
260-
constexpr Decoration DecorationHostAccessINTEL =
261-
static_cast<Decoration>(IDecHostAccessINTEL);
262-
constexpr Decoration DecorationInitModeINTEL =
263-
static_cast<Decoration>(IDecInitModeINTEL);
264-
constexpr Decoration DecorationImplementInCSRINTEL =
265-
static_cast<Decoration>(IDecImplementInCSRINTEL);
266257
constexpr Decoration DecorationArgumentAttributeINTEL =
267258
static_cast<Decoration>(IDecArgumentAttributeINTEL);
268259
constexpr Decoration DecorationFuncParamKindINTEL =

0 commit comments

Comments
 (0)