Lines Matching refs:SPIRV
38 static cl::list<SPIRV::Capability::Capability>
43 cl::values(clEnumValN(SPIRV::Capability::Shader, "Shader",
47 SmallSet<SPIRV::Capability::Capability, 4> S;
73 static SPIRV::Requirements
74 getSymbolicOperandRequirements(SPIRV::OperandCategory::OperandCategory Category, in getSymbolicOperandRequirements()
76 SPIRV::RequirementHandler &Reqs) { in getSymbolicOperandRequirements()
120 if (llvm::all_of(ReqExts, [&ST](const SPIRV::Extension::Extension &Ext) { in getSymbolicOperandRequirements()
134 for (int i = 0; i < SPIRV::NUM_MODULE_SECTIONS; i++) in setBaseInfo()
147 MAI.Addr = static_cast<SPIRV::AddressingModel::AddressingModel>( in setBaseInfo()
150 static_cast<SPIRV::MemoryModel::MemoryModel>(getMetadataUInt(MemMD, 1)); in setBaseInfo()
153 MAI.Mem = ST->isOpenCLEnv() ? SPIRV::MemoryModel::OpenCL in setBaseInfo()
154 : SPIRV::MemoryModel::GLSL450; in setBaseInfo()
155 if (MAI.Mem == SPIRV::MemoryModel::OpenCL) { in setBaseInfo()
157 MAI.Addr = PtrSize == 32 ? SPIRV::AddressingModel::Physical32 in setBaseInfo()
158 : PtrSize == 64 ? SPIRV::AddressingModel::Physical64 in setBaseInfo()
159 : SPIRV::AddressingModel::Logical; in setBaseInfo()
162 MAI.Addr = SPIRV::AddressingModel::Logical; in setBaseInfo()
168 MAI.SrcLang = SPIRV::SourceLanguage::OpenCL_C; in setBaseInfo()
185 MAI.SrcLang = SPIRV::SourceLanguage::OpenCL_CPP; in setBaseInfo()
188 MAI.SrcLang = SPIRV::SourceLanguage::Unknown; in setBaseInfo()
205 MAI.Reqs.getAndAddRequirements(SPIRV::OperandCategory::MemoryModelOperand, in setBaseInfo()
207 MAI.Reqs.getAndAddRequirements(SPIRV::OperandCategory::SourceLanguageOperand, in setBaseInfo()
209 MAI.Reqs.getAndAddRequirements(SPIRV::OperandCategory::AddressingModelOperand, in setBaseInfo()
215 SPIRV::InstructionSet::OpenCL_std)] = in setBaseInfo()
222 SPIRV::ModuleAnalysisInfo *MAI, in collectDefInstr()
223 SPIRV::ModuleSectionType MSType, in collectDefInstr()
234 const std::vector<SPIRV::DTSortableEntry *> &DepsGraph, in collectGlobalEntities()
235 SPIRV::ModuleSectionType MSType, in collectGlobalEntities()
236 std::function<bool(const SPIRV::DTSortableEntry *)> Pred, in collectGlobalEntities()
238 DenseSet<const SPIRV::DTSortableEntry *> Visited; in collectGlobalEntities()
240 std::function<void(const SPIRV::DTSortableEntry *)> RecHoistUtil; in collectGlobalEntities()
244 &RecHoistUtil](const SPIRV::DTSortableEntry *E) { in collectGlobalEntities()
284 std::vector<SPIRV::DTSortableEntry *> DepsGraph; in processDefInstrs()
289 DepsGraph, SPIRV::MB_TypeConstVars, in processDefInstrs()
290 [](const SPIRV::DTSortableEntry *E) { return !E->getIsFunc(); }); in processDefInstrs()
299 if (MI.getOpcode() == SPIRV::OpExtension) { in processDefInstrs()
301 auto Ext = SPIRV::Extension::Extension(MI.getOperand(0).getImm()); in processDefInstrs()
304 } else if (MI.getOpcode() == SPIRV::OpCapability) { in processDefInstrs()
305 auto Cap = SPIRV::Capability::Capability(MI.getOperand(0).getImm()); in processDefInstrs()
314 DepsGraph, SPIRV::MB_ExtFuncDecls, in processDefInstrs()
315 [](const SPIRV::DTSortableEntry *E) { return E->getIsFunc(); }, true); in processDefInstrs()
324 if (MI.getOpcode() == SPIRV::OpDecorate) { in collectFuncNames()
327 if (Dec == static_cast<unsigned>(SPIRV::Decoration::LinkageAttributes)) { in collectFuncNames()
329 if (Lnk == static_cast<unsigned>(SPIRV::LinkageType::Import)) { in collectFuncNames()
337 } else if (MI.getOpcode() == SPIRV::OpFunction) { in collectFuncNames()
351 for (auto &MI : MAI.MS[SPIRV::MB_TypeConstVars]) in collectFuncPtrs()
352 if (MI->getOpcode() == SPIRV::OpConstantFunctionPointerINTEL) in collectFuncPtrs()
360 assert(FunDefMI->getOpcode() == SPIRV::OpFunction && in collectFuncPtrs()
380 SPIRV::ModuleAnalysisInfo &MAI) { in instrToSignature()
401 static void collectOtherInstr(MachineInstr &MI, SPIRV::ModuleAnalysisInfo &MAI, in collectOtherInstr()
402 SPIRV::ModuleSectionType MSType, InstrTraces &IS, in collectOtherInstr()
430 if (OpCode == SPIRV::OpName || OpCode == SPIRV::OpMemberName) { in processOtherInstrs()
431 collectOtherInstr(MI, MAI, SPIRV::MB_DebugNames, IS); in processOtherInstrs()
432 } else if (OpCode == SPIRV::OpEntryPoint) { in processOtherInstrs()
433 collectOtherInstr(MI, MAI, SPIRV::MB_EntryPoints, IS); in processOtherInstrs()
435 collectOtherInstr(MI, MAI, SPIRV::MB_Annotations, IS); in processOtherInstrs()
440 collectOtherInstr(MI, MAI, SPIRV::MB_TypeConstVars, IS); in processOtherInstrs()
441 } else if (OpCode == SPIRV::OpFunction) { in processOtherInstrs()
443 } else if (OpCode == SPIRV::OpTypeForwardPointer) { in processOtherInstrs()
444 collectOtherInstr(MI, MAI, SPIRV::MB_TypeConstVars, IS, false); in processOtherInstrs()
470 if (MI.getOpcode() != SPIRV::OpExtInst) in numberRegistersGlobally()
481 void SPIRV::RequirementHandler::getAndAddRequirements( in getAndAddRequirements()
482 SPIRV::OperandCategory::OperandCategory Category, uint32_t i, in getAndAddRequirements()
487 void SPIRV::RequirementHandler::recursiveAddCapabilities( in recursiveAddCapabilities()
497 void SPIRV::RequirementHandler::addCapabilities(const CapabilityList &ToAdd) { in addCapabilities()
509 void SPIRV::RequirementHandler::addRequirements( in addRequirements()
510 const SPIRV::Requirements &Req) { in addRequirements()
542 void SPIRV::RequirementHandler::checkSatisfiable( in checkSatisfiable()
597 void SPIRV::RequirementHandler::addAvailableCaps(const CapabilityList &ToAdd) { in addAvailableCaps()
601 SPIRV::OperandCategory::CapabilityOperand, Cap)); in addAvailableCaps()
604 void SPIRV::RequirementHandler::removeCapabilityIf( in removeCapabilityIf()
612 namespace SPIRV { namespace
688 SPIRV::RequirementHandler &Reqs, in addOpDecorateReqs()
691 auto Dec = static_cast<SPIRV::Decoration::Decoration>(DecOp); in addOpDecorateReqs()
693 SPIRV::OperandCategory::DecorationOperand, Dec, ST, Reqs)); in addOpDecorateReqs()
695 if (Dec == SPIRV::Decoration::BuiltIn) { in addOpDecorateReqs()
697 auto BuiltIn = static_cast<SPIRV::BuiltIn::BuiltIn>(BuiltInOp); in addOpDecorateReqs()
699 SPIRV::OperandCategory::BuiltInOperand, BuiltIn, ST, Reqs)); in addOpDecorateReqs()
700 } else if (Dec == SPIRV::Decoration::LinkageAttributes) { in addOpDecorateReqs()
702 SPIRV::LinkageType::LinkageType LnkType = in addOpDecorateReqs()
703 static_cast<SPIRV::LinkageType::LinkageType>(LinkageOp); in addOpDecorateReqs()
704 if (LnkType == SPIRV::LinkageType::LinkOnceODR) in addOpDecorateReqs()
705 Reqs.addExtension(SPIRV::Extension::SPV_KHR_linkonce_odr); in addOpDecorateReqs()
706 } else if (Dec == SPIRV::Decoration::CacheControlLoadINTEL || in addOpDecorateReqs()
707 Dec == SPIRV::Decoration::CacheControlStoreINTEL) { in addOpDecorateReqs()
708 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_cache_controls); in addOpDecorateReqs()
709 } else if (Dec == SPIRV::Decoration::HostAccessINTEL) { in addOpDecorateReqs()
710 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_global_variable_host_access); in addOpDecorateReqs()
711 } else if (Dec == SPIRV::Decoration::InitModeINTEL || in addOpDecorateReqs()
712 Dec == SPIRV::Decoration::ImplementInRegisterMapINTEL) { in addOpDecorateReqs()
714 SPIRV::Extension::SPV_INTEL_global_variable_fpga_decorations); in addOpDecorateReqs()
720 SPIRV::RequirementHandler &Reqs, in addOpTypeImageReqs()
726 auto ImgFormat = static_cast<SPIRV::ImageFormat::ImageFormat>(ImgFormatOp); in addOpTypeImageReqs()
727 Reqs.getAndAddRequirements(SPIRV::OperandCategory::ImageFormatOperand, in addOpTypeImageReqs()
736 case SPIRV::Dim::DIM_1D: in addOpTypeImageReqs()
737 Reqs.addRequirements(NoSampler ? SPIRV::Capability::Image1D in addOpTypeImageReqs()
738 : SPIRV::Capability::Sampled1D); in addOpTypeImageReqs()
740 case SPIRV::Dim::DIM_2D: in addOpTypeImageReqs()
742 Reqs.addRequirements(SPIRV::Capability::ImageMSArray); in addOpTypeImageReqs()
744 case SPIRV::Dim::DIM_Cube: in addOpTypeImageReqs()
745 Reqs.addRequirements(SPIRV::Capability::Shader); in addOpTypeImageReqs()
747 Reqs.addRequirements(NoSampler ? SPIRV::Capability::ImageCubeArray in addOpTypeImageReqs()
748 : SPIRV::Capability::SampledCubeArray); in addOpTypeImageReqs()
750 case SPIRV::Dim::DIM_Rect: in addOpTypeImageReqs()
751 Reqs.addRequirements(NoSampler ? SPIRV::Capability::ImageRect in addOpTypeImageReqs()
752 : SPIRV::Capability::SampledRect); in addOpTypeImageReqs()
754 case SPIRV::Dim::DIM_Buffer: in addOpTypeImageReqs()
755 Reqs.addRequirements(NoSampler ? SPIRV::Capability::ImageBuffer in addOpTypeImageReqs()
756 : SPIRV::Capability::SampledBuffer); in addOpTypeImageReqs()
758 case SPIRV::Dim::DIM_SubpassData: in addOpTypeImageReqs()
759 Reqs.addRequirements(SPIRV::Capability::InputAttachment); in addOpTypeImageReqs()
766 MI.getOperand(8).getImm() == SPIRV::AccessQualifier::ReadWrite) in addOpTypeImageReqs()
767 Reqs.addRequirements(SPIRV::Capability::ImageReadWrite); in addOpTypeImageReqs()
769 Reqs.addRequirements(SPIRV::Capability::ImageBasic); in addOpTypeImageReqs()
777 SPIRV::RequirementHandler &Reqs, in AddAtomicFloatRequirements()
783 if (TypeDef->getOpcode() != SPIRV::OpTypeFloat) in AddAtomicFloatRequirements()
789 if (Op == SPIRV::OpAtomicFAddEXT) { in AddAtomicFloatRequirements()
790 if (!ST.canUseExtension(SPIRV::Extension::SPV_EXT_shader_atomic_float_add)) in AddAtomicFloatRequirements()
792 Reqs.addExtension(SPIRV::Extension::SPV_EXT_shader_atomic_float_add); in AddAtomicFloatRequirements()
796 SPIRV::Extension::SPV_EXT_shader_atomic_float16_add)) in AddAtomicFloatRequirements()
798 Reqs.addExtension(SPIRV::Extension::SPV_EXT_shader_atomic_float16_add); in AddAtomicFloatRequirements()
799 Reqs.addCapability(SPIRV::Capability::AtomicFloat16AddEXT); in AddAtomicFloatRequirements()
802 Reqs.addCapability(SPIRV::Capability::AtomicFloat32AddEXT); in AddAtomicFloatRequirements()
805 Reqs.addCapability(SPIRV::Capability::AtomicFloat64AddEXT); in AddAtomicFloatRequirements()
813 SPIRV::Extension::SPV_EXT_shader_atomic_float_min_max)) in AddAtomicFloatRequirements()
815 Reqs.addExtension(SPIRV::Extension::SPV_EXT_shader_atomic_float_min_max); in AddAtomicFloatRequirements()
818 Reqs.addCapability(SPIRV::Capability::AtomicFloat16MinMaxEXT); in AddAtomicFloatRequirements()
821 Reqs.addCapability(SPIRV::Capability::AtomicFloat32MinMaxEXT); in AddAtomicFloatRequirements()
824 Reqs.addCapability(SPIRV::Capability::AtomicFloat64MinMaxEXT); in AddAtomicFloatRequirements()
834 SPIRV::RequirementHandler &Reqs, in addInstrRequirements()
837 case SPIRV::OpMemoryModel: { in addInstrRequirements()
839 Reqs.getAndAddRequirements(SPIRV::OperandCategory::AddressingModelOperand, in addInstrRequirements()
842 Reqs.getAndAddRequirements(SPIRV::OperandCategory::MemoryModelOperand, Mem, in addInstrRequirements()
846 case SPIRV::OpEntryPoint: { in addInstrRequirements()
848 Reqs.getAndAddRequirements(SPIRV::OperandCategory::ExecutionModelOperand, in addInstrRequirements()
852 case SPIRV::OpExecutionMode: in addInstrRequirements()
853 case SPIRV::OpExecutionModeId: { in addInstrRequirements()
855 Reqs.getAndAddRequirements(SPIRV::OperandCategory::ExecutionModeOperand, in addInstrRequirements()
859 case SPIRV::OpTypeMatrix: in addInstrRequirements()
860 Reqs.addCapability(SPIRV::Capability::Matrix); in addInstrRequirements()
862 case SPIRV::OpTypeInt: { in addInstrRequirements()
865 Reqs.addCapability(SPIRV::Capability::Int64); in addInstrRequirements()
867 Reqs.addCapability(SPIRV::Capability::Int16); in addInstrRequirements()
869 Reqs.addCapability(SPIRV::Capability::Int8); in addInstrRequirements()
872 case SPIRV::OpTypeFloat: { in addInstrRequirements()
875 Reqs.addCapability(SPIRV::Capability::Float64); in addInstrRequirements()
877 Reqs.addCapability(SPIRV::Capability::Float16); in addInstrRequirements()
880 case SPIRV::OpTypeVector: { in addInstrRequirements()
883 Reqs.addCapability(SPIRV::Capability::Vector16); in addInstrRequirements()
886 case SPIRV::OpTypePointer: { in addInstrRequirements()
888 Reqs.getAndAddRequirements(SPIRV::OperandCategory::StorageClassOperand, SC, in addInstrRequirements()
897 if (TypeDef->getOpcode() == SPIRV::OpTypeFloat && in addInstrRequirements()
899 Reqs.addCapability(SPIRV::Capability::Float16Buffer); in addInstrRequirements()
902 case SPIRV::OpBitReverse: in addInstrRequirements()
903 case SPIRV::OpBitFieldInsert: in addInstrRequirements()
904 case SPIRV::OpBitFieldSExtract: in addInstrRequirements()
905 case SPIRV::OpBitFieldUExtract: in addInstrRequirements()
906 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_bit_instructions)) { in addInstrRequirements()
907 Reqs.addCapability(SPIRV::Capability::Shader); in addInstrRequirements()
910 Reqs.addExtension(SPIRV::Extension::SPV_KHR_bit_instructions); in addInstrRequirements()
911 Reqs.addCapability(SPIRV::Capability::BitInstructions); in addInstrRequirements()
913 case SPIRV::OpTypeRuntimeArray: in addInstrRequirements()
914 Reqs.addCapability(SPIRV::Capability::Shader); in addInstrRequirements()
916 case SPIRV::OpTypeOpaque: in addInstrRequirements()
917 case SPIRV::OpTypeEvent: in addInstrRequirements()
918 Reqs.addCapability(SPIRV::Capability::Kernel); in addInstrRequirements()
920 case SPIRV::OpTypePipe: in addInstrRequirements()
921 case SPIRV::OpTypeReserveId: in addInstrRequirements()
922 Reqs.addCapability(SPIRV::Capability::Pipes); in addInstrRequirements()
924 case SPIRV::OpTypeDeviceEvent: in addInstrRequirements()
925 case SPIRV::OpTypeQueue: in addInstrRequirements()
926 case SPIRV::OpBuildNDRange: in addInstrRequirements()
927 Reqs.addCapability(SPIRV::Capability::DeviceEnqueue); in addInstrRequirements()
929 case SPIRV::OpDecorate: in addInstrRequirements()
930 case SPIRV::OpDecorateId: in addInstrRequirements()
931 case SPIRV::OpDecorateString: in addInstrRequirements()
934 case SPIRV::OpMemberDecorate: in addInstrRequirements()
935 case SPIRV::OpMemberDecorateString: in addInstrRequirements()
938 case SPIRV::OpInBoundsPtrAccessChain: in addInstrRequirements()
939 Reqs.addCapability(SPIRV::Capability::Addresses); in addInstrRequirements()
941 case SPIRV::OpConstantSampler: in addInstrRequirements()
942 Reqs.addCapability(SPIRV::Capability::LiteralSampler); in addInstrRequirements()
944 case SPIRV::OpTypeImage: in addInstrRequirements()
947 case SPIRV::OpTypeSampler: in addInstrRequirements()
948 Reqs.addCapability(SPIRV::Capability::ImageBasic); in addInstrRequirements()
950 case SPIRV::OpTypeForwardPointer: in addInstrRequirements()
952 Reqs.addCapability(SPIRV::Capability::Addresses); in addInstrRequirements()
954 case SPIRV::OpAtomicFlagTestAndSet: in addInstrRequirements()
955 case SPIRV::OpAtomicLoad: in addInstrRequirements()
956 case SPIRV::OpAtomicStore: in addInstrRequirements()
957 case SPIRV::OpAtomicExchange: in addInstrRequirements()
958 case SPIRV::OpAtomicCompareExchange: in addInstrRequirements()
959 case SPIRV::OpAtomicIIncrement: in addInstrRequirements()
960 case SPIRV::OpAtomicIDecrement: in addInstrRequirements()
961 case SPIRV::OpAtomicIAdd: in addInstrRequirements()
962 case SPIRV::OpAtomicISub: in addInstrRequirements()
963 case SPIRV::OpAtomicUMin: in addInstrRequirements()
964 case SPIRV::OpAtomicUMax: in addInstrRequirements()
965 case SPIRV::OpAtomicSMin: in addInstrRequirements()
966 case SPIRV::OpAtomicSMax: in addInstrRequirements()
967 case SPIRV::OpAtomicAnd: in addInstrRequirements()
968 case SPIRV::OpAtomicOr: in addInstrRequirements()
969 case SPIRV::OpAtomicXor: { in addInstrRequirements()
972 if (MI.getOpcode() == SPIRV::OpAtomicStore) { in addInstrRequirements()
980 if (TypeDef->getOpcode() == SPIRV::OpTypeInt) { in addInstrRequirements()
983 Reqs.addCapability(SPIRV::Capability::Int64Atomics); in addInstrRequirements()
987 case SPIRV::OpGroupNonUniformIAdd: in addInstrRequirements()
988 case SPIRV::OpGroupNonUniformFAdd: in addInstrRequirements()
989 case SPIRV::OpGroupNonUniformIMul: in addInstrRequirements()
990 case SPIRV::OpGroupNonUniformFMul: in addInstrRequirements()
991 case SPIRV::OpGroupNonUniformSMin: in addInstrRequirements()
992 case SPIRV::OpGroupNonUniformUMin: in addInstrRequirements()
993 case SPIRV::OpGroupNonUniformFMin: in addInstrRequirements()
994 case SPIRV::OpGroupNonUniformSMax: in addInstrRequirements()
995 case SPIRV::OpGroupNonUniformUMax: in addInstrRequirements()
996 case SPIRV::OpGroupNonUniformFMax: in addInstrRequirements()
997 case SPIRV::OpGroupNonUniformBitwiseAnd: in addInstrRequirements()
998 case SPIRV::OpGroupNonUniformBitwiseOr: in addInstrRequirements()
999 case SPIRV::OpGroupNonUniformBitwiseXor: in addInstrRequirements()
1000 case SPIRV::OpGroupNonUniformLogicalAnd: in addInstrRequirements()
1001 case SPIRV::OpGroupNonUniformLogicalOr: in addInstrRequirements()
1002 case SPIRV::OpGroupNonUniformLogicalXor: { in addInstrRequirements()
1006 case SPIRV::GroupOperation::Reduce: in addInstrRequirements()
1007 case SPIRV::GroupOperation::InclusiveScan: in addInstrRequirements()
1008 case SPIRV::GroupOperation::ExclusiveScan: in addInstrRequirements()
1009 Reqs.addCapability(SPIRV::Capability::Kernel); in addInstrRequirements()
1010 Reqs.addCapability(SPIRV::Capability::GroupNonUniformArithmetic); in addInstrRequirements()
1011 Reqs.addCapability(SPIRV::Capability::GroupNonUniformBallot); in addInstrRequirements()
1013 case SPIRV::GroupOperation::ClusteredReduce: in addInstrRequirements()
1014 Reqs.addCapability(SPIRV::Capability::GroupNonUniformClustered); in addInstrRequirements()
1016 case SPIRV::GroupOperation::PartitionedReduceNV: in addInstrRequirements()
1017 case SPIRV::GroupOperation::PartitionedInclusiveScanNV: in addInstrRequirements()
1018 case SPIRV::GroupOperation::PartitionedExclusiveScanNV: in addInstrRequirements()
1019 Reqs.addCapability(SPIRV::Capability::GroupNonUniformPartitionedNV); in addInstrRequirements()
1024 case SPIRV::OpGroupNonUniformShuffle: in addInstrRequirements()
1025 case SPIRV::OpGroupNonUniformShuffleXor: in addInstrRequirements()
1026 Reqs.addCapability(SPIRV::Capability::GroupNonUniformShuffle); in addInstrRequirements()
1028 case SPIRV::OpGroupNonUniformShuffleUp: in addInstrRequirements()
1029 case SPIRV::OpGroupNonUniformShuffleDown: in addInstrRequirements()
1030 Reqs.addCapability(SPIRV::Capability::GroupNonUniformShuffleRelative); in addInstrRequirements()
1032 case SPIRV::OpGroupAll: in addInstrRequirements()
1033 case SPIRV::OpGroupAny: in addInstrRequirements()
1034 case SPIRV::OpGroupBroadcast: in addInstrRequirements()
1035 case SPIRV::OpGroupIAdd: in addInstrRequirements()
1036 case SPIRV::OpGroupFAdd: in addInstrRequirements()
1037 case SPIRV::OpGroupFMin: in addInstrRequirements()
1038 case SPIRV::OpGroupUMin: in addInstrRequirements()
1039 case SPIRV::OpGroupSMin: in addInstrRequirements()
1040 case SPIRV::OpGroupFMax: in addInstrRequirements()
1041 case SPIRV::OpGroupUMax: in addInstrRequirements()
1042 case SPIRV::OpGroupSMax: in addInstrRequirements()
1043 Reqs.addCapability(SPIRV::Capability::Groups); in addInstrRequirements()
1045 case SPIRV::OpGroupNonUniformElect: in addInstrRequirements()
1046 Reqs.addCapability(SPIRV::Capability::GroupNonUniform); in addInstrRequirements()
1048 case SPIRV::OpGroupNonUniformAll: in addInstrRequirements()
1049 case SPIRV::OpGroupNonUniformAny: in addInstrRequirements()
1050 case SPIRV::OpGroupNonUniformAllEqual: in addInstrRequirements()
1051 Reqs.addCapability(SPIRV::Capability::GroupNonUniformVote); in addInstrRequirements()
1053 case SPIRV::OpGroupNonUniformBroadcast: in addInstrRequirements()
1054 case SPIRV::OpGroupNonUniformBroadcastFirst: in addInstrRequirements()
1055 case SPIRV::OpGroupNonUniformBallot: in addInstrRequirements()
1056 case SPIRV::OpGroupNonUniformInverseBallot: in addInstrRequirements()
1057 case SPIRV::OpGroupNonUniformBallotBitExtract: in addInstrRequirements()
1058 case SPIRV::OpGroupNonUniformBallotBitCount: in addInstrRequirements()
1059 case SPIRV::OpGroupNonUniformBallotFindLSB: in addInstrRequirements()
1060 case SPIRV::OpGroupNonUniformBallotFindMSB: in addInstrRequirements()
1061 Reqs.addCapability(SPIRV::Capability::GroupNonUniformBallot); in addInstrRequirements()
1063 case SPIRV::OpSubgroupShuffleINTEL: in addInstrRequirements()
1064 case SPIRV::OpSubgroupShuffleDownINTEL: in addInstrRequirements()
1065 case SPIRV::OpSubgroupShuffleUpINTEL: in addInstrRequirements()
1066 case SPIRV::OpSubgroupShuffleXorINTEL: in addInstrRequirements()
1067 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_subgroups)) { in addInstrRequirements()
1068 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_subgroups); in addInstrRequirements()
1069 Reqs.addCapability(SPIRV::Capability::SubgroupShuffleINTEL); in addInstrRequirements()
1072 case SPIRV::OpSubgroupBlockReadINTEL: in addInstrRequirements()
1073 case SPIRV::OpSubgroupBlockWriteINTEL: in addInstrRequirements()
1074 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_subgroups)) { in addInstrRequirements()
1075 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_subgroups); in addInstrRequirements()
1076 Reqs.addCapability(SPIRV::Capability::SubgroupBufferBlockIOINTEL); in addInstrRequirements()
1079 case SPIRV::OpSubgroupImageBlockReadINTEL: in addInstrRequirements()
1080 case SPIRV::OpSubgroupImageBlockWriteINTEL: in addInstrRequirements()
1081 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_subgroups)) { in addInstrRequirements()
1082 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_subgroups); in addInstrRequirements()
1083 Reqs.addCapability(SPIRV::Capability::SubgroupImageBlockIOINTEL); in addInstrRequirements()
1086 case SPIRV::OpAssumeTrueKHR: in addInstrRequirements()
1087 case SPIRV::OpExpectKHR: in addInstrRequirements()
1088 if (ST.canUseExtension(SPIRV::Extension::SPV_KHR_expect_assume)) { in addInstrRequirements()
1089 Reqs.addExtension(SPIRV::Extension::SPV_KHR_expect_assume); in addInstrRequirements()
1090 Reqs.addCapability(SPIRV::Capability::ExpectAssumeKHR); in addInstrRequirements()
1093 case SPIRV::OpPtrCastToCrossWorkgroupINTEL: in addInstrRequirements()
1094 case SPIRV::OpCrossWorkgroupCastToPtrINTEL: in addInstrRequirements()
1095 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_usm_storage_classes)) { in addInstrRequirements()
1096 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_usm_storage_classes); in addInstrRequirements()
1097 Reqs.addCapability(SPIRV::Capability::USMStorageClassesINTEL); in addInstrRequirements()
1100 case SPIRV::OpConstantFunctionPointerINTEL: in addInstrRequirements()
1101 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_function_pointers)) { in addInstrRequirements()
1102 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_function_pointers); in addInstrRequirements()
1103 Reqs.addCapability(SPIRV::Capability::FunctionPointersINTEL); in addInstrRequirements()
1106 case SPIRV::OpGroupNonUniformRotateKHR: in addInstrRequirements()
1107 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_subgroup_rotate)) in addInstrRequirements()
1111 Reqs.addExtension(SPIRV::Extension::SPV_KHR_subgroup_rotate); in addInstrRequirements()
1112 Reqs.addCapability(SPIRV::Capability::GroupNonUniformRotateKHR); in addInstrRequirements()
1113 Reqs.addCapability(SPIRV::Capability::GroupNonUniform); in addInstrRequirements()
1115 case SPIRV::OpGroupIMulKHR: in addInstrRequirements()
1116 case SPIRV::OpGroupFMulKHR: in addInstrRequirements()
1117 case SPIRV::OpGroupBitwiseAndKHR: in addInstrRequirements()
1118 case SPIRV::OpGroupBitwiseOrKHR: in addInstrRequirements()
1119 case SPIRV::OpGroupBitwiseXorKHR: in addInstrRequirements()
1120 case SPIRV::OpGroupLogicalAndKHR: in addInstrRequirements()
1121 case SPIRV::OpGroupLogicalOrKHR: in addInstrRequirements()
1122 case SPIRV::OpGroupLogicalXorKHR: in addInstrRequirements()
1124 SPIRV::Extension::SPV_KHR_uniform_group_instructions)) { in addInstrRequirements()
1125 Reqs.addExtension(SPIRV::Extension::SPV_KHR_uniform_group_instructions); in addInstrRequirements()
1126 Reqs.addCapability(SPIRV::Capability::GroupUniformArithmeticKHR); in addInstrRequirements()
1129 case SPIRV::OpReadClockKHR: in addInstrRequirements()
1130 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_shader_clock)) in addInstrRequirements()
1134 Reqs.addExtension(SPIRV::Extension::SPV_KHR_shader_clock); in addInstrRequirements()
1135 Reqs.addCapability(SPIRV::Capability::ShaderClockKHR); in addInstrRequirements()
1137 case SPIRV::OpFunctionPointerCallINTEL: in addInstrRequirements()
1138 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_function_pointers)) { in addInstrRequirements()
1139 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_function_pointers); in addInstrRequirements()
1140 Reqs.addCapability(SPIRV::Capability::FunctionPointersINTEL); in addInstrRequirements()
1143 case SPIRV::OpAtomicFAddEXT: in addInstrRequirements()
1144 case SPIRV::OpAtomicFMinEXT: in addInstrRequirements()
1145 case SPIRV::OpAtomicFMaxEXT: in addInstrRequirements()
1148 case SPIRV::OpConvertBF16ToFINTEL: in addInstrRequirements()
1149 case SPIRV::OpConvertFToBF16INTEL: in addInstrRequirements()
1150 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_bfloat16_conversion)) { in addInstrRequirements()
1151 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_bfloat16_conversion); in addInstrRequirements()
1152 Reqs.addCapability(SPIRV::Capability::BFloat16ConversionINTEL); in addInstrRequirements()
1155 case SPIRV::OpVariableLengthArrayINTEL: in addInstrRequirements()
1156 case SPIRV::OpSaveMemoryINTEL: in addInstrRequirements()
1157 case SPIRV::OpRestoreMemoryINTEL: in addInstrRequirements()
1158 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_variable_length_array)) { in addInstrRequirements()
1159 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_variable_length_array); in addInstrRequirements()
1160 Reqs.addCapability(SPIRV::Capability::VariableLengthArrayINTEL); in addInstrRequirements()
1163 case SPIRV::OpAsmTargetINTEL: in addInstrRequirements()
1164 case SPIRV::OpAsmINTEL: in addInstrRequirements()
1165 case SPIRV::OpAsmCallINTEL: in addInstrRequirements()
1166 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_inline_assembly)) { in addInstrRequirements()
1167 Reqs.addExtension(SPIRV::Extension::SPV_INTEL_inline_assembly); in addInstrRequirements()
1168 Reqs.addCapability(SPIRV::Capability::AsmINTEL); in addInstrRequirements()
1171 case SPIRV::OpTypeCooperativeMatrixKHR: in addInstrRequirements()
1172 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_cooperative_matrix)) in addInstrRequirements()
1177 Reqs.addExtension(SPIRV::Extension::SPV_KHR_cooperative_matrix); in addInstrRequirements()
1178 Reqs.addCapability(SPIRV::Capability::CooperativeMatrixKHR); in addInstrRequirements()
1187 Reqs.removeCapabilityIf(SPIRV::Capability::BitInstructions, in addInstrRequirements()
1188 SPIRV::Capability::Shader); in addInstrRequirements()
1191 static void collectReqs(const Module &M, SPIRV::ModuleAnalysisInfo &MAI, in collectReqs()
1216 SPIRV::OperandCategory::ExecutionModeOperand, EM, ST); in collectReqs()
1219 case SPIRV::ExecutionMode::DenormPreserve: in collectReqs()
1220 case SPIRV::ExecutionMode::DenormFlushToZero: in collectReqs()
1221 case SPIRV::ExecutionMode::SignedZeroInfNanPreserve: in collectReqs()
1222 case SPIRV::ExecutionMode::RoundingModeRTE: in collectReqs()
1223 case SPIRV::ExecutionMode::RoundingModeRTZ: in collectReqs()
1231 ST.canUseExtension(SPIRV::Extension::SPV_KHR_float_controls)) in collectReqs()
1232 MAI.Reqs.addExtension(SPIRV::Extension::SPV_KHR_float_controls); in collectReqs()
1240 SPIRV::OperandCategory::ExecutionModeOperand, in collectReqs()
1241 SPIRV::ExecutionMode::LocalSize, ST); in collectReqs()
1244 SPIRV::OperandCategory::ExecutionModeOperand, in collectReqs()
1245 SPIRV::ExecutionMode::LocalSize, ST); in collectReqs()
1249 SPIRV::OperandCategory::ExecutionModeOperand, in collectReqs()
1250 SPIRV::ExecutionMode::LocalSizeHint, ST); in collectReqs()
1253 SPIRV::OperandCategory::ExecutionModeOperand, in collectReqs()
1254 SPIRV::ExecutionMode::SubgroupSize, ST); in collectReqs()
1257 SPIRV::OperandCategory::ExecutionModeOperand, in collectReqs()
1258 SPIRV::ExecutionMode::VecTypeHint, ST); in collectReqs()
1261 ST.canUseExtension(SPIRV::Extension::SPV_INTEL_optnone)) { in collectReqs()
1263 MAI.Reqs.addExtension(SPIRV::Extension::SPV_INTEL_optnone); in collectReqs()
1264 MAI.Reqs.addCapability(SPIRV::Capability::OptNoneINTEL); in collectReqs()
1270 unsigned Flags = SPIRV::FPFastMathMode::None; in getFastMathFlags()
1272 Flags |= SPIRV::FPFastMathMode::NotNaN; in getFastMathFlags()
1274 Flags |= SPIRV::FPFastMathMode::NotInf; in getFastMathFlags()
1276 Flags |= SPIRV::FPFastMathMode::NSZ; in getFastMathFlags()
1278 Flags |= SPIRV::FPFastMathMode::AllowRecip; in getFastMathFlags()
1280 Flags |= SPIRV::FPFastMathMode::Fast; in getFastMathFlags()
1286 SPIRV::RequirementHandler &Reqs) { in handleMIFlagDecoration()
1288 getSymbolicOperandRequirements(SPIRV::OperandCategory::DecorationOperand, in handleMIFlagDecoration()
1289 SPIRV::Decoration::NoSignedWrap, ST, Reqs) in handleMIFlagDecoration()
1292 SPIRV::Decoration::NoSignedWrap, {}); in handleMIFlagDecoration()
1295 getSymbolicOperandRequirements(SPIRV::OperandCategory::DecorationOperand, in handleMIFlagDecoration()
1296 SPIRV::Decoration::NoUnsignedWrap, ST, in handleMIFlagDecoration()
1300 SPIRV::Decoration::NoUnsignedWrap, {}); in handleMIFlagDecoration()
1305 if (FMFlags == SPIRV::FPFastMathMode::None) in handleMIFlagDecoration()
1308 buildOpDecorate(DstReg, I, TII, SPIRV::Decoration::FPFastMathMode, {FMFlags}); in handleMIFlagDecoration()
1314 SPIRV::ModuleAnalysisInfo &MAI) { in addDecorations()
1325 struct SPIRV::ModuleAnalysisInfo SPIRVModuleAnalysis::MAI;
1362 if (MAI.MS[SPIRV::MB_EntryPoints].empty()) in runOnModule()
1363 MAI.Reqs.addCapability(SPIRV::Capability::Linkage); in runOnModule()