1542 unsigned Op =
MI.getOpcode();
1544 case SPIRV::OpMemoryModel: {
1545 int64_t Addr =
MI.getOperand(0).getImm();
1548 int64_t Mem =
MI.getOperand(1).getImm();
1553 case SPIRV::OpEntryPoint: {
1554 int64_t Exe =
MI.getOperand(0).getImm();
1559 case SPIRV::OpExecutionMode:
1560 case SPIRV::OpExecutionModeId: {
1561 int64_t Exe =
MI.getOperand(1).getImm();
1566 case SPIRV::OpTypeMatrix:
1569 case SPIRV::OpTypeInt: {
1570 unsigned BitWidth =
MI.getOperand(1).getImm();
1578 ST.canUseExtension(SPIRV::Extension::SPV_INTEL_int4)) {
1582 if (!ST.canUseExtension(
1583 SPIRV::Extension::SPV_ALTERA_arbitrary_precision_integers))
1585 "OpTypeInt type with a width other than 8, 16, 32 or 64 bits "
1586 "requires the following SPIR-V extension: "
1587 "SPV_ALTERA_arbitrary_precision_integers");
1589 SPIRV::Extension::SPV_ALTERA_arbitrary_precision_integers);
1590 Reqs.
addCapability(SPIRV::Capability::ArbitraryPrecisionIntegersALTERA);
1594 case SPIRV::OpDot: {
1598 Reqs.
addCapability(SPIRV::Capability::BFloat16DotProductKHR);
1601 case SPIRV::OpTypeFloat: {
1602 unsigned BitWidth =
MI.getOperand(1).getImm();
1607 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_bfloat16))
1609 "following SPIR-V extension: SPV_KHR_bfloat16",
1619 case SPIRV::OpTypeVector: {
1620 unsigned NumComponents =
MI.getOperand(2).getImm();
1621 if (NumComponents == 8 || NumComponents == 16)
1627 if (ElemTypeDef->
getOpcode() == SPIRV::OpTypePointer &&
1628 ST.canUseExtension(SPIRV::Extension::SPV_INTEL_masked_gather_scatter)) {
1629 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_masked_gather_scatter);
1630 Reqs.
addCapability(SPIRV::Capability::MaskedGatherScatterINTEL);
1634 case SPIRV::OpTypePointer: {
1635 auto SC =
MI.getOperand(1).getImm();
1646 (TypeDef->
getOpcode() == SPIRV::OpTypeFloat) &&
1651 case SPIRV::OpExtInst: {
1652 if (
MI.getOperand(2).getImm() ==
1653 static_cast<int64_t
>(
1654 SPIRV::InstructionSet::NonSemantic_Shader_DebugInfo_100)) {
1655 Reqs.
addExtension(SPIRV::Extension::SPV_KHR_non_semantic_info);
1658 if (
MI.getOperand(3).getImm() ==
1659 static_cast<int64_t
>(SPIRV::OpenCLExtInst::printf)) {
1663 if (
MI.getOperand(2).getImm() ==
1664 static_cast<int64_t
>(SPIRV::InstructionSet::OpenCL_std)) {
1670 if (TypeDef && TypeDef->getOpcode() == SPIRV::OpTypeVector)
1671 TypeDef = MRI.
getVRegDef(TypeDef->getOperand(1).getReg());
1676 bool UsesBFloat16 = IsBFloat16(MRI.
getVRegDef(
MI.getOperand(1).getReg()));
1677 for (
unsigned I = 4,
E =
MI.getNumOperands();
I <
E && !UsesBFloat16;
1686 if (!ST.canUseExtension(
1687 SPIRV::Extension::SPV_INTEL_bfloat16_arithmetic)) {
1689 MI,
"OpenCL Extended instructions with bfloat16 require the "
1690 "following SPIR-V extension: SPV_INTEL_bfloat16_arithmetic");
1693 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_bfloat16_arithmetic);
1694 Reqs.
addCapability(SPIRV::Capability::BFloat16ArithmeticINTEL);
1699 case SPIRV::OpAliasDomainDeclINTEL:
1700 case SPIRV::OpAliasScopeDeclINTEL:
1701 case SPIRV::OpAliasScopeListDeclINTEL: {
1702 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_memory_access_aliasing);
1703 Reqs.
addCapability(SPIRV::Capability::MemoryAccessAliasingINTEL);
1706 case SPIRV::OpBitReverse:
1707 case SPIRV::OpBitFieldInsert:
1708 case SPIRV::OpBitFieldSExtract:
1709 case SPIRV::OpBitFieldUExtract:
1710 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_bit_instructions)) {
1714 Reqs.
addExtension(SPIRV::Extension::SPV_KHR_bit_instructions);
1717 case SPIRV::OpTypeRuntimeArray:
1720 case SPIRV::OpTypeOpaque:
1721 case SPIRV::OpTypeEvent:
1724 case SPIRV::OpTypePipe:
1725 case SPIRV::OpTypeReserveId:
1728 case SPIRV::OpTypeDeviceEvent:
1729 case SPIRV::OpTypeQueue:
1730 case SPIRV::OpBuildNDRange:
1731 case SPIRV::OpEnqueueKernel:
1734 case SPIRV::OpDecorate:
1735 case SPIRV::OpDecorateId:
1736 case SPIRV::OpDecorateString:
1739 case SPIRV::OpMemberDecorate:
1740 case SPIRV::OpMemberDecorateString:
1743 case SPIRV::OpInBoundsPtrAccessChain:
1746 case SPIRV::OpConstantSampler:
1749 case SPIRV::OpInBoundsAccessChain:
1750 case SPIRV::OpAccessChain:
1753 case SPIRV::OpTypeImage:
1756 case SPIRV::OpTypeSampler:
1757 if (!ST.isShader()) {
1761 case SPIRV::OpTypeForwardPointer:
1765 case SPIRV::OpAtomicFlagTestAndSet:
1766 case SPIRV::OpAtomicLoad:
1767 case SPIRV::OpAtomicStore:
1768 case SPIRV::OpAtomicExchange:
1769 case SPIRV::OpAtomicCompareExchange:
1770 case SPIRV::OpAtomicCompareExchangeWeak:
1771 case SPIRV::OpAtomicIIncrement:
1772 case SPIRV::OpAtomicIDecrement:
1773 case SPIRV::OpAtomicIAdd:
1774 case SPIRV::OpAtomicISub:
1775 case SPIRV::OpAtomicUMin:
1776 case SPIRV::OpAtomicUMax:
1777 case SPIRV::OpAtomicSMin:
1778 case SPIRV::OpAtomicSMax:
1779 case SPIRV::OpAtomicAnd:
1780 case SPIRV::OpAtomicOr:
1781 case SPIRV::OpAtomicXor: {
1784 if (
Op == SPIRV::OpAtomicStore) {
1787 assert(InstrPtr &&
"Unexpected type instruction for OpAtomicStore");
1793 if (TypeDef->
getOpcode() == SPIRV::OpTypeInt) {
1798 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_16bit_atomics))
1800 "16-bit integer atomic operations require the following SPIR-V "
1801 "extension: SPV_INTEL_16bit_atomics",
1803 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_16bit_atomics);
1805 case SPIRV::OpAtomicLoad:
1806 case SPIRV::OpAtomicStore:
1807 case SPIRV::OpAtomicExchange:
1808 case SPIRV::OpAtomicCompareExchange:
1809 case SPIRV::OpAtomicCompareExchangeWeak:
1811 SPIRV::Capability::AtomicInt16CompareExchangeINTEL);
1819 if (
is_contained({SPIRV::OpAtomicLoad, SPIRV::OpAtomicStore,
1820 SPIRV::OpAtomicExchange},
1822 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_16bit_atomics))
1824 "The atomic bfloat16 instruction requires the following SPIR-V "
1825 "extension: SPV_INTEL_16bit_atomics",
1827 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_16bit_atomics);
1828 Reqs.
addCapability(SPIRV::Capability::AtomicBFloat16LoadStoreINTEL);
1833 case SPIRV::OpGroupNonUniformIAdd:
1834 case SPIRV::OpGroupNonUniformFAdd:
1835 case SPIRV::OpGroupNonUniformIMul:
1836 case SPIRV::OpGroupNonUniformFMul:
1837 case SPIRV::OpGroupNonUniformSMin:
1838 case SPIRV::OpGroupNonUniformUMin:
1839 case SPIRV::OpGroupNonUniformFMin:
1840 case SPIRV::OpGroupNonUniformSMax:
1841 case SPIRV::OpGroupNonUniformUMax:
1842 case SPIRV::OpGroupNonUniformFMax:
1843 case SPIRV::OpGroupNonUniformBitwiseAnd:
1844 case SPIRV::OpGroupNonUniformBitwiseOr:
1845 case SPIRV::OpGroupNonUniformBitwiseXor:
1846 case SPIRV::OpGroupNonUniformLogicalAnd:
1847 case SPIRV::OpGroupNonUniformLogicalOr:
1848 case SPIRV::OpGroupNonUniformLogicalXor: {
1850 int64_t GroupOp =
MI.getOperand(3).getImm();
1852 case SPIRV::GroupOperation::Reduce:
1853 case SPIRV::GroupOperation::InclusiveScan:
1854 case SPIRV::GroupOperation::ExclusiveScan:
1855 Reqs.
addCapability(SPIRV::Capability::GroupNonUniformArithmetic);
1857 case SPIRV::GroupOperation::ClusteredReduce:
1858 Reqs.
addCapability(SPIRV::Capability::GroupNonUniformClustered);
1860 case SPIRV::GroupOperation::PartitionedReduceNV:
1861 case SPIRV::GroupOperation::PartitionedInclusiveScanNV:
1862 case SPIRV::GroupOperation::PartitionedExclusiveScanNV:
1863 Reqs.
addCapability(SPIRV::Capability::GroupNonUniformPartitionedNV);
1868 case SPIRV::OpGroupNonUniformQuadSwap:
1871 case SPIRV::OpImageQueryLod:
1874 case SPIRV::OpImageQuerySize:
1875 case SPIRV::OpImageQuerySizeLod:
1876 case SPIRV::OpImageQueryLevels:
1877 case SPIRV::OpImageQuerySamples:
1881 case SPIRV::OpImageQueryFormat: {
1882 Register ResultReg =
MI.getOperand(0).getReg();
1884 static const unsigned CompareOps[] = {
1885 SPIRV::OpIEqual, SPIRV::OpINotEqual,
1886 SPIRV::OpUGreaterThan, SPIRV::OpUGreaterThanEqual,
1887 SPIRV::OpULessThan, SPIRV::OpULessThanEqual,
1888 SPIRV::OpSGreaterThan, SPIRV::OpSGreaterThanEqual,
1889 SPIRV::OpSLessThan, SPIRV::OpSLessThanEqual};
1891 auto CheckAndAddExtension = [&](int64_t ImmVal) {
1892 if (ImmVal == 4323 || ImmVal == 4324) {
1893 if (ST.canUseExtension(SPIRV::Extension::SPV_EXT_image_raw10_raw12))
1894 Reqs.
addExtension(SPIRV::Extension::SPV_EXT_image_raw10_raw12);
1897 "SPV_EXT_image_raw10_raw12 extension");
1902 unsigned Opc = UseInst.getOpcode();
1904 if (
Opc == SPIRV::OpSwitch) {
1907 CheckAndAddExtension(
Op.getImm());
1909 for (
unsigned i = 1; i < UseInst.getNumOperands(); ++i) {
1912 if (ConstInst && ConstInst->
getOpcode() == SPIRV::OpConstantI) {
1915 CheckAndAddExtension(ImmVal);
1923 case SPIRV::OpGroupNonUniformShuffle:
1924 case SPIRV::OpGroupNonUniformShuffleXor:
1925 Reqs.
addCapability(SPIRV::Capability::GroupNonUniformShuffle);
1927 case SPIRV::OpGroupNonUniformShuffleUp:
1928 case SPIRV::OpGroupNonUniformShuffleDown:
1929 Reqs.
addCapability(SPIRV::Capability::GroupNonUniformShuffleRelative);
1931 case SPIRV::OpGroupAll:
1932 case SPIRV::OpGroupAny:
1933 case SPIRV::OpGroupBroadcast:
1934 case SPIRV::OpGroupIAdd:
1935 case SPIRV::OpGroupFAdd:
1936 case SPIRV::OpGroupFMin:
1937 case SPIRV::OpGroupUMin:
1938 case SPIRV::OpGroupSMin:
1939 case SPIRV::OpGroupFMax:
1940 case SPIRV::OpGroupUMax:
1941 case SPIRV::OpGroupSMax:
1944 case SPIRV::OpGroupNonUniformElect:
1947 case SPIRV::OpGroupNonUniformAll:
1948 case SPIRV::OpGroupNonUniformAny:
1949 case SPIRV::OpGroupNonUniformAllEqual:
1952 case SPIRV::OpGroupNonUniformBroadcast:
1953 case SPIRV::OpGroupNonUniformBroadcastFirst:
1954 case SPIRV::OpGroupNonUniformBallot:
1955 case SPIRV::OpGroupNonUniformInverseBallot:
1956 case SPIRV::OpGroupNonUniformBallotBitExtract:
1957 case SPIRV::OpGroupNonUniformBallotBitCount:
1958 case SPIRV::OpGroupNonUniformBallotFindLSB:
1959 case SPIRV::OpGroupNonUniformBallotFindMSB:
1960 Reqs.
addCapability(SPIRV::Capability::GroupNonUniformBallot);
1962 case SPIRV::OpSubgroupShuffleINTEL:
1963 case SPIRV::OpSubgroupShuffleDownINTEL:
1964 case SPIRV::OpSubgroupShuffleUpINTEL:
1965 case SPIRV::OpSubgroupShuffleXorINTEL:
1966 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_subgroups)) {
1967 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_subgroups);
1968 Reqs.
addCapability(SPIRV::Capability::SubgroupShuffleINTEL);
1971 case SPIRV::OpSubgroupBlockReadINTEL:
1972 case SPIRV::OpSubgroupBlockWriteINTEL:
1973 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_subgroups)) {
1974 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_subgroups);
1975 Reqs.
addCapability(SPIRV::Capability::SubgroupBufferBlockIOINTEL);
1978 case SPIRV::OpSubgroupImageBlockReadINTEL:
1979 case SPIRV::OpSubgroupImageBlockWriteINTEL:
1980 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_subgroups)) {
1981 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_subgroups);
1982 Reqs.
addCapability(SPIRV::Capability::SubgroupImageBlockIOINTEL);
1985 case SPIRV::OpSubgroupImageMediaBlockReadINTEL:
1986 case SPIRV::OpSubgroupImageMediaBlockWriteINTEL:
1987 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_media_block_io)) {
1988 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_media_block_io);
1989 Reqs.
addCapability(SPIRV::Capability::SubgroupImageMediaBlockIOINTEL);
1992 case SPIRV::OpAssumeTrueKHR:
1993 case SPIRV::OpExpectKHR:
1994 if (ST.canUseExtension(SPIRV::Extension::SPV_KHR_expect_assume)) {
1995 Reqs.
addExtension(SPIRV::Extension::SPV_KHR_expect_assume);
1999 case SPIRV::OpFmaKHR:
2000 if (ST.canUseExtension(SPIRV::Extension::SPV_KHR_fma)) {
2005 case SPIRV::OpPtrCastToCrossWorkgroupINTEL:
2006 case SPIRV::OpCrossWorkgroupCastToPtrINTEL:
2007 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_usm_storage_classes)) {
2008 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_usm_storage_classes);
2009 Reqs.
addCapability(SPIRV::Capability::USMStorageClassesINTEL);
2012 case SPIRV::OpConstantFunctionPointerINTEL:
2013 case SPIRV::OpFunctionPointerCallINTEL:
2014 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_function_pointers)) {
2015 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_function_pointers);
2016 Reqs.
addCapability(SPIRV::Capability::FunctionPointersINTEL);
2019 case SPIRV::OpGroupNonUniformRotateKHR:
2020 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_subgroup_rotate))
2022 "following SPIR-V extension: SPV_KHR_subgroup_rotate",
2024 Reqs.
addExtension(SPIRV::Extension::SPV_KHR_subgroup_rotate);
2025 Reqs.
addCapability(SPIRV::Capability::GroupNonUniformRotateKHR);
2028 case SPIRV::OpFixedCosALTERA:
2029 case SPIRV::OpFixedSinALTERA:
2030 case SPIRV::OpFixedCosPiALTERA:
2031 case SPIRV::OpFixedSinPiALTERA:
2032 case SPIRV::OpFixedExpALTERA:
2033 case SPIRV::OpFixedLogALTERA:
2034 case SPIRV::OpFixedRecipALTERA:
2035 case SPIRV::OpFixedSqrtALTERA:
2036 case SPIRV::OpFixedSinCosALTERA:
2037 case SPIRV::OpFixedSinCosPiALTERA:
2038 case SPIRV::OpFixedRsqrtALTERA:
2039 if (!ST.canUseExtension(
2040 SPIRV::Extension::SPV_ALTERA_arbitrary_precision_fixed_point))
2042 "following SPIR-V extension: "
2043 "SPV_ALTERA_arbitrary_precision_fixed_point",
2046 SPIRV::Extension::SPV_ALTERA_arbitrary_precision_fixed_point);
2047 Reqs.
addCapability(SPIRV::Capability::ArbitraryPrecisionFixedPointALTERA);
2049 case SPIRV::OpGroupIMulKHR:
2050 case SPIRV::OpGroupFMulKHR:
2051 case SPIRV::OpGroupBitwiseAndKHR:
2052 case SPIRV::OpGroupBitwiseOrKHR:
2053 case SPIRV::OpGroupBitwiseXorKHR:
2054 case SPIRV::OpGroupLogicalAndKHR:
2055 case SPIRV::OpGroupLogicalOrKHR:
2056 case SPIRV::OpGroupLogicalXorKHR:
2057 if (ST.canUseExtension(
2058 SPIRV::Extension::SPV_KHR_uniform_group_instructions)) {
2059 Reqs.
addExtension(SPIRV::Extension::SPV_KHR_uniform_group_instructions);
2060 Reqs.
addCapability(SPIRV::Capability::GroupUniformArithmeticKHR);
2063 case SPIRV::OpReadClockKHR:
2064 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_shader_clock))
2066 "following SPIR-V extension: SPV_KHR_shader_clock",
2068 Reqs.
addExtension(SPIRV::Extension::SPV_KHR_shader_clock);
2071 case SPIRV::OpAbortKHR:
2072 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_abort))
2074 "following SPIR-V extension: SPV_KHR_abort",
2079 case SPIRV::OpPoisonKHR:
2080 case SPIRV::OpFreezeKHR:
2081 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_poison_freeze))
2083 "following SPIR-V extension: SPV_KHR_poison_freeze",
2085 Reqs.
addExtension(SPIRV::Extension::SPV_KHR_poison_freeze);
2088 case SPIRV::OpAtomicFAddEXT:
2089 case SPIRV::OpAtomicFMinEXT:
2090 case SPIRV::OpAtomicFMaxEXT:
2093 case SPIRV::OpConvertBF16ToFINTEL:
2094 case SPIRV::OpConvertFToBF16INTEL:
2095 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_bfloat16_conversion)) {
2096 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_bfloat16_conversion);
2097 Reqs.
addCapability(SPIRV::Capability::BFloat16ConversionINTEL);
2100 case SPIRV::OpRoundFToTF32INTEL:
2101 if (ST.canUseExtension(
2102 SPIRV::Extension::SPV_INTEL_tensor_float32_conversion)) {
2103 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_tensor_float32_conversion);
2104 Reqs.
addCapability(SPIRV::Capability::TensorFloat32RoundingINTEL);
2107 case SPIRV::OpVariableLengthArrayINTEL:
2108 case SPIRV::OpSaveMemoryINTEL:
2109 case SPIRV::OpRestoreMemoryINTEL:
2110 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_variable_length_array)) {
2111 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_variable_length_array);
2112 Reqs.
addCapability(SPIRV::Capability::VariableLengthArrayINTEL);
2115 case SPIRV::OpAsmTargetINTEL:
2116 case SPIRV::OpAsmINTEL:
2117 case SPIRV::OpAsmCallINTEL:
2118 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_inline_assembly)) {
2119 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_inline_assembly);
2123 case SPIRV::OpTypeCooperativeMatrixKHR: {
2124 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_cooperative_matrix))
2126 "OpTypeCooperativeMatrixKHR type requires the "
2127 "following SPIR-V extension: SPV_KHR_cooperative_matrix",
2129 Reqs.
addExtension(SPIRV::Extension::SPV_KHR_cooperative_matrix);
2130 Reqs.
addCapability(SPIRV::Capability::CooperativeMatrixKHR);
2134 Reqs.
addCapability(SPIRV::Capability::BFloat16CooperativeMatrixKHR);
2137 case SPIRV::OpArithmeticFenceEXT:
2138 if (!ST.canUseExtension(SPIRV::Extension::SPV_EXT_arithmetic_fence))
2140 "following SPIR-V extension: SPV_EXT_arithmetic_fence",
2142 Reqs.
addExtension(SPIRV::Extension::SPV_EXT_arithmetic_fence);
2145 case SPIRV::OpControlBarrierArriveINTEL:
2146 case SPIRV::OpControlBarrierWaitINTEL:
2147 if (ST.canUseExtension(SPIRV::Extension::SPV_INTEL_split_barrier)) {
2148 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_split_barrier);
2152 case SPIRV::OpCooperativeMatrixMulAddKHR: {
2153 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_cooperative_matrix))
2155 "following SPIR-V extension: "
2156 "SPV_KHR_cooperative_matrix",
2158 Reqs.
addExtension(SPIRV::Extension::SPV_KHR_cooperative_matrix);
2159 Reqs.
addCapability(SPIRV::Capability::CooperativeMatrixKHR);
2160 constexpr unsigned MulAddMaxSize = 6;
2161 if (
MI.getNumOperands() != MulAddMaxSize)
2163 const int64_t CoopOperands =
MI.getOperand(MulAddMaxSize - 1).getImm();
2165 SPIRV::CooperativeMatrixOperands::MatrixAAndBTF32ComponentsINTEL) {
2166 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_joint_matrix))
2168 "require the following SPIR-V extension: "
2169 "SPV_INTEL_joint_matrix",
2171 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_joint_matrix);
2173 SPIRV::Capability::CooperativeMatrixTF32ComponentTypeINTEL);
2176 MatrixAAndBBFloat16ComponentsINTEL ||
2178 SPIRV::CooperativeMatrixOperands::MatrixCBFloat16ComponentsINTEL ||
2180 MatrixResultBFloat16ComponentsINTEL) {
2181 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_joint_matrix))
2183 "require the following SPIR-V extension: "
2184 "SPV_INTEL_joint_matrix",
2186 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_joint_matrix);
2188 SPIRV::Capability::CooperativeMatrixBFloat16ComponentTypeINTEL);
2192 case SPIRV::OpCooperativeMatrixLoadKHR:
2193 case SPIRV::OpCooperativeMatrixStoreKHR:
2194 case SPIRV::OpCooperativeMatrixLoadCheckedINTEL:
2195 case SPIRV::OpCooperativeMatrixStoreCheckedINTEL:
2196 case SPIRV::OpCooperativeMatrixPrefetchINTEL: {
2197 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_cooperative_matrix))
2199 "following SPIR-V extension: "
2200 "SPV_KHR_cooperative_matrix",
2202 Reqs.
addExtension(SPIRV::Extension::SPV_KHR_cooperative_matrix);
2203 Reqs.
addCapability(SPIRV::Capability::CooperativeMatrixKHR);
2209 case SPIRV::OpCooperativeMatrixLoadKHR:
2212 case SPIRV::OpCooperativeMatrixStoreKHR:
2215 case SPIRV::OpCooperativeMatrixLoadCheckedINTEL:
2218 case SPIRV::OpCooperativeMatrixStoreCheckedINTEL:
2219 case SPIRV::OpCooperativeMatrixPrefetchINTEL:
2225 Register RegLayout =
MI.getOperand(LayoutNum).getReg();
2228 if (MILayout->
getOpcode() == SPIRV::OpConstantI) {
2231 static_cast<unsigned>(SPIRV::CooperativeMatrixLayout::PackedINTEL)) {
2232 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_joint_matrix))
2234 "extension: SPV_INTEL_joint_matrix",
2236 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_joint_matrix);
2237 Reqs.
addCapability(SPIRV::Capability::PackedCooperativeMatrixINTEL);
2242 if (
Op == SPIRV::OpCooperativeMatrixLoadKHR ||
2243 Op == SPIRV::OpCooperativeMatrixStoreKHR)
2246 std::string InstName;
2248 case SPIRV::OpCooperativeMatrixPrefetchINTEL:
2249 InstName =
"OpCooperativeMatrixPrefetchINTEL";
2251 case SPIRV::OpCooperativeMatrixLoadCheckedINTEL:
2252 InstName =
"OpCooperativeMatrixLoadCheckedINTEL";
2254 case SPIRV::OpCooperativeMatrixStoreCheckedINTEL:
2255 InstName =
"OpCooperativeMatrixStoreCheckedINTEL";
2259 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_joint_matrix)) {
2260 const std::string ErrorMsg =
2261 InstName +
" instruction requires the "
2262 "following SPIR-V extension: SPV_INTEL_joint_matrix";
2265 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_joint_matrix);
2266 if (
Op == SPIRV::OpCooperativeMatrixPrefetchINTEL) {
2267 Reqs.
addCapability(SPIRV::Capability::CooperativeMatrixPrefetchINTEL);
2271 SPIRV::Capability::CooperativeMatrixCheckedInstructionsINTEL);
2274 case SPIRV::OpCooperativeMatrixConstructCheckedINTEL:
2275 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_joint_matrix))
2277 "instructions require the following SPIR-V extension: "
2278 "SPV_INTEL_joint_matrix",
2280 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_joint_matrix);
2282 SPIRV::Capability::CooperativeMatrixCheckedInstructionsINTEL);
2284 case SPIRV::OpReadPipeBlockingALTERA:
2285 case SPIRV::OpWritePipeBlockingALTERA:
2286 if (ST.canUseExtension(SPIRV::Extension::SPV_ALTERA_blocking_pipes)) {
2287 Reqs.
addExtension(SPIRV::Extension::SPV_ALTERA_blocking_pipes);
2291 case SPIRV::OpCooperativeMatrixGetElementCoordINTEL:
2292 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_joint_matrix))
2294 "following SPIR-V extension: SPV_INTEL_joint_matrix",
2296 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_joint_matrix);
2298 SPIRV::Capability::CooperativeMatrixInvocationInstructionsINTEL);
2300 case SPIRV::OpConvertHandleToImageINTEL:
2301 case SPIRV::OpConvertHandleToSamplerINTEL:
2302 case SPIRV::OpConvertHandleToSampledImageINTEL: {
2303 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_bindless_images))
2305 "instructions require the following SPIR-V extension: "
2306 "SPV_INTEL_bindless_images",
2309 SPIRV::AddressingModel::AddressingModel AddrModel = MAI.
Addr;
2311 if (
Op == SPIRV::OpConvertHandleToImageINTEL &&
2312 TyDef->
getOpcode() != SPIRV::OpTypeImage) {
2314 "OpConvertHandleToImageINTEL",
2316 }
else if (
Op == SPIRV::OpConvertHandleToSamplerINTEL &&
2317 TyDef->
getOpcode() != SPIRV::OpTypeSampler) {
2319 "OpConvertHandleToSamplerINTEL",
2321 }
else if (
Op == SPIRV::OpConvertHandleToSampledImageINTEL &&
2322 TyDef->
getOpcode() != SPIRV::OpTypeSampledImage) {
2324 "OpConvertHandleToSampledImageINTEL",
2329 if (!(Bitwidth == 32 && AddrModel == SPIRV::AddressingModel::Physical32) &&
2330 !(Bitwidth == 64 && AddrModel == SPIRV::AddressingModel::Physical64)) {
2332 "Parameter value must be a 32-bit scalar in case of "
2333 "Physical32 addressing model or a 64-bit scalar in case of "
2334 "Physical64 addressing model",
2337 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_bindless_images);
2341 case SPIRV::OpSubgroup2DBlockLoadINTEL:
2342 case SPIRV::OpSubgroup2DBlockLoadTransposeINTEL:
2343 case SPIRV::OpSubgroup2DBlockLoadTransformINTEL:
2344 case SPIRV::OpSubgroup2DBlockPrefetchINTEL:
2345 case SPIRV::OpSubgroup2DBlockStoreINTEL: {
2346 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_2d_block_io))
2348 "Prefetch/Store]INTEL instructions require the "
2349 "following SPIR-V extension: SPV_INTEL_2d_block_io",
2351 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_2d_block_io);
2352 Reqs.
addCapability(SPIRV::Capability::Subgroup2DBlockIOINTEL);
2354 if (
Op == SPIRV::OpSubgroup2DBlockLoadTransposeINTEL) {
2355 Reqs.
addCapability(SPIRV::Capability::Subgroup2DBlockTransposeINTEL);
2358 if (
Op == SPIRV::OpSubgroup2DBlockLoadTransformINTEL) {
2359 Reqs.
addCapability(SPIRV::Capability::Subgroup2DBlockTransformINTEL);
2364 case SPIRV::OpKill: {
2367 case SPIRV::OpDemoteToHelperInvocation:
2368 Reqs.
addCapability(SPIRV::Capability::DemoteToHelperInvocation);
2370 if (ST.canUseExtension(
2371 SPIRV::Extension::SPV_EXT_demote_to_helper_invocation)) {
2374 SPIRV::Extension::SPV_EXT_demote_to_helper_invocation);
2379 case SPIRV::OpSUDot:
2380 case SPIRV::OpSDotAccSat:
2381 case SPIRV::OpUDotAccSat:
2382 case SPIRV::OpSUDotAccSat:
2385 case SPIRV::OpImageSampleImplicitLod:
2386 case SPIRV::OpImageFetch:
2390 case SPIRV::OpImageSampleExplicitLod:
2393 case SPIRV::OpImageSampleDrefImplicitLod:
2394 case SPIRV::OpImageSampleDrefExplicitLod:
2395 case SPIRV::OpImageDrefGather:
2396 case SPIRV::OpImageGather:
2400 case SPIRV::OpImageRead: {
2401 Register ImageReg =
MI.getOperand(2).getReg();
2402 SPIRVTypeInst TypeDef = ST.getSPIRVGlobalRegistry()->getResultType(
2411 Reqs.
addCapability(SPIRV::Capability::StorageImageReadWithoutFormat);
2414 case SPIRV::OpImageWrite: {
2415 Register ImageReg =
MI.getOperand(0).getReg();
2416 SPIRVTypeInst TypeDef = ST.getSPIRVGlobalRegistry()->getResultType(
2425 Reqs.
addCapability(SPIRV::Capability::StorageImageWriteWithoutFormat);
2428 case SPIRV::OpTypeStructContinuedINTEL:
2429 case SPIRV::OpConstantCompositeContinuedINTEL:
2430 case SPIRV::OpSpecConstantCompositeContinuedINTEL:
2431 case SPIRV::OpCompositeConstructContinuedINTEL: {
2432 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_long_composites))
2434 "Continued instructions require the "
2435 "following SPIR-V extension: SPV_INTEL_long_composites",
2437 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_long_composites);
2441 case SPIRV::OpArbitraryFloatEQALTERA:
2442 case SPIRV::OpArbitraryFloatGEALTERA:
2443 case SPIRV::OpArbitraryFloatGTALTERA:
2444 case SPIRV::OpArbitraryFloatLEALTERA:
2445 case SPIRV::OpArbitraryFloatLTALTERA:
2446 case SPIRV::OpArbitraryFloatCbrtALTERA:
2447 case SPIRV::OpArbitraryFloatCosALTERA:
2448 case SPIRV::OpArbitraryFloatCosPiALTERA:
2449 case SPIRV::OpArbitraryFloatExp10ALTERA:
2450 case SPIRV::OpArbitraryFloatExp2ALTERA:
2451 case SPIRV::OpArbitraryFloatExpALTERA:
2452 case SPIRV::OpArbitraryFloatExpm1ALTERA:
2453 case SPIRV::OpArbitraryFloatHypotALTERA:
2454 case SPIRV::OpArbitraryFloatLog10ALTERA:
2455 case SPIRV::OpArbitraryFloatLog1pALTERA:
2456 case SPIRV::OpArbitraryFloatLog2ALTERA:
2457 case SPIRV::OpArbitraryFloatLogALTERA:
2458 case SPIRV::OpArbitraryFloatRecipALTERA:
2459 case SPIRV::OpArbitraryFloatSinCosALTERA:
2460 case SPIRV::OpArbitraryFloatSinCosPiALTERA:
2461 case SPIRV::OpArbitraryFloatSinALTERA:
2462 case SPIRV::OpArbitraryFloatSinPiALTERA:
2463 case SPIRV::OpArbitraryFloatSqrtALTERA:
2464 case SPIRV::OpArbitraryFloatACosALTERA:
2465 case SPIRV::OpArbitraryFloatACosPiALTERA:
2466 case SPIRV::OpArbitraryFloatAddALTERA:
2467 case SPIRV::OpArbitraryFloatASinALTERA:
2468 case SPIRV::OpArbitraryFloatASinPiALTERA:
2469 case SPIRV::OpArbitraryFloatATan2ALTERA:
2470 case SPIRV::OpArbitraryFloatATanALTERA:
2471 case SPIRV::OpArbitraryFloatATanPiALTERA:
2472 case SPIRV::OpArbitraryFloatCastFromIntALTERA:
2473 case SPIRV::OpArbitraryFloatCastALTERA:
2474 case SPIRV::OpArbitraryFloatCastToIntALTERA:
2475 case SPIRV::OpArbitraryFloatDivALTERA:
2476 case SPIRV::OpArbitraryFloatMulALTERA:
2477 case SPIRV::OpArbitraryFloatPowALTERA:
2478 case SPIRV::OpArbitraryFloatPowNALTERA:
2479 case SPIRV::OpArbitraryFloatPowRALTERA:
2480 case SPIRV::OpArbitraryFloatRSqrtALTERA:
2481 case SPIRV::OpArbitraryFloatSubALTERA: {
2482 if (!ST.canUseExtension(
2483 SPIRV::Extension::SPV_ALTERA_arbitrary_precision_floating_point))
2485 "Floating point instructions can't be translated correctly without "
2486 "enabled SPV_ALTERA_arbitrary_precision_floating_point extension!",
2489 SPIRV::Extension::SPV_ALTERA_arbitrary_precision_floating_point);
2491 SPIRV::Capability::ArbitraryPrecisionFloatingPointALTERA);
2494 case SPIRV::OpSubgroupMatrixMultiplyAccumulateINTEL: {
2495 if (!ST.canUseExtension(
2496 SPIRV::Extension::SPV_INTEL_subgroup_matrix_multiply_accumulate))
2498 "OpSubgroupMatrixMultiplyAccumulateINTEL instruction requires the "
2500 "extension: SPV_INTEL_subgroup_matrix_multiply_accumulate",
2503 SPIRV::Extension::SPV_INTEL_subgroup_matrix_multiply_accumulate);
2505 SPIRV::Capability::SubgroupMatrixMultiplyAccumulateINTEL);
2508 case SPIRV::OpBitwiseFunctionINTEL: {
2509 if (!ST.canUseExtension(
2510 SPIRV::Extension::SPV_INTEL_ternary_bitwise_function))
2512 "OpBitwiseFunctionINTEL instruction requires the following SPIR-V "
2513 "extension: SPV_INTEL_ternary_bitwise_function",
2515 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_ternary_bitwise_function);
2516 Reqs.
addCapability(SPIRV::Capability::TernaryBitwiseFunctionINTEL);
2519 case SPIRV::OpCopyMemorySized: {
2524 case SPIRV::OpTypeUntypedPointerKHR:
2526 MI.getOperand(1).getImm(), ST);
2528 case SPIRV::OpUntypedVariableKHR:
2529 case SPIRV::OpUntypedAccessChainKHR:
2530 case SPIRV::OpUntypedInBoundsAccessChainKHR:
2531 case SPIRV::OpUntypedPtrAccessChainKHR:
2532 case SPIRV::OpUntypedInBoundsPtrAccessChainKHR:
2533 case SPIRV::OpUntypedPrefetchKHR:
2534 case SPIRV::OpUntypedGroupAsyncCopyKHR: {
2535 if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_untyped_pointers))
2537 "SPIR-V extension: SPV_KHR_untyped_pointers",
2539 Reqs.
addExtension(SPIRV::Extension::SPV_KHR_untyped_pointers);
2543 case SPIRV::OpPredicatedLoadINTEL:
2544 case SPIRV::OpPredicatedStoreINTEL: {
2545 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_predicated_io))
2547 "OpPredicated[Load/Store]INTEL instructions require "
2548 "the following SPIR-V extension: SPV_INTEL_predicated_io",
2550 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_predicated_io);
2554 case SPIRV::OpFAddS:
2555 case SPIRV::OpFSubS:
2556 case SPIRV::OpFMulS:
2557 case SPIRV::OpFDivS:
2558 case SPIRV::OpFRemS:
2560 case SPIRV::OpFNegate:
2561 case SPIRV::OpFAddV:
2562 case SPIRV::OpFSubV:
2563 case SPIRV::OpFMulV:
2564 case SPIRV::OpFDivV:
2565 case SPIRV::OpFRemV:
2566 case SPIRV::OpFNegateV: {
2569 if (TypeDef->
getOpcode() == SPIRV::OpTypeVector)
2572 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_bfloat16_arithmetic))
2574 "Arithmetic instructions with bfloat16 arguments require the "
2575 "following SPIR-V extension: SPV_INTEL_bfloat16_arithmetic",
2577 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_bfloat16_arithmetic);
2578 Reqs.
addCapability(SPIRV::Capability::BFloat16ArithmeticINTEL);
2582 case SPIRV::OpOrdered:
2583 case SPIRV::OpUnordered:
2584 case SPIRV::OpFOrdEqual:
2585 case SPIRV::OpFOrdNotEqual:
2586 case SPIRV::OpFOrdLessThan:
2587 case SPIRV::OpFOrdLessThanEqual:
2588 case SPIRV::OpFOrdGreaterThan:
2589 case SPIRV::OpFOrdGreaterThanEqual:
2590 case SPIRV::OpFUnordEqual:
2591 case SPIRV::OpFUnordNotEqual:
2592 case SPIRV::OpFUnordLessThan:
2593 case SPIRV::OpFUnordLessThanEqual:
2594 case SPIRV::OpFUnordGreaterThan:
2595 case SPIRV::OpFUnordGreaterThanEqual: {
2599 if (TypeDef->
getOpcode() == SPIRV::OpTypeVector)
2602 if (!ST.canUseExtension(SPIRV::Extension::SPV_INTEL_bfloat16_arithmetic))
2604 "Relational instructions with bfloat16 arguments require the "
2605 "following SPIR-V extension: SPV_INTEL_bfloat16_arithmetic",
2607 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_bfloat16_arithmetic);
2608 Reqs.
addCapability(SPIRV::Capability::BFloat16ArithmeticINTEL);
2612 case SPIRV::OpDPdxCoarse:
2613 case SPIRV::OpDPdyCoarse:
2614 case SPIRV::OpDPdxFine:
2615 case SPIRV::OpDPdyFine: {
2619 case SPIRV::OpLoopControlINTEL: {
2620 Reqs.
addExtension(SPIRV::Extension::SPV_INTEL_unstructured_loop_controls);
2621 Reqs.
addCapability(SPIRV::Capability::UnstructuredLoopControlsINTEL);
2633 SPIRV::Capability::Shader);