@@ -239,6 +239,7 @@ class SPIRVModuleImpl : public SPIRVModule {
239239 SPIRVTypePipeStorage *addPipeStorageType () override ;
240240 SPIRVTypeSampledImage *addSampledImageType (SPIRVTypeImage *T) override ;
241241 SPIRVTypeStruct *openStructType (unsigned , const std::string &) override ;
242+ SPIRVEntry *addTypeStructContinuedINTEL (unsigned NumMembers) override ;
242243 void closeStructType (SPIRVTypeStruct *T, bool ) override ;
243244 SPIRVTypeVector *addVectorType (SPIRVType *, SPIRVWord) override ;
244245 SPIRVType *addOpaqueGenericType (Op) override ;
@@ -259,9 +260,13 @@ class SPIRVModuleImpl : public SPIRVModule {
259260 SPIRVBasicBlock *) override ;
260261 SPIRVValue *addCompositeConstant (SPIRVType *,
261262 const std::vector<SPIRVValue *> &) override ;
263+ SPIRVEntry *addCompositeConstantContinuedINTEL (
264+ const std::vector<SPIRVValue *> &) override ;
262265 SPIRVValue *
263266 addSpecConstantComposite (SPIRVType *Ty,
264267 const std::vector<SPIRVValue *> &Elements) override ;
268+ SPIRVEntry *addSpecConstantCompositeContinuedINTEL (
269+ const std::vector<SPIRVValue *> &) override ;
265270 SPIRVValue *addConstFunctionPointerINTEL (SPIRVType *Ty,
266271 SPIRVFunction *F) override ;
267272 SPIRVValue *addConstant (SPIRVValue *) override ;
@@ -846,6 +851,10 @@ SPIRVTypeStruct *SPIRVModuleImpl::openStructType(unsigned NumMembers,
846851 return T;
847852}
848853
854+ SPIRVEntry *SPIRVModuleImpl::addTypeStructContinuedINTEL (unsigned NumMembers) {
855+ return add (new SPIRVTypeStructContinuedINTEL (this , NumMembers));
856+ }
857+
849858void SPIRVModuleImpl::closeStructType (SPIRVTypeStruct *T, bool Packed) {
850859 addType (T);
851860 T->setPacked (Packed);
@@ -1069,13 +1078,72 @@ SPIRVValue *SPIRVModuleImpl::addNullConstant(SPIRVType *Ty) {
10691078
10701079SPIRVValue *SPIRVModuleImpl::addCompositeConstant (
10711080 SPIRVType *Ty, const std::vector<SPIRVValue *> &Elements) {
1072- return addConstant (new SPIRVConstantComposite (this , Ty, getId (), Elements));
1081+ constexpr int MaxNumElements = MaxWordCount - SPIRVConstantComposite::FixedWC;
1082+ const int NumElements = Elements.size ();
1083+
1084+ // In case number of elements is greater than maximum WordCount and
1085+ // SPV_INTEL_long_constant_composite is not enabled, the error will be emitted
1086+ // by validate functionality of SPIRVCompositeConstant class.
1087+ if (NumElements <= MaxNumElements ||
1088+ !isAllowedToUseExtension (ExtensionID::SPV_INTEL_long_constant_composite))
1089+ return addConstant (new SPIRVConstantComposite (this , Ty, getId (), Elements));
1090+
1091+ auto Start = Elements.begin ();
1092+ auto End = Start + MaxNumElements;
1093+ std::vector<SPIRVValue *> Slice (Start, End);
1094+ auto *Res =
1095+ static_cast <SPIRVConstantComposite *>(addCompositeConstant (Ty, Slice));
1096+ for (; End != Elements.end ();) {
1097+ Start = End;
1098+ End = ((Elements.end () - End) > MaxNumElements) ? End + MaxNumElements
1099+ : Elements.end ();
1100+ Slice.assign (Start, End);
1101+ auto Continued = static_cast <SPIRVConstantComposite::ContinuedInstType>(
1102+ addCompositeConstantContinuedINTEL (Slice));
1103+ Res->addContinuedInstruction (Continued);
1104+ }
1105+ return Res;
1106+ }
1107+
1108+ SPIRVEntry *SPIRVModuleImpl::addCompositeConstantContinuedINTEL (
1109+ const std::vector<SPIRVValue *> &Elements) {
1110+ return add (new SPIRVConstantCompositeContinuedINTEL (this , Elements));
10731111}
10741112
10751113SPIRVValue *SPIRVModuleImpl::addSpecConstantComposite (
10761114 SPIRVType *Ty, const std::vector<SPIRVValue *> &Elements) {
1077- return addConstant (
1078- new SPIRVSpecConstantComposite (this , Ty, getId (), Elements));
1115+ constexpr int MaxNumElements =
1116+ MaxWordCount - SPIRVSpecConstantComposite::FixedWC;
1117+ const int NumElements = Elements.size ();
1118+
1119+ // In case number of elements is greater than maximum WordCount and
1120+ // SPV_INTEL_long_constant_composite is not enabled, the error will be emitted
1121+ // by validate functionality of SPIRVSpecConstantComposite class.
1122+ if (NumElements <= MaxNumElements ||
1123+ !isAllowedToUseExtension (ExtensionID::SPV_INTEL_long_constant_composite))
1124+ return addConstant (
1125+ new SPIRVSpecConstantComposite (this , Ty, getId (), Elements));
1126+
1127+ auto Start = Elements.begin ();
1128+ auto End = Start + MaxNumElements;
1129+ std::vector<SPIRVValue *> Slice (Start, End);
1130+ auto *Res = static_cast <SPIRVSpecConstantComposite *>(
1131+ addSpecConstantComposite (Ty, Slice));
1132+ for (; End != Elements.end ();) {
1133+ Start = End;
1134+ End = ((Elements.end () - End) > MaxNumElements) ? End + MaxNumElements
1135+ : Elements.end ();
1136+ Slice.assign (Start, End);
1137+ auto Continued = static_cast <SPIRVSpecConstantComposite::ContinuedInstType>(
1138+ addSpecConstantCompositeContinuedINTEL (Slice));
1139+ Res->addContinuedInstruction (Continued);
1140+ }
1141+ return Res;
1142+ }
1143+
1144+ SPIRVEntry *SPIRVModuleImpl::addSpecConstantCompositeContinuedINTEL (
1145+ const std::vector<SPIRVValue *> &Elements) {
1146+ return add (new SPIRVSpecConstantCompositeContinuedINTEL (this , Elements));
10791147}
10801148
10811149SPIRVValue *SPIRVModuleImpl::addConstFunctionPointerINTEL (SPIRVType *Ty,
0 commit comments