Lines Matching defs:SPIRV
20 #include "SPIRV.h"
37 static cl::list<SPIRV::Capability::Capability>
42 cl::values(clEnumValN(SPIRV::Capability::Shader, "Shader",
46 SmallSet<SPIRV::Capability::Capability, 4> S;
59 INITIALIZE_PASS(SPIRVModuleAnalysis, DEBUG_TYPE, "SPIRV module analysis", true,
72 static SPIRV::Requirements
73 getSymbolicOperandRequirements(SPIRV::OperandCategory::OperandCategory Category,
75 SPIRV::RequirementHandler &Reqs) {
79 AvoidCaps.S.insert(SPIRV::Capability::Shader);
121 if (llvm::all_of(ReqExts, [&ST](const SPIRV::Extension::Extension &Ext) {
135 for (int i = 0; i < SPIRV::NUM_MODULE_SECTIONS; i++)
148 MAI.Addr = static_cast<SPIRV::AddressingModel::AddressingModel>(
151 static_cast<SPIRV::MemoryModel::MemoryModel>(getMetadataUInt(MemMD, 1));
154 MAI.Mem = ST->isOpenCLEnv() ? SPIRV::MemoryModel::OpenCL
155 : SPIRV::MemoryModel::GLSL450;
156 if (MAI.Mem == SPIRV::MemoryModel::OpenCL) {
158 MAI.Addr = PtrSize == 32 ? SPIRV::AddressingModel::Physical32
159 : PtrSize == 64 ? SPIRV::AddressingModel::Physical64
160 : SPIRV::AddressingModel::Logical;
163 MAI.Addr = SPIRV::AddressingModel::Logical;
169 MAI.SrcLang = SPIRV::SourceLanguage::OpenCL_C;
170 // Construct version literal in accordance with SPIRV-LLVM-Translator.
183 // run-times with Unknown/0.0 version output. For a reference, LLVM-SPIRV
186 MAI.SrcLang = SPIRV::SourceLanguage::OpenCL_CPP;
189 MAI.SrcLang = SPIRV::SourceLanguage::Unknown;
206 MAI.Reqs.getAndAddRequirements(SPIRV::OperandCategory::MemoryModelOperand,
208 MAI.Reqs.getAndAddRequirements(SPIRV::OperandCategory::SourceLanguageOperand,
210 MAI.Reqs.getAndAddRequirements(SPIRV::OperandCategory::AddressingModelOperand,
216 SPIRV::InstructionSet::OpenCL_std)] =
226 SPIRV::ModuleAnalysisInfo &MAI,
261 case SPIRV::OpTypeForwardPointer:
264 case SPIRV::OpVariable:
265 return static_cast<SPIRV::StorageClass::StorageClass>(
266 MI.getOperand(2).getImm()) != SPIRV::StorageClass::Function;
267 case SPIRV::OpFunction:
268 case SPIRV::OpFunctionParameter:
271 if (GR->hasConstFunPtr() && Opcode == SPIRV::OpUndef) {
274 if (UseMI.getOpcode() != SPIRV::OpConstantFunctionPointerINTEL)
300 assert(OpDefMI && OpDefMI->getOpcode() == SPIRV::OpFunction);
306 } while (OpDefMI && (OpDefMI->getOpcode() == SPIRV::OpFunction ||
307 OpDefMI->getOpcode() == SPIRV::OpFunctionParameter));
330 if (Opcode == SPIRV::OpConstantFunctionPointerINTEL &&
331 MRI.getRegClass(OpReg) == &SPIRV::pIDRegClass) {
361 MAI.MS[SPIRV::MB_TypeConstVars].push_back(&MI);
362 } else if (Opcode == SPIRV::OpFunction ||
363 Opcode == SPIRV::OpFunctionParameter) {
368 } else if (Opcode == SPIRV::OpVariable) {
399 MAI.MS[SPIRV::MB_ExtFuncDecls].push_back(&MI);
412 MAI.MS[SPIRV::MB_TypeConstVars].push_back(&MI);
427 MAI.MS[SPIRV::MB_TypeConstVars].push_back(&MI);
445 if (Opcode == SPIRV::OpFunction) {
450 } else if (Opcode == SPIRV::OpFunctionParameter) {
459 case SPIRV::OpExtension:
460 MAI.Reqs.addExtension(SPIRV::Extension::Extension(DefMO.getImm()));
463 case SPIRV::OpCapability:
464 MAI.Reqs.addCapability(SPIRV::Capability::Capability(DefMO.getImm()));
485 if (MI.getOpcode() == SPIRV::OpDecorate) {
488 if (Dec == static_cast<unsigned>(SPIRV::Decoration::LinkageAttributes)) {
490 if (Lnk == static_cast<unsigned>(SPIRV::LinkageType::Import)) {
498 } else if (MI.getOpcode() == SPIRV::OpFunction) {
510 static void collectOtherInstr(MachineInstr &MI, SPIRV::ModuleAnalysisInfo &MAI,
511 SPIRV::ModuleSectionType MSType, InstrTraces &IS,
540 if (OpCode == SPIRV::OpString) {
541 collectOtherInstr(MI, MAI, SPIRV::MB_DebugStrings, IS);
542 } else if (OpCode == SPIRV::OpExtInst && MI.getOperand(2).isImm() &&
544 SPIRV::InstructionSet::
547 namespace NS = SPIRV::NonSemanticExtInst;
555 collectOtherInstr(MI, MAI, SPIRV::MB_NonSemanticGlobalDI, IS);
556 } else if (OpCode == SPIRV::OpName || OpCode == SPIRV::OpMemberName) {
557 collectOtherInstr(MI, MAI, SPIRV::MB_DebugNames, IS);
558 } else if (OpCode == SPIRV::OpEntryPoint) {
559 collectOtherInstr(MI, MAI, SPIRV::MB_EntryPoints, IS);
561 collectOtherInstr(MI, MAI, SPIRV::MB_Annotations, IS);
566 collectOtherInstr(MI, MAI, SPIRV::MB_TypeConstVars, IS);
567 } else if (OpCode == SPIRV::OpFunction) {
569 } else if (OpCode == SPIRV::OpTypeForwardPointer) {
570 collectOtherInstr(MI, MAI, SPIRV::MB_TypeConstVars, IS, false);
596 if (MI.getOpcode() != SPIRV::OpExtInst)
607 void SPIRV::RequirementHandler::getAndAddRequirements(
608 SPIRV::OperandCategory::OperandCategory Category, uint32_t i,
613 void SPIRV::RequirementHandler::recursiveAddCapabilities(
623 void SPIRV::RequirementHandler::addCapabilities(const CapabilityList &ToAdd) {
635 void SPIRV::RequirementHandler::addRequirements(
636 const SPIRV::Requirements &Req) {
668 void SPIRV::RequirementHandler::checkSatisfiable(
723 void SPIRV::RequirementHandler::addAvailableCaps(const CapabilityList &ToAdd) {
727 SPIRV::OperandCategory::CapabilityOperand, Cap));
730 void SPIRV::RequirementHandler::removeCapabilityIf(
738 namespace SPIRV {
844 } // namespace SPIRV
850 SPIRV::RequirementHandler &Reqs,
853 auto Dec = static_cast<SPIRV::Decoration::Decoration>(DecOp);
855 SPIRV::OperandCategory::DecorationOperand, Dec, ST, Reqs));
857 if (Dec == SPIRV::Decoration::BuiltIn) {
859 auto BuiltIn = static_cast<SPIRV::BuiltIn::BuiltIn>(BuiltInOp);
861 SPIRV::OperandCategory::BuiltInOperand, BuiltIn, ST, Reqs));
862 } else if (Dec == SPIRV::Decoration::LinkageAttributes) {
864 SPIRV::LinkageType::LinkageType LnkType =
865 static_cast<SPIRV::LinkageType::LinkageType>(LinkageOp);
866 if (LnkType == SPIRV::LinkageType::LinkOnceODR)
867 Reqs.addExtension(SPIRV::Extension::SPV_KHR_linkonce_odr);
868 } else if (Dec == SPIRV::Decoration::CacheControlLoadINTEL ||
869 Dec == SPIRV::Decoration::CacheControlStoreINTEL) {
870 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_cache_controls);
871 } else if (Dec == SPIRV::Decoration::HostAccessINTEL) {
872 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_global_variable_host_access);
873 } else if (Dec == SPIRV::Decoration::InitModeINTEL ||
874 Dec == SPIRV::Decoration::ImplementInRegisterMapINTEL) {
876 SPIRV::Extension::SPV_INTEL_global_variable_fpga_decorations);
877 } else if (Dec == SPIRV::Decoration::NonUniformEXT) {
878 Reqs.addRequirements(SPIRV::Capability::ShaderNonUniformEXT);
884 SPIRV::RequirementHandler &Reqs,
890 auto ImgFormat = static_cast<SPIRV::ImageFormat::ImageFormat>(ImgFormatOp);
891 Reqs.getAndAddRequirements(SPIRV::OperandCategory::ImageFormatOperand,
900 case SPIRV::Dim::DIM_1D:
901 Reqs.addRequirements(NoSampler ? SPIRV::Capability::Image1D
902 : SPIRV::Capability::Sampled1D);
904 case SPIRV::Dim::DIM_2D:
906 Reqs.addRequirements(SPIRV::Capability::ImageMSArray);
908 case SPIRV::Dim::DIM_Cube:
909 Reqs.addRequirements(SPIRV::Capability::Shader);
911 Reqs.addRequirements(NoSampler ? SPIRV::Capability::ImageCubeArray
912 : SPIRV::Capability::SampledCubeArray);
914 case SPIRV::Dim::DIM_Rect:
915 Reqs.addRequirements(NoSampler ? SPIRV::Capability::ImageRect
916 : SPIRV::Capability::SampledRect);
918 case SPIRV::Dim::DIM_Buffer:
919 Reqs.addRequirements(NoSampler ? SPIRV::Capability::ImageBuffer
920 : SPIRV::Capability::SampledBuffer);
922 case SPIRV::Dim::DIM_SubpassData:
923 Reqs.addRequirements(SPIRV::Capability::InputAttachment);
930 MI.getOperand(8).getImm() == SPIRV::AccessQualifier::ReadWrite)
931 Reqs.addRequirements(SPIRV::Capability::ImageReadWrite);
933 Reqs.addRequirements(SPIRV::Capability::ImageBasic);
942 SPIRV::RequirementHandler &Reqs,
948 if (TypeDef->getOpcode() != SPIRV::OpTypeFloat)
954 if (Op == SPIRV::OpAtomicFAddEXT) {
955 if (!ST.canUseExtension(SPIRV::Extension::SPV_EXT_shader_atomic_float_add))
957 Reqs.addExtension(SPIRV::Extension::SPV_EXT_shader_atomic_float_add);
961 SPIRV::Extension::SPV_EXT_shader_atomic_float16_add))
963 Reqs.addExtension(SPIRV::Extension::SPV_EXT_shader_atomic_float16_add);
964 Reqs.addCapability(SPIRV::Capability::AtomicFloat16AddEXT);
967 Reqs.addCapability(SPIRV::Capability::AtomicFloat32AddEXT);
970 Reqs.addCapability(SPIRV::Capability::AtomicFloat64AddEXT);
978 SPIRV::Extension::SPV_EXT_shader_atomic_float_min_max))
980 Reqs.addExtension(SPIRV::Extension::SPV_EXT_shader_atomic_float_min_max);
983 Reqs.addCapability(SPIRV::Capability::AtomicFloat16MinMaxEXT);
986 Reqs.addCapability(SPIRV::Capability::AtomicFloat32MinMaxEXT);
989 Reqs.addCapability(SPIRV::Capability::AtomicFloat64MinMaxEXT);
999 if (ImageInst->getOpcode() != SPIRV::OpTypeImage)
1003 return Dim == SPIRV::Dim::DIM_Buffer && Sampled == 1;
1007 if (ImageInst->getOpcode() != SPIRV::OpTypeImage)
1011 return Dim == SPIRV::Dim::DIM_Buffer && Sampled == 2;
1015 if (ImageInst->getOpcode() != SPIRV::OpTypeImage)
1019 return Dim != SPIRV::Dim::DIM_Buffer && Sampled == 1;
1023 if (ImageInst->getOpcode() != SPIRV::OpTypeImage)
1027 return Dim == SPIRV::Dim::DIM_SubpassData && Sampled == 2;
1031 if (ImageInst->getOpcode() != SPIRV::OpTypeImage)
1035 return Dim != SPIRV::Dim::DIM_Buffer && Sampled == 2;
1039 if (SampledImageInst->getOpcode() != SPIRV::OpTypeSampledImage)
1050 if (MI.getOpcode() != SPIRV::OpDecorate)
1054 if (Dec == SPIRV::Decoration::NonUniformEXT)
1061 SPIRV::RequirementHandler &Handler,
1070 assert(ResTypeInst->getOpcode() == SPIRV::OpTypePointer);
1072 if (StorageClass != SPIRV::StorageClass::StorageClass::UniformConstant &&
1073 StorageClass != SPIRV::StorageClass::StorageClass::Uniform &&
1074 StorageClass != SPIRV::StorageClass::StorageClass::StorageBuffer) {
1080 if (PointeeType->getOpcode() != SPIRV::OpTypeImage &&
1081 PointeeType->getOpcode() != SPIRV::OpTypeSampledImage &&
1082 PointeeType->getOpcode() != SPIRV::OpTypeSampler) {
1091 SPIRV::Capability::UniformTexelBufferArrayNonUniformIndexingEXT);
1094 SPIRV::Capability::UniformTexelBufferArrayDynamicIndexingEXT);
1098 SPIRV::Capability::InputAttachmentArrayNonUniformIndexingEXT);
1101 SPIRV::Capability::InputAttachmentArrayDynamicIndexingEXT);
1105 SPIRV::Capability::StorageTexelBufferArrayNonUniformIndexingEXT);
1108 SPIRV::Capability::StorageTexelBufferArrayDynamicIndexingEXT);
1111 PointeeType->getOpcode() == SPIRV::OpTypeSampler) {
1114 SPIRV::Capability::SampledImageArrayNonUniformIndexingEXT);
1117 SPIRV::Capability::SampledImageArrayDynamicIndexing);
1121 SPIRV::Capability::StorageImageArrayNonUniformIndexingEXT);
1124 SPIRV::Capability::StorageImageArrayDynamicIndexing);
1129 if (TypeInst->getOpcode() != SPIRV::OpTypeImage)
1136 SPIRV::RequirementHandler &Reqs,
1138 if (ST.canUseExtension(SPIRV::Extension::SPV_KHR_integer_dot_product))
1139 Reqs.addExtension(SPIRV::Extension::SPV_KHR_integer_dot_product);
1140 Reqs.addCapability(SPIRV::Capability::DotProduct);
1151 if (TypeDef->getOpcode() == SPIRV::OpTypeInt) {
1153 Reqs.addCapability(SPIRV::Capability::DotProductInput4x8BitPacked);
1154 } else if (TypeDef->getOpcode() == SPIRV::OpTypeVector) {
1156 assert(ScalarTypeDef->getOpcode() == SPIRV::OpTypeInt);
1160 Reqs.addCapability(SPIRV::Capability::DotProductInput4x8Bit);
1162 Reqs.addCapability(SPIRV::Capability::DotProductInputAll);
1168 SPIRV::RequirementHandler &Reqs,
1171 case SPIRV::OpMemoryModel: {
1173 Reqs.getAndAddRequirements(SPIRV::OperandCategory::AddressingModelOperand,
1176 Reqs.getAndAddRequirements(SPIRV::OperandCategory::MemoryModelOperand, Mem,
1180 case SPIRV::OpEntryPoint: {
1182 Reqs.getAndAddRequirements(SPIRV::OperandCategory::ExecutionModelOperand,
1186 case SPIRV::OpExecutionMode:
1187 case SPIRV::OpExecutionModeId: {
1189 Reqs.getAndAddRequirements(SPIRV::OperandCategory::ExecutionModeOperand,
1193 case SPIRV::OpTypeMatrix:
1194 Reqs.addCapability(SPIRV::Capability::Matrix);
1196 case SPIRV::OpTypeInt: {
1199 Reqs.addCapability(SPIRV::Capability::Int64);
1201 Reqs.addCapability(SPIRV::Capability::Int16);
1203 Reqs.addCapability(SPIRV::Capability::Int8);
1206 case SPIRV::OpTypeFloat: {
1209 Reqs.addCapability(SPIRV::Capability::Float64);
1211 Reqs.addCapability(SPIRV::Capability::Float16);
1214 case SPIRV::OpTypeVector: {
1217 Reqs.addCapability(SPIRV::Capability::Vector16);
1220 case SPIRV::OpTypePointer: {
1222 Reqs.getAndAddRequirements(SPIRV::OperandCategory::StorageClassOperand, SC,
1231 if (TypeDef->getOpcode() == SPIRV::OpTypeFloat &&
1233 Reqs.addCapability(SPIRV::Capability::Float16Buffer);
1236 case SPIRV::OpExtInst: {
1239 SPIRV::InstructionSet::NonSemantic_Shader_DebugInfo_100)) {
1240 Reqs.addExtension(SPIRV::Extension::SPV_KHR_non_semantic_info);
1244 case SPIRV::OpBitReverse:
1245 case SPIRV::OpBitFieldInsert:
1246 case SPIRV::OpBitFieldSExtract:
1247 case SPIRV::OpBitFieldUExtract:
1248 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_bit_instructions)) {
1249 Reqs.addCapability(SPIRV::Capability::Shader);
1252 Reqs.addExtension(SPIRV::Extension::SPV_KHR_bit_instructions);
1253 Reqs.addCapability(SPIRV::Capability::BitInstructions);
1255 case SPIRV::OpTypeRuntimeArray:
1256 Reqs.addCapability(SPIRV::Capability::Shader);
1258 case SPIRV::OpTypeOpaque:
1259 case SPIRV::OpTypeEvent:
1260 Reqs.addCapability(SPIRV::Capability::Kernel);
1262 case SPIRV::OpTypePipe:
1263 case SPIRV::OpTypeReserveId:
1264 Reqs.addCapability(SPIRV::Capability::Pipes);
1266 case SPIRV::OpTypeDeviceEvent:
1267 case SPIRV::OpTypeQueue:
1268 case SPIRV::OpBuildNDRange:
1269 Reqs.addCapability(SPIRV::Capability::DeviceEnqueue);
1271 case SPIRV::OpDecorate:
1272 case SPIRV::OpDecorateId:
1273 case SPIRV::OpDecorateString:
1276 case SPIRV::OpMemberDecorate:
1277 case SPIRV::OpMemberDecorateString:
1280 case SPIRV::OpInBoundsPtrAccessChain:
1281 Reqs.addCapability(SPIRV::Capability::Addresses);
1283 case SPIRV::OpConstantSampler:
1284 Reqs.addCapability(SPIRV::Capability::LiteralSampler);
1286 case SPIRV::OpInBoundsAccessChain:
1287 case SPIRV::OpAccessChain:
1290 case SPIRV::OpTypeImage:
1293 case SPIRV::OpTypeSampler:
1295 Reqs.addCapability(SPIRV::Capability::ImageBasic);
1298 case SPIRV::OpTypeForwardPointer:
1300 Reqs.addCapability(SPIRV::Capability::Addresses);
1302 case SPIRV::OpAtomicFlagTestAndSet:
1303 case SPIRV::OpAtomicLoad:
1304 case SPIRV::OpAtomicStore:
1305 case SPIRV::OpAtomicExchange:
1306 case SPIRV::OpAtomicCompareExchange:
1307 case SPIRV::OpAtomicIIncrement:
1308 case SPIRV::OpAtomicIDecrement:
1309 case SPIRV::OpAtomicIAdd:
1310 case SPIRV::OpAtomicISub:
1311 case SPIRV::OpAtomicUMin:
1312 case SPIRV::OpAtomicUMax:
1313 case SPIRV::OpAtomicSMin:
1314 case SPIRV::OpAtomicSMax:
1315 case SPIRV::OpAtomicAnd:
1316 case SPIRV::OpAtomicOr:
1317 case SPIRV::OpAtomicXor: {
1320 if (MI.getOpcode() == SPIRV::OpAtomicStore) {
1328 if (TypeDef->getOpcode() == SPIRV::OpTypeInt) {
1331 Reqs.addCapability(SPIRV::Capability::Int64Atomics);
1335 case SPIRV::OpGroupNonUniformIAdd:
1336 case SPIRV::OpGroupNonUniformFAdd:
1337 case SPIRV::OpGroupNonUniformIMul:
1338 case SPIRV::OpGroupNonUniformFMul:
1339 case SPIRV::OpGroupNonUniformSMin:
1340 case SPIRV::OpGroupNonUniformUMin:
1341 case SPIRV::OpGroupNonUniformFMin:
1342 case SPIRV::OpGroupNonUniformSMax:
1343 case SPIRV::OpGroupNonUniformUMax:
1344 case SPIRV::OpGroupNonUniformFMax:
1345 case SPIRV::OpGroupNonUniformBitwiseAnd:
1346 case SPIRV::OpGroupNonUniformBitwiseOr:
1347 case SPIRV::OpGroupNonUniformBitwiseXor:
1348 case SPIRV::OpGroupNonUniformLogicalAnd:
1349 case SPIRV::OpGroupNonUniformLogicalOr:
1350 case SPIRV::OpGroupNonUniformLogicalXor: {
1354 case SPIRV::GroupOperation::Reduce:
1355 case SPIRV::GroupOperation::InclusiveScan:
1356 case SPIRV::GroupOperation::ExclusiveScan:
1357 Reqs.addCapability(SPIRV::Capability::GroupNonUniformArithmetic);
1359 case SPIRV::GroupOperation::ClusteredReduce:
1360 Reqs.addCapability(SPIRV::Capability::GroupNonUniformClustered);
1362 case SPIRV::GroupOperation::PartitionedReduceNV:
1363 case SPIRV::GroupOperation::PartitionedInclusiveScanNV:
1364 case SPIRV::GroupOperation::PartitionedExclusiveScanNV:
1365 Reqs.addCapability(SPIRV::Capability::GroupNonUniformPartitionedNV);
1370 case SPIRV::OpGroupNonUniformShuffle:
1371 case SPIRV::OpGroupNonUniformShuffleXor:
1372 Reqs.addCapability(SPIRV::Capability::GroupNonUniformShuffle);
1374 case SPIRV::OpGroupNonUniformShuffleUp:
1375 case SPIRV::OpGroupNonUniformShuffleDown:
1376 Reqs.addCapability(SPIRV::Capability::GroupNonUniformShuffleRelative);
1378 case SPIRV::OpGroupAll:
1379 case SPIRV::OpGroupAny:
1380 case SPIRV::OpGroupBroadcast:
1381 case SPIRV::OpGroupIAdd:
1382 case SPIRV::OpGroupFAdd:
1383 case SPIRV::OpGroupFMin:
1384 case SPIRV::OpGroupUMin:
1385 case SPIRV::OpGroupSMin:
1386 case SPIRV::OpGroupFMax:
1387 case SPIRV::OpGroupUMax:
1388 case SPIRV::OpGroupSMax:
1389 Reqs.addCapability(SPIRV::Capability::Groups);
1391 case SPIRV::OpGroupNonUniformElect:
1392 Reqs.addCapability(SPIRV::Capability::GroupNonUniform);
1394 case SPIRV::OpGroupNonUniformAll:
1395 case SPIRV::OpGroupNonUniformAny:
1396 case SPIRV::OpGroupNonUniformAllEqual:
1397 Reqs.addCapability(SPIRV::Capability::GroupNonUniformVote);
1399 case SPIRV::OpGroupNonUniformBroadcast:
1400 case SPIRV::OpGroupNonUniformBroadcastFirst:
1401 case SPIRV::OpGroupNonUniformBallot:
1402 case SPIRV::OpGroupNonUniformInverseBallot:
1403 case SPIRV::OpGroupNonUniformBallotBitExtract:
1404 case SPIRV::OpGroupNonUniformBallotBitCount:
1405 case SPIRV::OpGroupNonUniformBallotFindLSB:
1406 case SPIRV::OpGroupNonUniformBallotFindMSB:
1407 Reqs.addCapability(SPIRV::Capability::GroupNonUniformBallot);
1409 case SPIRV::OpSubgroupShuffleINTEL:
1410 case SPIRV::OpSubgroupShuffleDownINTEL:
1411 case SPIRV::OpSubgroupShuffleUpINTEL:
1412 case SPIRV::OpSubgroupShuffleXorINTEL:
1413 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_subgroups)) {
1414 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_subgroups);
1415 Reqs.addCapability(SPIRV::Capability::SubgroupShuffleINTEL);
1418 case SPIRV::OpSubgroupBlockReadINTEL:
1419 case SPIRV::OpSubgroupBlockWriteINTEL:
1420 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_subgroups)) {
1421 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_subgroups);
1422 Reqs.addCapability(SPIRV::Capability::SubgroupBufferBlockIOINTEL);
1425 case SPIRV::OpSubgroupImageBlockReadINTEL:
1426 case SPIRV::OpSubgroupImageBlockWriteINTEL:
1427 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_subgroups)) {
1428 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_subgroups);
1429 Reqs.addCapability(SPIRV::Capability::SubgroupImageBlockIOINTEL);
1432 case SPIRV::OpSubgroupImageMediaBlockReadINTEL:
1433 case SPIRV::OpSubgroupImageMediaBlockWriteINTEL:
1434 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_media_block_io)) {
1435 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_media_block_io);
1436 Reqs.addCapability(SPIRV::Capability::SubgroupImageMediaBlockIOINTEL);
1439 case SPIRV::OpAssumeTrueKHR:
1440 case SPIRV::OpExpectKHR:
1441 if (ST.canUseExtension(SPIRV::Extension::SPV_KHR_expect_assume)) {
1442 Reqs.addExtension(SPIRV::Extension::SPV_KHR_expect_assume);
1443 Reqs.addCapability(SPIRV::Capability::ExpectAssumeKHR);
1446 case SPIRV::OpPtrCastToCrossWorkgroupINTEL:
1447 case SPIRV::OpCrossWorkgroupCastToPtrINTEL:
1448 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_usm_storage_classes)) {
1449 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_usm_storage_classes);
1450 Reqs.addCapability(SPIRV::Capability::USMStorageClassesINTEL);
1453 case SPIRV::OpConstantFunctionPointerINTEL:
1454 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_function_pointers)) {
1455 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_function_pointers);
1456 Reqs.addCapability(SPIRV::Capability::FunctionPointersINTEL);
1459 case SPIRV::OpGroupNonUniformRotateKHR:
1460 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_subgroup_rotate))
1464 Reqs.addExtension(SPIRV::Extension::SPV_KHR_subgroup_rotate);
1465 Reqs.addCapability(SPIRV::Capability::GroupNonUniformRotateKHR);
1466 Reqs.addCapability(SPIRV::Capability::GroupNonUniform);
1468 case SPIRV::OpGroupIMulKHR:
1469 case SPIRV::OpGroupFMulKHR:
1470 case SPIRV::OpGroupBitwiseAndKHR:
1471 case SPIRV::OpGroupBitwiseOrKHR:
1472 case SPIRV::OpGroupBitwiseXorKHR:
1473 case SPIRV::OpGroupLogicalAndKHR:
1474 case SPIRV::OpGroupLogicalOrKHR:
1475 case SPIRV::OpGroupLogicalXorKHR:
1477 SPIRV::Extension::SPV_KHR_uniform_group_instructions)) {
1478 Reqs.addExtension(SPIRV::Extension::SPV_KHR_uniform_group_instructions);
1479 Reqs.addCapability(SPIRV::Capability::GroupUniformArithmeticKHR);
1482 case SPIRV::OpReadClockKHR:
1483 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_shader_clock))
1487 Reqs.addExtension(SPIRV::Extension::SPV_KHR_shader_clock);
1488 Reqs.addCapability(SPIRV::Capability::ShaderClockKHR);
1490 case SPIRV::OpFunctionPointerCallINTEL:
1491 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_function_pointers)) {
1492 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_function_pointers);
1493 Reqs.addCapability(SPIRV::Capability::FunctionPointersINTEL);
1496 case SPIRV::OpAtomicFAddEXT:
1497 case SPIRV::OpAtomicFMinEXT:
1498 case SPIRV::OpAtomicFMaxEXT:
1501 case SPIRV::OpConvertBF16ToFINTEL:
1502 case SPIRV::OpConvertFToBF16INTEL:
1503 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_bfloat16_conversion)) {
1504 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_bfloat16_conversion);
1505 Reqs.addCapability(SPIRV::Capability::BFloat16ConversionINTEL);
1508 case SPIRV::OpVariableLengthArrayINTEL:
1509 case SPIRV::OpSaveMemoryINTEL:
1510 case SPIRV::OpRestoreMemoryINTEL:
1511 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_variable_length_array)) {
1512 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_variable_length_array);
1513 Reqs.addCapability(SPIRV::Capability::VariableLengthArrayINTEL);
1516 case SPIRV::OpAsmTargetINTEL:
1517 case SPIRV::OpAsmINTEL:
1518 case SPIRV::OpAsmCallINTEL:
1519 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_inline_assembly)) {
1520 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_inline_assembly);
1521 Reqs.addCapability(SPIRV::Capability::AsmINTEL);
1524 case SPIRV::OpTypeCooperativeMatrixKHR:
1525 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_cooperative_matrix))
1530 Reqs.addExtension(SPIRV::Extension::SPV_KHR_cooperative_matrix);
1531 Reqs.addCapability(SPIRV::Capability::CooperativeMatrixKHR);
1533 case SPIRV::OpArithmeticFenceEXT:
1534 if (!ST.canUseExtension(SPIRV::Extension::SPV_EXT_arithmetic_fence))
1538 Reqs.addExtension(SPIRV::Extension::SPV_EXT_arithmetic_fence);
1539 Reqs.addCapability(SPIRV::Capability::ArithmeticFenceEXT);
1541 case SPIRV::OpControlBarrierArriveINTEL:
1542 case SPIRV::OpControlBarrierWaitINTEL:
1543 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_split_barrier)) {
1544 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_split_barrier);
1545 Reqs.addCapability(SPIRV::Capability::SplitBarrierINTEL);
1548 case SPIRV::OpCooperativeMatrixMulAddKHR: {
1549 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_cooperative_matrix))
1554 Reqs.addExtension(SPIRV::Extension::SPV_KHR_cooperative_matrix);
1555 Reqs.addCapability(SPIRV::Capability::CooperativeMatrixKHR);
1561 SPIRV::CooperativeMatrixOperands::MatrixAAndBTF32ComponentsINTEL) {
1562 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_joint_matrix))
1567 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_joint_matrix);
1569 SPIRV::Capability::CooperativeMatrixTF32ComponentTypeINTEL);
1571 if (CoopOperands & SPIRV::CooperativeMatrixOperands::
1574 SPIRV::CooperativeMatrixOperands::MatrixCBFloat16ComponentsINTEL ||
1575 CoopOperands & SPIRV::CooperativeMatrixOperands::
1577 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_joint_matrix))
1582 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_joint_matrix);
1584 SPIRV::Capability::CooperativeMatrixBFloat16ComponentTypeINTEL);
1588 case SPIRV::OpCooperativeMatrixLoadKHR:
1589 case SPIRV::OpCooperativeMatrixStoreKHR:
1590 case SPIRV::OpCooperativeMatrixLoadCheckedINTEL:
1591 case SPIRV::OpCooperativeMatrixStoreCheckedINTEL:
1592 case SPIRV::OpCooperativeMatrixPrefetchINTEL: {
1593 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_cooperative_matrix))
1598 Reqs.addExtension(SPIRV::Extension::SPV_KHR_cooperative_matrix);
1599 Reqs.addCapability(SPIRV::Capability::CooperativeMatrixKHR);
1604 {SPIRV::OpCooperativeMatrixLoadKHR, 3},
1605 {SPIRV::OpCooperativeMatrixStoreKHR, 2},
1606 {SPIRV::OpCooperativeMatrixLoadCheckedINTEL, 5},
1607 {SPIRV::OpCooperativeMatrixStoreCheckedINTEL, 4},
1608 {SPIRV::OpCooperativeMatrixPrefetchINTEL, 4}};
1615 if (MILayout->getOpcode() == SPIRV::OpConstantI) {
1618 static_cast<unsigned>(SPIRV::CooperativeMatrixLayout::PackedINTEL)) {
1619 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_joint_matrix))
1623 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_joint_matrix);
1624 Reqs.addCapability(SPIRV::Capability::PackedCooperativeMatrixINTEL);
1629 if (OpCode == SPIRV::OpCooperativeMatrixLoadKHR ||
1630 OpCode == SPIRV::OpCooperativeMatrixStoreKHR)
1635 case SPIRV::OpCooperativeMatrixPrefetchINTEL:
1638 case SPIRV::OpCooperativeMatrixLoadCheckedINTEL:
1641 case SPIRV::OpCooperativeMatrixStoreCheckedINTEL:
1646 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_joint_matrix)) {
1652 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_joint_matrix);
1653 if (OpCode == SPIRV::OpCooperativeMatrixPrefetchINTEL) {
1654 Reqs.addCapability(SPIRV::Capability::CooperativeMatrixPrefetchINTEL);
1658 SPIRV::Capability::CooperativeMatrixCheckedInstructionsINTEL);
1661 case SPIRV::OpCooperativeMatrixConstructCheckedINTEL:
1662 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_joint_matrix))
1667 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_joint_matrix);
1669 SPIRV::Capability::CooperativeMatrixCheckedInstructionsINTEL);
1671 case SPIRV::OpCooperativeMatrixGetElementCoordINTEL:
1672 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_joint_matrix))
1676 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_joint_matrix);
1678 SPIRV::Capability::CooperativeMatrixInvocationInstructionsINTEL);
1680 case SPIRV::OpKill: {
1681 Reqs.addCapability(SPIRV::Capability::Shader);
1683 case SPIRV::OpDemoteToHelperInvocation:
1684 Reqs.addCapability(SPIRV::Capability::DemoteToHelperInvocation);
1687 SPIRV::Extension::SPV_EXT_demote_to_helper_invocation)) {
1690 SPIRV::Extension::SPV_EXT_demote_to_helper_invocation);
1693 case SPIRV::OpSDot:
1694 case SPIRV::OpUDot:
1697 case SPIRV::OpImageRead: {
1702 Reqs.addCapability(SPIRV::Capability::StorageImageReadWithoutFormat);
1705 case SPIRV::OpImageWrite: {
1710 Reqs.addCapability(SPIRV::Capability::StorageImageWriteWithoutFormat);
1721 Reqs.removeCapabilityIf(SPIRV::Capability::BitInstructions,
1722 SPIRV::Capability::Shader);
1725 static void collectReqs(const Module &M, SPIRV::ModuleAnalysisInfo &MAI,
1742 ST.canUseExtension(SPIRV::Extension::SPV_INTEL_float_controls2);
1753 case SPIRV::ExecutionMode::DenormPreserve:
1754 case SPIRV::ExecutionMode::DenormFlushToZero:
1755 case SPIRV::ExecutionMode::SignedZeroInfNanPreserve:
1756 case SPIRV::ExecutionMode::RoundingModeRTE:
1757 case SPIRV::ExecutionMode::RoundingModeRTZ:
1760 SPIRV::OperandCategory::ExecutionModeOperand, EM, ST);
1762 case SPIRV::ExecutionMode::RoundingModeRTPINTEL:
1763 case SPIRV::ExecutionMode::RoundingModeRTNINTEL:
1764 case SPIRV::ExecutionMode::FloatingPointModeALTINTEL:
1765 case SPIRV::ExecutionMode::FloatingPointModeIEEEINTEL:
1769 SPIRV::OperandCategory::ExecutionModeOperand, EM, ST);
1774 SPIRV::OperandCategory::ExecutionModeOperand, EM, ST);
1780 ST.canUseExtension(SPIRV::Extension::SPV_KHR_float_controls))
1781 MAI.Reqs.addExtension(SPIRV::Extension::SPV_KHR_float_controls);
1783 MAI.Reqs.addExtension(SPIRV::Extension::SPV_INTEL_float_controls2);
1791 SPIRV::OperandCategory::ExecutionModeOperand,
1792 SPIRV::ExecutionMode::LocalSize, ST);
1795 SPIRV::OperandCategory::ExecutionModeOperand,
1796 SPIRV::ExecutionMode::LocalSize, ST);
1800 SPIRV::OperandCategory::ExecutionModeOperand,
1801 SPIRV::ExecutionMode::LocalSizeHint, ST);
1804 SPIRV::OperandCategory::ExecutionModeOperand,
1805 SPIRV::ExecutionMode::SubgroupSize, ST);
1808 SPIRV::OperandCategory::ExecutionModeOperand,
1809 SPIRV::ExecutionMode::VecTypeHint, ST);
1812 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_optnone)) {
1813 MAI.Reqs.addExtension(SPIRV::Extension::SPV_INTEL_optnone);
1814 MAI.Reqs.addCapability(SPIRV::Capability::OptNoneINTEL);
1815 } else if (ST.canUseExtension(SPIRV::Extension::SPV_EXT_optnone)) {
1816 MAI.Reqs.addExtension(SPIRV::Extension::SPV_EXT_optnone);
1817 MAI.Reqs.addCapability(SPIRV::Capability::OptNoneEXT);
1824 unsigned Flags = SPIRV::FPFastMathMode::None;
1826 Flags |= SPIRV::FPFastMathMode::NotNaN;
1828 Flags |= SPIRV::FPFastMathMode::NotInf;
1830 Flags |= SPIRV::FPFastMathMode::NSZ;
1832 Flags |= SPIRV::FPFastMathMode::AllowRecip;
1834 Flags |= SPIRV::FPFastMathMode::Fast;
1840 SPIRV::RequirementHandler &Reqs) {
1842 getSymbolicOperandRequirements(SPIRV::OperandCategory::DecorationOperand,
1843 SPIRV::Decoration::NoSignedWrap, ST, Reqs)
1846 SPIRV::Decoration::NoSignedWrap, {});
1849 getSymbolicOperandRequirements(SPIRV::OperandCategory::DecorationOperand,
1850 SPIRV::Decoration::NoUnsignedWrap, ST,
1854 SPIRV::Decoration::NoUnsignedWrap, {});
1859 if (FMFlags == SPIRV::FPFastMathMode::None)
1862 buildOpDecorate(DstReg, I, TII, SPIRV::Decoration::FPFastMathMode, {FMFlags});
1868 SPIRV::ModuleAnalysisInfo &MAI) {
1881 SPIRV::ModuleAnalysisInfo &MAI) {
1892 MRI.setRegClass(Reg, &SPIRV::IDRegClass);
1900 // patching Instruction::PHI to SPIRV::OpPhi
1911 MI.setDesc(TII.get(SPIRV::OpPhi));
1921 struct SPIRV::ModuleAnalysisInfo SPIRVModuleAnalysis::MAI;
1957 if (MAI.MS[SPIRV::MB_EntryPoints].empty())
1958 MAI.Reqs.addCapability(SPIRV::Capability::Linkage);