699 auto GetAddrSpacePtr = [&TM](
unsigned AS) {
712 const LLT BufferStridedPtr =
715 const LLT CodePtr = FlatPtr;
717 const std::initializer_list<LLT> AddrSpaces64 = {
718 GlobalPtr, ConstantPtr, FlatPtr
721 const std::initializer_list<LLT> AddrSpaces32 = {
722 LocalPtr, PrivatePtr, Constant32Ptr, RegionPtr
725 const std::initializer_list<LLT> AddrSpaces128 = {RsrcPtr};
727 const std::initializer_list<LLT> FPTypesBase = {
F32,
F64};
728 const std::initializer_list<LLT> FPTypes16 = {
F32,
F64,
F16};
729 const std::initializer_list<LLT> FPTypesPK16 = {
F32,
F64,
F16,
V2F16};
730 const std::initializer_list<LLT> FPTypesPK16_64 = {
F32,
F64,
F16,
V2F16,
733 const LLT MinExtendedFPTy = ST.has16BitInsts() ?
F16 :
F32;
761 if (ST.hasVOP3PInsts() && ST.hasAddNoCarryInsts() && ST.hasIntClamp()) {
763 if (ST.hasAnyPackedU64Ops()) {
766 .clampMaxNumElementsStrict(0,
S16, 2)
772 }
else if (ST.hasScalarAddSub64()) {
775 .clampMaxNumElementsStrict(0,
S16, 2)
783 .clampMaxNumElementsStrict(0,
S16, 2)
790 if (ST.hasScalarSMulU64()) {
793 .clampMaxNumElementsStrict(0,
S16, 2)
801 .clampMaxNumElementsStrict(0,
S16, 2)
811 .minScalarOrElt(0,
S16)
816 }
else if (ST.has16BitInsts()) {
850 .widenScalarToNextMultipleOf(0, 32)
860 if (ST.hasMad64_32())
865 if (ST.hasIntClamp()) {
888 {G_SDIV, G_UDIV, G_SREM, G_UREM, G_SDIVREM, G_UDIVREM})
898 if (ST.hasVOP3PInsts()) {
900 .clampMaxNumElements(0,
S8, 2)
921 {G_UADDO, G_USUBO, G_UADDE, G_SADDE, G_USUBE, G_SSUBE})
937 LocalPtr, ConstantPtr, PrivatePtr, FlatPtr })
978 auto &FCanonicalizeActions =
980 auto &StrictFPOpActions =
987 if (ST.has16BitInsts()) {
988 if (ST.hasVOP3PInsts()) {
990 FCanonicalizeActions.legalFor({
F16,
V2F16});
991 StrictFPOpActions.legalFor({
F16,
V2F16});
993 FPOpActions.legalFor({
F16});
994 FCanonicalizeActions.legalFor({
F16});
995 StrictFPOpActions.legalFor({
F16});
998 TrigActions.customFor({
F16});
999 FDIVActions.customFor({
F16});
1005 if (ST.hasAnyPackedFP32Ops()) {
1006 FPOpActions.legalFor({
V2F32});
1007 FCanonicalizeActions.legalFor({
V2F32});
1008 StrictFPOpActions.legalFor({
V2F32});
1009 FPOpActions.clampMaxNumElementsStrict(0,
F32, 2);
1010 FCanonicalizeActions.clampMaxNumElementsStrict(0,
F32, 2);
1011 StrictFPOpActions.clampMaxNumElementsStrict(0,
F32, 2);
1014 if (ST.hasAnyPackedFP64Ops()) {
1015 FPOpActions.legalFor({
V2F64});
1016 FCanonicalizeActions.legalFor({
V2F64});
1017 StrictFPOpActions.legalFor({
V2F64});
1018 FPOpActions.clampMaxNumElementsStrict(0,
F64, 2);
1019 FCanonicalizeActions.clampMaxNumElementsStrict(0,
F64, 2);
1020 StrictFPOpActions.clampMaxNumElementsStrict(0,
F64, 2);
1023 auto &MinNumMaxNumIeee =
1026 if (ST.hasVOP3PInsts()) {
1027 MinNumMaxNumIeee.legalFor(FPTypesPK16)
1029 .clampMaxNumElements(0,
F16, 2)
1031 }
else if (ST.has16BitInsts()) {
1032 MinNumMaxNumIeee.legalFor(FPTypes16).scalarize(0);
1034 MinNumMaxNumIeee.legalFor(FPTypesBase).scalarize(0);
1038 {G_FMINNUM, G_FMAXNUM, G_FMINIMUMNUM, G_FMAXIMUMNUM});
1040 if (ST.hasAnyPackedFP64Ops()) {
1041 MinNumMaxNum.customFor(FPTypesPK16_64)
1043 .clampMaxNumElements(0,
F16, 2)
1044 .clampMaxNumElements(0,
F64, 2)
1046 }
else if (ST.hasVOP3PInsts()) {
1047 MinNumMaxNum.customFor(FPTypesPK16)
1049 .clampMaxNumElements(0,
F16, 2)
1051 }
else if (ST.has16BitInsts()) {
1052 MinNumMaxNum.customFor(FPTypes16).scalarize(0);
1054 MinNumMaxNum.customFor(FPTypesBase).scalarize(0);
1057 if (!ST.has16BitInsts()) {
1058 MinNumMaxNumIeee.minScalar(0,
F32);
1059 MinNumMaxNum.minScalar(0,
F32);
1062 if (ST.hasVOP3PInsts()) {
1063 FPOpActions.clampMaxNumElementsStrict(0,
F16, 2);
1064 FCanonicalizeActions.clampMaxNumElementsStrict(0,
F16, 2);
1065 StrictFPOpActions.clampMaxNumElementsStrict(0,
F16, 2);
1073 if (!ST.has16BitInsts()) {
1084 .legalFor(ST.hasAnyPackedFP32Ops(), {V2F32})
1087 if (ST.hasAnyPackedFP32Ops())
1091 if (ST.has16BitInsts()) {
1094 .legalFor(ST.hasBF16TransInsts(), {BF16})
1104 .legalFor({{
F32, I32}, {
F64, I32}, {
F16, I16}})
1126 if (ST.hasFractBug()) {
1140 .legalFor({{
F32, I32}, {
F64, I32}})
1160 if (ST.hasCvtPkF16F32Inst()) {
1162 .clampMaxNumElements(0,
F16, 2);
1175 if (ST.has16BitInsts()) {
1189 if (ST.hasAnyPackedFP32Ops())
1197 if (ST.hasMadF16() && ST.hasMadMacF32Insts())
1198 FMad.customFor({
F32,
F16});
1199 else if (ST.hasMadMacF32Insts())
1200 FMad.customFor({
F32});
1201 else if (ST.hasMadF16())
1202 FMad.customFor({
F16});
1207 if (ST.has16BitInsts()) {
1210 FRem.minScalar(0,
F32).customFor({
F32,
F64});
1218 .clampMaxNumElements(0,
S16, 2)
1234 .legalFor({{
F32, I32}, {
F64, I32}})
1238 if (ST.has16BitInsts())
1246 .legalFor({{I32,
F32}, {I32,
F64}})
1247 .customFor({{I64,
F32}, {I64,
F64}})
1250 if (ST.has16BitInsts())
1259 .legalFor({{I32,
F32}, {I32,
F64}, {I16,
F32}})
1260 .legalFor(ST.has16BitInsts(), {{I16, F16}})
1261 .legalFor(ST.hasVCvtPkIU16F32(), {{V2I16, V2F32}})
1265 if (
ST.has16BitInsts())
1268 if (
ST.hasVCvtPkIU16F32())
1278 getActionDefinitionsBuilder({G_LROUND, G_LLROUND})
1279 .clampScalar(0, I16, I64)
1283 getActionDefinitionsBuilder(G_INTRINSIC_FPTRUNC_ROUND)
1289 getActionDefinitionsBuilder({G_INTRINSIC_ROUND, G_FRINT, G_FNEARBYINT})
1293 getActionDefinitionsBuilder({G_INTRINSIC_LRINT, G_INTRINSIC_LLRINT})
1294 .clampScalar(0, I16, I64)
1298 auto &RoundingActions = getActionDefinitionsBuilder(
1299 {G_INTRINSIC_TRUNC, G_FCEIL, G_INTRINSIC_ROUNDEVEN});
1300 if (
ST.has16BitInsts())
1308 if (!
ST.has16BitInsts())
1311 getActionDefinitionsBuilder(G_PTR_ADD)
1317 getActionDefinitionsBuilder(G_PTRMASK)
1319 .scalarSameSizeAs(1, 0)
1323 getActionDefinitionsBuilder(G_ICMP)
1335 {
S1}, {
S32,
S64, GlobalPtr, LocalPtr, ConstantPtr, PrivatePtr, FlatPtr})
1336 .legalForCartesianProduct(
1337 {
S32}, {
S32,
S64, GlobalPtr, LocalPtr, ConstantPtr, PrivatePtr, FlatPtr});
1338 if (
ST.has16BitInsts()) {
1339 CmpBuilder.legalFor({{
S1,
S16}});
1348 getActionDefinitionsBuilder({G_SCMP, G_UCMP}).lower();
1351 getActionDefinitionsBuilder(G_FCMP).legalForCartesianProduct(
1352 {
I1},
ST.has16BitInsts() ? FPTypes16 : FPTypesBase);
1354 if (
ST.hasSALUFloatInsts())
1355 FCmpBuilder.legalForCartesianProduct({
I32}, {
F16,
F32});
1357 FCmpBuilder.widenScalarToNextPow2(1).minScalar(1,
F32).scalarize(0);
1360 auto &ExpOps = getActionDefinitionsBuilder(G_FPOW);
1361 if (
ST.has16BitInsts())
1362 ExpOps.customFor({{
F32}, {
F16}});
1364 ExpOps.customFor({
F32});
1365 ExpOps.clampScalar(0, MinExtendedFPTy,
F32).scalarize(0);
1367 getActionDefinitionsBuilder(G_FPOWI)
1368 .clampScalar(0, MinExtendedFPTy,
F32)
1371 getActionDefinitionsBuilder(G_FLOG2)
1372 .legalFor(
ST.has16BitInsts(), {F16})
1373 .legalFor(
ST.hasBF16TransInsts(), {BF16})
1379 getActionDefinitionsBuilder(G_FEXP2)
1380 .legalFor(
ST.has16BitInsts(), {F16})
1381 .legalFor(
ST.hasBF16TransInsts(), {BF16})
1387 getActionDefinitionsBuilder({G_FLOG, G_FLOG10})
1391 getActionDefinitionsBuilder({G_FEXP, G_FEXP10})
1396 getActionDefinitionsBuilder(G_CTPOP)
1398 .clampScalar(0,
S32,
S32)
1399 .widenScalarToNextPow2(1, 32)
1400 .clampScalar(1,
S32,
S64)
1402 .widenScalarToNextPow2(0, 32);
1405 if (
ST.has16BitInsts())
1406 getActionDefinitionsBuilder(G_IS_FPCLASS)
1407 .legalForCartesianProduct({
I1}, FPTypes16)
1408 .widenScalarToNextPow2(1)
1412 getActionDefinitionsBuilder(G_IS_FPCLASS)
1413 .legalForCartesianProduct({
I1}, FPTypesBase)
1414 .lowerFor({
I1,
F16})
1415 .widenScalarToNextPow2(1)
1422 getActionDefinitionsBuilder({G_CTLZ, G_CTTZ})
1424 .clampScalar(0,
S32,
S32)
1425 .clampScalar(1,
S32,
S64)
1426 .widenScalarToNextPow2(0, 32)
1427 .widenScalarToNextPow2(1, 32)
1431 getActionDefinitionsBuilder(G_CTLZ_ZERO_POISON)
1434 .clampScalar(0,
S32,
S32)
1435 .clampScalar(1,
S32,
S64)
1437 .widenScalarToNextPow2(0, 32)
1438 .widenScalarToNextPow2(1, 32);
1440 getActionDefinitionsBuilder(G_CTTZ_ZERO_POISON)
1442 .clampScalar(0,
S32,
S32)
1443 .clampScalar(1,
S32,
S64)
1445 .widenScalarToNextPow2(0, 32)
1446 .widenScalarToNextPow2(1, 32);
1448 getActionDefinitionsBuilder(G_CTLS)
1451 .clampScalar(0,
S32,
S32)
1452 .clampScalar(1,
S32,
S32);
1456 getActionDefinitionsBuilder(G_BITREVERSE)
1458 .clampScalar(0,
S32,
S64)
1460 .widenScalarToNextPow2(0);
1462 if (
ST.has16BitInsts()) {
1463 getActionDefinitionsBuilder(G_BSWAP)
1465 .clampMaxNumElementsStrict(0,
S16, 2)
1468 .widenScalarToNextPow2(0)
1469 .clampScalar(0,
S16,
S32)
1472 if (
ST.hasVOP3PInsts()) {
1473 getActionDefinitionsBuilder(G_ABS)
1475 .clampMaxNumElements(0,
S16, 2)
1477 .widenScalarToNextPow2(0)
1480 if (
ST.hasMinMaxI64Insts()) {
1481 getActionDefinitionsBuilder({G_SMIN, G_SMAX, G_UMIN, G_UMAX})
1483 .clampMaxNumElements(0,
S16, 2)
1485 .widenScalarToNextPow2(0)
1489 getActionDefinitionsBuilder({G_SMIN, G_SMAX, G_UMIN, G_UMAX})
1491 .clampMaxNumElements(0,
S16, 2)
1493 .widenScalarToNextPow2(0)
1498 getActionDefinitionsBuilder({G_SMIN, G_SMAX, G_UMIN, G_UMAX, G_ABS})
1500 .widenScalarToNextPow2(0)
1507 getActionDefinitionsBuilder(G_BSWAP)
1512 .widenScalarToNextPow2(0)
1517 getActionDefinitionsBuilder({G_SMIN, G_SMAX, G_UMIN, G_UMAX, G_ABS})
1520 .widenScalarToNextPow2(0)
1525 getActionDefinitionsBuilder(G_INTTOPTR)
1527 .legalForCartesianProduct(AddrSpaces64, {
S64})
1528 .legalForCartesianProduct(AddrSpaces32, {
S32})
1541 getActionDefinitionsBuilder(G_PTRTOINT)
1543 .legalForCartesianProduct(AddrSpaces64, {
S64})
1544 .legalForCartesianProduct(AddrSpaces32, {
S32})
1557 getActionDefinitionsBuilder(G_ADDRSPACE_CAST)
1561 const auto needToSplitMemOp = [=](
const LegalityQuery &Query,
1562 bool IsLoad) ->
bool {
1566 unsigned MemSize = Query.
MMODescrs[0].MemoryTy.getSizeInBits();
1580 unsigned NumRegs = (MemSize + 31) / 32;
1582 if (!
ST.hasDwordx3LoadStores())
1593 unsigned GlobalAlign32 =
ST.hasUnalignedBufferAccessEnabled() ? 0 : 32;
1594 unsigned GlobalAlign16 =
ST.hasUnalignedBufferAccessEnabled() ? 0 : 16;
1595 unsigned GlobalAlign8 =
ST.hasUnalignedBufferAccessEnabled() ? 0 : 8;
1601 for (
unsigned Op : {G_LOAD, G_STORE}) {
1602 const bool IsStore =
Op == G_STORE;
1604 auto &Actions = getActionDefinitionsBuilder(
Op);
1607 Actions.legalForTypesWithMemDesc({{
S32, GlobalPtr,
S32, GlobalAlign32},
1610 {
S64, GlobalPtr,
S64, GlobalAlign32},
1613 {
S32, GlobalPtr,
S8, GlobalAlign8},
1614 {
S32, GlobalPtr,
S16, GlobalAlign16},
1616 {
S32, LocalPtr,
S32, 32},
1617 {
S64, LocalPtr,
S64, 32},
1619 {
S32, LocalPtr,
S8, 8},
1620 {
S32, LocalPtr,
S16, 16},
1623 {
S32, PrivatePtr,
S32, 32},
1624 {
S32, PrivatePtr,
S8, 8},
1625 {
S32, PrivatePtr,
S16, 16},
1628 {
S32, ConstantPtr,
S32, GlobalAlign32},
1631 {
S64, ConstantPtr,
S64, GlobalAlign32},
1632 {
V2S32, ConstantPtr,
V2S32, GlobalAlign32}});
1634 Actions.legalForTypesWithMemDesc(
ST.useRealTrue16Insts(),
1635 {{S16, GlobalPtr, S8, GlobalAlign8},
1636 {S16, GlobalPtr, S16, GlobalAlign16},
1637 {S16, LocalPtr, S8, 8},
1638 {S16, LocalPtr, S16, 16},
1639 {S16, PrivatePtr, S8, 8},
1640 {S16, PrivatePtr, S16, 16}});
1650 Actions.unsupportedIf(
1651 typeInSet(1, {BufferFatPtr, BufferStridedPtr, RsrcPtr}));
1665 Actions.customIf(
typeIs(1, Constant32Ptr));
1691 return !Query.
Types[0].isVector() &&
1692 needToSplitMemOp(Query,
Op == G_LOAD);
1694 [=](
const LegalityQuery &Query) -> std::pair<unsigned, LLT> {
1699 unsigned MemSize = Query.
MMODescrs[0].MemoryTy.getSizeInBits();
1702 if (DstSize > MemSize)
1708 if (MemSize > MaxSize)
1716 return Query.
Types[0].isVector() &&
1717 needToSplitMemOp(Query,
Op == G_LOAD);
1719 [=](
const LegalityQuery &Query) -> std::pair<unsigned, LLT> {
1733 unsigned MemSize = Query.
MMODescrs[0].MemoryTy.getSizeInBits();
1734 if (MemSize > MaxSize) {
1738 if (MaxSize % EltSize == 0) {
1744 unsigned NumPieces = MemSize / MaxSize;
1748 if (NumPieces == 1 || NumPieces >= NumElts ||
1749 NumElts % NumPieces != 0)
1750 return std::pair(0, EltTy);
1758 return std::pair(0, EltTy);
1773 return std::pair(0, EltTy);
1778 .widenScalarToNextPow2(0)
1785 getActionDefinitionsBuilder({G_SEXTLOAD, G_ZEXTLOAD})
1786 .legalForTypesWithMemDesc({{
S32, GlobalPtr,
S8, 8},
1787 {
S32, GlobalPtr,
S16, 2 * 8},
1788 {
S32, LocalPtr,
S8, 8},
1789 {
S32, LocalPtr,
S16, 16},
1790 {
S32, PrivatePtr,
S8, 8},
1791 {
S32, PrivatePtr,
S16, 16},
1792 {
S32, ConstantPtr,
S8, 8},
1793 {
S32, ConstantPtr,
S16, 2 * 8}})
1794 .legalForTypesWithMemDesc(
ST.useRealTrue16Insts(),
1795 {{S16, GlobalPtr, S8, GlobalAlign8},
1796 {S16, LocalPtr, S8, GlobalAlign8},
1797 {S16, PrivatePtr, S8, GlobalAlign8},
1798 {S16, ConstantPtr, S8, GlobalAlign8}})
1803 if (
ST.hasFlatAddressSpace()) {
1804 ExtLoads.legalForTypesWithMemDesc(
1805 {{
S32, FlatPtr,
S8, 8}, {
S32, FlatPtr,
S16, 16}});
1807 ExtLoads.legalForTypesWithMemDesc(
ST.useRealTrue16Insts(),
1808 {{S16, FlatPtr, S8, GlobalAlign8}});
1816 ExtLoads.customIf(
typeIs(1, Constant32Ptr));
1818 ExtLoads.narrowScalarIf(
1825 ExtLoads.clampScalar(0,
S32,
S32)
1826 .widenScalarToNextPow2(0)
1829 auto &Atomics = getActionDefinitionsBuilder(
1830 {G_ATOMICRMW_XCHG, G_ATOMICRMW_ADD, G_ATOMICRMW_SUB,
1831 G_ATOMICRMW_AND, G_ATOMICRMW_OR, G_ATOMICRMW_XOR,
1832 G_ATOMICRMW_MAX, G_ATOMICRMW_MIN, G_ATOMICRMW_UMAX,
1833 G_ATOMICRMW_UMIN, G_ATOMICRMW_UINC_WRAP, G_ATOMICRMW_UDEC_WRAP})
1834 .legalFor({{
S32, GlobalPtr}, {
S32, LocalPtr},
1835 {
S64, GlobalPtr}, {
S64, LocalPtr},
1836 {
S32, RegionPtr}, {
S64, RegionPtr}});
1837 if (
ST.hasFlatAddressSpace()) {
1838 Atomics.legalFor({{
S32, FlatPtr}, {
S64, FlatPtr}});
1842 getActionDefinitionsBuilder({G_ATOMICRMW_USUB_COND, G_ATOMICRMW_USUB_SAT})
1843 .legalFor({{
S32, GlobalPtr}, {
S32, LocalPtr}, {
S32, RegionPtr}});
1844 if (
ST.hasFlatAddressSpace()) {
1845 Atomics32.legalFor({{
S32, FlatPtr}});
1849 auto &Atomic = getActionDefinitionsBuilder(G_ATOMICRMW_FADD);
1850 if (
ST.hasLDSFPAtomicAddF32()) {
1851 Atomic.legalFor({{
F32, LocalPtr}, {
F32, RegionPtr}});
1852 if (
ST.hasLdsAtomicAddF64())
1853 Atomic.legalFor({{
F64, LocalPtr}});
1854 if (
ST.hasAtomicDsPkAdd16Insts())
1855 Atomic.legalFor({{
V2F16, LocalPtr}, {
V2BF16, LocalPtr}});
1857 if (
ST.hasAtomicFaddInsts())
1858 Atomic.legalFor({{
F32, GlobalPtr}});
1859 if (
ST.hasFlatAtomicFaddF32Inst())
1860 Atomic.legalFor({{
F32, FlatPtr}});
1862 if (
ST.hasGFX90AInsts() ||
ST.hasGFX1250Insts()) {
1866 Atomic.legalFor({{
F32, GlobalPtr}, {
F64, GlobalPtr}, {
F64, FlatPtr}});
1869 if (
ST.hasAtomicBufferGlobalPkAddF16NoRtnInsts() ||
1870 ST.hasAtomicBufferGlobalPkAddF16Insts())
1871 Atomic.legalFor({{
V2F16, GlobalPtr}, {
V2F16, BufferFatPtr}});
1872 if (
ST.hasAtomicGlobalPkAddBF16Inst())
1873 Atomic.legalFor({{
V2BF16, GlobalPtr}});
1874 if (
ST.hasAtomicFlatPkAdd16Insts())
1875 Atomic.legalFor({{
V2F16, FlatPtr}, {
V2BF16, FlatPtr}});
1880 auto &AtomicFMinFMax =
1881 getActionDefinitionsBuilder({G_ATOMICRMW_FMIN, G_ATOMICRMW_FMAX})
1882 .legalFor({{
F32, LocalPtr}, {
F64, LocalPtr}});
1884 if (
ST.hasAtomicFMinFMaxF32GlobalInsts())
1885 AtomicFMinFMax.legalFor({{
F32, GlobalPtr},{
F32, BufferFatPtr}});
1886 if (
ST.hasAtomicFMinFMaxF64GlobalInsts())
1887 AtomicFMinFMax.legalFor({{
F64, GlobalPtr}, {
F64, BufferFatPtr}});
1888 if (
ST.hasAtomicFMinFMaxF32FlatInsts())
1889 AtomicFMinFMax.legalFor({
F32, FlatPtr});
1890 if (
ST.hasAtomicFMinFMaxF64FlatInsts())
1891 AtomicFMinFMax.legalFor({
F64, FlatPtr});
1895 getActionDefinitionsBuilder(G_ATOMIC_CMPXCHG)
1896 .customFor({{
S32, GlobalPtr}, {
S64, GlobalPtr},
1897 {
S32, FlatPtr}, {
S64, FlatPtr}})
1898 .legalFor({{
S32, LocalPtr}, {
S64, LocalPtr},
1899 {
S32, RegionPtr}, {
S64, RegionPtr}});
1903 getActionDefinitionsBuilder(G_SELECT)
1905 LocalPtr, FlatPtr, PrivatePtr,
1909 .clampScalar(0,
S16,
S64)
1913 .clampMaxNumElements(0,
S32, 2)
1914 .clampMaxNumElements(0, LocalPtr, 2)
1915 .clampMaxNumElements(0, PrivatePtr, 2)
1917 .widenScalarToNextPow2(0)
1922 auto &Shifts = getActionDefinitionsBuilder({G_SHL, G_LSHR, G_ASHR})
1924 if (
ST.has16BitInsts()) {
1925 if (
ST.hasVOP3PInsts()) {
1927 .clampMaxNumElements(0,
S16, 2);
1929 Shifts.legalFor({{
S16,
S16}});
1932 Shifts.widenScalarIf(
1937 const LLT AmountTy = Query.
Types[1];
1943 Shifts.clampScalar(1,
S32,
S32);
1944 Shifts.widenScalarToNextPow2(0, 16);
1945 Shifts.clampScalar(0,
S16,
S64);
1947 getActionDefinitionsBuilder({G_SSHLSAT, G_USHLSAT})
1955 Shifts.clampScalar(1,
S32,
S32);
1956 Shifts.widenScalarToNextPow2(0, 32);
1957 Shifts.clampScalar(0,
S32,
S64);
1959 getActionDefinitionsBuilder({G_SSHLSAT, G_USHLSAT})
1964 Shifts.scalarize(0);
1966 for (
unsigned Op : {G_EXTRACT_VECTOR_ELT, G_INSERT_VECTOR_ELT}) {
1967 unsigned VecTypeIdx =
Op == G_EXTRACT_VECTOR_ELT ? 1 : 0;
1968 unsigned EltTypeIdx =
Op == G_EXTRACT_VECTOR_ELT ? 0 : 1;
1969 unsigned IdxTypeIdx = 2;
1971 getActionDefinitionsBuilder(
Op)
1973 const LLT EltTy = Query.
Types[EltTypeIdx];
1974 const LLT VecTy = Query.
Types[VecTypeIdx];
1975 const LLT IdxTy = Query.
Types[IdxTypeIdx];
1977 const bool isLegalVecType =
1987 return (EltSize == 32 || EltSize == 64) &&
2003 const LLT EltTy = Query.
Types[EltTypeIdx];
2004 const LLT VecTy = Query.
Types[VecTypeIdx];
2008 const unsigned TargetEltSize =
2009 DstEltSize % 64 == 0 ? 64 : 32;
2010 return std::pair(VecTypeIdx,
2014 .clampScalar(EltTypeIdx,
S32,
S64)
2015 .clampScalar(VecTypeIdx,
S32,
S64)
2016 .clampScalar(IdxTypeIdx,
S32,
S32)
2017 .clampMaxNumElements(VecTypeIdx,
S32, 32)
2026 getActionDefinitionsBuilder(G_EXTRACT_VECTOR_ELT)
2028 const LLT &EltTy = Query.
Types[1].getElementType();
2029 return Query.
Types[0] != EltTy;
2032 for (
unsigned Op : {G_EXTRACT, G_INSERT}) {
2033 unsigned BigTyIdx =
Op == G_EXTRACT ? 1 : 0;
2034 unsigned LitTyIdx =
Op == G_EXTRACT ? 0 : 1;
2035 getActionDefinitionsBuilder(
Op)
2038 const LLT BigTy = Query.
Types[BigTyIdx];
2044 const LLT LitTy = Query.
Types[LitTyIdx];
2049 .widenScalarToNextPow2(BigTyIdx, 32)
2057 const LLT BigTy = Query.
Types[BigTyIdx];
2058 const LLT LitTy = Query.
Types[LitTyIdx];
2066 getActionDefinitionsBuilder(G_BUILD_VECTOR)
2076 if (
ST.hasScalarPackInsts()) {
2079 .minScalarOrElt(0,
S16)
2082 getActionDefinitionsBuilder(G_BUILD_VECTOR_TRUNC)
2086 BuildVector.customFor({
V2S16,
S16});
2087 BuildVector.minScalarOrElt(0,
S32);
2089 getActionDefinitionsBuilder(G_BUILD_VECTOR_TRUNC)
2097 getActionDefinitionsBuilder(G_CONCAT_VECTORS)
2099 .clampMaxNumElements(0,
S32, 32)
2100 .clampMaxNumElements(1,
S16, 2)
2101 .clampMaxNumElements(0,
S16, 64);
2103 getActionDefinitionsBuilder(G_SHUFFLE_VECTOR).lower();
2106 for (
unsigned Op : {G_MERGE_VALUES, G_UNMERGE_VALUES}) {
2107 unsigned BigTyIdx =
Op == G_MERGE_VALUES ? 0 : 1;
2108 unsigned LitTyIdx =
Op == G_MERGE_VALUES ? 1 : 0;
2110 auto notValidElt = [=](
const LegalityQuery &Query,
unsigned TypeIdx) {
2111 const LLT Ty = Query.
Types[TypeIdx];
2123 getActionDefinitionsBuilder(
Op)
2127 const LLT BigTy = Query.
Types[BigTyIdx];
2133 .widenScalarToNextPow2(LitTyIdx, 16)
2142 .clampScalar(LitTyIdx,
S32,
S512)
2143 .widenScalarToNextPow2(LitTyIdx, 32)
2147 return notValidElt(Query, LitTyIdx);
2152 return notValidElt(Query, BigTyIdx);
2157 if (
Op == G_MERGE_VALUES) {
2158 Builder.widenScalarIf(
2161 const LLT Ty = Query.
Types[LitTyIdx];
2167 Builder.widenScalarIf(
2169 const LLT Ty = Query.
Types[BigTyIdx];
2175 const LLT &Ty = Query.
Types[BigTyIdx];
2177 if (NewSizeInBits >= 256) {
2179 if (RoundedTo < NewSizeInBits)
2180 NewSizeInBits = RoundedTo;
2182 return std::pair(BigTyIdx,
LLT::scalar(NewSizeInBits));
2191 auto &SextInReg = getActionDefinitionsBuilder(G_SEXT_INREG)
2192 .legalFor({{
S32}, {
S64}})
2193 .clampScalar(0,
S32,
S64);
2195 if (
ST.hasVOP3PInsts()) {
2196 SextInReg.lowerFor({{
V2S16}})
2200 .clampMaxNumElementsStrict(0,
S16, 2);
2201 }
else if (
ST.has16BitInsts()) {
2202 SextInReg.lowerFor({{
S32}, {
S64}, {
S16}});
2206 SextInReg.lowerFor({{
S32}, {
S64}});
2211 .clampScalar(0,
S32,
S64)
2214 getActionDefinitionsBuilder({G_ROTR, G_ROTL})
2218 auto &FSHRActionDefs = getActionDefinitionsBuilder(G_FSHR);
2219 FSHRActionDefs.legalFor({{
S32,
S32}})
2220 .clampMaxNumElementsStrict(0,
S16, 2);
2221 if (
ST.hasVOP3PInsts())
2223 FSHRActionDefs.scalarize(0).lower();
2225 if (
ST.hasVOP3PInsts()) {
2226 getActionDefinitionsBuilder(G_FSHL)
2228 .clampMaxNumElementsStrict(0,
S16, 2)
2232 getActionDefinitionsBuilder(G_FSHL)
2237 getActionDefinitionsBuilder(G_READCYCLECOUNTER)
2240 getActionDefinitionsBuilder(G_READSTEADYCOUNTER).legalFor({
S64});
2242 getActionDefinitionsBuilder(G_FENCE)
2245 getActionDefinitionsBuilder({G_SMULO, G_UMULO})
2250 getActionDefinitionsBuilder({G_SBFX, G_UBFX})
2252 .clampScalar(1,
S32,
S32)
2253 .clampScalar(0,
S32,
S64)
2254 .widenScalarToNextPow2(0)
2257 getActionDefinitionsBuilder(
2261 G_ATOMIC_CMPXCHG_WITH_SUCCESS, G_ATOMICRMW_NAND, G_ATOMICRMW_FSUB,
2262 G_READ_REGISTER, G_WRITE_REGISTER,
2267 if (
ST.hasIEEEMinimumMaximumInsts()) {
2268 getActionDefinitionsBuilder({G_FMINIMUM, G_FMAXIMUM})
2269 .legalFor(FPTypesPK16)
2270 .clampMaxNumElements(0,
F16, 2)
2272 }
else if (
ST.hasVOP3PInsts()) {
2273 getActionDefinitionsBuilder({G_FMINIMUM, G_FMAXIMUM})
2275 .clampMaxNumElementsStrict(0,
F16, 2)
2279 getActionDefinitionsBuilder({G_FMINIMUM, G_FMAXIMUM})
2281 .clampScalar(0,
F32,
F64)
2285 getActionDefinitionsBuilder(
2286 {G_MEMCPY, G_MEMCPY_INLINE, G_MEMMOVE, G_MEMSET, G_MEMSET_INLINE})
2289 getActionDefinitionsBuilder({G_TRAP, G_DEBUGTRAP}).custom();
2291 getActionDefinitionsBuilder({G_VASTART, G_VAARG, G_BRJT, G_JUMP_TABLE,
2292 G_INDEXED_LOAD, G_INDEXED_SEXTLOAD,
2293 G_INDEXED_ZEXTLOAD, G_INDEXED_STORE})
2296 getActionDefinitionsBuilder(G_PREFETCH).alwaysLegal();
2298 getActionDefinitionsBuilder(
2299 {G_VECREDUCE_SMIN, G_VECREDUCE_SMAX, G_VECREDUCE_UMIN, G_VECREDUCE_UMAX,
2300 G_VECREDUCE_ADD, G_VECREDUCE_MUL, G_VECREDUCE_FMUL, G_VECREDUCE_FMIN,
2301 G_VECREDUCE_FMAX, G_VECREDUCE_FMINIMUM, G_VECREDUCE_FMAXIMUM,
2302 G_VECREDUCE_OR, G_VECREDUCE_AND, G_VECREDUCE_XOR})
2307 getActionDefinitionsBuilder({G_INTRINSIC, G_INTRINSIC_W_SIDE_EFFECTS,
2308 G_INTRINSIC_CONVERGENT,
2309 G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS})
4430 bool UsePartialMad64_32,
4431 bool SeparateOddAlignedProducts)
const {
4446 auto getZero32 = [&]() ->
Register {
4448 Zero32 =
B.buildConstant(I32, 0).getReg(0);
4451 auto getZero64 = [&]() ->
Register {
4453 Zero64 =
B.buildConstant(I64, 0).getReg(0);
4458 for (
unsigned i = 0; i < Src0.
size(); ++i) {
4469 if (CarryIn.empty())
4472 bool HaveCarryOut =
true;
4474 if (CarryIn.size() == 1) {
4476 LocalAccum =
B.buildZExt(I32, CarryIn[0]).getReg(0);
4480 CarryAccum = getZero32();
4482 CarryAccum =
B.buildZExt(I32, CarryIn[0]).getReg(0);
4483 for (
unsigned i = 1; i + 1 < CarryIn.size(); ++i) {
4485 B.buildUAdde(I32,
S1, CarryAccum, getZero32(), CarryIn[i])
4490 LocalAccum = getZero32();
4491 HaveCarryOut =
false;
4496 B.buildUAdde(I32,
S1, CarryAccum, LocalAccum, CarryIn.back());
4497 LocalAccum =
Add.getReg(0);
4511 auto buildMadChain =
4514 assert((DstIndex + 1 < Accum.
size() && LocalAccum.size() == 2) ||
4515 (DstIndex + 1 >= Accum.
size() && LocalAccum.size() == 1));
4522 if (LocalAccum.size() == 1 &&
4523 (!UsePartialMad64_32 || !CarryIn.empty())) {
4526 unsigned j1 = DstIndex - j0;
4527 if (Src0KnownZeros[j0] || Src1KnownZeros[j1]) {
4531 auto Mul =
B.buildMul(I32, Src0[j0], Src1[j1]);
4533 LocalAccum[0] =
Mul.getReg(0);
4535 if (CarryIn.empty()) {
4536 LocalAccum[0] =
B.buildAdd(I32, LocalAccum[0],
Mul).getReg(0);
4539 B.buildUAdde(I32,
S1, LocalAccum[0],
Mul, CarryIn.back())
4545 }
while (j0 <= DstIndex && (!UsePartialMad64_32 || !CarryIn.empty()));
4549 if (j0 <= DstIndex) {
4550 bool HaveSmallAccum =
false;
4553 if (LocalAccum[0]) {
4554 if (LocalAccum.size() == 1) {
4555 Tmp =
B.buildAnyExt(I64, LocalAccum[0]).getReg(0);
4556 HaveSmallAccum =
true;
4557 }
else if (LocalAccum[1]) {
4558 Tmp =
B.buildMergeLikeInstr(I64, LocalAccum).getReg(0);
4559 HaveSmallAccum =
false;
4561 Tmp =
B.buildZExt(I64, LocalAccum[0]).getReg(0);
4562 HaveSmallAccum =
true;
4565 assert(LocalAccum.size() == 1 || !LocalAccum[1]);
4567 HaveSmallAccum =
true;
4571 unsigned j1 = DstIndex - j0;
4572 if (Src0KnownZeros[j0] || Src1KnownZeros[j1]) {
4576 auto Mad =
B.buildInstr(AMDGPU::G_AMDGPU_MAD_U64_U32, {I64,
S1},
4577 {Src0[j0], Src1[j1], Tmp});
4578 Tmp = Mad.getReg(0);
4579 if (!HaveSmallAccum)
4580 CarryOut.push_back(Mad.getReg(1));
4581 HaveSmallAccum =
false;
4584 }
while (j0 <= DstIndex);
4586 auto Unmerge =
B.buildUnmerge(I32, Tmp);
4587 LocalAccum[0] = Unmerge.getReg(0);
4588 if (LocalAccum.size() > 1)
4589 LocalAccum[1] = Unmerge.getReg(1);
4596 LocalAccum[0] = getZero32();
4600 assert((LocalAccum.size() == 1 || LocalAccum[1]) &&
4601 "Uninitialized accumulator part");
4627 for (
unsigned i = 0; i <= Accum.
size() / 2; ++i) {
4628 Carry OddCarryIn = std::move(OddCarry);
4629 Carry EvenCarryIn = std::move(EvenCarry);
4634 if (2 * i < Accum.
size()) {
4635 auto LocalAccum = Accum.
drop_front(2 * i).take_front(2);
4636 EvenCarry = buildMadChain(LocalAccum, 2 * i, EvenCarryIn);
4641 if (!SeparateOddAlignedProducts) {
4642 auto LocalAccum = Accum.
drop_front(2 * i - 1).take_front(2);
4643 OddCarry = buildMadChain(LocalAccum, 2 * i - 1, OddCarryIn);
4645 bool IsHighest = 2 * i >= Accum.
size();
4648 .take_front(IsHighest ? 1 : 2);
4649 OddCarry = buildMadChain(LocalAccum, 2 * i - 1, OddCarryIn);
4655 Lo =
B.buildUAddo(I32,
S1, Accum[2 * i - 1], SeparateOddOut[0]);
4657 Lo =
B.buildAdd(I32, Accum[2 * i - 1], SeparateOddOut[0]);
4659 Lo =
B.buildUAdde(I32,
S1, Accum[2 * i - 1], SeparateOddOut[0],
4662 Accum[2 * i - 1] =
Lo->getOperand(0).getReg();
4665 auto Hi =
B.buildUAdde(I32,
S1, Accum[2 * i], SeparateOddOut[1],
4666 Lo->getOperand(1).getReg());
4667 Accum[2 * i] =
Hi.getReg(0);
4668 SeparateOddCarry =
Hi.getReg(1);
4675 if (
Register CarryOut = mergeCarry(Accum[2 * i - 1], OddCarryIn))
4676 EvenCarryIn.push_back(CarryOut);
4678 if (2 * i < Accum.
size()) {
4679 if (
Register CarryOut = mergeCarry(Accum[2 * i], EvenCarryIn))
4680 OddCarry.push_back(CarryOut);
5300 auto Rcp =
B.buildMergeLikeInstr(I64, {RcpLo, RcpHi});
5302 auto Zero64 =
B.buildConstant(I64, 0);
5303 auto NegDenom =
B.buildSub(I64, Zero64, Denom);
5305 auto MulLo1 =
B.buildMul(I64, NegDenom, Rcp);
5306 auto MulHi1 =
B.buildUMulH(I64, Rcp, MulLo1);
5308 auto UnmergeMulHi1 =
B.buildUnmerge(I32, MulHi1);
5309 Register MulHi1_Lo = UnmergeMulHi1.getReg(0);
5310 Register MulHi1_Hi = UnmergeMulHi1.getReg(1);
5312 auto Add1_Lo =
B.buildUAddo(I32,
S1, RcpLo, MulHi1_Lo);
5313 auto Add1_Hi =
B.buildUAdde(I32,
S1, RcpHi, MulHi1_Hi, Add1_Lo.getReg(1));
5314 auto Add1 =
B.buildMergeLikeInstr(I64, {Add1_Lo, Add1_Hi});
5316 auto MulLo2 =
B.buildMul(I64, NegDenom, Add1);
5317 auto MulHi2 =
B.buildUMulH(I64, Add1, MulLo2);
5318 auto UnmergeMulHi2 =
B.buildUnmerge(I32, MulHi2);
5319 Register MulHi2_Lo = UnmergeMulHi2.getReg(0);
5320 Register MulHi2_Hi = UnmergeMulHi2.getReg(1);
5322 auto Zero32 =
B.buildConstant(I32, 0);
5323 auto Add2_Lo =
B.buildUAddo(I32,
S1, Add1_Lo, MulHi2_Lo);
5324 auto Add2_Hi =
B.buildUAdde(I32,
S1, Add1_Hi, MulHi2_Hi, Add2_Lo.getReg(1));
5325 auto Add2 =
B.buildMergeLikeInstr(I64, {Add2_Lo, Add2_Hi});
5327 auto UnmergeNumer =
B.buildUnmerge(I32, Numer);
5328 Register NumerLo = UnmergeNumer.getReg(0);
5329 Register NumerHi = UnmergeNumer.getReg(1);
5331 auto MulHi3 =
B.buildUMulH(I64, Numer, Add2);
5332 auto Mul3 =
B.buildMul(I64, Denom, MulHi3);
5333 auto UnmergeMul3 =
B.buildUnmerge(I32, Mul3);
5334 Register Mul3_Lo = UnmergeMul3.getReg(0);
5335 Register Mul3_Hi = UnmergeMul3.getReg(1);
5336 auto Sub1_Lo =
B.buildUSubo(I32,
S1, NumerLo, Mul3_Lo);
5337 auto Sub1_Hi =
B.buildUSube(I32,
S1, NumerHi, Mul3_Hi, Sub1_Lo.getReg(1));
5338 auto Sub1_Mi =
B.buildSub(I32, NumerHi, Mul3_Hi);
5339 auto Sub1 =
B.buildMergeLikeInstr(I64, {Sub1_Lo, Sub1_Hi});
5341 auto UnmergeDenom =
B.buildUnmerge(I32, Denom);
5342 Register DenomLo = UnmergeDenom.getReg(0);
5343 Register DenomHi = UnmergeDenom.getReg(1);
5346 auto C1 =
B.buildSExt(I32, CmpHi);
5349 auto C2 =
B.buildSExt(I32, CmpLo);
5352 auto C3 =
B.buildSelect(I32, CmpEq, C2, C1);
5359 auto Sub2_Lo =
B.buildUSubo(I32,
S1, Sub1_Lo, DenomLo);
5360 auto Sub2_Mi =
B.buildUSube(I32,
S1, Sub1_Mi, DenomHi, Sub1_Lo.getReg(1));
5361 auto Sub2_Hi =
B.buildUSube(I32,
S1, Sub2_Mi, Zero32, Sub2_Lo.getReg(1));
5362 auto Sub2 =
B.buildMergeLikeInstr(I64, {Sub2_Lo, Sub2_Hi});
5364 auto One64 =
B.buildConstant(I64, 1);
5365 auto Add3 =
B.buildAdd(I64, MulHi3, One64);
5371 auto C6 =
B.buildSelect(
5375 auto Add4 =
B.buildAdd(I64, Add3, One64);
5376 auto Sub3_Lo =
B.buildUSubo(I32,
S1, Sub2_Lo, DenomLo);
5378 auto Sub3_Mi =
B.buildUSube(I32,
S1, Sub2_Mi, DenomHi, Sub2_Lo.getReg(1));
5379 auto Sub3_Hi =
B.buildUSube(I32,
S1, Sub3_Mi, Zero32, Sub3_Lo.getReg(1));
5380 auto Sub3 =
B.buildMergeLikeInstr(I64, {Sub3_Lo, Sub3_Hi});
5386 auto Sel1 =
B.buildSelect(
5393 auto Sel2 =
B.buildSelect(
6799 bool IsTyped)
const {
6813 assert(
MI.getNumExplicitDefs() == 1 ||
MI.getNumExplicitDefs() == 2);
6814 bool IsTFE =
MI.getNumExplicitDefs() == 2;
6816 StatusDst =
MI.getOperand(1).getReg();
6821 Register RSrc =
MI.getOperand(2 + OpOffset).getReg();
6824 const unsigned NumVIndexOps = IsTyped ? 8 : 7;
6827 const bool HasVIndex =
MI.getNumOperands() == NumVIndexOps + OpOffset;
6830 VIndex =
MI.getOperand(3 + OpOffset).getReg();
6833 VIndex =
B.buildConstant(I32, 0).getReg(0);
6836 Register VOffset =
MI.getOperand(3 + OpOffset).getReg();
6837 Register SOffset =
MI.getOperand(4 + OpOffset).getReg();
6841 Format =
MI.getOperand(5 + OpOffset).getImm();
6845 unsigned AuxiliaryData =
MI.getOperand(5 + OpOffset).getImm();
6855 Dst =
MI.getOperand(0).getReg();
6856 B.setInsertPt(
B.getMBB(),
MI);
6863 Dst =
MI.getOperand(0).getReg();
6864 B.setInsertPt(
B.getMBB(),
MI);
6868 const bool IsD16 = IsFormat && (EltTy.
getSizeInBits() == 16);
6869 const bool Unpacked = ST.hasUnpackedD16VMem();
6871 if (IsFormat && !IsTyped && !IsD16 && MemTy.
getSizeInBits() < 32) {
6872 const Function &Fn =
B.getMF().getFunction();
6874 Fn,
"unsupported sub-dword format buffer load",
MI.getDebugLoc()));
6877 B.buildUndef(StatusDst);
6878 MI.eraseFromParent();
6890 Opc = IsD16 ? AMDGPU::G_AMDGPU_TBUFFER_LOAD_FORMAT_D16 :
6891 AMDGPU::G_AMDGPU_TBUFFER_LOAD_FORMAT;
6892 }
else if (IsFormat) {
6896 Opc = AMDGPU::G_AMDGPU_BUFFER_LOAD_FORMAT_D16;
6898 Opc = IsTFE ? AMDGPU::G_AMDGPU_BUFFER_LOAD_FORMAT_TFE
6899 : AMDGPU::G_AMDGPU_BUFFER_LOAD_FORMAT;
6904 Opc = IsTFE ? AMDGPU::G_AMDGPU_BUFFER_LOAD_UBYTE_TFE
6905 : AMDGPU::G_AMDGPU_BUFFER_LOAD_UBYTE;
6908 Opc = IsTFE ? AMDGPU::G_AMDGPU_BUFFER_LOAD_USHORT_TFE
6909 : AMDGPU::G_AMDGPU_BUFFER_LOAD_USHORT;
6912 Opc = IsTFE ? AMDGPU::G_AMDGPU_BUFFER_LOAD_TFE
6913 : AMDGPU::G_AMDGPU_BUFFER_LOAD;
6919 unsigned NumValueDWords =
divideCeil(Ty.getSizeInBits(), 32);
6920 unsigned NumLoadDWords = NumValueDWords + 1;
6922 Register LoadDstReg =
B.getMRI()->createGenericVirtualRegister(LoadTy);
6924 Format, AuxiliaryData, MMO, IsTyped, HasVIndex,
B);
6925 bool IsFloat = Ty.getScalarType().isFloat();
6930 IsFloat ?
B.getMRI()->createGenericVirtualRegister(DstIntTy) : Dst;
6932 Register ExtDst =
B.getMRI()->createGenericVirtualRegister(I32);
6933 B.buildUnmerge({ExtDst, StatusDst}, LoadDstReg);
6934 B.buildTrunc(DstInt, ExtDst);
6935 }
else if (NumValueDWords == 1) {
6936 B.buildUnmerge({DstInt, StatusDst}, LoadDstReg);
6939 for (
unsigned I = 0;
I != NumValueDWords; ++
I)
6940 LoadElts.
push_back(
B.getMRI()->createGenericVirtualRegister(I32));
6942 B.buildUnmerge(LoadElts, LoadDstReg);
6944 B.buildMergeLikeInstr(DstInt, LoadElts);
6947 B.buildBitcast(Dst, DstInt);
6949 (IsD16 && !Ty.isVector())) {
6950 Register LoadDstReg =
B.getMRI()->createGenericVirtualRegister(I32);
6952 Format, AuxiliaryData, MMO, IsTyped, HasVIndex,
B);
6953 B.setInsertPt(
B.getMBB(), ++
B.getInsertPt());
6954 B.buildTrunc(Dst, LoadDstReg);
6955 }
else if (Unpacked && IsD16 && Ty.isVector()) {
6957 Register LoadDstReg =
B.getMRI()->createGenericVirtualRegister(UnpackedTy);
6959 Format, AuxiliaryData, MMO, IsTyped, HasVIndex,
B);
6960 B.setInsertPt(
B.getMBB(), ++
B.getInsertPt());
6962 auto Unmerge =
B.buildUnmerge(I32, LoadDstReg);
6964 for (
unsigned I = 0,
N = Unmerge->getNumOperands() - 1;
I !=
N; ++
I)
6965 Repack.
push_back(
B.buildTrunc(EltTy, Unmerge.getReg(
I)).getReg(0));
6966 B.buildMergeLikeInstr(Dst, Repack);
6969 AuxiliaryData, MMO, IsTyped, HasVIndex,
B);
6972 MI.eraseFromParent();
6978 case Intrinsic::amdgcn_raw_buffer_atomic_swap:
6979 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_swap:
6980 case Intrinsic::amdgcn_struct_buffer_atomic_swap:
6981 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_swap:
6982 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_SWAP;
6983 case Intrinsic::amdgcn_raw_buffer_atomic_add:
6984 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_add:
6985 case Intrinsic::amdgcn_struct_buffer_atomic_add:
6986 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_add:
6987 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_ADD;
6988 case Intrinsic::amdgcn_raw_buffer_atomic_sub:
6989 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_sub:
6990 case Intrinsic::amdgcn_struct_buffer_atomic_sub:
6991 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_sub:
6992 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_SUB;
6993 case Intrinsic::amdgcn_raw_buffer_atomic_smin:
6994 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_smin:
6995 case Intrinsic::amdgcn_struct_buffer_atomic_smin:
6996 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_smin:
6997 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_SMIN;
6998 case Intrinsic::amdgcn_raw_buffer_atomic_umin:
6999 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_umin:
7000 case Intrinsic::amdgcn_struct_buffer_atomic_umin:
7001 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_umin:
7002 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_UMIN;
7003 case Intrinsic::amdgcn_raw_buffer_atomic_smax:
7004 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_smax:
7005 case Intrinsic::amdgcn_struct_buffer_atomic_smax:
7006 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_smax:
7007 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_SMAX;
7008 case Intrinsic::amdgcn_raw_buffer_atomic_umax:
7009 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_umax:
7010 case Intrinsic::amdgcn_struct_buffer_atomic_umax:
7011 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_umax:
7012 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_UMAX;
7013 case Intrinsic::amdgcn_raw_buffer_atomic_and:
7014 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_and:
7015 case Intrinsic::amdgcn_struct_buffer_atomic_and:
7016 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_and:
7017 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_AND;
7018 case Intrinsic::amdgcn_raw_buffer_atomic_or:
7019 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_or:
7020 case Intrinsic::amdgcn_struct_buffer_atomic_or:
7021 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_or:
7022 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_OR;
7023 case Intrinsic::amdgcn_raw_buffer_atomic_xor:
7024 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_xor:
7025 case Intrinsic::amdgcn_struct_buffer_atomic_xor:
7026 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_xor:
7027 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_XOR;
7028 case Intrinsic::amdgcn_raw_buffer_atomic_inc:
7029 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_inc:
7030 case Intrinsic::amdgcn_struct_buffer_atomic_inc:
7031 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_inc:
7032 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_INC;
7033 case Intrinsic::amdgcn_raw_buffer_atomic_dec:
7034 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_dec:
7035 case Intrinsic::amdgcn_struct_buffer_atomic_dec:
7036 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_dec:
7037 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_DEC;
7038 case Intrinsic::amdgcn_raw_buffer_atomic_cmpswap:
7039 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_cmpswap:
7040 case Intrinsic::amdgcn_struct_buffer_atomic_cmpswap:
7041 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_cmpswap:
7042 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_CMPSWAP;
7043 case Intrinsic::amdgcn_raw_buffer_atomic_fadd:
7044 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_fadd:
7045 case Intrinsic::amdgcn_struct_buffer_atomic_fadd:
7046 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_fadd:
7047 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_FADD;
7048 case Intrinsic::amdgcn_raw_buffer_atomic_fmin:
7049 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_fmin:
7050 case Intrinsic::amdgcn_struct_buffer_atomic_fmin:
7051 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_fmin:
7052 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_FMIN;
7053 case Intrinsic::amdgcn_raw_buffer_atomic_fmax:
7054 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_fmax:
7055 case Intrinsic::amdgcn_struct_buffer_atomic_fmax:
7056 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_fmax:
7057 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_FMAX;
7058 case Intrinsic::amdgcn_raw_buffer_atomic_sub_clamp_u32:
7059 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_sub_clamp_u32:
7060 case Intrinsic::amdgcn_struct_buffer_atomic_sub_clamp_u32:
7061 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_sub_clamp_u32:
7062 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_SUB_CLAMP_U32;
7063 case Intrinsic::amdgcn_raw_buffer_atomic_cond_sub_u32:
7064 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_cond_sub_u32:
7065 case Intrinsic::amdgcn_struct_buffer_atomic_cond_sub_u32:
7066 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_cond_sub_u32:
7067 return AMDGPU::G_AMDGPU_BUFFER_ATOMIC_COND_SUB_U32;
7250 const unsigned NumDefs =
MI.getNumExplicitDefs();
7251 const unsigned ArgOffset = NumDefs + 1;
7252 bool IsTFE = NumDefs == 2;
7270 VData =
MI.getOperand(NumDefs == 0 ? 1 : 0).getReg();
7274 const bool IsAtomicPacked16Bit =
7275 (BaseOpcode->
BaseOpcode == AMDGPU::IMAGE_ATOMIC_PK_ADD_F16 ||
7276 BaseOpcode->
BaseOpcode == AMDGPU::IMAGE_ATOMIC_PK_ADD_BF16);
7283 const bool GradTyIs16 = GradTy == I16 || GradTy ==
F16;
7284 const bool AddrTyIs16 = AddrTy == I16 || AddrTy ==
F16;
7285 const bool DataTyIs16 =
7286 Ty.getScalarType() == I16 || Ty.getScalarType() ==
F16;
7288 ST.hasG16() ? (BaseOpcode->
Gradients && GradTyIs16) : GradTyIs16;
7289 const bool IsA16 = AddrTyIs16;
7290 const bool IsD16 = !IsAtomicPacked16Bit && DataTyIs16;
7293 if (!BaseOpcode->
Atomic) {
7294 DMask =
MI.getOperand(ArgOffset + Intr->
DMaskIndex).getImm();
7297 }
else if (DMask != 0) {
7299 }
else if (!IsTFE && !BaseOpcode->
Store) {
7301 B.buildUndef(
MI.getOperand(0));
7302 MI.eraseFromParent();
7310 const unsigned StoreOpcode = IsD16 ? AMDGPU::G_AMDGPU_INTRIN_IMAGE_STORE_D16
7311 : AMDGPU::G_AMDGPU_INTRIN_IMAGE_STORE;
7312 const unsigned LoadOpcode = IsD16 ? AMDGPU::G_AMDGPU_INTRIN_IMAGE_LOAD_D16
7313 : AMDGPU::G_AMDGPU_INTRIN_IMAGE_LOAD;
7314 unsigned NewOpcode = LoadOpcode;
7315 if (BaseOpcode->
Store)
7316 NewOpcode = StoreOpcode;
7318 NewOpcode = AMDGPU::G_AMDGPU_INTRIN_IMAGE_LOAD_NORET;
7321 MI.setDesc(
B.getTII().get(NewOpcode));
7325 if (IsTFE && DMask == 0) {
7328 MI.getOperand(ArgOffset + Intr->
DMaskIndex).setImm(DMask);
7331 if (BaseOpcode->
Atomic) {
7336 if (Ty.isVector() && !IsAtomicPacked16Bit)
7343 auto Concat =
B.buildBuildVector(PackedTy, {VData0, VData1});
7344 MI.getOperand(2).setReg(
Concat.getReg(0));
7345 MI.getOperand(3).setReg(AMDGPU::NoRegister);
7349 unsigned CorrectedNumVAddrs = Intr->
NumVAddrs;
7352 if (BaseOpcode->
Gradients && !ST.hasG16() && (IsA16 != IsG16)) {
7358 if (IsA16 && !ST.hasA16()) {
7363 const unsigned NSAMaxSize = ST.getNSAMaxSize(BaseOpcode->
Sampler);
7364 const unsigned HasPartialNSA = ST.hasPartialNSAEncoding();
7366 if (IsA16 || IsG16) {
7374 const bool UseNSA = ST.hasNSAEncoding() &&
7375 PackedRegs.
size() >= ST.getNSAThreshold(MF) &&
7376 (PackedRegs.
size() <= NSAMaxSize || HasPartialNSA);
7377 const bool UsePartialNSA =
7378 UseNSA && HasPartialNSA && PackedRegs.
size() > NSAMaxSize;
7380 if (UsePartialNSA) {
7384 auto Concat =
B.buildConcatVectors(
7385 PackedAddrTy,
ArrayRef(PackedRegs).slice(NSAMaxSize - 1));
7386 PackedRegs[NSAMaxSize - 1] =
Concat.getReg(0);
7387 PackedRegs.
resize(NSAMaxSize);
7388 }
else if (!UseNSA && PackedRegs.
size() > 1) {
7390 auto Concat =
B.buildConcatVectors(PackedAddrTy, PackedRegs);
7391 PackedRegs[0] =
Concat.getReg(0);
7395 const unsigned NumPacked = PackedRegs.
size();
7398 if (!
SrcOp.isReg()) {
7408 SrcOp.setReg(AMDGPU::NoRegister);
7425 const bool UseNSA = ST.hasNSAEncoding() &&
7426 CorrectedNumVAddrs >= ST.getNSAThreshold(MF) &&
7427 (CorrectedNumVAddrs <= NSAMaxSize || HasPartialNSA);
7428 const bool UsePartialNSA =
7429 UseNSA && HasPartialNSA && CorrectedNumVAddrs > NSAMaxSize;
7431 if (UsePartialNSA) {
7433 ArgOffset + Intr->
VAddrStart + NSAMaxSize - 1,
7435 }
else if (!UseNSA && Intr->
NumVAddrs > 1) {
7450 if (!Ty.isVector() || !IsD16)
7454 if (RepackedReg != VData) {
7455 MI.getOperand(1).setReg(RepackedReg);
7463 const int NumElts = Ty.isVector() ? Ty.getNumElements() : 1;
7466 if (NumElts < DMaskLanes)
7469 if (NumElts > 4 || DMaskLanes > 4)
7480 const unsigned AdjustedNumElts = DMaskLanes == 0 ? 1 : DMaskLanes;
7481 const LLT AdjustedTy =
7497 if (IsD16 && ST.hasUnpackedD16VMem()) {
7504 unsigned RoundedElts = (AdjustedTy.
getSizeInBits() + 31) / 32;
7505 unsigned RoundedSize = 32 * RoundedElts;
7509 RegTy = !IsTFE && EltSize == 16 ? V2I16 : I32;
7514 if (!IsTFE && (RoundedTy == Ty || !Ty.
isVector()))
7520 B.setInsertPt(*
MI.getParent(), ++
MI.getIterator());
7524 const LLT LoadResultTy = IsTFE ? TFETy : RoundedTy;
7525 const int ResultNumRegs = LoadResultTy.
getSizeInBits() / 32;
7529 MI.getOperand(0).setReg(NewResultReg);
7537 Dst1Reg =
MI.getOperand(1).getReg();
7538 if (MRI->
getType(Dst1Reg) != I32)
7542 MI.removeOperand(1);
7545 if (!Ty.isVector() && Ty.getSizeInBits() == 32) {
7546 auto Unmerge =
B.buildUnmerge({I32, I32}, NewResultReg);
7547 B.buildBitcast(DstReg, Unmerge.getReg(0));
7548 B.buildCopy(Dst1Reg, Unmerge.getReg(1));
7557 const int NumDataRegs = IsTFE ? ResultNumRegs - 1 : ResultNumRegs;
7559 if (ResultNumRegs == 1) {
7561 ResultRegs[0] = NewResultReg;
7564 for (
int I = 0;
I != NumDataRegs; ++
I)
7566 B.buildUnmerge(ResultRegs, NewResultReg);
7571 ResultRegs.
resize(NumDataRegs);
7576 if (IsD16 && !Ty.isVector()) {
7577 B.buildTrunc(DstReg, ResultRegs[0]);
7582 if ((Ty == V2I16 || Ty ==
V2F16) && NumDataRegs == 1 &&
7583 !ST.hasUnpackedD16VMem()) {
7584 B.buildBitcast(DstReg, ResultRegs[0]);
7596 if (RegTy != V2I16 && !ST.hasUnpackedD16VMem()) {
7598 Reg =
B.buildBitcast(V2I16, Reg).getReg(0);
7599 }
else if (ST.hasUnpackedD16VMem()) {
7601 Reg =
B.buildTrunc(I16, Reg).getReg(0);
7605 auto padWithUndef = [&](
LLT Ty,
int NumElts) {
7609 for (
int I = 0;
I != NumElts; ++
I)
7616 padWithUndef(ResTy, NumElts - ResultRegs.
size());
7617 B.buildBuildVector(DstReg, ResultRegs);
7621 assert(!ST.hasUnpackedD16VMem() && (ResTy == V2I16 || ResTy ==
V2F16));
7622 const int RegsToCover = (Ty.getSizeInBits() + 31) / 32;
7627 if (Ty == V3I16 || Ty == V3F16) {
7629 if (ResultRegs.
size() == 1) {
7630 NewResultReg = ResultRegs[0];
7631 }
else if (ResultRegs.
size() == 2) {
7633 NewResultReg =
B.buildConcatVectors(V4I16, ResultRegs).getReg(0);
7648 B.buildDeleteTrailingVectorElements(ResizeDst, NewResultReg);
7650 B.buildPadVectorWithUndefElements(ResizeDst, NewResultReg);
7652 if (ResizeDst != DstReg)
7653 B.buildBitcast(DstReg, ResizeDst);
7657 padWithUndef(ResTy, RegsToCover - ResultRegs.
size());
7658 B.buildConcatVectors(DstReg, ResultRegs);
8188 case Intrinsic::amdgcn_icmp: {
8199 if (!Src1Const || Src1Const->Value != 0)
8203 int64_t Pred =
MI.getOperand(4).getImm();
8209 B.buildIntrinsic(Intrinsic::amdgcn_ballot, Dst).addUse(Src0);
8210 MI.eraseFromParent();
8213 case Intrinsic::sponentry:
8219 B.buildInstr(AMDGPU::G_AMDGPU_SPONENTRY).addDef(TmpReg);
8222 B.buildIntToPtr(DstReg, TmpReg);
8223 MI.eraseFromParent();
8225 int FI =
B.getMF().getFrameInfo().CreateFixedObject(
8227 B.buildFrameIndex(
MI.getOperand(0), FI);
8228 MI.eraseFromParent();
8231 case Intrinsic::amdgcn_if:
8232 case Intrinsic::amdgcn_else: {
8235 bool Negated =
false;
8247 std::swap(CondBrTarget, UncondBrTarget);
8249 B.setInsertPt(
B.getMBB(), BrCond->getIterator());
8250 if (IntrID == Intrinsic::amdgcn_if) {
8251 B.buildInstr(AMDGPU::SI_IF)
8254 .addMBB(UncondBrTarget);
8256 B.buildInstr(AMDGPU::SI_ELSE)
8259 .addMBB(UncondBrTarget);
8268 B.buildBr(*CondBrTarget);
8273 MI.eraseFromParent();
8274 BrCond->eraseFromParent();
8280 case Intrinsic::amdgcn_loop: {
8283 bool Negated =
false;
8293 std::swap(CondBrTarget, UncondBrTarget);
8295 B.setInsertPt(
B.getMBB(), BrCond->getIterator());
8296 B.buildInstr(AMDGPU::SI_LOOP)
8298 .addMBB(UncondBrTarget);
8303 B.buildBr(*CondBrTarget);
8305 MI.eraseFromParent();
8306 BrCond->eraseFromParent();
8313 case Intrinsic::amdgcn_wave_reduce_min:
8314 case Intrinsic::amdgcn_wave_reduce_umin:
8315 case Intrinsic::amdgcn_wave_reduce_fmin:
8316 case Intrinsic::amdgcn_wave_reduce_max:
8317 case Intrinsic::amdgcn_wave_reduce_umax:
8318 case Intrinsic::amdgcn_wave_reduce_fmax:
8319 case Intrinsic::amdgcn_wave_reduce_add:
8320 case Intrinsic::amdgcn_wave_reduce_fadd:
8321 case Intrinsic::amdgcn_wave_reduce_sub:
8322 case Intrinsic::amdgcn_wave_reduce_fsub:
8323 case Intrinsic::amdgcn_wave_reduce_and:
8324 case Intrinsic::amdgcn_wave_reduce_or:
8325 case Intrinsic::amdgcn_wave_reduce_xor: {
8330 bool IsFPOp = IntrID == Intrinsic::amdgcn_wave_reduce_fmin ||
8331 IntrID == Intrinsic::amdgcn_wave_reduce_fmax ||
8332 IntrID == Intrinsic::amdgcn_wave_reduce_fadd ||
8333 IntrID == Intrinsic::amdgcn_wave_reduce_fsub;
8334 bool NeedsSignExt = IntrID == Intrinsic::amdgcn_wave_reduce_min ||
8335 IntrID == Intrinsic::amdgcn_wave_reduce_max ||
8336 IntrID == Intrinsic::amdgcn_wave_reduce_add ||
8337 IntrID == Intrinsic::amdgcn_wave_reduce_sub;
8338 auto Ext = IsFPOp ?
B.buildFPExt(
F32, SrcReg)
8345 .addUse(Ext.getReg(0))
8346 .addImm(
MI.getOperand(3).getImm());
8348 B.buildFPTrunc(DstReg, NewDst);
8350 B.buildTrunc(DstReg, NewDst);
8351 MI.eraseFromParent();
8354 case Intrinsic::amdgcn_addrspacecast_nonnull:
8356 case Intrinsic::amdgcn_make_buffer_rsrc:
8358 case Intrinsic::amdgcn_kernarg_segment_ptr:
8361 B.buildConstant(
MI.getOperand(0).getReg(), 0);
8362 MI.eraseFromParent();
8368 case Intrinsic::amdgcn_implicitarg_ptr:
8370 case Intrinsic::amdgcn_workitem_id_x:
8373 case Intrinsic::amdgcn_workitem_id_y:
8376 case Intrinsic::amdgcn_workitem_id_z:
8379 case Intrinsic::amdgcn_workgroup_id_x:
8384 case Intrinsic::amdgcn_workgroup_id_y:
8389 case Intrinsic::amdgcn_workgroup_id_z:
8394 case Intrinsic::amdgcn_cluster_id_x:
8395 return ST.hasClusters() &&
8398 case Intrinsic::amdgcn_cluster_id_y:
8399 return ST.hasClusters() &&
8402 case Intrinsic::amdgcn_cluster_id_z:
8403 return ST.hasClusters() &&
8406 case Intrinsic::amdgcn_cluster_workgroup_id_x:
8407 return ST.hasClusters() &&
8410 case Intrinsic::amdgcn_cluster_workgroup_id_y:
8411 return ST.hasClusters() &&
8414 case Intrinsic::amdgcn_cluster_workgroup_id_z:
8415 return ST.hasClusters() &&
8418 case Intrinsic::amdgcn_cluster_workgroup_flat_id:
8419 return ST.hasClusters() &&
8421 case Intrinsic::amdgcn_cluster_workgroup_max_id_x:
8422 return ST.hasClusters() &&
8425 case Intrinsic::amdgcn_cluster_workgroup_max_id_y:
8426 return ST.hasClusters() &&
8429 case Intrinsic::amdgcn_cluster_workgroup_max_id_z:
8430 return ST.hasClusters() &&
8433 case Intrinsic::amdgcn_cluster_workgroup_max_flat_id:
8434 return ST.hasClusters() &&
8438 case Intrinsic::amdgcn_wave_id:
8440 case Intrinsic::amdgcn_lds_kernel_id:
8443 case Intrinsic::amdgcn_dispatch_ptr:
8446 case Intrinsic::amdgcn_queue_ptr:
8449 case Intrinsic::amdgcn_implicit_buffer_ptr:
8452 case Intrinsic::amdgcn_dispatch_id:
8455 case Intrinsic::r600_read_ngroups_x:
8459 case Intrinsic::r600_read_ngroups_y:
8462 case Intrinsic::r600_read_ngroups_z:
8465 case Intrinsic::r600_read_local_size_x:
8468 case Intrinsic::r600_read_local_size_y:
8472 case Intrinsic::r600_read_local_size_z:
8475 case Intrinsic::amdgcn_fdiv_fast:
8477 case Intrinsic::amdgcn_is_shared:
8479 case Intrinsic::amdgcn_is_private:
8481 case Intrinsic::amdgcn_wavefrontsize: {
8482 B.buildConstant(
MI.getOperand(0), ST.getWavefrontSize());
8483 MI.eraseFromParent();
8486 case Intrinsic::amdgcn_s_buffer_load:
8487 case Intrinsic::amdgcn_ptr_s_buffer_load:
8489 case Intrinsic::amdgcn_raw_buffer_store:
8490 case Intrinsic::amdgcn_raw_ptr_buffer_store:
8491 case Intrinsic::amdgcn_struct_buffer_store:
8492 case Intrinsic::amdgcn_struct_ptr_buffer_store:
8494 case Intrinsic::amdgcn_raw_buffer_store_format:
8495 case Intrinsic::amdgcn_raw_ptr_buffer_store_format:
8496 case Intrinsic::amdgcn_struct_buffer_store_format:
8497 case Intrinsic::amdgcn_struct_ptr_buffer_store_format:
8499 case Intrinsic::amdgcn_raw_tbuffer_store:
8500 case Intrinsic::amdgcn_raw_ptr_tbuffer_store:
8501 case Intrinsic::amdgcn_struct_tbuffer_store:
8502 case Intrinsic::amdgcn_struct_ptr_tbuffer_store:
8504 case Intrinsic::amdgcn_raw_buffer_load:
8505 case Intrinsic::amdgcn_raw_ptr_buffer_load:
8506 case Intrinsic::amdgcn_raw_atomic_buffer_load:
8507 case Intrinsic::amdgcn_raw_ptr_atomic_buffer_load:
8508 case Intrinsic::amdgcn_struct_buffer_load:
8509 case Intrinsic::amdgcn_struct_ptr_buffer_load:
8510 case Intrinsic::amdgcn_struct_atomic_buffer_load:
8511 case Intrinsic::amdgcn_struct_ptr_atomic_buffer_load:
8513 case Intrinsic::amdgcn_raw_buffer_load_format:
8514 case Intrinsic::amdgcn_raw_ptr_buffer_load_format:
8515 case Intrinsic::amdgcn_struct_buffer_load_format:
8516 case Intrinsic::amdgcn_struct_ptr_buffer_load_format:
8518 case Intrinsic::amdgcn_raw_tbuffer_load:
8519 case Intrinsic::amdgcn_raw_ptr_tbuffer_load:
8520 case Intrinsic::amdgcn_struct_tbuffer_load:
8521 case Intrinsic::amdgcn_struct_ptr_tbuffer_load:
8523 case Intrinsic::amdgcn_raw_buffer_atomic_swap:
8524 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_swap:
8525 case Intrinsic::amdgcn_struct_buffer_atomic_swap:
8526 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_swap:
8527 case Intrinsic::amdgcn_raw_buffer_atomic_add:
8528 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_add:
8529 case Intrinsic::amdgcn_struct_buffer_atomic_add:
8530 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_add:
8531 case Intrinsic::amdgcn_raw_buffer_atomic_sub:
8532 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_sub:
8533 case Intrinsic::amdgcn_struct_buffer_atomic_sub:
8534 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_sub:
8535 case Intrinsic::amdgcn_raw_buffer_atomic_smin:
8536 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_smin:
8537 case Intrinsic::amdgcn_struct_buffer_atomic_smin:
8538 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_smin:
8539 case Intrinsic::amdgcn_raw_buffer_atomic_umin:
8540 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_umin:
8541 case Intrinsic::amdgcn_struct_buffer_atomic_umin:
8542 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_umin:
8543 case Intrinsic::amdgcn_raw_buffer_atomic_smax:
8544 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_smax:
8545 case Intrinsic::amdgcn_struct_buffer_atomic_smax:
8546 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_smax:
8547 case Intrinsic::amdgcn_raw_buffer_atomic_umax:
8548 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_umax:
8549 case Intrinsic::amdgcn_struct_buffer_atomic_umax:
8550 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_umax:
8551 case Intrinsic::amdgcn_raw_buffer_atomic_and:
8552 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_and:
8553 case Intrinsic::amdgcn_struct_buffer_atomic_and:
8554 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_and:
8555 case Intrinsic::amdgcn_raw_buffer_atomic_or:
8556 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_or:
8557 case Intrinsic::amdgcn_struct_buffer_atomic_or:
8558 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_or:
8559 case Intrinsic::amdgcn_raw_buffer_atomic_xor:
8560 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_xor:
8561 case Intrinsic::amdgcn_struct_buffer_atomic_xor:
8562 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_xor:
8563 case Intrinsic::amdgcn_raw_buffer_atomic_inc:
8564 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_inc:
8565 case Intrinsic::amdgcn_struct_buffer_atomic_inc:
8566 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_inc:
8567 case Intrinsic::amdgcn_raw_buffer_atomic_dec:
8568 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_dec:
8569 case Intrinsic::amdgcn_struct_buffer_atomic_dec:
8570 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_dec:
8571 case Intrinsic::amdgcn_raw_buffer_atomic_cmpswap:
8572 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_cmpswap:
8573 case Intrinsic::amdgcn_struct_buffer_atomic_cmpswap:
8574 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_cmpswap:
8575 case Intrinsic::amdgcn_raw_buffer_atomic_fmin:
8576 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_fmin:
8577 case Intrinsic::amdgcn_struct_buffer_atomic_fmin:
8578 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_fmin:
8579 case Intrinsic::amdgcn_raw_buffer_atomic_fmax:
8580 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_fmax:
8581 case Intrinsic::amdgcn_struct_buffer_atomic_fmax:
8582 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_fmax:
8583 case Intrinsic::amdgcn_raw_buffer_atomic_sub_clamp_u32:
8584 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_sub_clamp_u32:
8585 case Intrinsic::amdgcn_struct_buffer_atomic_sub_clamp_u32:
8586 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_sub_clamp_u32:
8587 case Intrinsic::amdgcn_raw_buffer_atomic_cond_sub_u32:
8588 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_cond_sub_u32:
8589 case Intrinsic::amdgcn_struct_buffer_atomic_cond_sub_u32:
8590 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_cond_sub_u32:
8591 case Intrinsic::amdgcn_raw_buffer_atomic_fadd:
8592 case Intrinsic::amdgcn_raw_ptr_buffer_atomic_fadd:
8593 case Intrinsic::amdgcn_struct_buffer_atomic_fadd:
8594 case Intrinsic::amdgcn_struct_ptr_buffer_atomic_fadd:
8596 case Intrinsic::amdgcn_rsq_clamp:
8598 case Intrinsic::amdgcn_image_bvh_intersect_ray:
8600 case Intrinsic::amdgcn_image_bvh_dual_intersect_ray:
8601 case Intrinsic::amdgcn_image_bvh8_intersect_ray:
8603 case Intrinsic::amdgcn_swmmac_f32_16x16x128_fp8_fp8:
8604 case Intrinsic::amdgcn_swmmac_f32_16x16x128_fp8_bf8:
8605 case Intrinsic::amdgcn_swmmac_f32_16x16x128_bf8_fp8:
8606 case Intrinsic::amdgcn_swmmac_f32_16x16x128_bf8_bf8:
8607 case Intrinsic::amdgcn_swmmac_f16_16x16x128_fp8_fp8:
8608 case Intrinsic::amdgcn_swmmac_f16_16x16x128_fp8_bf8:
8609 case Intrinsic::amdgcn_swmmac_f16_16x16x128_bf8_fp8:
8610 case Intrinsic::amdgcn_swmmac_f16_16x16x128_bf8_bf8: {
8614 if (IndexArgTy != I64) {
8615 auto NewIndex = IndexArgTy.
isVector() ?
B.buildBitcast(I64, Index)
8616 :
B.buildAnyExt(I64, Index);
8617 MI.getOperand(5).setReg(NewIndex.getReg(0));
8621 case Intrinsic::amdgcn_swmmac_f16_16x16x32_f16:
8622 case Intrinsic::amdgcn_swmmac_bf16_16x16x32_bf16:
8623 case Intrinsic::amdgcn_swmmac_f32_16x16x32_bf16:
8624 case Intrinsic::amdgcn_swmmac_f32_16x16x32_f16:
8625 case Intrinsic::amdgcn_swmmac_f32_16x16x32_fp8_fp8:
8626 case Intrinsic::amdgcn_swmmac_f32_16x16x32_fp8_bf8:
8627 case Intrinsic::amdgcn_swmmac_f32_16x16x32_bf8_fp8:
8628 case Intrinsic::amdgcn_swmmac_f32_16x16x32_bf8_bf8: {
8631 if (MRI.
getType(Index) != I32)
8632 MI.getOperand(5).setReg(
B.buildAnyExt(I32, Index).getReg(0));
8635 case Intrinsic::amdgcn_swmmac_f16_16x16x64_f16:
8636 case Intrinsic::amdgcn_swmmac_bf16_16x16x64_bf16:
8637 case Intrinsic::amdgcn_swmmac_f32_16x16x64_bf16:
8638 case Intrinsic::amdgcn_swmmac_bf16f32_16x16x64_bf16:
8639 case Intrinsic::amdgcn_swmmac_f32_16x16x64_f16:
8640 case Intrinsic::amdgcn_swmmac_i32_16x16x128_iu8:
8641 case Intrinsic::amdgcn_swmmac_i32_16x16x32_iu4:
8642 case Intrinsic::amdgcn_swmmac_i32_16x16x32_iu8:
8643 case Intrinsic::amdgcn_swmmac_i32_16x16x64_iu4: {
8645 LLT IdxTy = IntrID == Intrinsic::amdgcn_swmmac_i32_16x16x128_iu8
8649 if (IndexArgTy != IdxTy) {
8650 auto NewIndex = IndexArgTy.
isVector() ?
B.buildBitcast(IdxTy, Index)
8651 :
B.buildAnyExt(IdxTy, Index);
8652 MI.getOperand(7).setReg(NewIndex.getReg(0));
8657 case Intrinsic::amdgcn_fmed3: {
8663 MI.setDesc(
B.getTII().get(AMDGPU::G_AMDGPU_FMED3));
8664 MI.removeOperand(1);
8668 case Intrinsic::amdgcn_readlane:
8669 case Intrinsic::amdgcn_writelane:
8670 case Intrinsic::amdgcn_readfirstlane:
8671 case Intrinsic::amdgcn_permlane16:
8672 case Intrinsic::amdgcn_permlanex16:
8673 case Intrinsic::amdgcn_permlane64:
8674 case Intrinsic::amdgcn_set_inactive:
8675 case Intrinsic::amdgcn_set_inactive_chain_arg:
8676 case Intrinsic::amdgcn_mov_dpp8:
8677 case Intrinsic::amdgcn_update_dpp:
8678 case Intrinsic::amdgcn_permlane_bcast:
8679 case Intrinsic::amdgcn_permlane_up:
8680 case Intrinsic::amdgcn_permlane_down:
8681 case Intrinsic::amdgcn_permlane_xor:
8683 case Intrinsic::amdgcn_s_buffer_prefetch_data:
8685 case Intrinsic::amdgcn_dead: {
8689 MI.eraseFromParent();
8692 case Intrinsic::amdgcn_cooperative_atomic_load_32x4B:
8693 case Intrinsic::amdgcn_cooperative_atomic_load_16x8B:
8694 case Intrinsic::amdgcn_cooperative_atomic_load_8x16B:
8695 assert(
MI.hasOneMemOperand() &&
"Expected IRTranslator to set MemOp!");
8696 B.buildLoad(
MI.getOperand(0),
MI.getOperand(2), **
MI.memoperands_begin());
8697 MI.eraseFromParent();
8699 case Intrinsic::amdgcn_cooperative_atomic_store_32x4B:
8700 case Intrinsic::amdgcn_cooperative_atomic_store_16x8B:
8701 case Intrinsic::amdgcn_cooperative_atomic_store_8x16B:
8702 assert(
MI.hasOneMemOperand() &&
"Expected IRTranslator to set MemOp!");
8703 B.buildStore(
MI.getOperand(2),
MI.getOperand(1), **
MI.memoperands_begin());
8704 MI.eraseFromParent();
8706 case Intrinsic::amdgcn_av_load_b128:
8707 case Intrinsic::amdgcn_av_store_b128: {
8708 assert(
MI.hasOneMemOperand() &&
"Expected IRTranslator to set MemOp!");
8709 if (IntrID == Intrinsic::amdgcn_av_load_b128)
8710 B.buildLoad(
MI.getOperand(0),
MI.getOperand(2), **
MI.memoperands_begin());
8712 B.buildStore(
MI.getOperand(2),
MI.getOperand(1),
8713 **
MI.memoperands_begin());
8714 MI.eraseFromParent();
8717 case Intrinsic::amdgcn_flat_load_monitor_b32:
8718 case Intrinsic::amdgcn_flat_load_monitor_b64:
8719 case Intrinsic::amdgcn_flat_load_monitor_b128:
8720 assert(
MI.hasOneMemOperand() &&
"Expected IRTranslator to set MemOp!");
8721 B.buildInstr(AMDGPU::G_AMDGPU_FLAT_LOAD_MONITOR)
8722 .add(
MI.getOperand(0))
8723 .add(
MI.getOperand(2))
8724 .addMemOperand(*
MI.memoperands_begin());
8725 MI.eraseFromParent();
8727 case Intrinsic::amdgcn_global_load_monitor_b32:
8728 case Intrinsic::amdgcn_global_load_monitor_b64:
8729 case Intrinsic::amdgcn_global_load_monitor_b128:
8730 assert(
MI.hasOneMemOperand() &&
"Expected IRTranslator to set MemOp!");
8731 B.buildInstr(AMDGPU::G_AMDGPU_GLOBAL_LOAD_MONITOR)
8732 .add(
MI.getOperand(0))
8733 .add(
MI.getOperand(2))
8734 .addMemOperand(*
MI.memoperands_begin());
8735 MI.eraseFromParent();