106 TRI->getDefaultVectorSuperClassForBitWidth(32);
112 TRI->getDefaultVectorSuperClassForBitWidth(64);
150 TRI->getDefaultVectorSuperClassForBitWidth(320));
154 TRI->getDefaultVectorSuperClassForBitWidth(352));
158 TRI->getDefaultVectorSuperClassForBitWidth(384));
162 TRI->getDefaultVectorSuperClassForBitWidth(512));
169 TRI->getDefaultVectorSuperClassForBitWidth(1024));
171 if (Subtarget->has16BitInsts()) {
172 if (Subtarget->useRealTrue16Insts()) {
202 TRI->getDefaultVectorSuperClassForBitWidth(1024));
218 {MVT::v2i32, MVT::v3i32, MVT::v4i32, MVT::v5i32,
219 MVT::v6i32, MVT::v7i32, MVT::v8i32, MVT::v9i32,
220 MVT::v10i32, MVT::v11i32, MVT::v12i32, MVT::v16i32,
221 MVT::i1, MVT::v32i32},
225 {MVT::v2i32, MVT::v3i32, MVT::v4i32, MVT::v5i32,
226 MVT::v6i32, MVT::v7i32, MVT::v8i32, MVT::v9i32,
227 MVT::v10i32, MVT::v11i32, MVT::v12i32, MVT::v16i32,
228 MVT::i1, MVT::v32i32},
246 if (Subtarget->hasBF16PackedInsts()) {
310 {MVT::f32, MVT::i32, MVT::i64, MVT::f64, MVT::i1},
Expand);
317 {MVT::v2i32, MVT::v3i32, MVT::v4i32, MVT::v5i32,
318 MVT::v6i32, MVT::v7i32, MVT::v8i32, MVT::v9i32,
319 MVT::v10i32, MVT::v11i32, MVT::v12i32, MVT::v16i32},
322 {MVT::v2f32, MVT::v3f32, MVT::v4f32, MVT::v5f32,
323 MVT::v6f32, MVT::v7f32, MVT::v8f32, MVT::v9f32,
324 MVT::v10f32, MVT::v11f32, MVT::v12f32, MVT::v16f32},
328 {MVT::v2i1, MVT::v4i1, MVT::v2i8, MVT::v4i8, MVT::v2i16,
329 MVT::v3i16, MVT::v4i16, MVT::Other},
334 {MVT::i1, MVT::i32, MVT::i64, MVT::f32, MVT::f64},
Expand);
350 {MVT::v8i32, MVT::v8f32, MVT::v9i32, MVT::v9f32, MVT::v10i32,
351 MVT::v10f32, MVT::v11i32, MVT::v11f32, MVT::v12i32, MVT::v12f32,
352 MVT::v16i32, MVT::v16f32, MVT::v2i64, MVT::v2f64, MVT::v4i16,
353 MVT::v4f16, MVT::v4bf16, MVT::v3i64, MVT::v3f64, MVT::v6i32,
354 MVT::v6f32, MVT::v4i64, MVT::v4f64, MVT::v8i64, MVT::v8f64,
355 MVT::v8i16, MVT::v8f16, MVT::v8bf16, MVT::v16i16, MVT::v16f16,
356 MVT::v16bf16, MVT::v16i64, MVT::v16f64, MVT::v32i32, MVT::v32f32,
357 MVT::v32i16, MVT::v32f16, MVT::v32bf16}) {
390 for (
MVT Vec64 : {MVT::v2i64, MVT::v2f64}) {
404 for (
MVT Vec64 : {MVT::v3i64, MVT::v3f64}) {
418 for (
MVT Vec64 : {MVT::v4i64, MVT::v4f64}) {
432 for (
MVT Vec64 : {MVT::v8i64, MVT::v8f64}) {
446 for (
MVT Vec64 : {MVT::v16i64, MVT::v16f64}) {
461 {MVT::v4i32, MVT::v4f32, MVT::v8i32, MVT::v8f32,
462 MVT::v16i32, MVT::v16f32, MVT::v32i32, MVT::v32f32},
465 if (Subtarget->hasPkMovB32()) {
486 {MVT::v2i16, MVT::v2f16, MVT::v2bf16, MVT::v2i8, MVT::v4i8,
487 MVT::v8i8, MVT::v4i16, MVT::v4f16, MVT::v4bf16},
492 {MVT::v3i32, MVT::v3f32, MVT::v4i32, MVT::v4f32},
Custom);
496 {MVT::v5i32, MVT::v5f32, MVT::v6i32, MVT::v6f32,
497 MVT::v7i32, MVT::v7f32, MVT::v8i32, MVT::v8f32,
498 MVT::v9i32, MVT::v9f32, MVT::v10i32, MVT::v10f32,
499 MVT::v11i32, MVT::v11f32, MVT::v12i32, MVT::v12f32},
523 if (Subtarget->hasSMemRealTime() ||
528 if (Subtarget->has16BitInsts()) {
538 if (Subtarget->hasMadMacF32Insts())
556 if (Subtarget->hasIntClamp())
559 if (Subtarget->hasAddNoCarryInsts())
565 {MVT::f32, MVT::f64},
Custom);
571 {MVT::f32, MVT::f64},
Legal);
573 if (Subtarget->haveRoundOpsF64())
603 if (Subtarget->has16BitInsts()) {
657 if (Subtarget->hasBF16TransInsts())
673 {MVT::v2i16, MVT::v2f16, MVT::v2bf16, MVT::v4i16, MVT::v4f16,
674 MVT::v4bf16, MVT::v8i16, MVT::v8f16, MVT::v8bf16, MVT::v16i16,
675 MVT::v16f16, MVT::v16bf16, MVT::v32i16, MVT::v32f16}) {
708 if (Subtarget->hasVCvtPkIU16F32())
711 {MVT::v2i16, MVT::v4i16, MVT::v8i16, MVT::v16i16, MVT::v32i16},
718 {MVT::v2i16, MVT::v2f16, MVT::v2bf16},
Legal);
838 {MVT::v2f16, MVT::v2bf16, MVT::v4f16, MVT::v4bf16,
839 MVT::v8f16, MVT::v8bf16, MVT::v16f16, MVT::v16bf16,
840 MVT::v32f16, MVT::v32bf16},
850 {MVT::v4f16, MVT::v8f16, MVT::v16f16, MVT::v32f16},
854 {MVT::v4f16, MVT::v8f16, MVT::v16f16, MVT::v32f16},
858 {MVT::v8i16, MVT::v8f16, MVT::v8bf16, MVT::v16i16, MVT::v16f16,
859 MVT::v16bf16, MVT::v32i16, MVT::v32f16, MVT::v32bf16}) {
867 if (Subtarget->hasVOP3PInsts()) {
879 {MVT::v2i16, MVT::v2f16, MVT::v2bf16},
Custom);
882 {MVT::v4f16, MVT::v4i16, MVT::v4bf16, MVT::v8f16,
883 MVT::v8i16, MVT::v8bf16, MVT::v16f16, MVT::v16i16,
884 MVT::v16bf16, MVT::v32f16, MVT::v32i16, MVT::v32bf16},
887 for (
MVT VT : {MVT::v4i16, MVT::v8i16, MVT::v16i16, MVT::v32i16})
895 for (
MVT VT : {MVT::v4f16, MVT::v8f16, MVT::v16f16, MVT::v32f16})
903 {MVT::v2f16, MVT::v4f16},
Custom);
909 if (Subtarget->hasBF16PackedInsts()) {
914 for (
MVT VT : {MVT::v4bf16, MVT::v8bf16, MVT::v16bf16, MVT::v32bf16})
921 if (Subtarget->hasAnyPackedFP32Ops()) {
925 {MVT::v4f32, MVT::v8f32, MVT::v16f32, MVT::v32f32},
928 if (Subtarget->hasAnyPackedFP64Ops()) {
940 {MVT::v4f64, MVT::v8f64, MVT::v16f64, MVT::v32f64},
Custom);
943 if (Subtarget->hasAnyPackedU64Ops()) {
947 {MVT::v4i64, MVT::v8i64, MVT::v16i64, MVT::v32i64},
954 if (Subtarget->has16BitInsts()) {
969 {MVT::v4i16, MVT::v4f16, MVT::v4bf16, MVT::v2i8, MVT::v4i8,
970 MVT::v8i8, MVT::v8i16, MVT::v8f16, MVT::v8bf16,
971 MVT::v16i16, MVT::v16f16, MVT::v16bf16, MVT::v32i16,
972 MVT::v32f16, MVT::v32bf16},
977 if (Subtarget->hasVMulU64Inst())
979 else if (Subtarget->hasScalarSMulU64())
982 if (Subtarget->hasMad64_32())
985 if (Subtarget->hasSafeSmemPrefetch() || Subtarget->hasVmemPrefInsts())
988 if (Subtarget->hasIEEEMinimumMaximumInsts()) {
990 {MVT::f16, MVT::f32, MVT::f64, MVT::v2f16},
Legal);
993 if (Subtarget->hasMinimum3Maximum3F32())
996 if (Subtarget->hasMinimum3Maximum3PKF16()) {
1000 if (!Subtarget->hasMinimum3Maximum3F16())
1006 if (Subtarget->hasVOP3PInsts()) {
1009 {MVT::v4f16, MVT::v8f16, MVT::v16f16, MVT::v32f16},
1013 if (Subtarget->hasMinMaxI64Insts())
1018 {MVT::Other, MVT::f32, MVT::v4f32, MVT::i16, MVT::f16,
1019 MVT::bf16, MVT::v2i16, MVT::v2f16, MVT::v2bf16, MVT::i128,
1024 {MVT::v2f16, MVT::v2i16, MVT::v2bf16, MVT::v3f16,
1025 MVT::v3i16, MVT::v4f16, MVT::v4i16, MVT::v4bf16,
1026 MVT::v8i16, MVT::v8f16, MVT::v8bf16, MVT::Other, MVT::f16,
1027 MVT::i16, MVT::bf16, MVT::i8, MVT::i128},
1031 {MVT::Other, MVT::v2i16, MVT::v2f16, MVT::v2bf16,
1032 MVT::v3i16, MVT::v3f16, MVT::v4f16, MVT::v4i16,
1033 MVT::v4bf16, MVT::v8i16, MVT::v8f16, MVT::v8bf16,
1034 MVT::f16, MVT::i16, MVT::bf16, MVT::i8, MVT::i128},
1049 if (Subtarget->hasBF16ConversionInsts()) {
1051 {MVT::bf16, MVT::v2bf16},
Custom);
1055 if (Subtarget->hasBF16TransInsts()) {
1059 const bool HasE5M3ConversionInsts =
1060 Subtarget->hasFP8ConversionInsts() && Subtarget->hasFP8E5M3Insts();
1061 if (Subtarget->hasOCPFP8ConversionInsts() || HasE5M3ConversionInsts) {
1072 if (Subtarget->hasFP8F16ConversionInsts()) {
1077 if (Subtarget->hasCvtPkF16F32Inst()) {
1079 {MVT::v2f16, MVT::v4f16, MVT::v8f16, MVT::v16f16},
1130 if (Subtarget->has16BitInsts() && !Subtarget->hasMed3_16())
1441 unsigned IntrID)
const {
1443 if (CI.
hasMetadata(LLVMContext::MD_invariant_load))
1457 bool IsSPrefetch = IntrID == Intrinsic::amdgcn_s_buffer_prefetch_data;
1471 if (RsrcIntr->IsImage) {
1486 Info.ptrVal = RsrcArg;
1490 if (RsrcIntr->IsImage) {
1491 unsigned MaxNumLanes = 4;
1506 std::numeric_limits<unsigned>::max());
1516 if (RsrcIntr->IsImage) {
1536 if ((RsrcIntr->IsImage && BaseOpcode->
NoReturn) || IsSPrefetch) {
1538 Info.memVT = MVT::i32;
1545 case Intrinsic::amdgcn_raw_buffer_load_lds:
1546 case Intrinsic::amdgcn_raw_buffer_load_async_lds:
1547 case Intrinsic::amdgcn_raw_ptr_buffer_load_lds:
1548 case Intrinsic::amdgcn_raw_ptr_buffer_load_async_lds:
1549 case Intrinsic::amdgcn_struct_buffer_load_lds:
1550 case Intrinsic::amdgcn_struct_buffer_load_async_lds:
1551 case Intrinsic::amdgcn_struct_ptr_buffer_load_lds:
1552 case Intrinsic::amdgcn_struct_ptr_buffer_load_async_lds: {
1566 CI.
getContext(), Width * 8 * Subtarget->getWavefrontSize());
1575 case Intrinsic::amdgcn_raw_atomic_buffer_load:
1576 case Intrinsic::amdgcn_raw_ptr_atomic_buffer_load:
1577 case Intrinsic::amdgcn_struct_atomic_buffer_load:
1578 case Intrinsic::amdgcn_struct_ptr_atomic_buffer_load: {
1581 std::numeric_limits<unsigned>::max());
1594 case Intrinsic::amdgcn_ds_ordered_add:
1595 case Intrinsic::amdgcn_ds_ordered_swap: {
1609 case Intrinsic::amdgcn_ds_add_gs_reg_rtn:
1610 case Intrinsic::amdgcn_ds_sub_gs_reg_rtn: {
1613 Info.ptrVal =
nullptr;
1619 case Intrinsic::amdgcn_ds_append:
1620 case Intrinsic::amdgcn_ds_consume: {
1634 case Intrinsic::amdgcn_ds_atomic_async_barrier_arrive_b64:
1635 case Intrinsic::amdgcn_ds_atomic_barrier_arrive_rtn_b64: {
1636 Info.opc = (IntrID == Intrinsic::amdgcn_ds_atomic_barrier_arrive_rtn_b64)
1641 Info.memVT = MVT::i64;
1649 case Intrinsic::amdgcn_image_bvh_dual_intersect_ray:
1650 case Intrinsic::amdgcn_image_bvh_intersect_ray:
1651 case Intrinsic::amdgcn_image_bvh8_intersect_ray: {
1654 MVT::getVT(IntrID == Intrinsic::amdgcn_image_bvh_intersect_ray
1657 ->getElementType(0));
1666 case Intrinsic::amdgcn_global_atomic_fmin_num:
1667 case Intrinsic::amdgcn_global_atomic_fmax_num:
1668 case Intrinsic::amdgcn_global_atomic_ordered_add_b64:
1669 case Intrinsic::amdgcn_flat_atomic_fmin_num:
1670 case Intrinsic::amdgcn_flat_atomic_fmax_num: {
1681 case Intrinsic::amdgcn_cluster_load_b32:
1682 case Intrinsic::amdgcn_cluster_load_b64:
1683 case Intrinsic::amdgcn_cluster_load_b128:
1684 case Intrinsic::amdgcn_ds_load_tr6_b96:
1685 case Intrinsic::amdgcn_ds_load_tr4_b64:
1686 case Intrinsic::amdgcn_ds_load_tr8_b64:
1687 case Intrinsic::amdgcn_ds_load_tr16_b128:
1688 case Intrinsic::amdgcn_global_load_tr6_b96:
1689 case Intrinsic::amdgcn_global_load_tr4_b64:
1690 case Intrinsic::amdgcn_global_load_tr_b64:
1691 case Intrinsic::amdgcn_global_load_tr_b128:
1692 case Intrinsic::amdgcn_ds_read_tr4_b64:
1693 case Intrinsic::amdgcn_ds_read_tr6_b96:
1694 case Intrinsic::amdgcn_ds_read_tr8_b64:
1695 case Intrinsic::amdgcn_ds_read_tr16_b64: {
1704 case Intrinsic::amdgcn_flat_load_monitor_b32:
1705 case Intrinsic::amdgcn_flat_load_monitor_b64:
1706 case Intrinsic::amdgcn_flat_load_monitor_b128:
1707 case Intrinsic::amdgcn_global_load_monitor_b32:
1708 case Intrinsic::amdgcn_global_load_monitor_b64:
1709 case Intrinsic::amdgcn_global_load_monitor_b128: {
1720 case Intrinsic::amdgcn_cooperative_atomic_load_32x4B:
1721 case Intrinsic::amdgcn_cooperative_atomic_load_16x8B:
1722 case Intrinsic::amdgcn_cooperative_atomic_load_8x16B: {
1733 case Intrinsic::amdgcn_cooperative_atomic_store_32x4B:
1734 case Intrinsic::amdgcn_cooperative_atomic_store_16x8B:
1735 case Intrinsic::amdgcn_cooperative_atomic_store_8x16B: {
1746 case Intrinsic::amdgcn_ds_gws_init:
1747 case Intrinsic::amdgcn_ds_gws_barrier:
1748 case Intrinsic::amdgcn_ds_gws_sema_v:
1749 case Intrinsic::amdgcn_ds_gws_sema_br:
1750 case Intrinsic::amdgcn_ds_gws_sema_p:
1751 case Intrinsic::amdgcn_ds_gws_sema_release_all: {
1761 Info.memVT = MVT::i32;
1763 Info.align =
Align(4);
1765 if (IntrID == Intrinsic::amdgcn_ds_gws_barrier)
1772 case Intrinsic::amdgcn_global_load_async_to_lds_b8:
1773 case Intrinsic::amdgcn_global_load_async_to_lds_b32:
1774 case Intrinsic::amdgcn_global_load_async_to_lds_b64:
1775 case Intrinsic::amdgcn_global_load_async_to_lds_b128:
1776 case Intrinsic::amdgcn_cluster_load_async_to_lds_b8:
1777 case Intrinsic::amdgcn_cluster_load_async_to_lds_b32:
1778 case Intrinsic::amdgcn_cluster_load_async_to_lds_b64:
1779 case Intrinsic::amdgcn_cluster_load_async_to_lds_b128: {
1794 case Intrinsic::amdgcn_global_store_async_from_lds_b8:
1795 case Intrinsic::amdgcn_global_store_async_from_lds_b32:
1796 case Intrinsic::amdgcn_global_store_async_from_lds_b64:
1797 case Intrinsic::amdgcn_global_store_async_from_lds_b128: {
1812 case Intrinsic::amdgcn_av_load_b128:
1813 case Intrinsic::amdgcn_av_store_b128: {
1814 bool IsStore = IntrID == Intrinsic::amdgcn_av_store_b128;
1816 Info.memVT = MVT::v4i32;
1818 Info.align =
Align(16);
1826 unsigned ScopeIdx = CI.
arg_size() - 1;
1830 Info.ssid = Ctx.getOrInsertSyncScopeID(Scope);
1834 case Intrinsic::amdgcn_load_to_lds:
1835 case Intrinsic::amdgcn_load_async_to_lds:
1836 case Intrinsic::amdgcn_global_load_lds:
1837 case Intrinsic::amdgcn_global_load_async_lds: {
1856 Width * 8 * Subtarget->getWavefrontSize());
1862 case Intrinsic::amdgcn_ds_bvh_stack_rtn:
1863 case Intrinsic::amdgcn_ds_bvh_stack_push4_pop1_rtn:
1864 case Intrinsic::amdgcn_ds_bvh_stack_push8_pop1_rtn:
1865 case Intrinsic::amdgcn_ds_bvh_stack_push8_pop2_rtn: {
1875 Info.memVT = MVT::i32;
1877 Info.align =
Align(4);
1883 case Intrinsic::amdgcn_s_prefetch_data:
1884 case Intrinsic::amdgcn_s_prefetch_inst:
1885 case Intrinsic::amdgcn_flat_prefetch:
1886 case Intrinsic::amdgcn_global_prefetch: {
3470 bool IsError =
false;
3474 Fn,
"unsupported non-compute shaders with HSA",
DL.getDebugLoc()));
3492 !Info->hasLDSKernelId() && !Info->hasWorkItemIDX() &&
3493 !Info->hasWorkItemIDY() && !Info->hasWorkItemIDZ());
3495 if (!Subtarget->hasFlatScratchEnabled())
3500 !Subtarget->hasArchitectedSGPRs())
3501 assert(!Info->hasWorkGroupIDX() && !Info->hasWorkGroupIDY() &&
3502 !Info->hasWorkGroupIDZ());
3505 bool IsWholeWaveFunc = Info->isWholeWaveFunction();
3523 if ((Info->getPSInputAddr() & 0x7F) == 0 ||
3524 ((Info->getPSInputAddr() & 0xF) == 0 && Info->isPSInputAllocated(11))) {
3527 Info->markPSInputAllocated(0);
3528 Info->markPSInputEnabled(0);
3530 if (Subtarget->isAmdPalOS()) {
3539 unsigned PsInputBits = Info->getPSInputAddr() & Info->getPSInputEnable();
3540 if ((PsInputBits & 0x7F) == 0 ||
3541 ((PsInputBits & 0xF) == 0 && (PsInputBits >> 11 & 1)))
3544 }
else if (IsKernel) {
3545 assert(Info->hasWorkGroupIDX() && Info->hasWorkItemIDX());
3557 if (IsKernel && Subtarget->hasKernargPreload())
3561 }
else if (!IsGraphics) {
3566 if (!Subtarget->hasFlatScratchEnabled())
3578 Info->setNumWaveDispatchSGPRs(
3580 Info->setNumWaveDispatchVGPRs(
3582 }
else if (Info->getNumKernargPreloadedSGPRs()) {
3583 Info->setNumWaveDispatchSGPRs(Info->getNumUserSGPRs());
3588 if (IsWholeWaveFunc) {
3590 {MVT::i1, MVT::Other}, Chain);
3602 for (
unsigned i = IsWholeWaveFunc ? 1 : 0, e = Ins.
size(), ArgIdx = 0; i != e;
3613 if (IsEntryFunc && VA.
isMemLoc()) {
3636 if (Arg.
isOrigArg() && Info->getArgInfo().PreloadKernArgs.count(i)) {
3640 int64_t OffsetDiff =
Offset - AlignDownOffset;
3647 Info->getArgInfo().PreloadKernArgs.find(i)->getSecond().Regs[0];
3650 Register VReg = MRI.getLiveInVirtReg(Reg);
3658 NewArg = convertArgType(DAG, VT, MemVT,
DL, ArgVal,
3659 Ins[i].Flags.isSExt(), &Ins[i]);
3667 Info->getArgInfo().PreloadKernArgs.find(i)->getSecond().Regs;
3670 if (PreloadRegs.
size() == 1) {
3671 Register VReg = MRI.getLiveInVirtReg(PreloadRegs[0]);
3676 TRI->getRegSizeInBits(*RC)));
3684 for (
auto Reg : PreloadRegs) {
3685 Register VReg = MRI.getLiveInVirtReg(Reg);
3691 PreloadRegs.size()),
3708 NewArg = convertArgType(DAG, VT, MemVT,
DL, NewArg,
3709 Ins[i].Flags.isSExt(), &Ins[i]);
3721 "hidden argument in kernel signature was not preloaded",
3727 lowerKernargMemParameter(DAG, VT, MemVT,
DL, Chain,
Offset,
3728 Alignment, Ins[i].Flags.isSExt(), &Ins[i]);
3748 if (!IsEntryFunc && VA.
isMemLoc()) {
3749 SDValue Val = lowerStackParameter(DAG, VA,
DL, Chain, Arg);
3760 if (AMDGPU::VGPR_32RegClass.
contains(Reg))
3761 RC = &AMDGPU::VGPR_32RegClass;
3762 else if (AMDGPU::SGPR_32RegClass.
contains(Reg))
3763 RC = &AMDGPU::SGPR_32RegClass;
3769 if (Arg.
Flags.
isInReg() && RC == &AMDGPU::VGPR_32RegClass) {
3775 ReadFirstLane, Val);
3784 Val = convertABITypeToValueType(DAG, Val, VA,
DL);
3793 Info->setBytesInStackArgArea(StackArgSize);
3795 return Chains.
empty() ? Chain
4298 bool UsesDynamicVGPRs =
false;
4299 if (IsChainCallConv) {
4304 auto RequestedExecIt =
4306 return Arg.OrigArgIndex == 2;
4308 assert(RequestedExecIt != CLI.
Outs.end() &&
"No node for EXEC");
4310 size_t SpecialArgsBeginIdx = RequestedExecIt - CLI.
Outs.begin();
4313 CLI.
Outs.erase(RequestedExecIt, CLI.
Outs.end());
4316 "Haven't popped all the special args");
4319 CLI.
Args[ChainCallArgIdx::Exec];
4320 if (!RequestedExecArg.
Ty->
isIntegerTy(Subtarget->getWavefrontSize()))
4328 ArgNode->getAPIntValue(),
DL, ArgNode->getValueType(0)));
4330 ChainCallSpecialArgs.
push_back(Arg.Node);
4333 PushNodeOrTargetConstant(RequestedExecArg);
4339 if (FlagsValue.
isZero()) {
4340 if (CLI.
Args.size() > ChainCallArgIdx::Flags + 1)
4342 "no additional args allowed if flags == 0");
4344 if (CLI.
Args.size() != ChainCallArgIdx::FallbackCallee + 1) {
4348 if (!Subtarget->isWave32()) {
4350 CLI, InVals,
"dynamic VGPR mode is only supported for wave32");
4353 UsesDynamicVGPRs =
true;
4354 std::for_each(CLI.
Args.begin() + ChainCallArgIdx::NumVGPRs,
4355 CLI.
Args.end(), PushNodeOrTargetConstant);
4364 bool IsSibCall =
false;
4378 "unsupported call to variadic function ");
4386 "unsupported required tail call to function ");
4391 Outs, OutVals, Ins, DAG);
4395 "site marked musttail or on llvm.amdgcn.cs.chain");
4402 if (!TailCallOpt && IsTailCall)
4426 if (!Subtarget->hasFlatScratchEnabled())
4447 auto *
TRI = Subtarget->getRegisterInfo();
4454 if (!IsSibCall || IsChainCallConv) {
4455 if (!Subtarget->hasFlatScratchEnabled()) {
4461 RegsToPass.emplace_back(IsChainCallConv
4462 ? AMDGPU::SGPR48_SGPR49_SGPR50_SGPR51
4463 : AMDGPU::SGPR0_SGPR1_SGPR2_SGPR3,
4470 const unsigned NumSpecialInputs = RegsToPass.size();
4472 MVT PtrVT = MVT::i32;
4475 for (
unsigned i = 0, e = ArgLocs.
size(); i != e; ++i) {
4503 RegsToPass.push_back(std::pair(VA.
getLocReg(), Arg));
4511 int32_t
Offset = LocMemOffset;
4518 unsigned OpSize = Flags.isByVal() ? Flags.getByValSize()
4524 ? Flags.getNonZeroByValAlign()
4551 if (Outs[i].Flags.isByVal()) {
4553 DAG.
getConstant(Outs[i].Flags.getByValSize(),
DL, MVT::i32);
4556 Outs[i].Flags.getNonZeroByValAlign(),
4557 Outs[i].Flags.getNonZeroByValAlign(),
4559 nullptr, std::nullopt, DstInfo,
4565 DAG.
getStore(Chain,
DL, Arg, DstAddr, DstInfo, Alignment);
4571 if (!MemOpChains.
empty())
4587 unsigned ArgIdx = 0;
4588 for (
auto [Reg, Val] : RegsToPass) {
4589 if (ArgIdx++ >= NumSpecialInputs &&
4590 (IsChainCallConv || !Val->
isDivergent()) &&
TRI->isSGPRPhysReg(Reg)) {
4616 if (IsTailCall && !IsSibCall) {
4621 std::vector<SDValue>
Ops({Chain});
4627 Ops.push_back(Callee);
4644 Ops.push_back(Callee);
4655 if (IsChainCallConv)
4660 for (
auto &[Reg, Val] : RegsToPass)
4664 const uint32_t *Mask =
TRI->getCallPreservedMask(MF, CallConv);
4665 assert(Mask &&
"Missing call preserved mask for calling convention");
4675 MVT::Glue, GlueOps),
4680 Ops.push_back(InGlue);
4686 unsigned OPC = AMDGPUISD::TC_RETURN;
4689 OPC = AMDGPUISD::TC_RETURN_GFX;
4693 OPC = UsesDynamicVGPRs ? AMDGPUISD::TC_RETURN_CHAIN_DVGPR
4694 : AMDGPUISD::TC_RETURN_CHAIN;
4700 if (Info->isWholeWaveFunction())
4701 OPC = AMDGPUISD::TC_RETURN_GFX_WholeWave;
4708 Chain =
Call.getValue(0);
4709 InGlue =
Call.getValue(1);
4711 uint64_t CalleePopBytes = NumBytes;
5930 unsigned Stratergy =
static_cast<unsigned>(
MI.getOperand(2).
getImm());
5931 enum WAVE_REDUCE_STRATEGY :
unsigned {
DEFAULT = 0, ITERATIVE = 1,
DPP = 2 };
5933 unsigned MIOpc =
MI.getOpcode();
5947 case AMDGPU::S_MIN_U32:
5948 case AMDGPU::S_MIN_I32:
5949 case AMDGPU::V_MIN_F32_e64:
5950 case AMDGPU::S_MAX_U32:
5951 case AMDGPU::S_MAX_I32:
5952 case AMDGPU::V_MAX_F32_e64:
5953 case AMDGPU::S_AND_B32:
5954 case AMDGPU::S_OR_B32: {
5960 case AMDGPU::V_CMP_LT_U64_e64:
5961 case AMDGPU::V_CMP_LT_I64_e64:
5962 case AMDGPU::V_CMP_GT_U64_e64:
5963 case AMDGPU::V_CMP_GT_I64_e64:
5964 case AMDGPU::V_MIN_F64_e64:
5965 case AMDGPU::V_MIN_NUM_F64_e64:
5966 case AMDGPU::V_MAX_F64_e64:
5967 case AMDGPU::V_MAX_NUM_F64_e64:
5968 case AMDGPU::S_AND_B64:
5969 case AMDGPU::S_OR_B64: {
5975 case AMDGPU::S_XOR_B32:
5976 case AMDGPU::S_XOR_B64:
5977 case AMDGPU::S_ADD_I32:
5978 case AMDGPU::S_ADD_U64_PSEUDO:
5979 case AMDGPU::V_ADD_F32_e64:
5980 case AMDGPU::V_ADD_F64_e64:
5981 case AMDGPU::V_ADD_F64_pseudo_e64:
5982 case AMDGPU::S_SUB_I32:
5983 case AMDGPU::S_SUB_U64_PSEUDO:
5984 case AMDGPU::V_SUB_F32_e64: {
5991 bool IsWave32 = ST.isWave32();
5992 unsigned MovOpc = IsWave32 ? AMDGPU::S_MOV_B32 : AMDGPU::S_MOV_B64;
5993 MCRegister ExecReg = IsWave32 ? AMDGPU::EXEC_LO : AMDGPU::EXEC;
5994 unsigned BitCountOpc =
5995 IsWave32 ? AMDGPU::S_BCNT1_I32_B32 : AMDGPU::S_BCNT1_I32_B64;
5999 auto NewAccumulator =
6004 case AMDGPU::S_XOR_B32:
6005 case AMDGPU::S_XOR_B64: {
6014 .
addReg(NewAccumulator->getOperand(0).getReg())
6017 if (
Opc == AMDGPU::S_XOR_B32) {
6034 BuildRegSequence(BB,
MI, DstReg, DestSub0, DestSub1);
6038 case AMDGPU::S_SUB_I32: {
6047 .
addReg(NewAccumulator->getOperand(0).getReg());
6050 case AMDGPU::S_ADD_I32: {
6053 .
addReg(NewAccumulator->getOperand(0).getReg());
6056 case AMDGPU::S_ADD_U64_PSEUDO:
6057 case AMDGPU::S_SUB_U64_PSEUDO: {
6073 if (
Opc == AMDGPU::S_SUB_U64_PSEUDO) {
6076 .
addReg(NewAccumulator->getOperand(0).getReg())
6086 Register LowOpcode =
Opc == AMDGPU::S_SUB_U64_PSEUDO
6088 : NewAccumulator->getOperand(0).getReg();
6092 if (ST.hasScalarMulHiInsts()) {
6103 BuildMI(BB,
MI,
DL,
TII->get(AMDGPU::V_MUL_HI_U32_e64), VCarryReg)
6106 BuildMI(BB,
MI,
DL,
TII->get(AMDGPU::V_READFIRSTLANE_B32), CarryReg)
6113 Register HiVal =
Opc == AMDGPU::S_SUB_U64_PSEUDO ? AddReg : DestSub1;
6119 if (
Opc == AMDGPU::S_SUB_U64_PSEUDO) {
6125 BuildRegSequence(BB,
MI, DstReg, DestSub0, DestSub1);
6128 case AMDGPU::V_ADD_F32_e64:
6129 case AMDGPU::V_ADD_F64_e64:
6130 case AMDGPU::V_ADD_F64_pseudo_e64:
6131 case AMDGPU::V_SUB_F32_e64: {
6138 TII->get(is32BitOpc ? AMDGPU::V_CVT_F32_I32_e64
6139 : AMDGPU::V_CVT_F64_I32_e64),
6141 .
addReg(NewAccumulator->getOperand(0).getReg())
6146 unsigned srcMod = (MIOpc == AMDGPU::WAVE_REDUCE_FSUB_PSEUDO_F32 ||
6147 MIOpc == AMDGPU::WAVE_REDUCE_FSUB_PSEUDO_F64)
6150 unsigned MulOpc = is32BitOpc ? AMDGPU::V_MUL_F32_e64
6152 ? AMDGPU::V_MUL_F64_pseudo_e64
6153 : AMDGPU::V_MUL_F64_e64;
6163 BuildMI(BB,
MI,
DL,
TII->get(AMDGPU::V_READFIRSTLANE_B32), DstReg)
6180 BuildRegSequence(BB,
MI, DstReg, LaneValueLoReg, LaneValueHiReg);
6192 bool NeedsMovDPP = !is32BitOpc;
6197 bool IsWave32 = ST.isWave32();
6198 unsigned MovOpcForExec = IsWave32 ? AMDGPU::S_MOV_B32 : AMDGPU::S_MOV_B64;
6199 unsigned ExecReg = IsWave32 ? AMDGPU::EXEC_LO : AMDGPU::EXEC;
6200 if (Stratergy == WAVE_REDUCE_STRATEGY::ITERATIVE ||
6226 MI.getOpcode() == AMDGPU::WAVE_REDUCE_FSUB_PSEUDO_F64
6230 TII->get(is32BitOpc ? AMDGPU::S_MOV_B32
6231 : AMDGPU::S_MOV_B64_IMM_PSEUDO),
6240 I = ComputeLoop->begin();
6242 BuildMI(*ComputeLoop,
I,
DL,
TII->get(AMDGPU::PHI), AccumulatorReg)
6246 BuildMI(*ComputeLoop,
I,
DL,
TII->get(AMDGPU::PHI), ActiveBitsReg)
6250 I = ComputeLoop->end();
6254 IsWave32 ? AMDGPU::S_FF1_I32_B32 : AMDGPU::S_FF1_I32_B64;
6259 bool hasSrc0Modifier = AMDGPU::getNamedOperandIdx(
6260 Opc, AMDGPU::OpName::src0_modifiers) != -1;
6261 bool hasSrc1Modifier = AMDGPU::getNamedOperandIdx(
6262 Opc, AMDGPU::OpName::src1_modifiers) != -1;
6264 AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::clamp) != -1;
6266 AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::op_sel) != -1;
6268 AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::omod) != -1;
6269 BuildMI(*ComputeLoop,
I,
DL,
TII->get(AMDGPU::V_READLANE_B32),
6273 if (ST.getInstrInfo()->isVALU(
Opc,
true)) {
6277 BuildMI(*ComputeLoop,
I,
DL,
TII->get(AMDGPU::COPY), LaneValVgpr)
6279 OpDstReg = VgprResultReg;
6280 LaneValueReg = LaneValVgpr;
6283 if (hasSrc0Modifier)
6285 OpInstr.addReg(AccumulatorReg);
6286 if (hasSrc1Modifier)
6288 OpInstr.addReg(LaneValueReg);
6295 if (ST.getInstrInfo()->isVALU(
Opc,
true)) {
6296 BuildMI(*ComputeLoop,
I,
DL,
TII->get(AMDGPU::V_READFIRSTLANE_B32),
6310 BuildMI(*ComputeLoop,
I,
DL,
TII->get(AMDGPU::V_READLANE_B32),
6314 BuildMI(*ComputeLoop,
I,
DL,
TII->get(AMDGPU::V_READLANE_B32),
6318 auto LaneValue = BuildRegSequence(*ComputeLoop,
I, LaneValReg,
6319 LaneValueLoReg, LaneValueHiReg);
6321 case AMDGPU::S_OR_B64:
6322 case AMDGPU::S_AND_B64:
6323 case AMDGPU::S_XOR_B64: {
6326 .
addReg(LaneValue->getOperand(0).getReg())
6330 case AMDGPU::V_CMP_GT_I64_e64:
6331 case AMDGPU::V_CMP_GT_U64_e64:
6332 case AMDGPU::V_CMP_LT_I64_e64:
6333 case AMDGPU::V_CMP_LT_U64_e64: {
6338 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src);
6340 TRI->getAllocatableClass(
TII->getRegClass(
MI.getDesc(), SrcIdx));
6344 BuildRegSequence(*ComputeLoop,
I, AccumulatorVReg, SrcReg0Sub0,
6347 .
addReg(LaneValue->getOperand(0).getReg())
6348 .
addReg(AccumulatorVReg);
6350 unsigned AndOpc = IsWave32 ? AMDGPU::S_AND_B32 : AMDGPU::S_AND_B64;
6351 BuildMI(*ComputeLoop,
I,
DL,
TII->get(AndOpc), ComparisonResultReg)
6355 NewAccumulator =
BuildMI(*ComputeLoop,
I,
DL,
6356 TII->get(AMDGPU::S_CSELECT_B64), DstReg)
6357 .
addReg(LaneValue->getOperand(0).getReg())
6361 case AMDGPU::V_MIN_F64_e64:
6362 case AMDGPU::V_MIN_NUM_F64_e64:
6363 case AMDGPU::V_MAX_F64_e64:
6364 case AMDGPU::V_MAX_NUM_F64_e64:
6365 case AMDGPU::V_ADD_F64_e64:
6366 case AMDGPU::V_ADD_F64_pseudo_e64: {
6368 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src);
6370 TRI->getAllocatableClass(
TII->getRegClass(
MI.getDesc(), SrcIdx));
6377 BuildMI(*ComputeLoop,
I,
DL,
TII->get(AMDGPU::COPY), AccumulatorVReg)
6380 MI.getOpcode() == AMDGPU::WAVE_REDUCE_FSUB_PSEUDO_F64
6386 .
addReg(LaneValue->getOperand(0).getReg())
6393 TII->get(AMDGPU::V_READFIRSTLANE_B32), LaneValLo);
6396 TII->get(AMDGPU::V_READFIRSTLANE_B32), LaneValHi);
6398 auto [Op1L, Op1H] =
ExtractSubRegs(*Iters, DstVregInst->getOperand(0),
6400 ReadLaneLo.addReg(Op1L);
6401 ReadLaneHi.addReg(Op1H);
6403 BuildRegSequence(*ComputeLoop,
I, DstReg, LaneValLo, LaneValHi);
6406 case AMDGPU::S_ADD_U64_PSEUDO:
6407 case AMDGPU::S_SUB_U64_PSEUDO: {
6410 .
addReg(LaneValue->getOperand(0).getReg());
6418 unsigned BITSETOpc =
6419 IsWave32 ? AMDGPU::S_BITSET0_B32 : AMDGPU::S_BITSET0_B64;
6420 BuildMI(*ComputeLoop,
I,
DL,
TII->get(BITSETOpc), NewActiveBitsReg)
6426 ActiveBits.addReg(NewActiveBitsReg).addMBB(ComputeLoop);
6430 if (!ST.hasScalarCompareEq64()) {
6433 unsigned CMPOpc = IsWave32 ? AMDGPU::S_OR_B32 : AMDGPU::S_OR_B64;
6435 BuildMI(*ComputeLoop,
I,
DL,
TII->get(CMPOpc), LaneMaskReg);
6438 IsWave32 ? AMDGPU::S_CMP_LG_U32 : AMDGPU::S_CMP_LG_U64;
6439 SetSCCInstr =
BuildMI(*ComputeLoop,
I,
DL,
TII->get(CMPOpc));
6441 SetSCCInstr.
addReg(NewActiveBitsReg);
6442 if (ST.hasScalarCompareEq64())
6445 SetSCCInstr.
addReg(NewActiveBitsReg);
6446 BuildMI(*ComputeLoop,
I,
DL,
TII->get(AMDGPU::S_CBRANCH_SCC1))
6451 assert(ST.hasDPP() &&
"Sub Target does not support DPP Operations");
6468 BuildMI(*CurrBB,
MI,
DL,
TII->get(AMDGPU::IMPLICIT_DEF), UndefExec);
6472 TII->get(is32BitOpc ? AMDGPU::S_MOV_B32
6473 : AMDGPU::S_MOV_B64_IMM_PSEUDO),
6476 auto IdentityCopyInstr =
6480 unsigned DPPOpc = std::get<0>(DPPClampOpcPair);
6481 unsigned ClampOpc = std::get<1>(DPPClampOpcPair);
6496 if (isFPOp && !NeedsMovDPP)
6499 if (isFPOp && !NeedsMovDPP)
6503 if (AMDGPU::getNamedOperandIdx(DPPOpc, AMDGPU::OpName::clamp) >= 0)
6512 bool isAddSub =
false,
6513 bool needsCarryIn =
false,
6515 unsigned InstrOpc = ClampOpc;
6518 InstrOpc = AMDGPU::V_ADDC_U32_e64;
6519 auto ClampInstr =
BuildMI(*CurrBB,
MI,
DL,
TII->get(InstrOpc), Dst);
6524 ClampInstr.addReg(CarryOutReg,
6530 ClampInstr.addReg(Src0);
6533 ClampInstr.addReg(Src1);
6536 if (AMDGPU::getNamedOperandIdx(InstrOpc, AMDGPU::OpName::clamp) >= 0)
6537 ClampInstr.addImm(0);
6539 ClampInstr.addImm(0);
6540 LastBcastInstr = ClampInstr;
6545 Opc == AMDGPU::S_ADD_U64_PSEUDO ||
Opc == AMDGPU::S_SUB_U64_PSEUDO;
6546 bool isBitWiseOpc =
Opc == AMDGPU::S_AND_B64 ||
6547 Opc == AMDGPU::S_OR_B64 ||
Opc == AMDGPU::S_XOR_B64;
6549 if (isAddSubOpc || isBitWiseOpc) {
6556 auto [Src0Lo, Src0Hi] =
6558 auto [Src1Lo, Src1Hi] =
6560 Register CarryReg = BuildClampInstr(
6561 ResLo, Src0Lo, Src1Lo, isAddSubOpc,
false);
6562 BuildClampInstr(ResHi, Src0Hi, Src1Hi, isAddSubOpc,
6563 isAddSubOpc, CarryReg);
6564 BuildRegSequence(*CurrBB,
MI, ReturnReg, ResLo, ResHi);
6593 SrcWithIdentityInstr =
6594 BuildSetInactiveInstr(SrcWithIdentity, SrcReg, IdentityVGPR);
6601 MI, IdentityCopyInstr->getOperand(0), SrcRegClass, ST, MRI);
6602 auto [SrcReg0Sub0, SrcReg0Sub1] =
6605 BuildSetInactiveInstr(SrcWithIdentitylo, SrcReg0Sub0, Reg0Sub0);
6607 BuildSetInactiveInstr(SrcWithIdentityhi, SrcReg0Sub1, Reg0Sub1);
6608 SrcWithIdentityInstr =
6609 BuildRegSequence(*CurrBB,
MI, SrcWithIdentity,
6616 BuildDPPMachineInstr(DPPRowShr1, SrcWithIdentityReg,
6619 DPPRowShr1 = BuildPostDPPInstr(SrcWithIdentityReg, DPPRowShr1);
6621 BuildDPPMachineInstr(DPPRowShr2, DPPRowShr1,
6624 DPPRowShr2 = BuildPostDPPInstr(DPPRowShr1, DPPRowShr2);
6626 BuildDPPMachineInstr(DPPRowShr4, DPPRowShr2,
6629 DPPRowShr4 = BuildPostDPPInstr(DPPRowShr2, DPPRowShr4);
6631 BuildDPPMachineInstr(DPPRowShr8, DPPRowShr4,
6634 DPPRowShr8 = BuildPostDPPInstr(DPPRowShr4, DPPRowShr8);
6636 if (ST.hasDPPBroadcasts()) {
6639 RowBcast15 = BuildPostDPPInstr(DPPRowShr8, RowBcast15);
6654 BuildClampInstr(RowBcast15, DPPRowShr8, SwizzledValue);
6675 BuildRegSequence(*CurrBB,
MI, SwizzledValue64, SwizzledValuelo,
6678 RowBcast15 = BuildPostDPPInstr(DPPRowShr8, SwizzledValue64);
6680 BuildClampInstr(RowBcast15, DPPRowShr8, SwizzledValue64);
6683 FinalDPPResult = RowBcast15;
6685 if (ST.hasDPPBroadcasts()) {
6688 RowBcast31 = BuildPostDPPInstr(RowBcast15, RowBcast31);
6704 BuildMI(*CurrBB,
MI,
DL,
TII->get(AMDGPU::V_MBCNT_LO_U32_B32_e64),
6708 BuildMI(*CurrBB,
MI,
DL,
TII->get(AMDGPU::V_MBCNT_HI_U32_B32_e64),
6714 BuildMI(*CurrBB,
MI,
DL,
TII->get(AMDGPU::S_MOV_B32), Lane32Offset)
6722 BuildMI(*CurrBB,
MI,
DL,
TII->get(AMDGPU::S_MOV_B32), WordSizeConst)
6727 .
addReg(ShiftedThreadID);
6732 .
addReg(PermuteByteOffset)
6742 auto [RowBcast15Lo, RowBcast15Hi] =
6746 .
addReg(PermuteByteOffset)
6751 .
addReg(PermuteByteOffset)
6754 BuildRegSequence(*CurrBB,
MI, PermutedValue, PermutedValuelo,
6758 RowBcast31 = BuildPostDPPInstr(RowBcast15, PermutedValue);
6760 BuildClampInstr(RowBcast31, RowBcast15, PermutedValue);
6762 FinalDPPResult = RowBcast31;
6764 if (MIOpc == AMDGPU::WAVE_REDUCE_FSUB_PSEUDO_F32 ||
6765 MIOpc == AMDGPU::WAVE_REDUCE_FSUB_PSEUDO_F64) {
6775 .
addReg(IsWave32 ? RowBcast15 : RowBcast31)
6778 FinalDPPResult = NegatedValVGPR;
6785 .
addImm(ST.getWavefrontSize() - 1);
6800 .
addImm(ST.getWavefrontSize() - 1);
6804 .
addImm(ST.getWavefrontSize() - 1);
6805 BuildRegSequence(*CurrBB,
MI, ReducedValSGPR, LaneValueLoReg,
6808 if (
Opc == AMDGPU::S_SUB_I32) {
6809 BuildMI(*CurrBB,
MI,
DL,
TII->get(AMDGPU::S_SUB_I32), NegatedReducedVal)
6812 }
else if (
Opc == AMDGPU::S_SUB_U64_PSEUDO) {
6813 auto NegatedValInstr =
6821 .
addReg(
Opc == AMDGPU::S_SUB_I32 ||
Opc == AMDGPU::S_SUB_U64_PSEUDO
6827 MI.eraseFromParent();
6842 switch (
MI.getOpcode()) {
6843 case AMDGPU::WAVE_REDUCE_UMIN_PSEUDO_U32:
6845 case AMDGPU::WAVE_REDUCE_UMIN_PSEUDO_U64:
6847 case AMDGPU::WAVE_REDUCE_MIN_PSEUDO_I32:
6849 case AMDGPU::WAVE_REDUCE_MIN_PSEUDO_I64:
6851 case AMDGPU::WAVE_REDUCE_FMIN_PSEUDO_F32:
6853 case AMDGPU::WAVE_REDUCE_FMIN_PSEUDO_F64:
6856 ? AMDGPU::V_MIN_NUM_F64_e64
6857 : AMDGPU::V_MIN_F64_e64);
6858 case AMDGPU::WAVE_REDUCE_UMAX_PSEUDO_U32:
6860 case AMDGPU::WAVE_REDUCE_UMAX_PSEUDO_U64:
6862 case AMDGPU::WAVE_REDUCE_MAX_PSEUDO_I32:
6864 case AMDGPU::WAVE_REDUCE_MAX_PSEUDO_I64:
6866 case AMDGPU::WAVE_REDUCE_FMAX_PSEUDO_F32:
6868 case AMDGPU::WAVE_REDUCE_FMAX_PSEUDO_F64:
6871 ? AMDGPU::V_MAX_NUM_F64_e64
6872 : AMDGPU::V_MAX_F64_e64);
6873 case AMDGPU::WAVE_REDUCE_ADD_PSEUDO_I32:
6875 case AMDGPU::WAVE_REDUCE_ADD_PSEUDO_U64:
6877 case AMDGPU::WAVE_REDUCE_FADD_PSEUDO_F32:
6879 case AMDGPU::WAVE_REDUCE_FADD_PSEUDO_F64:
6882 ? AMDGPU::V_ADD_F64_pseudo_e64
6883 : AMDGPU::V_ADD_F64_e64);
6884 case AMDGPU::WAVE_REDUCE_SUB_PSEUDO_I32:
6886 case AMDGPU::WAVE_REDUCE_SUB_PSEUDO_U64:
6888 case AMDGPU::WAVE_REDUCE_FSUB_PSEUDO_F32:
6890 case AMDGPU::WAVE_REDUCE_FSUB_PSEUDO_F64:
6895 ? AMDGPU::V_ADD_F64_pseudo_e64
6896 : AMDGPU::V_ADD_F64_e64);
6897 case AMDGPU::WAVE_REDUCE_AND_PSEUDO_B32:
6899 case AMDGPU::WAVE_REDUCE_AND_PSEUDO_B64:
6901 case AMDGPU::WAVE_REDUCE_OR_PSEUDO_B32:
6903 case AMDGPU::WAVE_REDUCE_OR_PSEUDO_B64:
6905 case AMDGPU::WAVE_REDUCE_XOR_PSEUDO_B32:
6907 case AMDGPU::WAVE_REDUCE_XOR_PSEUDO_B64:
6909 case AMDGPU::S_UADDO_PSEUDO:
6910 case AMDGPU::S_USUBO_PSEUDO: {
6916 unsigned Opc = (
MI.getOpcode() == AMDGPU::S_UADDO_PSEUDO)
6918 : AMDGPU::S_SUB_U32;
6926 Subtarget->isWave64() ? AMDGPU::S_CSELECT_B64 : AMDGPU::S_CSELECT_B32;
6929 MI.eraseFromParent();
6932 case AMDGPU::S_ADD_U64_PSEUDO:
6933 case AMDGPU::S_SUB_U64_PSEUDO: {
6936 case AMDGPU::V_ADD_U64_PSEUDO:
6937 case AMDGPU::V_SUB_U64_PSEUDO: {
6938 bool IsAdd = (
MI.getOpcode() == AMDGPU::V_ADD_U64_PSEUDO);
6944 if (ST.hasAddSubU64Insts()) {
6946 TII->get(IsAdd ? AMDGPU::V_ADD_U64_e64
6947 : AMDGPU::V_SUB_U64_e64),
6952 TII->legalizeOperands(*
I);
6953 MI.eraseFromParent();
6957 if (IsAdd && ST.hasLshlAddU64Inst()) {
6963 TII->legalizeOperands(*
Add);
6964 MI.eraseFromParent();
6968 const auto *CarryRC =
TRI->getWaveMaskRegClass();
6978 : &AMDGPU::VReg_64RegClass;
6981 : &AMDGPU::VReg_64RegClass;
6984 TRI->getSubRegisterClass(Src0RC, AMDGPU::sub0);
6986 TRI->getSubRegisterClass(Src1RC, AMDGPU::sub1);
6989 MI, MRI, Src0, Src0RC, AMDGPU::sub0, Src0SubRC);
6991 MI, MRI, Src1, Src1RC, AMDGPU::sub0, Src1SubRC);
6994 MI, MRI, Src0, Src0RC, AMDGPU::sub1, Src0SubRC);
6996 MI, MRI, Src1, Src1RC, AMDGPU::sub1, Src1SubRC);
6999 IsAdd ? AMDGPU::V_ADD_CO_U32_e64 : AMDGPU::V_SUB_CO_U32_e64;
7006 unsigned HiOpc = IsAdd ? AMDGPU::V_ADDC_U32_e64 : AMDGPU::V_SUBB_U32_e64;
7020 TII->legalizeOperands(*LoHalf);
7021 TII->legalizeOperands(*HiHalf);
7022 MI.eraseFromParent();
7025 case AMDGPU::S_ADD_CO_PSEUDO:
7026 case AMDGPU::S_SUB_CO_PSEUDO: {
7038 BuildMI(*BB, MII,
DL,
TII->get(AMDGPU::V_READFIRSTLANE_B32), RegOp0)
7044 BuildMI(*BB, MII,
DL,
TII->get(AMDGPU::V_READFIRSTLANE_B32), RegOp1)
7049 if (
TRI->isVectorRegister(MRI, Src2.
getReg())) {
7050 BuildMI(*BB, MII,
DL,
TII->get(AMDGPU::V_READFIRSTLANE_B32), RegOp2)
7055 if (ST.isWave64()) {
7056 if (ST.hasScalarCompareEq64()) {
7063 TRI->getSubRegisterClass(Src2RC, AMDGPU::sub0);
7065 MII, MRI, Src2, Src2RC, AMDGPU::sub0, SubRC);
7067 MII, MRI, Src2, Src2RC, AMDGPU::sub1, SubRC);
7070 BuildMI(*BB, MII,
DL,
TII->get(AMDGPU::S_OR_B32), Src2_32)
7084 unsigned Opc =
MI.getOpcode() == AMDGPU::S_ADD_CO_PSEUDO
7085 ? AMDGPU::S_ADDC_U32
7086 : AMDGPU::S_SUBB_U32;
7091 ST.isWave64() ? AMDGPU::S_CSELECT_B64 : AMDGPU::S_CSELECT_B32;
7097 MI.eraseFromParent();
7100 case AMDGPU::SI_INIT_M0: {
7103 TII->get(M0Init.
isReg() ? AMDGPU::COPY : AMDGPU::S_MOV_B32),
7106 MI.eraseFromParent();
7109 case AMDGPU::S_BARRIER_SIGNAL_ISFIRST_IMM: {
7112 TII->get(AMDGPU::S_CMP_EQ_U32))
7117 case AMDGPU::GET_GROUPSTATICSIZE: {
7121 .
add(
MI.getOperand(0))
7123 MI.eraseFromParent();
7126 case AMDGPU::GET_SHADERCYCLESHILO: {
7141 .
addImm(HwregEncoding::encode(ID_SHADER_CYCLES_HI, 0, 32));
7144 .
addImm(HwregEncoding::encode(ID_SHADER_CYCLES, 0, 32));
7147 .
addImm(HwregEncoding::encode(ID_SHADER_CYCLES_HI, 0, 32));
7156 .
add(
MI.getOperand(0))
7161 MI.eraseFromParent();
7164 case AMDGPU::SI_INDIRECT_SRC_V1:
7165 case AMDGPU::SI_INDIRECT_SRC_V2:
7166 case AMDGPU::SI_INDIRECT_SRC_V3:
7167 case AMDGPU::SI_INDIRECT_SRC_V4:
7168 case AMDGPU::SI_INDIRECT_SRC_V5:
7169 case AMDGPU::SI_INDIRECT_SRC_V6:
7170 case AMDGPU::SI_INDIRECT_SRC_V7:
7171 case AMDGPU::SI_INDIRECT_SRC_V8:
7172 case AMDGPU::SI_INDIRECT_SRC_V9:
7173 case AMDGPU::SI_INDIRECT_SRC_V10:
7174 case AMDGPU::SI_INDIRECT_SRC_V11:
7175 case AMDGPU::SI_INDIRECT_SRC_V12:
7176 case AMDGPU::SI_INDIRECT_SRC_V16:
7177 case AMDGPU::SI_INDIRECT_SRC_V32:
7179 case AMDGPU::SI_INDIRECT_DST_V1:
7180 case AMDGPU::SI_INDIRECT_DST_V2:
7181 case AMDGPU::SI_INDIRECT_DST_V3:
7182 case AMDGPU::SI_INDIRECT_DST_V4:
7183 case AMDGPU::SI_INDIRECT_DST_V5:
7184 case AMDGPU::SI_INDIRECT_DST_V6:
7185 case AMDGPU::SI_INDIRECT_DST_V7:
7186 case AMDGPU::SI_INDIRECT_DST_V8:
7187 case AMDGPU::SI_INDIRECT_DST_V9:
7188 case AMDGPU::SI_INDIRECT_DST_V10:
7189 case AMDGPU::SI_INDIRECT_DST_V11:
7190 case AMDGPU::SI_INDIRECT_DST_V12:
7191 case AMDGPU::SI_INDIRECT_DST_V16:
7192 case AMDGPU::SI_INDIRECT_DST_V32:
7194 case AMDGPU::SI_KILL_F32_COND_IMM_PSEUDO:
7195 case AMDGPU::SI_KILL_I1_PSEUDO:
7197 case AMDGPU::V_CNDMASK_B64_PSEUDO: {
7201 case AMDGPU::SI_BR_UNDEF: {
7203 .
add(
MI.getOperand(0));
7205 MI.eraseFromParent();
7208 case AMDGPU::ADJCALLSTACKUP:
7209 case AMDGPU::ADJCALLSTACKDOWN: {
7216 case AMDGPU::SI_CALL_ISEL: {
7217 unsigned ReturnAddrReg =
TII->getRegisterInfo().getReturnAddressReg(*MF);
7220 MIB =
BuildMI(*BB,
MI,
DL,
TII->get(AMDGPU::SI_CALL), ReturnAddrReg);
7226 MI.eraseFromParent();
7229 case AMDGPU::V_ADD_CO_U32_e32:
7230 case AMDGPU::V_SUB_CO_U32_e32:
7231 case AMDGPU::V_SUBREV_CO_U32_e32: {
7233 unsigned Opc =
MI.getOpcode();
7235 bool NeedClampOperand =
false;
7236 if (
TII->pseudoToMCOpcode(
Opc) == -1) {
7238 NeedClampOperand =
true;
7242 if (
TII->isVOP3(*
I)) {
7245 I.add(
MI.getOperand(1)).add(
MI.getOperand(2));
7246 if (NeedClampOperand)
7249 TII->legalizeOperands(*
I);
7251 MI.eraseFromParent();
7254 case AMDGPU::V_ADDC_U32_e32:
7255 case AMDGPU::V_SUBB_U32_e32:
7256 case AMDGPU::V_SUBBREV_U32_e32:
7259 TII->legalizeOperands(
MI);
7261 case AMDGPU::DS_GWS_INIT:
7262 case AMDGPU::DS_GWS_SEMA_BR:
7263 case AMDGPU::DS_GWS_BARRIER:
7264 case AMDGPU::DS_GWS_SEMA_V:
7265 case AMDGPU::DS_GWS_SEMA_P:
7266 case AMDGPU::DS_GWS_SEMA_RELEASE_ALL:
7274 case AMDGPU::S_SETREG_B32: {
7284 auto [ID,
Offset, Width] =
7290 const unsigned SetMask = WidthMask <<
Offset;
7293 unsigned SetDenormOp = 0;
7294 unsigned SetRoundOp = 0;
7302 SetRoundOp = AMDGPU::S_ROUND_MODE;
7303 SetDenormOp = AMDGPU::S_DENORM_MODE;
7305 SetRoundOp = AMDGPU::S_ROUND_MODE;
7307 SetDenormOp = AMDGPU::S_DENORM_MODE;
7310 if (SetRoundOp || SetDenormOp) {
7312 if (Def && Def->isMoveImmediate() && Def->getOperand(1).isImm()) {
7313 unsigned ImmVal = Def->getOperand(1).getImm();
7327 MI.eraseFromParent();
7336 MI.setDesc(
TII->get(AMDGPU::S_SETREG_B32_mode));
7340 case AMDGPU::S_INVERSE_BALLOT_U32:
7341 case AMDGPU::S_INVERSE_BALLOT_U64:
7344 MI.setDesc(
TII->get(AMDGPU::COPY));
7346 case AMDGPU::ENDPGM_TRAP: {
7348 MI.setDesc(
TII->get(AMDGPU::S_ENDPGM));
7368 MI.eraseFromParent();
7371 case AMDGPU::SIMULATED_TRAP: {
7372 assert(Subtarget->hasPrivEnabledTrap2NopBug());
7374 TII->insertSimulatedTrap(MRI, *BB,
MI,
MI.getDebugLoc());
7375 MI.eraseFromParent();
7378 case AMDGPU::SI_TCRETURN_GFX_WholeWave:
7379 case AMDGPU::SI_WHOLE_WAVE_FUNC_RETURN: {
7385 assert(Setup &&
"Couldn't find SI_SETUP_WHOLE_WAVE_FUNC");
7386 Register OriginalExec = Setup->getOperand(0).getReg();
7388 MI.getOperand(0).setReg(OriginalExec);
7391 case AMDGPU::V_DOT2_F32_F16:
7392 case AMDGPU::V_DOT2_F32_BF16: {