@@ -67,6 +67,7 @@ class SpirvInstruction {
6767 IK_ConstantInteger,
6868 IK_ConstantFloat,
6969 IK_ConstantComposite,
70+ IK_ConstantString,
7071 IK_ConstantNull,
7172
7273 // Pointer <-> uint conversions.
@@ -165,6 +166,13 @@ class SpirvInstruction {
165166 IK_DebugTypeMember,
166167 IK_DebugTypeTemplate,
167168 IK_DebugTypeTemplateParameter,
169+
170+ // For workgraph instructions
171+ IK_IsNodePayloadValid,
172+ IK_NodePayloadArrayLength,
173+ IK_AllocateNodePayloads,
174+ IK_EnqueueNodePayloads,
175+ IK_FinishWritingNodePayload,
168176 };
169177
170178 // All instruction classes should include a releaseMemory method.
@@ -440,9 +448,13 @@ class SpirvExecutionMode : public SpirvExecutionModeBase {
440448
441449 bool invokeVisitor (Visitor *v) override ;
442450
451+ SpirvFunction *getEntryPoint () const { return entryPoint; }
452+ spv::ExecutionMode getExecutionMode () const { return execMode; }
443453 llvm::ArrayRef<uint32_t > getParams () const { return params; }
444454
445455private:
456+ SpirvFunction *entryPoint;
457+ spv::ExecutionMode execMode;
446458 llvm::SmallVector<uint32_t , 4 > params;
447459};
448460
@@ -1056,6 +1068,119 @@ class SpirvBarrier : public SpirvInstruction {
10561068 llvm::Optional<spv::Scope> executionScope;
10571069};
10581070
1071+ // / \brief OpIsNodePayloadValidAMDX instruction
1072+ class SpirvIsNodePayloadValid : public SpirvInstruction {
1073+ public:
1074+ SpirvIsNodePayloadValid (QualType resultType, SourceLocation loc,
1075+ SpirvInstruction *payloadArray,
1076+ SpirvInstruction *nodeIndex);
1077+
1078+ DEFINE_RELEASE_MEMORY_FOR_CLASS (SpirvIsNodePayloadValid)
1079+
1080+ // For LLVM-style RTTI
1081+ static bool classof (const SpirvInstruction *inst) {
1082+ return inst->getKind () == IK_IsNodePayloadValid;
1083+ }
1084+
1085+ bool invokeVisitor (Visitor *v) override ;
1086+
1087+ SpirvInstruction *getPayloadArray () { return payloadArray; }
1088+ SpirvInstruction *getNodeIndex () { return nodeIndex; }
1089+
1090+ private:
1091+ SpirvInstruction *payloadArray;
1092+ SpirvInstruction *nodeIndex;
1093+ };
1094+
1095+ // / \brief OpNodePayloadArrayLengthAMDX instruction
1096+ class SpirvNodePayloadArrayLength : public SpirvInstruction {
1097+ public:
1098+ SpirvNodePayloadArrayLength (QualType resultType, SourceLocation loc,
1099+ SpirvInstruction *payloadArray);
1100+
1101+ DEFINE_RELEASE_MEMORY_FOR_CLASS (SpirvNodePayloadArrayLength)
1102+
1103+ // For LLVM-style RTTI
1104+ static bool classof (const SpirvInstruction *inst) {
1105+ return inst->getKind () == IK_NodePayloadArrayLength;
1106+ }
1107+
1108+ bool invokeVisitor (Visitor *v) override ;
1109+
1110+ SpirvInstruction *getPayloadArray () { return payloadArray; }
1111+
1112+ private:
1113+ SpirvInstruction *payloadArray;
1114+ };
1115+
1116+ // / \brief OpAllocateNodePayloadsAMDX instruction
1117+ class SpirvAllocateNodePayloads : public SpirvInstruction {
1118+ public:
1119+ SpirvAllocateNodePayloads (QualType resultType, SourceLocation loc,
1120+ spv::Scope allocationScope,
1121+ SpirvInstruction *shaderIndex,
1122+ SpirvInstruction *recordCount);
1123+
1124+ DEFINE_RELEASE_MEMORY_FOR_CLASS (SpirvAllocateNodePayloads)
1125+
1126+ // For LLVM-style RTTI
1127+ static bool classof (const SpirvInstruction *inst) {
1128+ return inst->getKind () == IK_AllocateNodePayloads;
1129+ }
1130+
1131+ bool invokeVisitor (Visitor *v) override ;
1132+
1133+ spv::Scope getAllocationScope () { return allocationScope; }
1134+ SpirvInstruction *getShaderIndex () { return shaderIndex; }
1135+ SpirvInstruction *getRecordCount () { return recordCount; }
1136+
1137+ private:
1138+ spv::Scope allocationScope;
1139+ SpirvInstruction *shaderIndex;
1140+ SpirvInstruction *recordCount;
1141+ };
1142+
1143+ // / \brief OpReleaseOutputNodePayloadAMDX instruction
1144+ class SpirvEnqueueNodePayloads : public SpirvInstruction {
1145+ public:
1146+ SpirvEnqueueNodePayloads (SourceLocation loc, SpirvInstruction *payload);
1147+
1148+ DEFINE_RELEASE_MEMORY_FOR_CLASS (SpirvEnqueueNodePayloads)
1149+
1150+ // For LLVM-style RTTI
1151+ static bool classof (const SpirvInstruction *inst) {
1152+ return inst->getKind () == IK_EnqueueNodePayloads;
1153+ }
1154+
1155+ bool invokeVisitor (Visitor *v) override ;
1156+
1157+ SpirvInstruction *getPayload () { return payload; }
1158+
1159+ private:
1160+ SpirvInstruction *payload;
1161+ };
1162+
1163+ // / \brief OpFinishWritingNodePayloadAMDX instruction
1164+ class SpirvFinishWritingNodePayload : public SpirvInstruction {
1165+ public:
1166+ SpirvFinishWritingNodePayload (QualType resultType, SourceLocation loc,
1167+ SpirvInstruction *payload);
1168+
1169+ DEFINE_RELEASE_MEMORY_FOR_CLASS (SpirvFinishWritingNodePayload)
1170+
1171+ // For LLVM-style RTTI
1172+ static bool classof (const SpirvInstruction *inst) {
1173+ return inst->getKind () == IK_FinishWritingNodePayload;
1174+ }
1175+
1176+ bool invokeVisitor (Visitor *v) override ;
1177+
1178+ SpirvInstruction *getPayload () { return payload; }
1179+
1180+ private:
1181+ SpirvInstruction *payload;
1182+ };
1183+
10591184// / \brief Represents SPIR-V binary operation instructions.
10601185// /
10611186// / This class includes:
@@ -1352,6 +1477,27 @@ class SpirvConstantNull : public SpirvConstant {
13521477 bool operator ==(const SpirvConstantNull &that) const ;
13531478};
13541479
1480+ class SpirvConstantString : public SpirvConstant {
1481+ public:
1482+ SpirvConstantString (llvm::StringRef stringLiteral, bool isSpecConst = false );
1483+
1484+ DEFINE_RELEASE_MEMORY_FOR_CLASS (SpirvConstantString)
1485+
1486+ // For LLVM-style RTTI
1487+ static bool classof (const SpirvInstruction *inst) {
1488+ return inst->getKind () == IK_ConstantString;
1489+ }
1490+
1491+ bool invokeVisitor (Visitor *v) override ;
1492+
1493+ bool operator ==(const SpirvConstantString &that) const ;
1494+
1495+ llvm::StringRef getString () const { return str; }
1496+
1497+ private:
1498+ std::string str;
1499+ };
1500+
13551501class SpirvConvertPtrToU : public SpirvInstruction {
13561502public:
13571503 SpirvConvertPtrToU (SpirvInstruction *ptr, QualType type,
0 commit comments