34#include "llvm/IR/IntrinsicsAMDGPU.h"
42#define DEBUG_TYPE "si-instr-info"
44#define GET_INSTRINFO_CTOR_DTOR
45#include "AMDGPUGenInstrInfo.inc"
48#define GET_D16ImageDimIntrinsics_IMPL
49#define GET_ImageDimIntrinsicTable_IMPL
50#define GET_RsrcIntrinsics_IMPL
51#include "AMDGPUGenSearchableTables.inc"
59 cl::desc(
"Restrict range of branch instructions (DEBUG)"));
62 "amdgpu-fix-16-bit-physreg-copies",
63 cl::desc(
"Fix copies between 32 and 16 bit registers by extending to 32 bit"),
79 unsigned N =
Node->getNumOperands();
80 while (
N &&
Node->getOperand(
N - 1).getValueType() == MVT::Glue)
92 int Op0Idx = AMDGPU::getNamedOperandIdx(Opc0,
OpName);
93 int Op1Idx = AMDGPU::getNamedOperandIdx(Opc1,
OpName);
95 if (Op0Idx == -1 && Op1Idx == -1)
99 if ((Op0Idx == -1 && Op1Idx != -1) ||
100 (Op1Idx == -1 && Op0Idx != -1))
121 return !
MI.memoperands_empty() &&
123 return MMO->isLoad() && MMO->isInvariant();
132static std::tuple<unsigned, unsigned, unsigned>
140 unsigned LoReloc, HiReloc;
170 return {BaseFlags, LoReloc, HiReloc};
188 if (!
MI.hasImplicitDef() &&
189 MI.getNumImplicitOperands() ==
MI.getDesc().implicit_uses().size() &&
190 !
MI.mayRaiseFPException())
199 if (!
MI.getNumOperands() || !
MI.getOperand(0).isReg())
214 if (
MI.isNotDuplicable() ||
MI.mayStore() ||
MI.mayRaiseFPException() ||
215 MI.hasUnmodeledSideEffects())
220 if (
MI.isInlineAsm())
224 if (
MI.mayLoad() && !
MI.isDereferenceableInvariantLoad())
239 if (Reg.isPhysical()) {
255 if (MO.isDef() && Reg != DefReg)
263bool SIInstrInfo::resultDependsOnExec(
const MachineInstr &
MI)
const {
267 if (
MI.isConvergent())
295 if (
MI.getOpcode() == AMDGPU::SI_IF_BREAK)
300 for (
auto Op :
MI.uses()) {
301 if (
Op.isReg() &&
Op.getReg().isVirtual() &&
315 while (FromCycle && !(ToCycle && CI->
contains(FromCycle, ToCycle))) {
335 int64_t &Offset1)
const {
343 if (!
get(Opc0).mayLoad() || !
get(Opc1).mayLoad())
347 if (!
get(Opc0).getNumDefs() || !
get(Opc1).getNumDefs())
363 int Offset0Idx = AMDGPU::getNamedOperandIdx(Opc0, AMDGPU::OpName::offset);
364 int Offset1Idx = AMDGPU::getNamedOperandIdx(Opc1, AMDGPU::OpName::offset);
365 if (Offset0Idx == -1 || Offset1Idx == -1)
372 Offset0Idx -=
get(Opc0).NumDefs;
373 Offset1Idx -=
get(Opc1).NumDefs;
403 if (!Load0Offset || !Load1Offset)
420 int OffIdx0 = AMDGPU::getNamedOperandIdx(Opc0, AMDGPU::OpName::offset);
421 int OffIdx1 = AMDGPU::getNamedOperandIdx(Opc1, AMDGPU::OpName::offset);
423 if (OffIdx0 == -1 || OffIdx1 == -1)
429 OffIdx0 -=
get(Opc0).NumDefs;
430 OffIdx1 -=
get(Opc1).NumDefs;
449 case AMDGPU::DS_READ2ST64_B32:
450 case AMDGPU::DS_READ2ST64_B64:
451 case AMDGPU::DS_WRITE2ST64_B32:
452 case AMDGPU::DS_WRITE2ST64_B64:
467 OffsetIsScalable =
false;
484 DataOpIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::vdst);
486 DataOpIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::data0);
487 if (
Opc == AMDGPU::DS_ATOMIC_ASYNC_BARRIER_ARRIVE_B64)
500 unsigned Offset0 = Offset0Op->
getImm() & 0xff;
501 unsigned Offset1 = Offset1Op->
getImm() & 0xff;
502 if (Offset0 + 1 != Offset1)
513 int Data0Idx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::data0);
521 Offset = EltSize * Offset0;
523 DataOpIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::vdst);
524 if (DataOpIdx == -1) {
525 DataOpIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::data0);
527 DataOpIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::data1);
543 if (BaseOp && !BaseOp->
isFI())
551 if (SOffset->
isReg())
557 DataOpIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::vdst);
559 DataOpIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::vdata);
568 isMIMG(LdSt) ? AMDGPU::OpName::srsrc : AMDGPU::OpName::rsrc;
569 int SRsrcIdx = AMDGPU::getNamedOperandIdx(
Opc, RsrcOpName);
571 int VAddr0Idx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::vaddr0);
572 if (VAddr0Idx >= 0) {
574 for (
int I = VAddr0Idx;
I < SRsrcIdx; ++
I)
581 DataOpIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::vdata);
596 DataOpIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::sdst);
613 DataOpIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::vdst);
615 DataOpIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::vdata);
632 if (BaseOps1.
front()->isIdenticalTo(*BaseOps2.
front()))
640 if (MO1->getAddrSpace() != MO2->getAddrSpace())
643 const auto *Base1 = MO1->getValue();
644 const auto *Base2 = MO2->getValue();
645 if (!Base1 || !Base2)
653 return Base1 == Base2;
657 int64_t Offset1,
bool OffsetIsScalable1,
659 int64_t Offset2,
bool OffsetIsScalable2,
660 unsigned ClusterSize,
661 unsigned NumBytes)
const {
674 }
else if (!BaseOps1.
empty() || !BaseOps2.
empty()) {
693 const unsigned LoadSize = NumBytes / ClusterSize;
694 const unsigned NumDWords = ((LoadSize + 3) / 4) * ClusterSize;
695 return NumDWords <= MaxMemoryClusterDWords;
709 int64_t Offset0, int64_t Offset1,
710 unsigned NumLoads)
const {
711 assert(Offset1 > Offset0 &&
712 "Second offset should be larger than first offset!");
717 return (NumLoads <= 16 && (Offset1 - Offset0) < 64);
724 const char *
Msg =
"illegal VGPR to SGPR copy") {
743 assert((
TII.getSubtarget().hasMAIInsts() &&
744 !
TII.getSubtarget().hasGFX90AInsts()) &&
745 "Expected GFX908 subtarget.");
748 AMDGPU::AGPR_32RegClass.
contains(SrcReg)) &&
749 "Source register of the copy should be either an SGPR or an AGPR.");
752 "Destination register of the copy should be an AGPR.");
761 for (
auto Def =
MI,
E =
MBB.begin(); Def !=
E; ) {
764 if (!Def->modifiesRegister(SrcReg, &RI))
767 if (Def->getOpcode() != AMDGPU::V_ACCVGPR_WRITE_B32_e64 ||
768 Def->getOperand(0).getReg() != SrcReg)
775 bool SafeToPropagate =
true;
778 for (
auto I = Def;
I !=
MI && SafeToPropagate; ++
I)
779 if (
I->modifiesRegister(DefOp.
getReg(), &RI))
780 SafeToPropagate =
false;
782 if (!SafeToPropagate)
785 for (
auto I = Def;
I !=
MI; ++
I)
786 I->clearRegisterKills(DefOp.
getReg(), &RI);
794 if (ImpUseSuperReg) {
795 Builder.addReg(ImpUseSuperReg,
803 RS.enterBasicBlockEnd(
MBB);
804 RS.backward(std::next(
MI));
813 unsigned RegNo = (DestReg - AMDGPU::AGPR0) % 3;
816 assert(
MBB.getParent()->getRegInfo().isReserved(Tmp) &&
817 "VGPR used for an intermediate copy should have been reserved.");
822 Register Tmp2 = RS.scavengeRegisterBackwards(AMDGPU::VGPR_32RegClass,
MI,
832 unsigned TmpCopyOp = AMDGPU::V_MOV_B32_e32;
833 if (AMDGPU::AGPR_32RegClass.
contains(SrcReg)) {
834 TmpCopyOp = AMDGPU::V_ACCVGPR_READ_B32_e64;
841 if (ImpUseSuperReg) {
842 UseBuilder.
addReg(ImpUseSuperReg,
859 for (
unsigned Idx = 0; Idx < BaseIndices.
size(); ++Idx) {
860 int16_t SubIdx = BaseIndices[Idx];
861 Register DestSubReg = RI.getSubReg(DestReg, SubIdx);
862 Register SrcSubReg = RI.getSubReg(SrcReg, SubIdx);
863 assert(DestSubReg && SrcSubReg &&
"Failed to find subregs!");
864 unsigned Opcode = AMDGPU::S_MOV_B32;
867 bool AlignedDest = ((DestSubReg - AMDGPU::SGPR0) % 2) == 0;
868 bool AlignedSrc = ((SrcSubReg - AMDGPU::SGPR0) % 2) == 0;
869 if (AlignedDest && AlignedSrc && (Idx + 1 < BaseIndices.
size())) {
873 DestSubReg = RI.getSubReg(DestReg, SubIdx);
874 SrcSubReg = RI.getSubReg(SrcReg, SubIdx);
875 assert(DestSubReg && SrcSubReg &&
"Failed to find subregs!");
876 Opcode = AMDGPU::S_MOV_B64;
891 assert(FirstMI && LastMI);
896 LastMI->addRegisterKilled(SrcReg, &RI);
902 Register SrcReg,
bool KillSrc,
bool RenamableDest,
903 bool RenamableSrc)
const {
905 unsigned Size = RI.getRegSizeInBits(*RC);
907 unsigned SrcSize = RI.getRegSizeInBits(*SrcRC);
913 if (((
Size == 16) != (SrcSize == 16))) {
915 assert(ST.useRealTrue16Insts());
917 MCRegister SubReg = RI.getSubReg(RegToFix, AMDGPU::lo16);
920 if (DestReg == SrcReg) {
926 RC = RI.getPhysRegBaseClass(DestReg);
927 Size = RI.getRegSizeInBits(*RC);
928 SrcRC = RI.getPhysRegBaseClass(SrcReg);
929 SrcSize = RI.getRegSizeInBits(*SrcRC);
933 if (RC == &AMDGPU::VGPR_32RegClass) {
935 AMDGPU::SReg_32RegClass.
contains(SrcReg) ||
936 AMDGPU::AGPR_32RegClass.
contains(SrcReg));
937 unsigned Opc = AMDGPU::AGPR_32RegClass.contains(SrcReg) ?
938 AMDGPU::V_ACCVGPR_READ_B32_e64 : AMDGPU::V_MOV_B32_e32;
944 if (RC == &AMDGPU::SReg_32_XM0RegClass ||
945 RC == &AMDGPU::SReg_32RegClass) {
946 if (SrcReg == AMDGPU::SCC) {
953 if (!AMDGPU::SReg_32RegClass.
contains(SrcReg)) {
954 if (DestReg == AMDGPU::VCC_LO) {
972 if (RC == &AMDGPU::SReg_64RegClass) {
973 if (SrcReg == AMDGPU::SCC) {
980 if (!AMDGPU::SReg_64_EncodableRegClass.
contains(SrcReg)) {
981 if (DestReg == AMDGPU::VCC) {
999 if (DestReg == AMDGPU::SCC) {
1002 if (AMDGPU::SReg_64RegClass.
contains(SrcReg)) {
1006 assert(ST.hasScalarCompareEq64());
1020 if (RC == &AMDGPU::AGPR_32RegClass) {
1021 if (AMDGPU::VGPR_32RegClass.
contains(SrcReg) ||
1022 (ST.hasGFX90AInsts() && AMDGPU::SReg_32RegClass.contains(SrcReg))) {
1028 if (AMDGPU::AGPR_32RegClass.
contains(SrcReg) && ST.hasGFX90AInsts()) {
1037 const bool Overlap = RI.regsOverlap(SrcReg, DestReg);
1044 AMDGPU::SReg_LO16RegClass.
contains(SrcReg) ||
1045 AMDGPU::AGPR_LO16RegClass.
contains(SrcReg));
1047 bool IsSGPRDst = AMDGPU::SReg_LO16RegClass.contains(DestReg);
1048 bool IsSGPRSrc = AMDGPU::SReg_LO16RegClass.contains(SrcReg);
1049 bool IsAGPRDst = AMDGPU::AGPR_LO16RegClass.contains(DestReg);
1050 bool IsAGPRSrc = AMDGPU::AGPR_LO16RegClass.contains(SrcReg);
1053 MCRegister NewDestReg = RI.get32BitRegister(DestReg);
1054 MCRegister NewSrcReg = RI.get32BitRegister(SrcReg);
1067 if (IsAGPRDst || IsAGPRSrc) {
1068 if (!DstLow || !SrcLow) {
1070 "Cannot use hi16 subreg with an AGPR!");
1077 if (ST.useRealTrue16Insts()) {
1083 if (AMDGPU::VGPR_16_Lo128RegClass.
contains(DestReg) &&
1084 (IsSGPRSrc || AMDGPU::VGPR_16_Lo128RegClass.
contains(SrcReg))) {
1096 if (IsSGPRSrc && !ST.hasSDWAScalar()) {
1097 if (!DstLow || !SrcLow) {
1099 "Cannot use hi16 subreg on VI!");
1122 if (RC == RI.getVGPR64Class() && (SrcRC == RC || RI.isSGPRClass(SrcRC))) {
1123 if (ST.hasVMovB64Inst()) {
1128 if (ST.hasPkMovB32()) {
1144 const bool Forward = RI.getHWRegIndex(DestReg) <= RI.getHWRegIndex(SrcReg);
1145 if (RI.isSGPRClass(RC)) {
1146 if (!RI.isSGPRClass(SrcRC)) {
1150 const bool CanKillSuperReg = KillSrc && !RI.regsOverlap(SrcReg, DestReg);
1156 unsigned EltSize = 4;
1157 unsigned Opcode = AMDGPU::V_MOV_B32_e32;
1158 if (RI.isAGPRClass(RC)) {
1159 if (ST.hasGFX90AInsts() && RI.isAGPRClass(SrcRC))
1160 Opcode = AMDGPU::V_ACCVGPR_MOV_B32;
1161 else if (RI.hasVGPRs(SrcRC) ||
1162 (ST.hasGFX90AInsts() && RI.isSGPRClass(SrcRC)))
1163 Opcode = AMDGPU::V_ACCVGPR_WRITE_B32_e64;
1165 Opcode = AMDGPU::INSTRUCTION_LIST_END;
1166 }
else if (RI.hasVGPRs(RC) && RI.isAGPRClass(SrcRC)) {
1167 Opcode = AMDGPU::V_ACCVGPR_READ_B32_e64;
1168 }
else if ((
Size % 64 == 0) && RI.hasVGPRs(RC) &&
1169 (RI.isProperlyAlignedRC(*RC) &&
1170 (SrcRC == RC || RI.isSGPRClass(SrcRC)))) {
1172 if (ST.hasVMovB64Inst()) {
1173 Opcode = AMDGPU::V_MOV_B64_e32;
1175 }
else if (ST.hasPkMovB32()) {
1176 Opcode = AMDGPU::V_PK_MOV_B32;
1186 std::unique_ptr<RegScavenger> RS;
1187 if (Opcode == AMDGPU::INSTRUCTION_LIST_END)
1188 RS = std::make_unique<RegScavenger>();
1194 const bool Overlap = RI.regsOverlap(SrcReg, DestReg);
1195 const bool CanKillSuperReg = KillSrc && !Overlap;
1197 for (
unsigned Idx = 0; Idx < SubIndices.
size(); ++Idx) {
1200 SubIdx = SubIndices[Idx];
1202 SubIdx = SubIndices[SubIndices.
size() - Idx - 1];
1203 Register DestSubReg = RI.getSubReg(DestReg, SubIdx);
1204 Register SrcSubReg = RI.getSubReg(SrcReg, SubIdx);
1205 assert(DestSubReg && SrcSubReg &&
"Failed to find subregs!");
1207 bool UseKill = CanKillSuperReg && Idx == SubIndices.
size() - 1;
1209 if (Opcode == AMDGPU::INSTRUCTION_LIST_END) {
1212 *RS, Overlap, ImpUseSuper);
1213 }
else if (Opcode == AMDGPU::V_PK_MOV_B32) {
1254 int64_t &ImmVal)
const {
1255 switch (
MI.getOpcode()) {
1256 case AMDGPU::V_MOV_B32_e32:
1257 case AMDGPU::S_MOV_B32:
1258 case AMDGPU::S_MOVK_I32:
1259 case AMDGPU::S_MOV_B64:
1260 case AMDGPU::V_MOV_B64_e32:
1261 case AMDGPU::V_ACCVGPR_WRITE_B32_e64:
1262 case AMDGPU::AV_MOV_B32_IMM_PSEUDO:
1263 case AMDGPU::AV_MOV_B64_IMM_PSEUDO:
1264 case AMDGPU::S_MOV_B64_IMM_PSEUDO:
1265 case AMDGPU::V_MOV_B64_PSEUDO:
1266 case AMDGPU::V_MOV_B16_t16_e32: {
1270 return MI.getOperand(0).getReg() == Reg;
1275 case AMDGPU::V_MOV_B16_t16_e64: {
1277 if (Src0.
isImm() && !
MI.getOperand(1).getImm()) {
1279 return MI.getOperand(0).getReg() == Reg;
1284 case AMDGPU::S_BREV_B32:
1285 case AMDGPU::V_BFREV_B32_e32:
1286 case AMDGPU::V_BFREV_B32_e64: {
1290 return MI.getOperand(0).getReg() == Reg;
1295 case AMDGPU::S_NOT_B32:
1296 case AMDGPU::V_NOT_B32_e32:
1297 case AMDGPU::V_NOT_B32_e64: {
1300 ImmVal =
static_cast<int64_t
>(~static_cast<int32_t>(Src0.
getImm()));
1301 return MI.getOperand(0).getReg() == Reg;
1311std::optional<int64_t>
1316 if (!
Op.isReg() || !
Op.getReg().isVirtual())
1317 return std::nullopt;
1320 if (Def && Def->isMoveImmediate()) {
1326 return std::nullopt;
1331 if (RI.isAGPRClass(DstRC))
1332 return AMDGPU::COPY;
1333 if (RI.getRegSizeInBits(*DstRC) == 16) {
1336 return RI.isSGPRClass(DstRC) ? AMDGPU::COPY : AMDGPU::V_MOV_B16_t16_e64;
1338 if (RI.getRegSizeInBits(*DstRC) == 32)
1339 return RI.isSGPRClass(DstRC) ? AMDGPU::S_MOV_B32 : AMDGPU::V_MOV_B32_e32;
1340 if (RI.getRegSizeInBits(*DstRC) == 64 && RI.isSGPRClass(DstRC))
1341 return AMDGPU::S_MOV_B64;
1342 if (RI.getRegSizeInBits(*DstRC) == 64 && !RI.isSGPRClass(DstRC))
1343 return AMDGPU::V_MOV_B64_PSEUDO;
1344 return AMDGPU::COPY;
1349 bool IsIndirectSrc)
const {
1350 if (IsIndirectSrc) {
1352 return get(AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V1);
1354 return get(AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V2);
1356 return get(AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V3);
1358 return get(AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V4);
1360 return get(AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V5);
1362 return get(AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V6);
1364 return get(AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V7);
1366 return get(AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V8);
1368 return get(AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V9);
1370 return get(AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V10);
1372 return get(AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V11);
1374 return get(AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V12);
1376 return get(AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V16);
1377 if (VecSize <= 1024)
1378 return get(AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V32);
1384 return get(AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V1);
1386 return get(AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V2);
1388 return get(AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V3);
1390 return get(AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V4);
1392 return get(AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V5);
1394 return get(AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V6);
1396 return get(AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V7);
1398 return get(AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V8);
1400 return get(AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V9);
1402 return get(AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V10);
1404 return get(AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V11);
1406 return get(AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V12);
1408 return get(AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V16);
1409 if (VecSize <= 1024)
1410 return get(AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V32);
1417 return AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V1;
1419 return AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V2;
1421 return AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V3;
1423 return AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V4;
1425 return AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V5;
1427 return AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V6;
1429 return AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V7;
1431 return AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V8;
1433 return AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V9;
1435 return AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V10;
1437 return AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V11;
1439 return AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V12;
1441 return AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V16;
1442 if (VecSize <= 1024)
1443 return AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V32;
1450 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V1;
1452 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V2;
1454 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V3;
1456 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V4;
1458 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V5;
1460 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V6;
1462 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V7;
1464 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V8;
1466 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V9;
1468 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V10;
1470 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V11;
1472 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V12;
1474 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V16;
1475 if (VecSize <= 1024)
1476 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V32;
1483 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B64_V1;
1485 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B64_V2;
1487 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B64_V4;
1489 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B64_V8;
1490 if (VecSize <= 1024)
1491 return AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B64_V16;
1498 bool IsSGPR)
const {
1510 assert(EltSize == 32 &&
"invalid reg indexing elt size");
1517 return NeedsCFI ? AMDGPU::SI_SPILL_S32_CFI_SAVE : AMDGPU::SI_SPILL_S32_SAVE;
1519 return NeedsCFI ? AMDGPU::SI_SPILL_S64_CFI_SAVE : AMDGPU::SI_SPILL_S64_SAVE;
1521 return NeedsCFI ? AMDGPU::SI_SPILL_S96_CFI_SAVE : AMDGPU::SI_SPILL_S96_SAVE;
1523 return NeedsCFI ? AMDGPU::SI_SPILL_S128_CFI_SAVE
1524 : AMDGPU::SI_SPILL_S128_SAVE;
1526 return NeedsCFI ? AMDGPU::SI_SPILL_S160_CFI_SAVE
1527 : AMDGPU::SI_SPILL_S160_SAVE;
1529 return NeedsCFI ? AMDGPU::SI_SPILL_S192_CFI_SAVE
1530 : AMDGPU::SI_SPILL_S192_SAVE;
1532 return NeedsCFI ? AMDGPU::SI_SPILL_S224_CFI_SAVE
1533 : AMDGPU::SI_SPILL_S224_SAVE;
1535 return AMDGPU::SI_SPILL_S256_SAVE;
1537 return AMDGPU::SI_SPILL_S288_SAVE;
1539 return AMDGPU::SI_SPILL_S320_SAVE;
1541 return AMDGPU::SI_SPILL_S352_SAVE;
1543 return AMDGPU::SI_SPILL_S384_SAVE;
1545 return NeedsCFI ? AMDGPU::SI_SPILL_S512_CFI_SAVE
1546 : AMDGPU::SI_SPILL_S512_SAVE;
1548 return NeedsCFI ? AMDGPU::SI_SPILL_S1024_CFI_SAVE
1549 : AMDGPU::SI_SPILL_S1024_SAVE;
1558 return AMDGPU::SI_SPILL_V16_SAVE;
1560 return NeedsCFI ? AMDGPU::SI_SPILL_V32_CFI_SAVE : AMDGPU::SI_SPILL_V32_SAVE;
1562 return NeedsCFI ? AMDGPU::SI_SPILL_V64_CFI_SAVE : AMDGPU::SI_SPILL_V64_SAVE;
1564 return NeedsCFI ? AMDGPU::SI_SPILL_V96_CFI_SAVE : AMDGPU::SI_SPILL_V96_SAVE;
1566 return NeedsCFI ? AMDGPU::SI_SPILL_V128_CFI_SAVE
1567 : AMDGPU::SI_SPILL_V128_SAVE;
1569 return NeedsCFI ? AMDGPU::SI_SPILL_V160_CFI_SAVE
1570 : AMDGPU::SI_SPILL_V160_SAVE;
1572 return NeedsCFI ? AMDGPU::SI_SPILL_V192_CFI_SAVE
1573 : AMDGPU::SI_SPILL_V192_SAVE;
1575 return NeedsCFI ? AMDGPU::SI_SPILL_V224_CFI_SAVE
1576 : AMDGPU::SI_SPILL_V224_SAVE;
1578 return NeedsCFI ? AMDGPU::SI_SPILL_V256_CFI_SAVE
1579 : AMDGPU::SI_SPILL_V256_SAVE;
1581 return NeedsCFI ? AMDGPU::SI_SPILL_V288_CFI_SAVE
1582 : AMDGPU::SI_SPILL_V288_SAVE;
1584 return NeedsCFI ? AMDGPU::SI_SPILL_V320_CFI_SAVE
1585 : AMDGPU::SI_SPILL_V320_SAVE;
1587 return NeedsCFI ? AMDGPU::SI_SPILL_V352_CFI_SAVE
1588 : AMDGPU::SI_SPILL_V352_SAVE;
1590 return NeedsCFI ? AMDGPU::SI_SPILL_V384_CFI_SAVE
1591 : AMDGPU::SI_SPILL_V384_SAVE;
1593 return NeedsCFI ? AMDGPU::SI_SPILL_V512_CFI_SAVE
1594 : AMDGPU::SI_SPILL_V512_SAVE;
1596 return NeedsCFI ? AMDGPU::SI_SPILL_V1024_CFI_SAVE
1597 : AMDGPU::SI_SPILL_V1024_SAVE;
1606 return NeedsCFI ? AMDGPU::SI_SPILL_AV32_CFI_SAVE
1607 : AMDGPU::SI_SPILL_AV32_SAVE;
1609 return NeedsCFI ? AMDGPU::SI_SPILL_AV64_CFI_SAVE
1610 : AMDGPU::SI_SPILL_AV64_SAVE;
1612 return NeedsCFI ? AMDGPU::SI_SPILL_AV96_CFI_SAVE
1613 : AMDGPU::SI_SPILL_AV96_SAVE;
1615 return NeedsCFI ? AMDGPU::SI_SPILL_AV128_CFI_SAVE
1616 : AMDGPU::SI_SPILL_AV128_SAVE;
1618 return NeedsCFI ? AMDGPU::SI_SPILL_AV160_CFI_SAVE
1619 : AMDGPU::SI_SPILL_AV160_SAVE;
1621 return NeedsCFI ? AMDGPU::SI_SPILL_AV192_CFI_SAVE
1622 : AMDGPU::SI_SPILL_AV192_SAVE;
1624 return NeedsCFI ? AMDGPU::SI_SPILL_AV224_CFI_SAVE
1625 : AMDGPU::SI_SPILL_AV224_SAVE;
1627 return NeedsCFI ? AMDGPU::SI_SPILL_AV256_CFI_SAVE
1628 : AMDGPU::SI_SPILL_AV256_SAVE;
1630 return AMDGPU::SI_SPILL_AV288_SAVE;
1632 return AMDGPU::SI_SPILL_AV320_SAVE;
1634 return AMDGPU::SI_SPILL_AV352_SAVE;
1636 return AMDGPU::SI_SPILL_AV384_SAVE;
1638 return NeedsCFI ? AMDGPU::SI_SPILL_AV512_CFI_SAVE
1639 : AMDGPU::SI_SPILL_AV512_SAVE;
1641 return NeedsCFI ? AMDGPU::SI_SPILL_AV1024_CFI_SAVE
1642 : AMDGPU::SI_SPILL_AV1024_SAVE;
1649 bool IsVectorSuperClass) {
1654 if (IsVectorSuperClass)
1655 return AMDGPU::SI_SPILL_WWM_AV32_SAVE;
1657 return AMDGPU::SI_SPILL_WWM_V32_SAVE;
1663 bool IsVectorSuperClass = RI.isVectorSuperClass(RC);
1670 if (ST.hasMAIInsts())
1676void SIInstrInfo::storeRegToStackSlotImpl(
1689 FrameInfo.getObjectAlign(FrameIndex));
1690 unsigned SpillSize = RI.getSpillSize(*RC);
1696 assert(SrcReg != AMDGPU::M0 &&
"m0 should not be spilled");
1697 assert(SrcReg != AMDGPU::EXEC_LO && SrcReg != AMDGPU::EXEC_HI &&
1698 SrcReg != AMDGPU::EXEC &&
"exec should not be spilled");
1707 if (SrcReg.
isVirtual() && SpillSize == 4) {
1721 SpillSize, *MFI, NeedsCFI);
1736 storeRegToStackSlotImpl(
MBB,
MI, SrcReg, isKill, FrameIndex, RC, VReg, Flags,
1745 storeRegToStackSlotImpl(
MBB,
MI, SrcReg, isKill, FrameIndex, RC,
Register(),
1752 return AMDGPU::SI_SPILL_S32_RESTORE;
1754 return AMDGPU::SI_SPILL_S64_RESTORE;
1756 return AMDGPU::SI_SPILL_S96_RESTORE;
1758 return AMDGPU::SI_SPILL_S128_RESTORE;
1760 return AMDGPU::SI_SPILL_S160_RESTORE;
1762 return AMDGPU::SI_SPILL_S192_RESTORE;
1764 return AMDGPU::SI_SPILL_S224_RESTORE;
1766 return AMDGPU::SI_SPILL_S256_RESTORE;
1768 return AMDGPU::SI_SPILL_S288_RESTORE;
1770 return AMDGPU::SI_SPILL_S320_RESTORE;
1772 return AMDGPU::SI_SPILL_S352_RESTORE;
1774 return AMDGPU::SI_SPILL_S384_RESTORE;
1776 return AMDGPU::SI_SPILL_S512_RESTORE;
1778 return AMDGPU::SI_SPILL_S1024_RESTORE;
1787 return AMDGPU::SI_SPILL_V16_RESTORE;
1789 return AMDGPU::SI_SPILL_V32_RESTORE;
1791 return AMDGPU::SI_SPILL_V64_RESTORE;
1793 return AMDGPU::SI_SPILL_V96_RESTORE;
1795 return AMDGPU::SI_SPILL_V128_RESTORE;
1797 return AMDGPU::SI_SPILL_V160_RESTORE;
1799 return AMDGPU::SI_SPILL_V192_RESTORE;
1801 return AMDGPU::SI_SPILL_V224_RESTORE;
1803 return AMDGPU::SI_SPILL_V256_RESTORE;
1805 return AMDGPU::SI_SPILL_V288_RESTORE;
1807 return AMDGPU::SI_SPILL_V320_RESTORE;
1809 return AMDGPU::SI_SPILL_V352_RESTORE;
1811 return AMDGPU::SI_SPILL_V384_RESTORE;
1813 return AMDGPU::SI_SPILL_V512_RESTORE;
1815 return AMDGPU::SI_SPILL_V1024_RESTORE;
1824 return AMDGPU::SI_SPILL_AV32_RESTORE;
1826 return AMDGPU::SI_SPILL_AV64_RESTORE;
1828 return AMDGPU::SI_SPILL_AV96_RESTORE;
1830 return AMDGPU::SI_SPILL_AV128_RESTORE;
1832 return AMDGPU::SI_SPILL_AV160_RESTORE;
1834 return AMDGPU::SI_SPILL_AV192_RESTORE;
1836 return AMDGPU::SI_SPILL_AV224_RESTORE;
1838 return AMDGPU::SI_SPILL_AV256_RESTORE;
1840 return AMDGPU::SI_SPILL_AV288_RESTORE;
1842 return AMDGPU::SI_SPILL_AV320_RESTORE;
1844 return AMDGPU::SI_SPILL_AV352_RESTORE;
1846 return AMDGPU::SI_SPILL_AV384_RESTORE;
1848 return AMDGPU::SI_SPILL_AV512_RESTORE;
1850 return AMDGPU::SI_SPILL_AV1024_RESTORE;
1857 bool IsVectorSuperClass) {
1862 if (IsVectorSuperClass)
1863 return AMDGPU::SI_SPILL_WWM_AV32_RESTORE;
1865 return AMDGPU::SI_SPILL_WWM_V32_RESTORE;
1871 bool IsVectorSuperClass = RI.isVectorSuperClass(RC);
1878 if (ST.hasMAIInsts())
1881 assert(!RI.isAGPRClass(RC));
1895 unsigned SpillSize = RI.getSpillSize(*RC);
1902 FrameInfo.getObjectAlign(FrameIndex));
1904 if (RI.isSGPRClass(RC)) {
1907 assert(DestReg != AMDGPU::M0 &&
"m0 should not be reloaded into");
1908 assert(DestReg != AMDGPU::EXEC_LO && DestReg != AMDGPU::EXEC_HI &&
1909 DestReg != AMDGPU::EXEC &&
"exec should not be spilled");
1914 if (DestReg.
isVirtual() && SpillSize == 4) {
1943 unsigned Quantity)
const {
1945 unsigned MaxSNopCount = 1u << ST.getSNopBits();
1946 while (Quantity > 0) {
1947 unsigned Arg = std::min(Quantity, MaxSNopCount);
1958 constexpr unsigned DoorbellIDMask = 0x3ff;
1959 constexpr unsigned ECQueueWaveAbort = 0x400;
1964 if (!
MBB.succ_empty() || std::next(
MI.getIterator()) !=
MBB.end()) {
1965 MBB.splitAt(
MI,
false);
1969 MBB.addSuccessor(TrapBB);
1979 BuildMI(*TrapBB, TrapBB->
end(),
DL,
get(AMDGPU::S_MOV_B32), AMDGPU::TTMP2)
1983 BuildMI(*TrapBB, TrapBB->
end(),
DL,
get(AMDGPU::S_AND_B32), DoorbellRegMasked)
1988 BuildMI(*TrapBB, TrapBB->
end(),
DL,
get(AMDGPU::S_OR_B32), SetWaveAbortBit)
1989 .
addUse(DoorbellRegMasked)
1990 .
addImm(ECQueueWaveAbort);
1991 BuildMI(*TrapBB, TrapBB->
end(),
DL,
get(AMDGPU::S_MOV_B32), AMDGPU::M0)
1992 .
addUse(SetWaveAbortBit);
1995 BuildMI(*TrapBB, TrapBB->
end(),
DL,
get(AMDGPU::S_MOV_B32), AMDGPU::M0)
2006 return MBB.getNextNode();
2010 switch (
MI.getOpcode()) {
2012 if (
MI.isMetaInstruction())
2017 return MI.getOperand(0).getImm() + 1;
2028 switch (
MI.getOpcode()) {
2030 case AMDGPU::S_MOV_B64_term:
2033 MI.setDesc(
get(AMDGPU::S_MOV_B64));
2036 case AMDGPU::S_MOV_B32_term:
2039 MI.setDesc(
get(AMDGPU::S_MOV_B32));
2042 case AMDGPU::S_XOR_B64_term:
2045 MI.setDesc(
get(AMDGPU::S_XOR_B64));
2048 case AMDGPU::S_XOR_B32_term:
2051 MI.setDesc(
get(AMDGPU::S_XOR_B32));
2053 case AMDGPU::S_OR_B64_term:
2056 MI.setDesc(
get(AMDGPU::S_OR_B64));
2058 case AMDGPU::S_OR_B32_term:
2061 MI.setDesc(
get(AMDGPU::S_OR_B32));
2064 case AMDGPU::S_ANDN2_B64_term:
2067 MI.setDesc(
get(AMDGPU::S_ANDN2_B64));
2070 case AMDGPU::S_ANDN2_B32_term:
2073 MI.setDesc(
get(AMDGPU::S_ANDN2_B32));
2076 case AMDGPU::S_AND_B64_term:
2079 MI.setDesc(
get(AMDGPU::S_AND_B64));
2082 case AMDGPU::S_AND_B32_term:
2085 MI.setDesc(
get(AMDGPU::S_AND_B32));
2088 case AMDGPU::S_AND_SAVEEXEC_B64_term:
2091 MI.setDesc(
get(AMDGPU::S_AND_SAVEEXEC_B64));
2094 case AMDGPU::S_AND_SAVEEXEC_B32_term:
2097 MI.setDesc(
get(AMDGPU::S_AND_SAVEEXEC_B32));
2100 case AMDGPU::V_CMPX_EQ_U32_nosdst_e32_term:
2101 MI.setDesc(
get(AMDGPU::V_CMPX_EQ_U32_nosdst_e32));
2103 case AMDGPU::V_CMPX_EQ_U64_nosdst_e32_term:
2104 MI.setDesc(
get(AMDGPU::V_CMPX_EQ_U64_nosdst_e32));
2107 case AMDGPU::SI_SPILL_S32_TO_VGPR:
2108 MI.setDesc(
get(AMDGPU::V_WRITELANE_B32));
2111 case AMDGPU::SI_RESTORE_S32_FROM_VGPR:
2112 MI.setDesc(
get(AMDGPU::V_READLANE_B32));
2114 case AMDGPU::AV_MOV_B32_IMM_PSEUDO: {
2118 get(IsAGPR ? AMDGPU::V_ACCVGPR_WRITE_B32_e64 : AMDGPU::V_MOV_B32_e32));
2121 case AMDGPU::AV_MOV_B64_IMM_PSEUDO: {
2124 int64_t
Imm =
MI.getOperand(1).getImm();
2126 Register DstLo = RI.getSubReg(Dst, AMDGPU::sub0);
2127 Register DstHi = RI.getSubReg(Dst, AMDGPU::sub1);
2132 MI.eraseFromParent();
2138 case AMDGPU::V_MOV_B64_PSEUDO: {
2140 Register DstLo = RI.getSubReg(Dst, AMDGPU::sub0);
2141 Register DstHi = RI.getSubReg(Dst, AMDGPU::sub1);
2149 if (ST.hasVMovB64Inst() && Mov64RC->
contains(Dst)) {
2150 MI.setDesc(Mov64Desc);
2154 (
SrcOp.isGlobal() && ST.has64BitLiterals()))
2157 if (
SrcOp.isGlobal()) {
2162 unsigned BaseFlags, LoReloc, HiReloc;
2163 std::tie(BaseFlags, LoReloc, HiReloc) =
2170 }
else if (
SrcOp.isImm()) {
2172 APInt Lo(32,
Imm.getLoBits(32).getZExtValue());
2173 APInt Hi(32,
Imm.getHiBits(32).getZExtValue());
2197 if (ST.hasPkMovB32() &&
2216 MI.eraseFromParent();
2219 case AMDGPU::V_MOV_B64_DPP_PSEUDO: {
2223 case AMDGPU::S_MOV_B64_IMM_PSEUDO: {
2227 if (ST.has64BitLiterals()) {
2228 MI.setDesc(
get(AMDGPU::S_MOV_B64));
2232 if (
SrcOp.isGlobal()) {
2234 Register DstLo = RI.getSubReg(Dst, AMDGPU::sub0);
2235 Register DstHi = RI.getSubReg(Dst, AMDGPU::sub1);
2238 unsigned BaseFlags, LoReloc, HiReloc;
2239 std::tie(BaseFlags, LoReloc, HiReloc) =
2246 MI.eraseFromParent();
2253 MI.setDesc(
get(AMDGPU::S_MOV_B64));
2258 Register DstLo = RI.getSubReg(Dst, AMDGPU::sub0);
2259 Register DstHi = RI.getSubReg(Dst, AMDGPU::sub1);
2261 APInt Lo(32,
Imm.getLoBits(32).getZExtValue());
2262 APInt Hi(32,
Imm.getHiBits(32).getZExtValue());
2267 MI.eraseFromParent();
2270 case AMDGPU::V_SET_INACTIVE_B32: {
2274 .
add(
MI.getOperand(3))
2275 .
add(
MI.getOperand(4))
2276 .
add(
MI.getOperand(1))
2277 .
add(
MI.getOperand(2))
2278 .
add(
MI.getOperand(5));
2279 MI.eraseFromParent();
2282 case AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V1:
2283 case AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V2:
2284 case AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V3:
2285 case AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V4:
2286 case AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V5:
2287 case AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V6:
2288 case AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V7:
2289 case AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V8:
2290 case AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V9:
2291 case AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V10:
2292 case AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V11:
2293 case AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V12:
2294 case AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V16:
2295 case AMDGPU::V_INDIRECT_REG_WRITE_MOVREL_B32_V32:
2296 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V1:
2297 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V2:
2298 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V3:
2299 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V4:
2300 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V5:
2301 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V6:
2302 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V7:
2303 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V8:
2304 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V9:
2305 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V10:
2306 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V11:
2307 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V12:
2308 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V16:
2309 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B32_V32:
2310 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B64_V1:
2311 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B64_V2:
2312 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B64_V4:
2313 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B64_V8:
2314 case AMDGPU::S_INDIRECT_REG_WRITE_MOVREL_B64_V16: {
2318 if (RI.hasVGPRs(EltRC)) {
2319 Opc = AMDGPU::V_MOVRELD_B32_e32;
2321 Opc = RI.getRegSizeInBits(*EltRC) == 64 ? AMDGPU::S_MOVRELD_B64
2322 : AMDGPU::S_MOVRELD_B32;
2327 bool IsUndef =
MI.getOperand(1).isUndef();
2328 unsigned SubReg =
MI.getOperand(3).getImm();
2329 assert(VecReg ==
MI.getOperand(1).getReg());
2334 .
add(
MI.getOperand(2))
2338 const int ImpDefIdx =
2340 const int ImpUseIdx = ImpDefIdx + 1;
2342 MI.eraseFromParent();
2345 case AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V1:
2346 case AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V2:
2347 case AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V3:
2348 case AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V4:
2349 case AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V5:
2350 case AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V6:
2351 case AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V7:
2352 case AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V8:
2353 case AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V9:
2354 case AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V10:
2355 case AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V11:
2356 case AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V12:
2357 case AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V16:
2358 case AMDGPU::V_INDIRECT_REG_WRITE_GPR_IDX_B32_V32: {
2359 assert(ST.useVGPRIndexMode());
2361 bool IsUndef =
MI.getOperand(1).isUndef();
2370 const MCInstrDesc &OpDesc =
get(AMDGPU::V_MOV_B32_indirect_write);
2374 .
add(
MI.getOperand(2))
2378 const int ImpDefIdx =
2380 const int ImpUseIdx = ImpDefIdx + 1;
2387 MI.eraseFromParent();
2390 case AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V1:
2391 case AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V2:
2392 case AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V3:
2393 case AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V4:
2394 case AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V5:
2395 case AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V6:
2396 case AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V7:
2397 case AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V8:
2398 case AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V9:
2399 case AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V10:
2400 case AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V11:
2401 case AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V12:
2402 case AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V16:
2403 case AMDGPU::V_INDIRECT_REG_READ_GPR_IDX_B32_V32: {
2404 assert(ST.useVGPRIndexMode());
2407 bool IsUndef =
MI.getOperand(1).isUndef();
2411 .
add(
MI.getOperand(2))
2424 MI.eraseFromParent();
2427 case AMDGPU::SI_PC_ADD_REL_OFFSET: {
2430 Register RegLo = RI.getSubReg(Reg, AMDGPU::sub0);
2431 Register RegHi = RI.getSubReg(Reg, AMDGPU::sub1);
2450 if (ST.hasGetPCZeroExtension()) {
2454 BuildMI(MF,
DL,
get(AMDGPU::S_SEXT_I32_I16), RegHi).addReg(RegHi));
2461 BuildMI(MF,
DL,
get(AMDGPU::S_ADD_U32), RegLo).addReg(RegLo).add(OpLo));
2471 MI.eraseFromParent();
2474 case AMDGPU::SI_PC_ADD_REL_OFFSET64: {
2484 Op.setOffset(
Op.getOffset() + 4);
2486 BuildMI(MF,
DL,
get(AMDGPU::S_ADD_U64), Reg).addReg(Reg).add(
Op));
2490 MI.eraseFromParent();
2493 case AMDGPU::ENTER_STRICT_WWM: {
2499 case AMDGPU::ENTER_STRICT_WQM: {
2506 MI.eraseFromParent();
2509 case AMDGPU::EXIT_STRICT_WWM:
2510 case AMDGPU::EXIT_STRICT_WQM: {
2516 case AMDGPU::SI_RETURN: {
2530 MI.eraseFromParent();
2534 case AMDGPU::S_MUL_U64_U32_PSEUDO:
2535 case AMDGPU::S_MUL_I64_I32_PSEUDO:
2536 MI.setDesc(
get(AMDGPU::S_MUL_U64));
2539 case AMDGPU::S_GETPC_B64_pseudo:
2540 MI.setDesc(
get(AMDGPU::S_GETPC_B64));
2541 if (ST.hasGetPCZeroExtension()) {
2543 Register DstHi = RI.getSubReg(Dst, AMDGPU::sub1);
2552 case AMDGPU::V_MAX_BF16_PSEUDO_e64: {
2553 assert(ST.hasBF16PackedInsts());
2554 MI.setDesc(
get(AMDGPU::V_PK_MAX_NUM_BF16));
2565 case AMDGPU::GET_STACK_BASE:
2568 if (ST.getFrameLowering()->mayReserveScratchForCWSR(*
MBB.getParent())) {
2575 Register DestReg =
MI.getOperand(0).getReg();
2585 MI.getOperand(
MI.getNumExplicitOperands()).setIsDead(
false);
2586 MI.getOperand(
MI.getNumExplicitOperands()).setIsUse();
2587 MI.setDesc(
get(AMDGPU::S_CMOVK_I32));
2590 MI.setDesc(
get(AMDGPU::S_MOV_B32));
2593 MI.getNumExplicitOperands());
2611 case AMDGPU::S_MOV_B64:
2612 case AMDGPU::S_MOV_B64_IMM_PSEUDO: {
2621 if (UsedLanes.
all())
2626 unsigned LoSubReg = RI.composeSubRegIndices(OrigSubReg, AMDGPU::sub0);
2627 unsigned HiSubReg = RI.composeSubRegIndices(OrigSubReg, AMDGPU::sub1);
2629 bool NeedLo = (UsedLanes & RI.getSubRegIndexLaneMask(LoSubReg)).any();
2630 bool NeedHi = (UsedLanes & RI.getSubRegIndexLaneMask(HiSubReg)).any();
2632 if (NeedLo && NeedHi)
2636 int32_t Imm32 = NeedLo ?
Lo_32(Imm64) :
Hi_32(Imm64);
2638 unsigned UseSubReg = NeedLo ? LoSubReg : HiSubReg;
2647 case AMDGPU::S_LOAD_DWORDX16_IMM:
2648 case AMDGPU::S_LOAD_DWORDX8_IMM: {
2661 for (
auto &CandMO :
I->operands()) {
2662 if (!CandMO.isReg() || CandMO.getReg() != RegToFind || CandMO.isDef())
2670 if (!UseMO || UseMO->
getSubReg() == AMDGPU::NoSubRegister)
2674 unsigned SubregSize = RI.getSubRegIdxSize(UseMO->
getSubReg());
2680 unsigned NewOpcode = -1;
2681 if (SubregSize == 256)
2682 NewOpcode = AMDGPU::S_LOAD_DWORDX8_IMM;
2683 else if (SubregSize == 128)
2684 NewOpcode = AMDGPU::S_LOAD_DWORDX4_IMM;
2694 UseMO->
setSubReg(AMDGPU::NoSubRegister);
2699 MI->getOperand(0).setReg(DestReg);
2700 MI->getOperand(0).setSubReg(AMDGPU::NoSubRegister);
2704 OffsetMO->
setImm(FinalOffset);
2710 MI->setMemRefs(*MF, NewMMOs);
2723std::pair<MachineInstr*, MachineInstr*>
2725 assert (
MI.getOpcode() == AMDGPU::V_MOV_B64_DPP_PSEUDO);
2727 if (ST.hasVMovB64Inst() && ST.hasFeature(AMDGPU::FeatureDPALU_DPP) &&
2730 MI.setDesc(
get(AMDGPU::V_MOV_B64_dpp));
2731 return std::pair(&
MI,
nullptr);
2742 for (
auto Sub : { AMDGPU::sub0, AMDGPU::sub1 }) {
2744 if (Dst.isPhysical()) {
2745 MovDPP.addDef(RI.getSubReg(Dst,
Sub));
2752 for (
unsigned I = 1;
I <= 2; ++
I) {
2755 if (
SrcOp.isImm()) {
2757 Imm.ashrInPlace(Part * 32);
2758 MovDPP.addImm(
Imm.getLoBits(32).getZExtValue());
2762 if (Src.isPhysical())
2763 MovDPP.addReg(RI.getSubReg(Src,
Sub));
2770 MovDPP.addImm(MO.getImm());
2772 Split[Part] = MovDPP;
2776 if (Dst.isVirtual())
2783 MI.eraseFromParent();
2784 return std::pair(Split[0], Split[1]);
2787std::optional<DestSourcePair>
2789 if (
MI.getOpcode() == AMDGPU::WWM_COPY)
2792 return std::nullopt;
2796 AMDGPU::OpName Src0OpName,
2798 AMDGPU::OpName Src1OpName)
const {
2805 "All commutable instructions have both src0 and src1 modifiers");
2807 int Src0ModsVal = Src0Mods->
getImm();
2808 int Src1ModsVal = Src1Mods->
getImm();
2810 Src1Mods->
setImm(Src0ModsVal);
2811 Src0Mods->
setImm(Src1ModsVal);
2820 bool IsKill = RegOp.
isKill();
2822 bool IsUndef = RegOp.
isUndef();
2823 bool IsDebug = RegOp.
isDebug();
2825 if (NonRegOp.
isImm())
2827 else if (NonRegOp.
isFI())
2848 int64_t NonRegVal = NonRegOp1.
getImm();
2851 NonRegOp2.
setImm(NonRegVal);
2858 unsigned OpIdx1)
const {
2863 unsigned Opc =
MI.getOpcode();
2864 int Src0Idx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src0);
2874 if ((
int)OpIdx0 == Src0Idx && !MO0.
isReg() &&
2877 if ((
int)OpIdx1 == Src0Idx && !MO1.
isReg() &&
2882 if ((
int)OpIdx1 != Src0Idx && MO0.
isReg()) {
2888 if ((
int)OpIdx0 != Src0Idx && MO1.
isReg()) {
2903 unsigned Src1Idx)
const {
2904 assert(!NewMI &&
"this should never be used");
2906 unsigned Opc =
MI.getOpcode();
2908 if (CommutedOpcode == -1)
2911 if (Src0Idx > Src1Idx)
2914 assert(AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src0) ==
2915 static_cast<int>(Src0Idx) &&
2916 AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src1) ==
2917 static_cast<int>(Src1Idx) &&
2918 "inconsistency with findCommutedOpIndices");
2943 Src1, AMDGPU::OpName::src1_modifiers);
2946 AMDGPU::OpName::src1_sel);
2958 unsigned &SrcOpIdx0,
2959 unsigned &SrcOpIdx1)
const {
2964 unsigned &SrcOpIdx0,
2965 unsigned &SrcOpIdx1)
const {
2966 if (!
Desc.isCommutable())
2969 unsigned Opc =
Desc.getOpcode();
2970 int Src0Idx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src0);
2974 int Src1Idx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src1);
2978 return fixCommutedOpIndices(SrcOpIdx0, SrcOpIdx1, Src0Idx, Src1Idx);
2982 int64_t BrOffset)
const {
2999 return MI.getOperand(0).getMBB();
3004 if (
MI.getOpcode() == AMDGPU::SI_IF ||
MI.getOpcode() == AMDGPU::SI_ELSE ||
3005 MI.getOpcode() == AMDGPU::SI_LOOP)
3017 "new block should be inserted for expanding unconditional branch");
3020 "restore block should be inserted for restoring clobbered registers");
3028 if (ST.useAddPC64Inst()) {
3030 MCCtx.createTempSymbol(
"offset",
true);
3034 MCCtx.createTempSymbol(
"post_addpc",
true);
3035 AddPC->setPostInstrSymbol(*MF, PostAddPCLabel);
3039 Offset->setVariableValue(OffsetExpr);
3043 assert(RS &&
"RegScavenger required for long branching");
3051 const bool FlushSGPRWrites = (ST.isWave64() && ST.hasVALUMaskWriteHazard()) ||
3052 ST.hasVALUReadSGPRHazard();
3053 auto ApplyHazardWorkarounds = [
this, &
MBB, &
I, &
DL, FlushSGPRWrites]() {
3054 if (FlushSGPRWrites)
3062 ApplyHazardWorkarounds();
3065 MCCtx.createTempSymbol(
"post_getpc",
true);
3069 MCCtx.createTempSymbol(
"offset_lo",
true);
3071 MCCtx.createTempSymbol(
"offset_hi",
true);
3074 .
addReg(PCReg, {}, AMDGPU::sub0)
3078 .
addReg(PCReg, {}, AMDGPU::sub1)
3080 ApplyHazardWorkarounds();
3121 if (LongBranchReservedReg) {
3122 RS->enterBasicBlock(
MBB);
3123 Scav = LongBranchReservedReg;
3125 RS->enterBasicBlockEnd(
MBB);
3126 Scav = RS->scavengeRegisterBackwards(
3131 RS->setRegUsed(Scav);
3139 TRI->spillEmergencySGPR(GetPC, RestoreBB, AMDGPU::SGPR0_SGPR1, RS);
3156unsigned SIInstrInfo::getBranchOpcode(SIInstrInfo::BranchPredicate
Cond) {
3158 case SIInstrInfo::SCC_TRUE:
3159 return AMDGPU::S_CBRANCH_SCC1;
3160 case SIInstrInfo::SCC_FALSE:
3161 return AMDGPU::S_CBRANCH_SCC0;
3162 case SIInstrInfo::VCCNZ:
3163 return AMDGPU::S_CBRANCH_VCCNZ;
3164 case SIInstrInfo::VCCZ:
3165 return AMDGPU::S_CBRANCH_VCCZ;
3166 case SIInstrInfo::EXECNZ:
3167 return AMDGPU::S_CBRANCH_EXECNZ;
3168 case SIInstrInfo::EXECZ:
3169 return AMDGPU::S_CBRANCH_EXECZ;
3175SIInstrInfo::BranchPredicate SIInstrInfo::getBranchPredicate(
unsigned Opcode) {
3177 case AMDGPU::S_CBRANCH_SCC0:
3179 case AMDGPU::S_CBRANCH_SCC1:
3181 case AMDGPU::S_CBRANCH_VCCNZ:
3183 case AMDGPU::S_CBRANCH_VCCZ:
3185 case AMDGPU::S_CBRANCH_EXECNZ:
3187 case AMDGPU::S_CBRANCH_EXECZ:
3199 bool AllowModify)
const {
3200 if (
I->getOpcode() == AMDGPU::S_BRANCH) {
3202 TBB =
I->getOperand(0).getMBB();
3206 BranchPredicate Pred = getBranchPredicate(
I->getOpcode());
3207 if (Pred == INVALID_BR)
3212 Cond.push_back(
I->getOperand(1));
3216 if (
I ==
MBB.end()) {
3222 if (
I->getOpcode() == AMDGPU::S_BRANCH) {
3224 FBB =
I->getOperand(0).getMBB();
3234 bool AllowModify)
const {
3242 while (
I != E && !
I->isBranch() && !
I->isReturn()) {
3243 switch (
I->getOpcode()) {
3244 case AMDGPU::S_MOV_B64_term:
3245 case AMDGPU::S_XOR_B64_term:
3246 case AMDGPU::S_OR_B64_term:
3247 case AMDGPU::S_ANDN2_B64_term:
3248 case AMDGPU::S_AND_B64_term:
3249 case AMDGPU::S_AND_SAVEEXEC_B64_term:
3250 case AMDGPU::S_MOV_B32_term:
3251 case AMDGPU::S_XOR_B32_term:
3252 case AMDGPU::S_OR_B32_term:
3253 case AMDGPU::S_ANDN2_B32_term:
3254 case AMDGPU::S_AND_B32_term:
3255 case AMDGPU::S_AND_SAVEEXEC_B32_term:
3256 case AMDGPU::V_CMPX_EQ_U32_nosdst_e32_term:
3257 case AMDGPU::V_CMPX_EQ_U64_nosdst_e32_term:
3260 case AMDGPU::SI_ELSE:
3261 case AMDGPU::SI_KILL_I1_TERMINATOR:
3262 case AMDGPU::SI_KILL_F32_COND_IMM_TERMINATOR:
3279 int *BytesRemoved)
const {
3281 unsigned RemovedSize = 0;
3284 if (
MI.isBranch() ||
MI.isReturn()) {
3286 MI.eraseFromParent();
3292 *BytesRemoved = RemovedSize;
3309 int *BytesAdded)
const {
3310 if (!FBB &&
Cond.empty()) {
3314 *BytesAdded = ST.hasOffset3fBug() ? 8 : 4;
3321 = getBranchOpcode(
static_cast<BranchPredicate
>(
Cond[0].
getImm()));
3333 *BytesAdded = ST.hasOffset3fBug() ? 8 : 4;
3351 *BytesAdded = ST.hasOffset3fBug() ? 16 : 8;
3358 if (
Cond.size() != 2) {
3362 if (
Cond[0].isImm()) {
3383 bool shouldIgnoreForPipelining(
const MachineInstr *
MI)
const override {
3387 std::optional<bool> createTripCountGreaterCondition(
3388 int TC, MachineBasicBlock &
MBB,
3389 SmallVectorImpl<MachineOperand> &CondParam)
override {
3390 CondParam = this->
Cond;
3394 void adjustTripCount(
int TripCountAdjust)
override {}
3396 void setPreheader(MachineBasicBlock *NewPreheader)
override {}
3400std::unique_ptr<TargetInstrInfo::PipelinerLoopInfo>
3409 if (
TBB == LoopBB && FBB == LoopBB)
3416 assert((
TBB == LoopBB || FBB == LoopBB) &&
3417 "The Loop must be a single-basic-block loop");
3420 BranchPredicate Pred =
static_cast<BranchPredicate
>(
Cond[0].getImm());
3421 if (Pred != SCC_TRUE && Pred != SCC_FALSE)
3426 if (
MI.isCall() ||
MI.isInlineAsm())
3441 if (CmpI == Instructions.end() || CmpI->isPHI())
3445 return std::make_unique<AMDGPUPipelinerLoopInfo>(
CmpInst,
Cond);
3451 Register FalseReg,
int &CondCycles,
3452 int &TrueCycles,
int &FalseCycles)
const {
3462 CondCycles = TrueCycles = FalseCycles = NumInsts;
3465 return RI.hasVGPRs(RC) && NumInsts <= 6;
3479 if (NumInsts % 2 == 0)
3482 CondCycles = TrueCycles = FalseCycles = NumInsts;
3483 return RI.isSGPRClass(RC);
3494 BranchPredicate Pred =
static_cast<BranchPredicate
>(
Cond[0].getImm());
3495 if (Pred == VCCZ || Pred == SCC_FALSE) {
3496 Pred =
static_cast<BranchPredicate
>(-Pred);
3502 unsigned DstSize = RI.getRegSizeInBits(*DstRC);
3504 if (DstSize == 32) {
3506 if (Pred == SCC_TRUE) {
3521 if (DstSize == 64 && Pred == SCC_TRUE) {
3531 static const int16_t Sub0_15[] = {
3532 AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3,
3533 AMDGPU::sub4, AMDGPU::sub5, AMDGPU::sub6, AMDGPU::sub7,
3534 AMDGPU::sub8, AMDGPU::sub9, AMDGPU::sub10, AMDGPU::sub11,
3535 AMDGPU::sub12, AMDGPU::sub13, AMDGPU::sub14, AMDGPU::sub15,
3538 static const int16_t Sub0_15_64[] = {
3539 AMDGPU::sub0_sub1, AMDGPU::sub2_sub3,
3540 AMDGPU::sub4_sub5, AMDGPU::sub6_sub7,
3541 AMDGPU::sub8_sub9, AMDGPU::sub10_sub11,
3542 AMDGPU::sub12_sub13, AMDGPU::sub14_sub15,
3545 unsigned SelOp = AMDGPU::V_CNDMASK_B32_e32;
3547 const int16_t *SubIndices = Sub0_15;
3548 int NElts = DstSize / 32;
3552 if (Pred == SCC_TRUE) {
3554 SelOp = AMDGPU::S_CSELECT_B32;
3555 EltRC = &AMDGPU::SGPR_32RegClass;
3557 SelOp = AMDGPU::S_CSELECT_B64;
3558 EltRC = &AMDGPU::SGPR_64RegClass;
3559 SubIndices = Sub0_15_64;
3565 MBB,
I,
DL,
get(AMDGPU::REG_SEQUENCE), DstReg);
3570 for (
int Idx = 0; Idx != NElts; ++Idx) {
3574 unsigned SubIdx = SubIndices[Idx];
3577 if (SelOp == AMDGPU::V_CNDMASK_B32_e32) {
3579 .
addReg(FalseReg, {}, SubIdx)
3580 .addReg(TrueReg, {}, SubIdx);
3583 .
addReg(TrueReg, {}, SubIdx)
3584 .addReg(FalseReg, {}, SubIdx);
3597 if (
MI.isBranch() ||
MI.isCall() ||
MI.isReturn() ||
MI.isIndirectBranch())
3600 switch (
MI.getOpcode()) {
3601 case AMDGPU::S_ENDPGM:
3602 case AMDGPU::S_ENDPGM_SAVED:
3603 case AMDGPU::S_TRAP:
3604 case AMDGPU::S_GETREG_B32:
3605 case AMDGPU::S_SETREG_B32:
3606 case AMDGPU::S_SETREG_B32_mode:
3607 case AMDGPU::S_SETREG_IMM32_B32:
3608 case AMDGPU::S_SETREG_IMM32_B32_mode:
3609 case AMDGPU::S_SENDMSG:
3610 case AMDGPU::S_SENDMSGHALT:
3611 case AMDGPU::S_SENDMSG_RTN_B32:
3612 case AMDGPU::S_SENDMSG_RTN_B64:
3613 case AMDGPU::S_BARRIER_WAIT:
3614 case AMDGPU::S_BARRIER_SIGNAL_M0:
3615 case AMDGPU::S_BARRIER_SIGNAL_IMM:
3616 case AMDGPU::S_BARRIER_SIGNAL_ISFIRST_M0:
3617 case AMDGPU::S_BARRIER_SIGNAL_ISFIRST_IMM:
3625 switch (
MI.getOpcode()) {
3626 case AMDGPU::V_MOV_B16_t16_e32:
3627 case AMDGPU::V_MOV_B16_t16_e64:
3628 case AMDGPU::V_MOV_B32_e32:
3629 case AMDGPU::V_MOV_B32_e64:
3630 case AMDGPU::V_MOV_B64_PSEUDO:
3631 case AMDGPU::V_MOV_B64_e32:
3632 case AMDGPU::V_MOV_B64_e64:
3633 case AMDGPU::S_MOV_B32:
3634 case AMDGPU::S_MOV_B64:
3635 case AMDGPU::S_MOV_B64_IMM_PSEUDO:
3637 case AMDGPU::WWM_COPY:
3638 case AMDGPU::V_ACCVGPR_WRITE_B32_e64:
3639 case AMDGPU::V_ACCVGPR_READ_B32_e64:
3640 case AMDGPU::V_ACCVGPR_MOV_B32:
3641 case AMDGPU::AV_MOV_B32_IMM_PSEUDO:
3642 case AMDGPU::AV_MOV_B64_IMM_PSEUDO:
3650 switch (
MI.getOpcode()) {
3651 case AMDGPU::V_MOV_B16_t16_e32:
3652 case AMDGPU::V_MOV_B16_t16_e64:
3654 case AMDGPU::V_MOV_B32_e32:
3655 case AMDGPU::V_MOV_B32_e64:
3656 case AMDGPU::V_MOV_B64_PSEUDO:
3657 case AMDGPU::V_MOV_B64_e32:
3658 case AMDGPU::V_MOV_B64_e64:
3659 case AMDGPU::S_MOV_B32:
3660 case AMDGPU::S_MOV_B64:
3661 case AMDGPU::S_MOV_B64_IMM_PSEUDO:
3663 case AMDGPU::WWM_COPY:
3664 case AMDGPU::V_ACCVGPR_WRITE_B32_e64:
3665 case AMDGPU::V_ACCVGPR_READ_B32_e64:
3666 case AMDGPU::V_ACCVGPR_MOV_B32:
3667 case AMDGPU::AV_MOV_B32_IMM_PSEUDO:
3668 case AMDGPU::AV_MOV_B64_IMM_PSEUDO:
3676 AMDGPU::OpName::src0_modifiers, AMDGPU::OpName::src1_modifiers,
3677 AMDGPU::OpName::src2_modifiers, AMDGPU::OpName::clamp,
3678 AMDGPU::OpName::omod, AMDGPU::OpName::op_sel};
3681 unsigned Opc =
MI.getOpcode();
3683 int Idx = AMDGPU::getNamedOperandIdx(
Opc, Name);
3685 MI.removeOperand(Idx);
3691 MI.setDesc(NewDesc);
3697 unsigned NumOps =
Desc.getNumOperands() +
Desc.implicit_uses().size() +
3698 Desc.implicit_defs().size();
3700 for (
unsigned I =
MI.getNumOperands() - 1;
I >=
NumOps; --
I)
3701 MI.removeOperand(
I);
3705 unsigned SubRegIndex) {
3706 switch (SubRegIndex) {
3707 case AMDGPU::NoSubRegister:
3717 case AMDGPU::sub1_lo16:
3719 case AMDGPU::sub1_hi16:
3722 return std::nullopt;
3730 case AMDGPU::V_MAC_F16_e32:
3731 case AMDGPU::V_MAC_F16_e64:
3732 case AMDGPU::V_MAD_F16_e64:
3733 return AMDGPU::V_MADAK_F16;
3734 case AMDGPU::V_MAC_F32_e32:
3735 case AMDGPU::V_MAC_F32_e64:
3736 case AMDGPU::V_MAD_F32_e64:
3737 return AMDGPU::V_MADAK_F32;
3738 case AMDGPU::V_FMAC_F32_e32:
3739 case AMDGPU::V_FMAC_F32_e64:
3740 case AMDGPU::V_FMA_F32_e64:
3741 return AMDGPU::V_FMAAK_F32;
3742 case AMDGPU::V_FMAC_F16_e32:
3743 case AMDGPU::V_FMAC_F16_e64:
3744 case AMDGPU::V_FMAC_F16_t16_e64:
3745 case AMDGPU::V_FMAC_F16_fake16_e64:
3746 case AMDGPU::V_FMAC_F16_t16_e32:
3747 case AMDGPU::V_FMAC_F16_fake16_e32:
3748 case AMDGPU::V_FMA_F16_e64:
3749 return ST.hasTrue16BitInsts() ? ST.useRealTrue16Insts()
3750 ? AMDGPU::V_FMAAK_F16_t16
3751 : AMDGPU::V_FMAAK_F16_fake16
3752 : AMDGPU::V_FMAAK_F16;
3753 case AMDGPU::V_FMAC_F64_e32:
3754 case AMDGPU::V_FMAC_F64_e64:
3755 case AMDGPU::V_FMA_F64_e64:
3756 return AMDGPU::V_FMAAK_F64;
3764 case AMDGPU::V_MAC_F16_e32:
3765 case AMDGPU::V_MAC_F16_e64:
3766 case AMDGPU::V_MAD_F16_e64:
3767 return AMDGPU::V_MADMK_F16;
3768 case AMDGPU::V_MAC_F32_e32:
3769 case AMDGPU::V_MAC_F32_e64:
3770 case AMDGPU::V_MAD_F32_e64:
3771 return AMDGPU::V_MADMK_F32;
3772 case AMDGPU::V_FMAC_F32_e32:
3773 case AMDGPU::V_FMAC_F32_e64:
3774 case AMDGPU::V_FMA_F32_e64:
3775 return AMDGPU::V_FMAMK_F32;
3776 case AMDGPU::V_FMAC_F16_e32:
3777 case AMDGPU::V_FMAC_F16_e64:
3778 case AMDGPU::V_FMAC_F16_t16_e64:
3779 case AMDGPU::V_FMAC_F16_fake16_e64:
3780 case AMDGPU::V_FMAC_F16_t16_e32:
3781 case AMDGPU::V_FMAC_F16_fake16_e32:
3782 case AMDGPU::V_FMA_F16_e64:
3783 return ST.hasTrue16BitInsts() ? ST.useRealTrue16Insts()
3784 ? AMDGPU::V_FMAMK_F16_t16
3785 : AMDGPU::V_FMAMK_F16_fake16
3786 : AMDGPU::V_FMAMK_F16;
3787 case AMDGPU::V_FMAC_F64_e32:
3788 case AMDGPU::V_FMAC_F64_e64:
3789 case AMDGPU::V_FMA_F64_e64:
3790 return AMDGPU::V_FMAMK_F64;
3804 assert(!
DefMI.getOperand(0).getSubReg() &&
"Expected SSA form");
3807 if (
Opc == AMDGPU::COPY) {
3808 assert(!
UseMI.getOperand(0).getSubReg() &&
"Expected SSA form");
3815 if (HasMultipleUses) {
3818 unsigned ImmDefSize = RI.getRegSizeInBits(*MRI->
getRegClass(Reg));
3821 if (UseSubReg != AMDGPU::NoSubRegister && ImmDefSize == 64)
3829 if (ImmDefSize == 32 &&
3834 bool Is16Bit = UseSubReg != AMDGPU::NoSubRegister &&
3835 RI.getSubRegIdxSize(UseSubReg) == 16;
3838 if (RI.hasVGPRs(DstRC))
3841 if (DstReg.
isVirtual() && UseSubReg != AMDGPU::lo16)
3847 unsigned NewOpc = AMDGPU::INSTRUCTION_LIST_END;
3854 for (
unsigned MovOp :
3855 {AMDGPU::S_MOV_B32, AMDGPU::V_MOV_B32_e32, AMDGPU::S_MOV_B64,
3856 AMDGPU::V_MOV_B64_PSEUDO, AMDGPU::V_ACCVGPR_WRITE_B32_e64}) {
3864 MovDstRC = RI.getMatchingSuperRegClass(MovDstRC, DstRC, AMDGPU::lo16);
3868 if (MovDstPhysReg) {
3872 RI.getMatchingSuperReg(MovDstPhysReg, AMDGPU::lo16, MovDstRC);
3879 if (MovDstPhysReg) {
3880 if (!MovDstRC->
contains(MovDstPhysReg))
3896 if (!RI.opCanUseLiteralConstant(OpInfo.OperandType) &&
3904 if (NewOpc == AMDGPU::INSTRUCTION_LIST_END)
3908 UseMI.getOperand(0).setSubReg(AMDGPU::NoSubRegister);
3910 UseMI.getOperand(0).setReg(MovDstPhysReg);
3915 UseMI.setDesc(NewMCID);
3916 UseMI.getOperand(1).ChangeToImmediate(*SubRegImm);
3917 UseMI.addImplicitDefUseOperands(*MF);
3921 if (HasMultipleUses)
3924 if (
Opc == AMDGPU::V_MAD_F32_e64 ||
Opc == AMDGPU::V_MAC_F32_e64 ||
3925 Opc == AMDGPU::V_MAD_F16_e64 ||
Opc == AMDGPU::V_MAC_F16_e64 ||
3926 Opc == AMDGPU::V_FMA_F32_e64 ||
Opc == AMDGPU::V_FMAC_F32_e64 ||
3927 Opc == AMDGPU::V_FMA_F16_e64 ||
Opc == AMDGPU::V_FMAC_F16_e64 ||
3928 Opc == AMDGPU::V_FMAC_F16_t16_e64 ||
3929 Opc == AMDGPU::V_FMAC_F16_fake16_e64 ||
Opc == AMDGPU::V_FMA_F64_e64 ||
3930 Opc == AMDGPU::V_FMAC_F64_e64) {
3939 int Src0Idx = getNamedOperandIdx(
UseMI.getOpcode(), AMDGPU::OpName::src0);
3950 auto CopyRegOperandToNarrowerRC =
3953 if (!
MI.getOperand(OpNo).isReg())
3957 if (RI.getCommonSubClass(RC, NewRC) != NewRC)
3960 BuildMI(*
MI.getParent(),
MI.getIterator(),
MI.getDebugLoc(),
3961 get(AMDGPU::COPY), Tmp)
3963 MI.getOperand(OpNo).setReg(Tmp);
3964 MI.getOperand(OpNo).setIsKill();
3971 Src1->
isReg() && Src1->
getReg() == Reg ? Src0 : Src1;
3972 if (!RegSrc->
isReg())
3975 ST.getConstantBusLimit(
Opc) < 2)
3990 if (Def && Def->isMoveImmediate() &&
4005 unsigned SrcSubReg = RegSrc->
getSubReg();
4010 if (
Opc == AMDGPU::V_MAC_F32_e64 ||
Opc == AMDGPU::V_MAC_F16_e64 ||
4011 Opc == AMDGPU::V_FMAC_F32_e64 ||
Opc == AMDGPU::V_FMAC_F16_t16_e64 ||
4012 Opc == AMDGPU::V_FMAC_F16_fake16_e64 ||
4013 Opc == AMDGPU::V_FMAC_F16_e64 ||
Opc == AMDGPU::V_FMAC_F64_e64)
4014 UseMI.untieRegOperand(
4015 AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src2));
4022 if (NewOpc == AMDGPU::V_FMAMK_F16_t16 ||
4023 NewOpc == AMDGPU::V_FMAMK_F16_fake16) {
4027 UseMI.getDebugLoc(),
get(AMDGPU::COPY),
4028 UseMI.getOperand(0).getReg())
4030 UseMI.getOperand(0).setReg(Tmp);
4031 CopyRegOperandToNarrowerRC(
UseMI, 1, NewRC);
4032 CopyRegOperandToNarrowerRC(
UseMI, 3, NewRC);
4037 DefMI.eraseFromParent();
4044 if (ST.getConstantBusLimit(
Opc) < 2) {
4047 bool Src0Inlined =
false;
4048 if (Src0->
isReg()) {
4053 if (Def && Def->isMoveImmediate() &&
4058 }
else if (ST.getConstantBusLimit(
Opc) <= 1 &&
4059 RI.isSGPRReg(*MRI, Src0->
getReg())) {
4065 if (Src1->
isReg() && !Src0Inlined) {
4068 if (Def && Def->isMoveImmediate() &&
4072 else if (RI.isSGPRReg(*MRI, Src1->
getReg()))
4085 if (
Opc == AMDGPU::V_MAC_F32_e64 ||
Opc == AMDGPU::V_MAC_F16_e64 ||
4086 Opc == AMDGPU::V_FMAC_F32_e64 ||
Opc == AMDGPU::V_FMAC_F16_t16_e64 ||
4087 Opc == AMDGPU::V_FMAC_F16_fake16_e64 ||
4088 Opc == AMDGPU::V_FMAC_F16_e64 ||
Opc == AMDGPU::V_FMAC_F64_e64)
4089 UseMI.untieRegOperand(
4090 AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src2));
4092 const std::optional<int64_t> SubRegImm =
4102 if (NewOpc == AMDGPU::V_FMAAK_F16_t16 ||
4103 NewOpc == AMDGPU::V_FMAAK_F16_fake16) {
4107 UseMI.getDebugLoc(),
get(AMDGPU::COPY),
4108 UseMI.getOperand(0).getReg())
4110 UseMI.getOperand(0).setReg(Tmp);
4111 CopyRegOperandToNarrowerRC(
UseMI, 1, NewRC);
4112 CopyRegOperandToNarrowerRC(
UseMI, 2, NewRC);
4122 DefMI.eraseFromParent();
4134 if (BaseOps1.
size() != BaseOps2.
size())
4136 for (
size_t I = 0,
E = BaseOps1.
size();
I <
E; ++
I) {
4137 if (!BaseOps1[
I]->isIdenticalTo(*BaseOps2[
I]))
4145 int LowOffset = OffsetA < OffsetB ? OffsetA : OffsetB;
4146 int HighOffset = OffsetA < OffsetB ? OffsetB : OffsetA;
4147 LocationSize LowWidth = (LowOffset == OffsetA) ? WidthA : WidthB;
4149 LowOffset + (int)LowWidth.
getValue() <= HighOffset;
4152bool SIInstrInfo::checkInstOffsetsDoNotOverlap(
const MachineInstr &MIa,
4155 int64_t Offset0, Offset1;
4158 bool Offset0IsScalable, Offset1IsScalable;
4172 LocationSize Width0 = MIa.
memoperands().front()->getSize();
4173 LocationSize Width1 = MIb.
memoperands().front()->getSize();
4180 "MIa must load from or modify a memory location");
4182 "MIb must load from or modify a memory location");
4204 return checkInstOffsetsDoNotOverlap(MIa, MIb);
4211 return checkInstOffsetsDoNotOverlap(MIa, MIb);
4221 return checkInstOffsetsDoNotOverlap(MIa, MIb);
4235 return checkInstOffsetsDoNotOverlap(MIa, MIb);
4246 if (
Reg.isPhysical())
4250 Imm = Def->getOperand(1).getImm();
4270 unsigned NumOps =
MI.getNumOperands();
4273 if (
Op.isReg() &&
Op.isKill())
4281 case AMDGPU::V_MAC_F16_e32:
4282 case AMDGPU::V_MAC_F16_e64:
4283 return AMDGPU::V_MAD_F16_e64;
4284 case AMDGPU::V_MAC_F32_e32:
4285 case AMDGPU::V_MAC_F32_e64:
4286 return AMDGPU::V_MAD_F32_e64;
4287 case AMDGPU::V_MAC_LEGACY_F32_e32:
4288 case AMDGPU::V_MAC_LEGACY_F32_e64:
4289 return AMDGPU::V_MAD_LEGACY_F32_e64;
4290 case AMDGPU::V_FMAC_LEGACY_F32_e32:
4291 case AMDGPU::V_FMAC_LEGACY_F32_e64:
4292 return AMDGPU::V_FMA_LEGACY_F32_e64;
4293 case AMDGPU::V_FMAC_F16_e32:
4294 case AMDGPU::V_FMAC_F16_e64:
4295 case AMDGPU::V_FMAC_F16_t16_e64:
4296 case AMDGPU::V_FMAC_F16_fake16_e64:
4297 return ST.hasTrue16BitInsts() ? ST.useRealTrue16Insts()
4298 ? AMDGPU::V_FMA_F16_gfx9_t16_e64
4299 : AMDGPU::V_FMA_F16_gfx9_fake16_e64
4300 : AMDGPU::V_FMA_F16_gfx9_e64;
4301 case AMDGPU::V_FMAC_F32_e32:
4302 case AMDGPU::V_FMAC_F32_e64:
4303 return AMDGPU::V_FMA_F32_e64;
4304 case AMDGPU::V_FMAC_F64_e32:
4305 case AMDGPU::V_FMAC_F64_e64:
4306 return AMDGPU::V_FMA_F64_e64;
4326 if (
MI.isBundle()) {
4329 if (
MI.getBundleSize() != 1)
4331 CandidateMI =
MI.getNextNode();
4335 MachineInstr *NewMI = convertToThreeAddressImpl(*CandidateMI, U);
4339 if (
MI.isBundle()) {
4344 MI.untieRegOperand(MO.getOperandNo());
4352 if (Def.isEarlyClobber() && Def.isReg() &&
4357 auto UpdateDefIndex = [&](
LiveRange &LR) {
4358 auto *S = LR.find(OldIndex);
4359 if (S != LR.end() && S->start == OldIndex) {
4360 assert(S->valno && S->valno->def == OldIndex);
4361 S->start = NewIndex;
4362 S->valno->def = NewIndex;
4366 for (
auto &SR : LI.subranges())
4372 if (U.RemoveMIUse) {
4375 Register DefReg = U.RemoveMIUse->getOperand(0).getReg();
4379 U.RemoveMIUse->setDesc(
get(AMDGPU::IMPLICIT_DEF));
4380 U.RemoveMIUse->getOperand(0).setIsDead(
true);
4381 for (
unsigned I = U.RemoveMIUse->getNumOperands() - 1;
I != 0; --
I)
4382 U.RemoveMIUse->removeOperand(
I);
4387 if (
MI.isBundle()) {
4391 if (MO.isReg() && MO.getReg() == DefReg) {
4392 assert(MO.getSubReg() == 0 &&
4393 "tied sub-registers in bundles currently not supported");
4394 MI.removeOperand(MO.getOperandNo());
4411 if (MIOp.isReg() && MIOp.getReg() == DefReg) {
4412 MIOp.setIsUndef(
true);
4413 MIOp.setReg(DummyReg);
4417 if (
MI.isBundle()) {
4421 if (MIOp.isReg() && MIOp.getReg() == DefReg) {
4422 MIOp.setIsUndef(
true);
4423 MIOp.setReg(DummyReg);
4436 return MI.isBundle() ? &
MI : NewMI;
4441 ThreeAddressUpdates &U)
const {
4443 unsigned Opc =
MI.getOpcode();
4447 if (NewMFMAOpc != -1) {
4450 for (
unsigned I = 0, E =
MI.getNumExplicitOperands();
I != E; ++
I)
4451 MIB.
add(
MI.getOperand(
I));
4459 for (
unsigned I = 0,
E =
MI.getNumExplicitOperands();
I !=
E; ++
I)
4464 assert(
Opc != AMDGPU::V_FMAC_F16_t16_e32 &&
4465 Opc != AMDGPU::V_FMAC_F16_fake16_e32 &&
4466 "V_FMAC_F16_t16/fake16_e32 is not supported and not expected to be "
4470 bool IsF64 =
Opc == AMDGPU::V_FMAC_F64_e32 ||
Opc == AMDGPU::V_FMAC_F64_e64;
4471 bool IsLegacy =
Opc == AMDGPU::V_MAC_LEGACY_F32_e32 ||
4472 Opc == AMDGPU::V_MAC_LEGACY_F32_e64 ||
4473 Opc == AMDGPU::V_FMAC_LEGACY_F32_e32 ||
4474 Opc == AMDGPU::V_FMAC_LEGACY_F32_e64;
4475 bool Src0Literal =
false;
4480 case AMDGPU::V_MAC_F16_e64:
4481 case AMDGPU::V_FMAC_F16_e64:
4482 case AMDGPU::V_FMAC_F16_t16_e64:
4483 case AMDGPU::V_FMAC_F16_fake16_e64:
4484 case AMDGPU::V_MAC_F32_e64:
4485 case AMDGPU::V_MAC_LEGACY_F32_e64:
4486 case AMDGPU::V_FMAC_F32_e64:
4487 case AMDGPU::V_FMAC_LEGACY_F32_e64:
4488 case AMDGPU::V_FMAC_F64_e64:
4490 case AMDGPU::V_MAC_F16_e32:
4491 case AMDGPU::V_FMAC_F16_e32:
4492 case AMDGPU::V_MAC_F32_e32:
4493 case AMDGPU::V_MAC_LEGACY_F32_e32:
4494 case AMDGPU::V_FMAC_F32_e32:
4495 case AMDGPU::V_FMAC_LEGACY_F32_e32:
4496 case AMDGPU::V_FMAC_F64_e32: {
4497 int Src0Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
4498 AMDGPU::OpName::src0);
4499 const MachineOperand *Src0 = &
MI.getOperand(Src0Idx);
4510 MachineInstrBuilder MIB;
4513 const MachineOperand *Src0Mods =
4516 const MachineOperand *Src1Mods =
4519 const MachineOperand *Src2Mods =
4525 if (!Src0Mods && !Src1Mods && !Src2Mods && !Clamp && !Omod && !IsLegacy &&
4526 (!IsF64 || ST.hasFmaakFmamkF64Insts()) &&
4528 (ST.getConstantBusLimit(
Opc) > 1 || !Src0->
isReg() ||
4530 MachineInstr *
DefMI =
nullptr;
4566 MI, AMDGPU::getNamedOperandIdx(NewOpc, AMDGPU::OpName::src0),
4582 if (Src0Literal && !ST.hasVOP3Literal())
4610 switch (
MI.getOpcode()) {
4611 case AMDGPU::S_SET_GPR_IDX_ON:
4612 case AMDGPU::S_SET_GPR_IDX_MODE:
4613 case AMDGPU::S_SET_GPR_IDX_OFF:
4631 if (
MI.isTerminator() ||
MI.isPosition())
4635 if (
MI.getOpcode() == TargetOpcode::INLINEASM_BR)
4638 if (
MI.getOpcode() == AMDGPU::SCHED_BARRIER &&
MI.getOperand(0).getImm() == 0)
4644 return MI.modifiesRegister(AMDGPU::EXEC, &RI) ||
4645 MI.getOpcode() == AMDGPU::S_SETREG_IMM32_B32 ||
4646 MI.getOpcode() == AMDGPU::S_SETREG_B32 ||
4647 MI.getOpcode() == AMDGPU::S_SETPRIO ||
4648 MI.getOpcode() == AMDGPU::S_SETPRIO_INC_WG ||
4653 return Opcode == AMDGPU::DS_ORDERED_COUNT ||
4654 Opcode == AMDGPU::DS_ADD_GS_REG_RTN ||
4655 Opcode == AMDGPU::DS_SUB_GS_REG_RTN ||
isGWS(Opcode);
4669 if (
MI.getMF()->getFunction().hasFnAttribute(
"amdgpu-no-flat-scratch-init"))
4674 if (
MI.memoperands_empty())
4679 unsigned AS = Memop->getAddrSpace();
4680 if (AS == AMDGPUAS::FLAT_ADDRESS) {
4681 const MDNode *MD = Memop->getAAInfo().NoAliasAddrSpace;
4682 return !MD || !AMDGPU::hasValueInRangeLikeMetadata(
4683 *MD, AMDGPUAS::PRIVATE_ADDRESS);
4698 if (
MI.memoperands_empty())
4707 unsigned AS = Memop->getAddrSpace();
4717 bool TgSplit)
const {
4730 if (
MI.memoperands_empty())
4735 unsigned AS = Memop->getAddrSpace();
4751 unsigned Opcode =
MI.getOpcode();
4766 if (Opcode == AMDGPU::S_SENDMSG || Opcode == AMDGPU::S_SENDMSGHALT ||
4767 isEXP(Opcode) || Opcode == AMDGPU::DS_ORDERED_COUNT ||
4768 Opcode == AMDGPU::S_TRAP || Opcode == AMDGPU::S_WAIT_EVENT ||
4769 Opcode == AMDGPU::S_SETHALT)
4772 if (
MI.isCall() ||
MI.isInlineAsm())
4788 if (Opcode == AMDGPU::V_READFIRSTLANE_B32 ||
4789 Opcode == AMDGPU::V_READLANE_B32 || Opcode == AMDGPU::V_WRITELANE_B32 ||
4790 Opcode == AMDGPU::SI_RESTORE_S32_FROM_VGPR ||
4791 Opcode == AMDGPU::SI_SPILL_S32_TO_VGPR)
4799 if (
MI.isMetaInstruction())
4803 if (
MI.isCopyLike()) {
4804 if (!RI.isSGPRReg(MRI,
MI.getOperand(0).getReg()))
4808 return MI.readsRegister(AMDGPU::EXEC, &RI);
4819 return !
isSALU(
MI) ||
MI.readsRegister(AMDGPU::EXEC, &RI);
4823 switch (
Imm.getBitWidth()) {
4829 ST.hasInv2PiInlineImm());
4832 ST.hasInv2PiInlineImm());
4834 return ST.has16BitInsts() &&
4836 ST.hasInv2PiInlineImm());
4843 APInt IntImm =
Imm.bitcastToAPInt();
4845 bool HasInv2Pi = ST.hasInv2PiInlineImm();
4853 return ST.has16BitInsts() &&
4856 return ST.has16BitInsts() &&
4866 switch (OperandType) {
4876 int32_t Trunc =
static_cast<int32_t
>(
Imm);
4920 int16_t Trunc =
static_cast<int16_t
>(
Imm);
4921 return ST.has16BitInsts() &&
4930 int16_t Trunc =
static_cast<int16_t
>(
Imm);
4931 return ST.has16BitInsts() &&
4982 if (!RI.opCanUseLiteralConstant(OpInfo.OperandType))
4988 return ST.hasVOP3Literal();
4992 int64_t ImmVal)
const {
4994 int Src1Idx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src1);
4995 if (Src1Idx != -1 &&
isDPP(
Opc) && !ST.hasDPPSrc1SGPR() &&
4996 OpNo ==
static_cast<unsigned>(Src1Idx))
5001 if (
isMAI(InstDesc) && ST.hasMFMAInlineLiteralBug() &&
5002 OpNo == (
unsigned)AMDGPU::getNamedOperandIdx(InstDesc.
getOpcode(),
5003 AMDGPU::OpName::src2))
5006 if (ST.hasBF16InlineConstFromUpperFP32() &&
isVOP1(
Opc)) {
5013 return RI.opCanUseInlineConstant(OpInfo.OperandType);
5025 "unexpected imm-like operand kind");
5038 if (Opcode == AMDGPU::V_MUL_LEGACY_F32_e64 && ST.hasGFX90AInsts())
5056 AMDGPU::OpName
OpName)
const {
5058 return Mods && Mods->
getImm();
5071 switch (
MI.getOpcode()) {
5072 default:
return false;
5074 case AMDGPU::V_ADDC_U32_e64:
5075 case AMDGPU::V_SUBB_U32_e64:
5076 case AMDGPU::V_SUBBREV_U32_e64: {
5079 if (!Src1->
isReg() || !RI.isVGPR(MRI, Src1->
getReg()))
5084 case AMDGPU::V_MAC_F16_e64:
5085 case AMDGPU::V_MAC_F32_e64:
5086 case AMDGPU::V_MAC_LEGACY_F32_e64:
5087 case AMDGPU::V_FMAC_F16_e64:
5088 case AMDGPU::V_FMAC_F16_t16_e64:
5089 case AMDGPU::V_FMAC_F16_fake16_e64:
5090 case AMDGPU::V_FMAC_F32_e64:
5091 case AMDGPU::V_FMAC_F64_e64:
5092 case AMDGPU::V_FMAC_LEGACY_F32_e64:
5093 if (!Src2->
isReg() || !RI.isVGPR(MRI, Src2->
getReg()) ||
5098 case AMDGPU::V_CNDMASK_B32_e64:
5104 if (Src1 && (!Src1->
isReg() || !RI.isVGPR(MRI, Src1->
getReg()) ||
5117 if (Src0 && Src0->
isImm()) {
5120 get(Op32), AMDGPU::getNamedOperandIdx(Op32, AMDGPU::OpName::src0),
5142 (
Use.getReg() == AMDGPU::VCC ||
Use.getReg() == AMDGPU::VCC_LO)) {
5151 unsigned Op32)
const {
5165 Inst32.
add(
MI.getOperand(
I));
5169 int Idx =
MI.getNumExplicitDefs();
5171 int OpTy =
MI.getDesc().operands()[Idx++].OperandType;
5176 if (AMDGPU::getNamedOperandIdx(Op32, AMDGPU::OpName::src2) == -1) {
5198 if (Reg == AMDGPU::SGPR_NULL || Reg == AMDGPU::SGPR_NULL64)
5206 return Reg == AMDGPU::VCC || Reg == AMDGPU::VCC_LO || Reg == AMDGPU::M0;
5209 return AMDGPU::SReg_32RegClass.contains(Reg) ||
5210 AMDGPU::SReg_64RegClass.contains(Reg);
5238 switch (MO.getReg()) {
5240 case AMDGPU::VCC_LO:
5241 case AMDGPU::VCC_HI:
5243 case AMDGPU::FLAT_SCR:
5256 switch (
MI.getOpcode()) {
5257 case AMDGPU::V_READLANE_B32:
5258 case AMDGPU::SI_RESTORE_S32_FROM_VGPR:
5259 case AMDGPU::V_WRITELANE_B32:
5260 case AMDGPU::SI_SPILL_S32_TO_VGPR:
5267 if (
MI.isPreISelOpcode() ||
5268 SIInstrInfo::isGenericOpcode(
MI.getOpcode()) ||
5286 return SubReg.
getSubReg() != AMDGPU::NoSubRegister &&
5297 if (RI.isVectorRegister(MRI, SrcReg) && RI.isSGPRReg(MRI, DstReg)) {
5298 ErrInfo =
"illegal copy from vector register to SGPR";
5316 if (!MRI.
isSSA() &&
MI.isCopy())
5317 return verifyCopy(
MI, MRI, ErrInfo);
5319 if (SIInstrInfo::isGenericOpcode(Opcode))
5322 int Src0Idx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::src0);
5323 int Src1Idx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::src1);
5324 int Src2Idx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::src2);
5326 if (Src0Idx == -1) {
5328 Src0Idx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::src0X);
5329 Src1Idx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::vsrc1X);
5330 Src2Idx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::src0Y);
5331 Src3Idx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::vsrc1Y);
5336 if (!
Desc.isVariadic() &&
5337 Desc.getNumOperands() !=
MI.getNumExplicitOperands()) {
5338 ErrInfo =
"Instruction has wrong number of operands.";
5342 if (
MI.isInlineAsm()) {
5355 if (!Reg.isVirtual() && !RC->
contains(Reg)) {
5356 ErrInfo =
"inlineasm operand has incorrect register class.";
5364 if (
isImage(
MI) &&
MI.memoperands_empty() &&
MI.mayLoadOrStore()) {
5365 ErrInfo =
"missing memory operand from image instruction.";
5370 for (
int i = 0, e =
Desc.getNumOperands(); i != e; ++i) {
5373 ErrInfo =
"FPImm Machine Operands are not supported. ISel should bitcast "
5374 "all fp values to integers.";
5379 int16_t RegClass = getOpRegClassID(OpInfo);
5381 switch (OpInfo.OperandType) {
5383 if (
MI.getOperand(i).isImm() ||
MI.getOperand(i).isGlobal()) {
5384 ErrInfo =
"Illegal immediate value for operand.";
5417 ErrInfo =
"Illegal immediate value for operand.";
5426 if (ST.has64BitLiterals() &&
Desc.getSize() != 4 && MO.
isImm() &&
5429 OpInfo.OperandType ==
5431 ErrInfo =
"illegal 64-bit immediate value for operand.";
5438 ErrInfo =
"Expected inline constant for operand.";
5452 if (!
MI.getOperand(i).isImm() && !
MI.getOperand(i).isFI()) {
5453 ErrInfo =
"Expected immediate, but got non-immediate";
5462 if (OpInfo.isGenericType())
5477 if (ST.needsAlignedVGPRs() && Opcode != AMDGPU::AV_MOV_B64_IMM_PSEUDO &&
5478 Opcode != AMDGPU::V_MOV_B64_PSEUDO && !
isSpill(
MI)) {
5480 if (RI.hasVectorRegisters(RC) && MO.
getSubReg()) {
5482 RI.getSubRegisterClass(RC, MO.
getSubReg())) {
5483 RC = RI.getCompatibleSubRegClass(RC, SubRC, MO.
getSubReg());
5490 if (!RC || !RI.isProperlyAlignedRC(*RC)) {
5491 ErrInfo =
"Subtarget requires even aligned vector registers";
5496 if (RegClass != -1) {
5497 if (Reg.isVirtual())
5502 ErrInfo =
"Operand has incorrect register class.";
5510 if (!ST.hasSDWA()) {
5511 ErrInfo =
"SDWA is not supported on this target";
5515 for (
auto Op : {AMDGPU::OpName::src0_sel, AMDGPU::OpName::src1_sel,
5516 AMDGPU::OpName::dst_sel}) {
5522 ErrInfo =
"Invalid SDWA selection";
5527 int DstIdx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::vdst);
5529 for (
int OpIdx : {DstIdx, Src0Idx, Src1Idx, Src2Idx}) {
5534 if (!ST.hasSDWAScalar()) {
5536 if (!MO.
isReg() || !RI.hasVGPRs(RI.getRegClassForReg(MRI, MO.
getReg()))) {
5537 ErrInfo =
"Only VGPRs allowed as operands in SDWA instructions on VI";
5544 "Only reg allowed as operands in SDWA instructions on GFX9+";
5550 if (!ST.hasSDWAOmod()) {
5553 if (OMod !=
nullptr &&
5555 ErrInfo =
"OMod not allowed in SDWA instructions on VI";
5560 if (Opcode == AMDGPU::V_CVT_F32_FP8_sdwa ||
5561 Opcode == AMDGPU::V_CVT_F32_BF8_sdwa ||
5562 Opcode == AMDGPU::V_CVT_PK_F32_FP8_sdwa ||
5563 Opcode == AMDGPU::V_CVT_PK_F32_BF8_sdwa) {
5566 unsigned Mods = Src0ModsMO->
getImm();
5569 ErrInfo =
"sext, abs and neg are not allowed on this instruction";
5575 if (
isVOPC(BasicOpcode)) {
5576 if (!ST.hasSDWASdst() && DstIdx != -1) {
5579 if (!Dst.isReg() || Dst.getReg() != AMDGPU::VCC) {
5580 ErrInfo =
"Only VCC allowed as dst in SDWA instructions on VI";
5583 }
else if (!ST.hasSDWAOutModsVOPC()) {
5586 if (Clamp && (!Clamp->
isImm() || Clamp->
getImm() != 0)) {
5587 ErrInfo =
"Clamp not allowed in VOPC SDWA instructions on VI";
5593 if (OMod && (!OMod->
isImm() || OMod->
getImm() != 0)) {
5594 ErrInfo =
"OMod not allowed in VOPC SDWA instructions on VI";
5601 if (DstUnused && DstUnused->isImm() &&
5604 if (!Dst.isReg() || !Dst.isTied()) {
5605 ErrInfo =
"Dst register should have tied register";
5610 MI.getOperand(
MI.findTiedOperandIdx(DstIdx));
5613 "Dst register should be tied to implicit use of preserved register";
5617 ErrInfo =
"Dst register should use same physical register as preserved";
5623 if (
isDPP(
MI) && !ST.hasDPPSrc1SGPR() && Src1Idx != -1) {
5625 if (Src1MO.
isReg() && RI.isSGPRReg(MRI, Src1MO.
getReg())) {
5626 ErrInfo =
"DPP src1 cannot be SGPR on this subtarget";
5629 if (Src1MO.
isImm()) {
5630 ErrInfo =
"DPP src1 cannot be an immediate on this subtarget";
5636 if (
isImage(Opcode) && !
MI.mayStore()) {
5641 uint64_t DMaskImm = DMask->
getImm();
5648 if (D16 && D16->getImm() && !ST.hasUnpackedD16VMem())
5656 AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::vdata);
5660 uint32_t DstSize = RI.getRegSizeInBits(*DstRC) / 32;
5661 if (RegCount > DstSize) {
5662 ErrInfo =
"Image instruction returns too many registers for dst "
5672 Desc.getOpcode() != AMDGPU::V_WRITELANE_B32) {
5673 unsigned ConstantBusCount = 0;
5674 bool UsesLiteral =
false;
5677 int ImmIdx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::imm);
5681 LiteralVal = &
MI.getOperand(ImmIdx);
5690 for (
int OpIdx : {Src0Idx, Src1Idx, Src2Idx, Src3Idx}) {
5701 }
else if (!MO.
isFI()) {
5708 ErrInfo =
"VOP2/VOP3 instruction uses more than one literal";
5718 if (
llvm::all_of(SGPRsUsed, [
this, SGPRUsed](
unsigned SGPR) {
5719 return !RI.regsOverlap(SGPRUsed, SGPR);
5728 if (ConstantBusCount > ST.getConstantBusLimit(Opcode) &&
5729 Opcode != AMDGPU::V_WRITELANE_B32) {
5730 ErrInfo =
"VOP* instruction violates constant bus restriction";
5734 if (
isVOP3(
MI) && UsesLiteral && !ST.hasVOP3Literal()) {
5735 ErrInfo =
"VOP3 instruction uses literal";
5742 if (
Desc.getOpcode() == AMDGPU::V_WRITELANE_B32) {
5743 unsigned SGPRCount = 0;
5746 for (
int OpIdx : {Src0Idx, Src1Idx}) {
5754 if (MO.
getReg() != SGPRUsed)
5759 if (SGPRCount > ST.getConstantBusLimit(Opcode)) {
5760 ErrInfo =
"WRITELANE instruction violates constant bus restriction";
5767 if (
Desc.getOpcode() == AMDGPU::V_DIV_SCALE_F32_e64 ||
5768 Desc.getOpcode() == AMDGPU::V_DIV_SCALE_F64_e64) {
5775 ErrInfo =
"v_div_scale_{f32|f64} require src0 = src1 or src2";
5785 ErrInfo =
"ABS not allowed in VOP3B instructions";
5798 ErrInfo =
"SOP2/SOPC instruction requires too many immediate constants";
5805 if (
Desc.isBranch()) {
5807 ErrInfo =
"invalid branch target for SOPK instruction";
5811 uint64_t
Imm =
Op->getImm();
5814 ErrInfo =
"invalid immediate for SOPK instruction";
5819 ErrInfo =
"invalid immediate for SOPK instruction";
5826 if (
Desc.getOpcode() == AMDGPU::V_MOVRELS_B32_e32 ||
5827 Desc.getOpcode() == AMDGPU::V_MOVRELS_B32_e64 ||
5828 Desc.getOpcode() == AMDGPU::V_MOVRELD_B32_e32 ||
5829 Desc.getOpcode() == AMDGPU::V_MOVRELD_B32_e64) {
5830 const bool IsDst =
Desc.getOpcode() == AMDGPU::V_MOVRELD_B32_e32 ||
5831 Desc.getOpcode() == AMDGPU::V_MOVRELD_B32_e64;
5833 const unsigned StaticNumOps =
5834 Desc.getNumOperands() +
Desc.implicit_uses().size();
5835 const unsigned NumImplicitOps = IsDst ? 2 : 1;
5841 if (
MI.getNumOperands() < StaticNumOps + NumImplicitOps) {
5842 ErrInfo =
"missing implicit register operands";
5848 if (!Dst->isUse()) {
5849 ErrInfo =
"v_movreld_b32 vdst should be a use operand";
5854 if (!
MI.isRegTiedToUseOperand(StaticNumOps, &UseOpIdx) ||
5855 UseOpIdx != StaticNumOps + 1) {
5856 ErrInfo =
"movrel implicit operands should be tied";
5863 =
MI.getOperand(StaticNumOps + NumImplicitOps - 1);
5865 !
isSubRegOf(RI, ImpUse, IsDst ? *Dst : Src0)) {
5866 ErrInfo =
"src0 should be subreg of implicit vector use";
5874 if (!
MI.hasRegisterImplicitUseOperand(AMDGPU::EXEC)) {
5875 ErrInfo =
"VALU instruction does not implicitly read exec mask";
5881 if (
MI.mayStore() &&
5886 if (Soff && Soff->
getReg() != AMDGPU::M0) {
5887 ErrInfo =
"scalar stores must use m0 as offset register";
5893 if (
isFLAT(
MI) && !ST.hasFlatInstOffsets()) {
5895 if (
Offset->getImm() != 0) {
5896 ErrInfo =
"subtarget does not support offsets in flat instructions";
5901 if (
isDS(
MI) && !ST.hasGDS()) {
5903 if (GDSOp && GDSOp->
getImm() != 0) {
5904 ErrInfo =
"GDS is not supported on this subtarget";
5912 int VAddr0Idx = AMDGPU::getNamedOperandIdx(Opcode,
5913 AMDGPU::OpName::vaddr0);
5914 AMDGPU::OpName RSrcOpName =
5915 isMIMG(
MI) ? AMDGPU::OpName::srsrc : AMDGPU::OpName::rsrc;
5916 int RsrcIdx = AMDGPU::getNamedOperandIdx(Opcode, RSrcOpName);
5924 ErrInfo =
"dim is out of range";
5929 if (ST.hasR128A16()) {
5931 IsA16 = R128A16->
getImm() != 0;
5932 }
else if (ST.hasA16()) {
5934 IsA16 = A16->
getImm() != 0;
5937 bool IsNSA = RsrcIdx - VAddr0Idx > 1;
5939 unsigned AddrWords =
5942 unsigned VAddrWords;
5944 VAddrWords = RsrcIdx - VAddr0Idx;
5945 if (ST.hasPartialNSAEncoding() &&
5947 unsigned LastVAddrIdx = RsrcIdx - 1;
5948 VAddrWords +=
getOpSize(
MI, LastVAddrIdx) / 4 - 1;
5956 if (VAddrWords != AddrWords) {
5958 <<
" but got " << VAddrWords <<
"\n");
5959 ErrInfo =
"bad vaddr size";
5969 unsigned DC = DppCt->
getImm();
5970 if (DC == DppCtrl::DPP_UNUSED1 || DC == DppCtrl::DPP_UNUSED2 ||
5971 DC == DppCtrl::DPP_UNUSED3 || DC > DppCtrl::DPP_LAST ||
5972 (DC >= DppCtrl::DPP_UNUSED4_FIRST && DC <= DppCtrl::DPP_UNUSED4_LAST) ||
5973 (DC >= DppCtrl::DPP_UNUSED5_FIRST && DC <= DppCtrl::DPP_UNUSED5_LAST) ||
5974 (DC >= DppCtrl::DPP_UNUSED6_FIRST && DC <= DppCtrl::DPP_UNUSED6_LAST) ||
5975 (DC >= DppCtrl::DPP_UNUSED7_FIRST && DC <= DppCtrl::DPP_UNUSED7_LAST) ||
5976 (DC >= DppCtrl::DPP_UNUSED8_FIRST && DC <= DppCtrl::DPP_UNUSED8_LAST)) {
5977 ErrInfo =
"Invalid dpp_ctrl value";
5980 if (DC >= DppCtrl::WAVE_SHL1 && DC <= DppCtrl::WAVE_ROR1 &&
5981 !ST.hasDPPWavefrontShifts()) {
5982 ErrInfo =
"Invalid dpp_ctrl value: "
5983 "wavefront shifts are not supported on GFX10+";
5986 if (DC >= DppCtrl::BCAST15 && DC <= DppCtrl::BCAST31 &&
5987 !ST.hasDPPBroadcasts()) {
5988 ErrInfo =
"Invalid dpp_ctrl value: "
5989 "broadcasts are not supported on GFX10+";
5992 if (DC >= DppCtrl::ROW_SHARE_FIRST && DC <= DppCtrl::ROW_XMASK_LAST &&
5994 if (DC >= DppCtrl::ROW_NEWBCAST_FIRST &&
5995 DC <= DppCtrl::ROW_NEWBCAST_LAST &&
5996 !ST.hasGFX90AInsts()) {
5997 ErrInfo =
"Invalid dpp_ctrl value: "
5998 "row_newbroadcast/row_share is not supported before "
6002 if (DC > DppCtrl::ROW_NEWBCAST_LAST || !ST.hasGFX90AInsts()) {
6003 ErrInfo =
"Invalid dpp_ctrl value: "
6004 "row_share and row_xmask are not supported before GFX10";
6009 if (Opcode != AMDGPU::V_MOV_B64_DPP_PSEUDO &&
6012 ErrInfo =
"Invalid dpp_ctrl value: "
6013 "DP ALU dpp only support row_newbcast";
6020 AMDGPU::OpName DataName =
6021 isDS(Opcode) ? AMDGPU::OpName::data0 : AMDGPU::OpName::vdata;
6027 if (!ST.hasGFX90AInsts()) {
6028 if ((Dst && RI.isAGPR(MRI, Dst->getReg())) ||
6029 (
Data && RI.isAGPR(MRI,
Data->getReg())) ||
6030 (Data2 && RI.isAGPR(MRI, Data2->
getReg()))) {
6031 ErrInfo =
"Invalid register class: "
6032 "agpr loads and stores not supported on this GPU";
6038 if (ST.needsAlignedVGPRs()) {
6039 const auto isAlignedReg = [&
MI, &MRI,
this](AMDGPU::OpName
OpName) ->
bool {
6044 if (Reg.isPhysical())
6045 return !(RI.getHWRegIndex(Reg) & 1);
6047 return RI.getRegSizeInBits(RC) > 32 && RI.isProperlyAlignedRC(RC) &&
6048 !(RI.getChannelFromSubReg(
Op->getSubReg()) & 1);
6051 if (Opcode == AMDGPU::DS_GWS_INIT || Opcode == AMDGPU::DS_GWS_SEMA_BR ||
6052 Opcode == AMDGPU::DS_GWS_BARRIER) {
6054 if (!isAlignedReg(AMDGPU::OpName::data0)) {
6055 ErrInfo =
"Subtarget requires even aligned vector registers "
6056 "for DS_GWS instructions";
6062 if (!isAlignedReg(AMDGPU::OpName::vaddr)) {
6063 ErrInfo =
"Subtarget requires even aligned vector registers "
6064 "for vaddr operand of image instructions";
6070 if (Opcode == AMDGPU::V_ACCVGPR_WRITE_B32_e64 && !ST.hasGFX90AInsts()) {
6072 if (Src->isReg() && RI.isSGPRReg(MRI, Src->getReg())) {
6073 ErrInfo =
"Invalid register class: "
6074 "v_accvgpr_write with an SGPR is not supported on this GPU";
6079 if (
Desc.getOpcode() == AMDGPU::G_AMDGPU_WAVE_ADDRESS) {
6082 ErrInfo =
"pseudo expects only physical SGPRs";
6089 if (!ST.hasScaleOffset()) {
6090 ErrInfo =
"Subtarget does not support offset scaling";
6094 ErrInfo =
"Instruction does not support offset scaling";
6102 for (
unsigned I = 0;
I < 3; ++
I) {
6108 if (ST.hasFlatScratchHiInB64InstHazard() &&
isSALU(
MI) &&
6109 MI.readsRegister(AMDGPU::SRC_FLAT_SCRATCH_BASE_HI,
nullptr)) {
6111 if ((Dst && RI.getRegClassForReg(MRI, Dst->getReg()) ==
6112 &AMDGPU::SReg_64RegClass) ||
6113 Opcode == AMDGPU::S_BITCMP0_B64 || Opcode == AMDGPU::S_BITCMP1_B64) {
6114 ErrInfo =
"Instruction cannot read flat_scratch_base_hi";
6123 if (
MI.getOpcode() == AMDGPU::S_MOV_B32) {
6125 return MI.getOperand(1).isReg() || RI.isAGPR(MRI,
MI.getOperand(0).getReg())
6127 : AMDGPU::V_MOV_B32_e32;
6137 default:
return AMDGPU::INSTRUCTION_LIST_END;
6138 case AMDGPU::REG_SEQUENCE:
return AMDGPU::REG_SEQUENCE;
6139 case AMDGPU::COPY:
return AMDGPU::COPY;
6140 case AMDGPU::PHI:
return AMDGPU::PHI;
6141 case AMDGPU::INSERT_SUBREG:
return AMDGPU::INSERT_SUBREG;
6142 case AMDGPU::WQM:
return AMDGPU::WQM;
6143 case AMDGPU::SOFT_WQM:
return AMDGPU::SOFT_WQM;
6144 case AMDGPU::STRICT_WWM:
return AMDGPU::STRICT_WWM;
6145 case AMDGPU::STRICT_WQM:
return AMDGPU::STRICT_WQM;
6146 case AMDGPU::S_ADD_I32:
6147 return ST.hasAddNoCarryInsts() ? AMDGPU::V_ADD_U32_e64 : AMDGPU::V_ADD_CO_U32_e32;
6148 case AMDGPU::S_ADDC_U32:
6149 return AMDGPU::V_ADDC_U32_e32;
6150 case AMDGPU::S_SUB_I32:
6151 return ST.hasAddNoCarryInsts() ? AMDGPU::V_SUB_U32_e64 : AMDGPU::V_SUB_CO_U32_e32;
6154 case AMDGPU::S_ADD_U32:
6155 return AMDGPU::V_ADD_CO_U32_e32;
6156 case AMDGPU::S_SUB_U32:
6157 return AMDGPU::V_SUB_CO_U32_e32;
6158 case AMDGPU::S_ADD_U64_PSEUDO:
6159 return AMDGPU::V_ADD_U64_PSEUDO;
6160 case AMDGPU::S_SUB_U64_PSEUDO:
6161 return AMDGPU::V_SUB_U64_PSEUDO;
6162 case AMDGPU::S_SUBB_U32:
return AMDGPU::V_SUBB_U32_e32;
6163 case AMDGPU::S_MUL_I32:
return AMDGPU::V_MUL_LO_U32_e64;
6164 case AMDGPU::S_MUL_HI_U32:
return AMDGPU::V_MUL_HI_U32_e64;
6165 case AMDGPU::S_MUL_HI_I32:
return AMDGPU::V_MUL_HI_I32_e64;
6166 case AMDGPU::S_AND_B32:
return AMDGPU::V_AND_B32_e64;
6167 case AMDGPU::S_OR_B32:
return AMDGPU::V_OR_B32_e64;
6168 case AMDGPU::S_XOR_B32:
return AMDGPU::V_XOR_B32_e64;
6169 case AMDGPU::S_XNOR_B32:
6170 return ST.hasDLInsts() ? AMDGPU::V_XNOR_B32_e64 : AMDGPU::INSTRUCTION_LIST_END;
6171 case AMDGPU::S_MIN_I32:
return AMDGPU::V_MIN_I32_e64;
6172 case AMDGPU::S_MIN_U32:
return AMDGPU::V_MIN_U32_e64;
6173 case AMDGPU::S_MAX_I32:
return AMDGPU::V_MAX_I32_e64;
6174 case AMDGPU::S_MAX_U32:
return AMDGPU::V_MAX_U32_e64;
6175 case AMDGPU::S_ASHR_I32:
return AMDGPU::V_ASHR_I32_e32;
6176 case AMDGPU::S_ASHR_I64:
return AMDGPU::V_ASHR_I64_e64;
6177 case AMDGPU::S_LSHL_B32:
return AMDGPU::V_LSHL_B32_e32;
6178 case AMDGPU::S_LSHL_B64:
return AMDGPU::V_LSHL_B64_e64;
6179 case AMDGPU::S_LSHR_B32:
return AMDGPU::V_LSHR_B32_e32;
6180 case AMDGPU::S_LSHR_B64:
return AMDGPU::V_LSHR_B64_e64;
6181 case AMDGPU::S_SEXT_I32_I8:
return AMDGPU::V_BFE_I32_e64;
6182 case AMDGPU::S_SEXT_I32_I16:
return AMDGPU::V_BFE_I32_e64;
6183 case AMDGPU::S_BFE_U32:
return AMDGPU::V_BFE_U32_e64;
6184 case AMDGPU::S_BFE_I32:
return AMDGPU::V_BFE_I32_e64;
6185 case AMDGPU::S_BFM_B32:
return AMDGPU::V_BFM_B32_e64;
6186 case AMDGPU::S_BREV_B32:
return AMDGPU::V_BFREV_B32_e32;
6187 case AMDGPU::S_NOT_B32:
return AMDGPU::V_NOT_B32_e32;
6188 case AMDGPU::S_NOT_B64:
return AMDGPU::V_NOT_B32_e32;
6189 case AMDGPU::S_CMP_EQ_I32:
return AMDGPU::V_CMP_EQ_I32_e64;
6190 case AMDGPU::S_CMP_LG_I32:
return AMDGPU::V_CMP_NE_I32_e64;
6191 case AMDGPU::S_CMP_GT_I32:
return AMDGPU::V_CMP_GT_I32_e64;
6192 case AMDGPU::S_CMP_GE_I32:
return AMDGPU::V_CMP_GE_I32_e64;
6193 case AMDGPU::S_CMP_LT_I32:
return AMDGPU::V_CMP_LT_I32_e64;
6194 case AMDGPU::S_CMP_LE_I32:
return AMDGPU::V_CMP_LE_I32_e64;
6195 case AMDGPU::S_CMP_EQ_U32:
return AMDGPU::V_CMP_EQ_U32_e64;
6196 case AMDGPU::S_CMP_LG_U32:
return AMDGPU::V_CMP_NE_U32_e64;
6197 case AMDGPU::S_CMP_GT_U32:
return AMDGPU::V_CMP_GT_U32_e64;
6198 case AMDGPU::S_CMP_GE_U32:
return AMDGPU::V_CMP_GE_U32_e64;
6199 case AMDGPU::S_CMP_LT_U32:
return AMDGPU::V_CMP_LT_U32_e64;
6200 case AMDGPU::S_CMP_LE_U32:
return AMDGPU::V_CMP_LE_U32_e64;
6201 case AMDGPU::S_CMP_EQ_U64:
return AMDGPU::V_CMP_EQ_U64_e64;
6202 case AMDGPU::S_CMP_LG_U64:
return AMDGPU::V_CMP_NE_U64_e64;
6203 case AMDGPU::S_BCNT1_I32_B32:
return AMDGPU::V_BCNT_U32_B32_e64;
6204 case AMDGPU::S_FF1_I32_B32:
return AMDGPU::V_FFBL_B32_e32;
6205 case AMDGPU::S_FLBIT_I32_B32:
return AMDGPU::V_FFBH_U32_e32;
6206 case AMDGPU::S_FLBIT_I32:
return AMDGPU::V_FFBH_I32_e64;
6207 case AMDGPU::S_CBRANCH_SCC0:
return AMDGPU::S_CBRANCH_VCCZ;
6208 case AMDGPU::S_CBRANCH_SCC1:
return AMDGPU::S_CBRANCH_VCCNZ;
6209 case AMDGPU::S_CVT_F32_I32:
return AMDGPU::V_CVT_F32_I32_e64;
6210 case AMDGPU::S_CVT_F32_U32:
return AMDGPU::V_CVT_F32_U32_e64;
6211 case AMDGPU::S_CVT_I32_F32:
return AMDGPU::V_CVT_I32_F32_e64;
6212 case AMDGPU::S_CVT_U32_F32:
return AMDGPU::V_CVT_U32_F32_e64;
6213 case AMDGPU::S_CVT_F32_F16:
6214 case AMDGPU::S_CVT_HI_F32_F16:
6215 return ST.useRealTrue16Insts() ? AMDGPU::V_CVT_F32_F16_t16_e64
6216 : AMDGPU::V_CVT_F32_F16_fake16_e64;
6217 case AMDGPU::S_CVT_F16_F32:
6218 return ST.useRealTrue16Insts() ? AMDGPU::V_CVT_F16_F32_t16_e64
6219 : AMDGPU::V_CVT_F16_F32_fake16_e64;
6220 case AMDGPU::S_CEIL_F32:
return AMDGPU::V_CEIL_F32_e64;
6221 case AMDGPU::S_FLOOR_F32:
return AMDGPU::V_FLOOR_F32_e64;
6222 case AMDGPU::S_TRUNC_F32:
return AMDGPU::V_TRUNC_F32_e64;
6223 case AMDGPU::S_RNDNE_F32:
return AMDGPU::V_RNDNE_F32_e64;
6224 case AMDGPU::S_CEIL_F16:
6225 return ST.useRealTrue16Insts() ? AMDGPU::V_CEIL_F16_t16_e64
6226 : AMDGPU::V_CEIL_F16_fake16_e64;
6227 case AMDGPU::S_FLOOR_F16:
6228 return ST.useRealTrue16Insts() ? AMDGPU::V_FLOOR_F16_t16_e64
6229 : AMDGPU::V_FLOOR_F16_fake16_e64;
6230 case AMDGPU::S_TRUNC_F16:
6231 return ST.useRealTrue16Insts() ? AMDGPU::V_TRUNC_F16_t16_e64
6232 : AMDGPU::V_TRUNC_F16_fake16_e64;
6233 case AMDGPU::S_RNDNE_F16:
6234 return ST.useRealTrue16Insts() ? AMDGPU::V_RNDNE_F16_t16_e64
6235 : AMDGPU::V_RNDNE_F16_fake16_e64;
6236 case AMDGPU::S_ADD_F32:
return AMDGPU::V_ADD_F32_e64;
6237 case AMDGPU::S_SUB_F32:
return AMDGPU::V_SUB_F32_e64;
6238 case AMDGPU::S_MIN_F32:
return AMDGPU::V_MIN_F32_e64;
6239 case AMDGPU::S_MAX_F32:
return AMDGPU::V_MAX_F32_e64;
6240 case AMDGPU::S_MINIMUM_F32:
return AMDGPU::V_MINIMUM_F32_e64;
6241 case AMDGPU::S_MAXIMUM_F32:
return AMDGPU::V_MAXIMUM_F32_e64;
6242 case AMDGPU::S_MUL_F32:
return AMDGPU::V_MUL_F32_e64;
6243 case AMDGPU::S_ADD_F16:
6244 return ST.useRealTrue16Insts() ? AMDGPU::V_ADD_F16_t16_e64
6245 : AMDGPU::V_ADD_F16_fake16_e64;
6246 case AMDGPU::S_SUB_F16:
6247 return ST.useRealTrue16Insts() ? AMDGPU::V_SUB_F16_t16_e64
6248 : AMDGPU::V_SUB_F16_fake16_e64;
6249 case AMDGPU::S_MIN_F16:
6250 return ST.useRealTrue16Insts() ? AMDGPU::V_MIN_F16_t16_e64
6251 : AMDGPU::V_MIN_F16_fake16_e64;
6252 case AMDGPU::S_MAX_F16:
6253 return ST.useRealTrue16Insts() ? AMDGPU::V_MAX_F16_t16_e64
6254 : AMDGPU::V_MAX_F16_fake16_e64;
6255 case AMDGPU::S_MINIMUM_F16:
6256 return ST.useRealTrue16Insts() ? AMDGPU::V_MINIMUM_F16_t16_e64
6257 : AMDGPU::V_MINIMUM_F16_fake16_e64;
6258 case AMDGPU::S_MAXIMUM_F16:
6259 return ST.useRealTrue16Insts() ? AMDGPU::V_MAXIMUM_F16_t16_e64
6260 : AMDGPU::V_MAXIMUM_F16_fake16_e64;
6261 case AMDGPU::S_MUL_F16:
6262 return ST.useRealTrue16Insts() ? AMDGPU::V_MUL_F16_t16_e64
6263 : AMDGPU::V_MUL_F16_fake16_e64;
6264 case AMDGPU::S_CVT_PK_RTZ_F16_F32:
return AMDGPU::V_CVT_PKRTZ_F16_F32_e64;
6265 case AMDGPU::S_FMAC_F32:
return AMDGPU::V_FMAC_F32_e64;
6266 case AMDGPU::S_FMAC_F16:
6267 return ST.useRealTrue16Insts() ? AMDGPU::V_FMAC_F16_t16_e64
6268 : AMDGPU::V_FMAC_F16_fake16_e64;
6269 case AMDGPU::S_FMAMK_F32:
return AMDGPU::V_FMAMK_F32;
6270 case AMDGPU::S_FMAAK_F32:
return AMDGPU::V_FMAAK_F32;
6271 case AMDGPU::S_CMP_LT_F32:
return AMDGPU::V_CMP_LT_F32_e64;
6272 case AMDGPU::S_CMP_EQ_F32:
return AMDGPU::V_CMP_EQ_F32_e64;
6273 case AMDGPU::S_CMP_LE_F32:
return AMDGPU::V_CMP_LE_F32_e64;
6274 case AMDGPU::S_CMP_GT_F32:
return AMDGPU::V_CMP_GT_F32_e64;
6275 case AMDGPU::S_CMP_LG_F32:
return AMDGPU::V_CMP_LG_F32_e64;
6276 case AMDGPU::S_CMP_GE_F32:
return AMDGPU::V_CMP_GE_F32_e64;
6277 case AMDGPU::S_CMP_O_F32:
return AMDGPU::V_CMP_O_F32_e64;
6278 case AMDGPU::S_CMP_U_F32:
return AMDGPU::V_CMP_U_F32_e64;
6279 case AMDGPU::S_CMP_NGE_F32:
return AMDGPU::V_CMP_NGE_F32_e64;
6280 case AMDGPU::S_CMP_NLG_F32:
return AMDGPU::V_CMP_NLG_F32_e64;
6281 case AMDGPU::S_CMP_NGT_F32:
return AMDGPU::V_CMP_NGT_F32_e64;
6282 case AMDGPU::S_CMP_NLE_F32:
return AMDGPU::V_CMP_NLE_F32_e64;
6283 case AMDGPU::S_CMP_NEQ_F32:
return AMDGPU::V_CMP_NEQ_F32_e64;
6284 case AMDGPU::S_CMP_NLT_F32:
return AMDGPU::V_CMP_NLT_F32_e64;
6285 case AMDGPU::S_CMP_LT_F16:
6286 return ST.useRealTrue16Insts() ? AMDGPU::V_CMP_LT_F16_t16_e64
6287 : AMDGPU::V_CMP_LT_F16_fake16_e64;
6288 case AMDGPU::S_CMP_EQ_F16:
6289 return ST.useRealTrue16Insts() ? AMDGPU::V_CMP_EQ_F16_t16_e64
6290 : AMDGPU::V_CMP_EQ_F16_fake16_e64;
6291 case AMDGPU::S_CMP_LE_F16:
6292 return ST.useRealTrue16Insts() ? AMDGPU::V_CMP_LE_F16_t16_e64
6293 : AMDGPU::V_CMP_LE_F16_fake16_e64;
6294 case AMDGPU::S_CMP_GT_F16:
6295 return ST.useRealTrue16Insts() ? AMDGPU::V_CMP_GT_F16_t16_e64
6296 : AMDGPU::V_CMP_GT_F16_fake16_e64;
6297 case AMDGPU::S_CMP_LG_F16:
6298 return ST.useRealTrue16Insts() ? AMDGPU::V_CMP_LG_F16_t16_e64
6299 : AMDGPU::V_CMP_LG_F16_fake16_e64;
6300 case AMDGPU::S_CMP_GE_F16:
6301 return ST.useRealTrue16Insts() ? AMDGPU::V_CMP_GE_F16_t16_e64
6302 : AMDGPU::V_CMP_GE_F16_fake16_e64;
6303 case AMDGPU::S_CMP_O_F16:
6304 return ST.useRealTrue16Insts() ? AMDGPU::V_CMP_O_F16_t16_e64
6305 : AMDGPU::V_CMP_O_F16_fake16_e64;
6306 case AMDGPU::S_CMP_U_F16:
6307 return ST.useRealTrue16Insts() ? AMDGPU::V_CMP_U_F16_t16_e64
6308 : AMDGPU::V_CMP_U_F16_fake16_e64;
6309 case AMDGPU::S_CMP_NGE_F16:
6310 return ST.useRealTrue16Insts() ? AMDGPU::V_CMP_NGE_F16_t16_e64
6311 : AMDGPU::V_CMP_NGE_F16_fake16_e64;
6312 case AMDGPU::S_CMP_NLG_F16:
6313 return ST.useRealTrue16Insts() ? AMDGPU::V_CMP_NLG_F16_t16_e64
6314 : AMDGPU::V_CMP_NLG_F16_fake16_e64;
6315 case AMDGPU::S_CMP_NGT_F16:
6316 return ST.useRealTrue16Insts() ? AMDGPU::V_CMP_NGT_F16_t16_e64
6317 : AMDGPU::V_CMP_NGT_F16_fake16_e64;
6318 case AMDGPU::S_CMP_NLE_F16:
6319 return ST.useRealTrue16Insts() ? AMDGPU::V_CMP_NLE_F16_t16_e64
6320 : AMDGPU::V_CMP_NLE_F16_fake16_e64;
6321 case AMDGPU::S_CMP_NEQ_F16:
6322 return ST.useRealTrue16Insts() ? AMDGPU::V_CMP_NEQ_F16_t16_e64
6323 : AMDGPU::V_CMP_NEQ_F16_fake16_e64;
6324 case AMDGPU::S_CMP_NLT_F16:
6325 return ST.useRealTrue16Insts() ? AMDGPU::V_CMP_NLT_F16_t16_e64
6326 : AMDGPU::V_CMP_NLT_F16_fake16_e64;
6327 case AMDGPU::V_S_EXP_F32_e64:
return AMDGPU::V_EXP_F32_e64;
6328 case AMDGPU::V_S_EXP_F16_e64:
6329 return ST.useRealTrue16Insts() ? AMDGPU::V_EXP_F16_t16_e64
6330 : AMDGPU::V_EXP_F16_fake16_e64;
6331 case AMDGPU::V_S_LOG_F32_e64:
return AMDGPU::V_LOG_F32_e64;
6332 case AMDGPU::V_S_LOG_F16_e64:
6333 return ST.useRealTrue16Insts() ? AMDGPU::V_LOG_F16_t16_e64
6334 : AMDGPU::V_LOG_F16_fake16_e64;
6335 case AMDGPU::V_S_RCP_F32_e64:
return AMDGPU::V_RCP_F32_e64;
6336 case AMDGPU::V_S_RCP_F16_e64:
6337 return ST.useRealTrue16Insts() ? AMDGPU::V_RCP_F16_t16_e64
6338 : AMDGPU::V_RCP_F16_fake16_e64;
6339 case AMDGPU::V_S_RSQ_F32_e64:
return AMDGPU::V_RSQ_F32_e64;
6340 case AMDGPU::V_S_RSQ_F16_e64:
6341 return ST.useRealTrue16Insts() ? AMDGPU::V_RSQ_F16_t16_e64
6342 : AMDGPU::V_RSQ_F16_fake16_e64;
6343 case AMDGPU::V_S_SQRT_F32_e64:
return AMDGPU::V_SQRT_F32_e64;
6344 case AMDGPU::V_S_SQRT_F16_e64:
6345 return ST.useRealTrue16Insts() ? AMDGPU::V_SQRT_F16_t16_e64
6346 : AMDGPU::V_SQRT_F16_fake16_e64;
6349 "Unexpected scalar opcode without corresponding vector one!");
6398 "Not a whole wave func");
6401 if (
MI.getOpcode() == AMDGPU::SI_WHOLE_WAVE_FUNC_SETUP ||
6402 MI.getOpcode() == AMDGPU::G_AMDGPU_WHOLE_WAVE_FUNC_SETUP)
6409 unsigned OpNo)
const {
6411 if (
MI.isVariadic() || OpNo >=
Desc.getNumOperands() ||
6412 Desc.operands()[OpNo].RegClass == -1) {
6415 if (Reg.isVirtual()) {
6419 return RI.getPhysRegBaseClass(Reg);
6422 int16_t RegClass = getOpRegClassID(
Desc.operands()[OpNo]);
6423 return RegClass < 0 ? nullptr : RI.getRegClass(RegClass);
6428 constexpr AMDGPU::OpName OpNames[] = {
6429 AMDGPU::OpName::src0, AMDGPU::OpName::src1, AMDGPU::OpName::src2};
6432 int SrcIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), OpNames[
I]);
6433 if (
static_cast<unsigned>(SrcIdx) == OpIdx)
6445 unsigned RCID = getOpRegClassID(
get(
MI.getOpcode()).operands()[OpIdx]);
6447 unsigned Size = RI.getRegSizeInBits(*RC);
6448 unsigned Opcode = (
Size == 64) ? AMDGPU::V_MOV_B64_PSEUDO
6449 :
Size == 16 ? AMDGPU::V_MOV_B16_t16_e64
6450 : AMDGPU::V_MOV_B32_e32;
6452 Opcode = AMDGPU::COPY;
6453 else if (RI.isSGPRClass(RC))
6454 Opcode = (
Size == 64) ? AMDGPU::S_MOV_B64 : AMDGPU::S_MOV_B32;
6479 .
addImm(AMDGPU::sub0_sub1)
6481 .
addImm(AMDGPU::sub2_sub3);
6494 return RI.getSubReg(SuperReg.
getReg(), SubIdx);
6500 unsigned NewSubIdx = RI.composeSubRegIndices(SuperReg.
getSubReg(), SubIdx);
6511 if (SubIdx == AMDGPU::sub0)
6513 if (SubIdx == AMDGPU::sub1)
6525void SIInstrInfo::swapOperands(
MachineInstr &Inst)
const {
6541 if (Reg.isPhysical())
6551 return RI.getMatchingSuperRegClass(SuperRC, DRC, MO.
getSubReg()) !=
nullptr;
6554 return RI.getCommonSubClass(DRC, RC) !=
nullptr;
6561 unsigned Opc =
MI.getOpcode();
6564 if (MO.
isReg() && RI.isSGPRReg(MRI, MO.
getReg()) &&
6574 bool IsAGPR = RI.isAGPR(MRI, MO.
getReg());
6575 if (IsAGPR && !ST.hasMAIInsts())
6581 const int VDstIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::vdst);
6582 const int DataIdx = AMDGPU::getNamedOperandIdx(
6583 Opc,
isDS(
Opc) ? AMDGPU::OpName::data0 : AMDGPU::OpName::vdata);
6584 if ((
int)OpIdx == VDstIdx && DataIdx != -1 &&
6585 MI.getOperand(DataIdx).isReg() &&
6586 RI.isAGPR(MRI,
MI.getOperand(DataIdx).getReg()) != IsAGPR)
6588 if ((
int)OpIdx == DataIdx) {
6589 if (VDstIdx != -1 &&
6590 RI.isAGPR(MRI,
MI.getOperand(VDstIdx).getReg()) != IsAGPR)
6593 const int Data1Idx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::data1);
6594 if (Data1Idx != -1 &&
MI.getOperand(Data1Idx).isReg() &&
6595 RI.isAGPR(MRI,
MI.getOperand(Data1Idx).getReg()) != IsAGPR)
6600 if (
Opc == AMDGPU::V_ACCVGPR_WRITE_B32_e64 && !ST.hasGFX90AInsts() &&
6601 (
int)OpIdx == AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src0) &&
6602 RI.isSGPRReg(MRI, MO.
getReg()))
6605 if (ST.hasFlatScratchHiInB64InstHazard() &&
6612 if (
Opc == AMDGPU::S_BITCMP0_B64 ||
Opc == AMDGPU::S_BITCMP1_B64)
6615 if (!ST.hasDPPSrc1SGPR() &&
isDPP(
MI) && RI.isSGPRReg(MRI, MO.
getReg()) &&
6616 (
int)OpIdx == AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src1))
6636 constexpr unsigned NumOps = 3;
6637 constexpr AMDGPU::OpName OpNames[
NumOps * 2] = {
6638 AMDGPU::OpName::src0, AMDGPU::OpName::src1,
6639 AMDGPU::OpName::src2, AMDGPU::OpName::src0_modifiers,
6640 AMDGPU::OpName::src1_modifiers, AMDGPU::OpName::src2_modifiers};
6645 int SrcIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), OpNames[SrcN]);
6648 MO = &
MI.getOperand(SrcIdx);
6651 if (!MO->
isReg() || !RI.isSGPRReg(MRI, MO->
getReg()))
6655 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), OpNames[
NumOps + SrcN]);
6659 unsigned Mods =
MI.getOperand(ModsIdx).getImm();
6663 return !OpSel && !OpSelHi;
6672 int64_t RegClass = getOpRegClassID(OpInfo);
6674 RegClass != -1 ? RI.getRegClass(RegClass) :
nullptr;
6676 MO = &
MI.getOperand(OpIdx);
6680 if (
isVALU(
MI,
true) && !IsInlineConst &&
6684 int ConstantBusLimit = ST.getConstantBusLimit(
MI.getOpcode());
6685 int LiteralLimit = !
isVOP3(
MI) || ST.hasVOP3Literal() ? 1 : 0;
6689 if (!LiteralLimit--)
6699 for (
unsigned i = 0, e =
MI.getNumOperands(); i != e; ++i) {
6707 if (--ConstantBusLimit <= 0)
6719 if (!LiteralLimit--)
6721 if (--ConstantBusLimit <= 0)
6727 for (
unsigned i = 0, e =
MI.getNumOperands(); i != e; ++i) {
6731 if (!
Op.isReg() && !
Op.isFI() && !
Op.isRegMask() &&
6733 !
Op.isIdenticalTo(*MO))
6743 }
else if (IsInlineConst && ST.hasNoF16PseudoScalarTransInlineConstants() &&
6758 bool Is64BitOp = Is64BitFPOp ||
6766 (!ST.has64BitLiterals() || InstDesc.
getSize() != 4))
6775 if (!Is64BitFPOp && (int32_t)
Imm < 0 &&
6793 bool IsGFX950Only = ST.hasGFX950Insts();
6794 bool IsGFX940Only = ST.hasGFX940Insts();
6796 if (!IsGFX950Only && !IsGFX940Only)
6814 unsigned Opcode =
MI.getOpcode();
6816 case AMDGPU::V_CVT_PK_BF8_F32_e64:
6817 case AMDGPU::V_CVT_PK_FP8_F32_e64:
6818 case AMDGPU::V_MQSAD_PK_U16_U8_e64:
6819 case AMDGPU::V_MQSAD_U32_U8_e64:
6820 case AMDGPU::V_PK_ADD_F16:
6821 case AMDGPU::V_PK_ADD_F32:
6822 case AMDGPU::V_PK_ADD_I16:
6823 case AMDGPU::V_PK_ADD_U16:
6824 case AMDGPU::V_PK_ASHRREV_I16:
6825 case AMDGPU::V_PK_FMA_F16:
6826 case AMDGPU::V_PK_FMA_F32:
6827 case AMDGPU::V_PK_FMAC_F16_e32:
6828 case AMDGPU::V_PK_FMAC_F16_e64:
6829 case AMDGPU::V_PK_LSHLREV_B16:
6830 case AMDGPU::V_PK_LSHRREV_B16:
6831 case AMDGPU::V_PK_MAD_I16:
6832 case AMDGPU::V_PK_MAD_U16:
6833 case AMDGPU::V_PK_MAX_F16:
6834 case AMDGPU::V_PK_MAX_I16:
6835 case AMDGPU::V_PK_MAX_U16:
6836 case AMDGPU::V_PK_MIN_F16:
6837 case AMDGPU::V_PK_MIN_I16:
6838 case AMDGPU::V_PK_MIN_U16:
6839 case AMDGPU::V_PK_MOV_B32:
6840 case AMDGPU::V_PK_MUL_F16:
6841 case AMDGPU::V_PK_MUL_F32:
6842 case AMDGPU::V_PK_MUL_LO_U16:
6843 case AMDGPU::V_PK_SUB_I16:
6844 case AMDGPU::V_PK_SUB_U16:
6845 case AMDGPU::V_QSAD_PK_U16_U8_e64:
6854 unsigned Opc =
MI.getOpcode();
6857 int Src0Idx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src0);
6860 int Src1Idx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src1);
6866 if (HasImplicitSGPR && ST.getConstantBusLimit(
Opc) <= 1 && Src0.
isReg() &&
6867 RI.isSGPRReg(MRI, Src0.
getReg()))
6873 if (
Opc == AMDGPU::V_WRITELANE_B32) {
6875 if (Src0.
isReg() && RI.isVGPR(MRI, Src0.
getReg())) {
6881 if (Src1.
isReg() && RI.isVGPR(MRI, Src1.
getReg())) {
6892 if (
Opc == AMDGPU::V_FMAC_F32_e32 ||
Opc == AMDGPU::V_FMAC_F16_e32) {
6893 int Src2Idx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src2);
6894 if (!RI.isVGPR(MRI,
MI.getOperand(Src2Idx).getReg()))
6906 if (
Opc == AMDGPU::V_READLANE_B32 && Src1.
isReg() &&
6907 RI.isVGPR(MRI, Src1.
getReg())) {
6920 if (HasImplicitSGPR || !
MI.isCommutable()) {
6937 if (CommutedOpc == -1) {
6942 MI.setDesc(
get(CommutedOpc));
6946 bool Src0Kill = Src0.
isKill();
6950 else if (Src1.
isReg()) {
6965 unsigned Opc =
MI.getOpcode();
6968 AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src0),
6969 AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src1),
6970 AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src2)
6973 if (
Opc == AMDGPU::V_PERMLANE16_B32_e64 ||
6974 Opc == AMDGPU::V_PERMLANEX16_B32_e64 ||
6975 Opc == AMDGPU::V_PERMLANE_BCAST_B32_e64 ||
6976 Opc == AMDGPU::V_PERMLANE_UP_B32_e64 ||
6977 Opc == AMDGPU::V_PERMLANE_DOWN_B32_e64 ||
6978 Opc == AMDGPU::V_PERMLANE_XOR_B32_e64 ||
6979 Opc == AMDGPU::V_PERMLANE_IDX_GEN_B32_e64) {
6989 if (VOP3Idx[2] != -1) {
7001 int ConstantBusLimit = ST.getConstantBusLimit(
Opc);
7002 int LiteralLimit = ST.hasVOP3Literal() ? 1 : 0;
7004 Register SGPRReg = findUsedSGPR(
MI, VOP3Idx);
7006 SGPRsUsed.
insert(SGPRReg);
7010 for (
int Idx : VOP3Idx) {
7019 if (LiteralLimit > 0 && ConstantBusLimit > 0) {
7031 if (!RI.isSGPRClass(RI.getRegClassForReg(MRI, MO.
getReg())))
7038 if (ConstantBusLimit > 0) {
7050 if ((
Opc == AMDGPU::V_FMAC_F32_e64 ||
Opc == AMDGPU::V_FMAC_F16_e64) &&
7051 !RI.isVGPR(MRI,
MI.getOperand(VOP3Idx[2]).getReg()))
7057 for (
unsigned I = 0;
I < 3; ++
I) {
7070 SRC = RI.getCommonSubClass(SRC, DstRC);
7073 unsigned SubRegs = RI.getRegSizeInBits(*VRC) / 32;
7075 if (RI.hasAGPRs(VRC)) {
7076 VRC = RI.getEquivalentVGPRClass(VRC);
7079 get(TargetOpcode::COPY), NewSrcReg)
7086 get(AMDGPU::V_READFIRSTLANE_B32), DstReg)
7092 for (
unsigned i = 0; i < SubRegs; ++i) {
7095 get(AMDGPU::V_READFIRSTLANE_B32), SGPR)
7096 .
addReg(SrcReg, {}, RI.getSubRegFromChannel(i));
7102 get(AMDGPU::REG_SEQUENCE), DstReg);
7103 for (
unsigned i = 0; i < SubRegs; ++i) {
7105 MIB.
addImm(RI.getSubRegFromChannel(i));
7118 if (SBase && !RI.isSGPRClass(MRI.
getRegClass(SBase->getReg()))) {
7120 SBase->setReg(SGPR);
7123 if (SOff && !RI.isSGPRReg(MRI, SOff->
getReg())) {
7131 int OldSAddrIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::saddr);
7132 if (OldSAddrIdx < 0)
7145 if (RI.isSGPRReg(MRI, SAddr.
getReg()))
7148 int NewVAddrIdx = AMDGPU::getNamedOperandIdx(NewOpc, AMDGPU::OpName::vaddr);
7149 if (NewVAddrIdx < 0)
7152 int OldVAddrIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::vaddr);
7156 if (OldVAddrIdx >= 0) {
7170 if (OldVAddrIdx == NewVAddrIdx) {
7181 assert(OldSAddrIdx == NewVAddrIdx);
7183 if (OldVAddrIdx >= 0) {
7184 int NewVDstIn = AMDGPU::getNamedOperandIdx(NewOpc,
7185 AMDGPU::OpName::vdst_in);
7189 if (NewVDstIn != -1) {
7190 int OldVDstIn = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::vdst_in);
7196 if (NewVDstIn != -1) {
7197 int NewVDst = AMDGPU::getNamedOperandIdx(NewOpc, AMDGPU::OpName::vdst);
7238 unsigned OpSubReg =
Op.getSubReg();
7241 RI.getRegClassForReg(MRI, OpReg), OpSubReg);
7248 auto Copy =
BuildMI(InsertMBB,
I,
DL,
get(AMDGPU::COPY), DstReg)
7249 .
addReg(OpReg, {}, OpSubReg);
7251 Op.setSubReg(AMDGPU::NoSubRegister);
7258 if (Def->isMoveImmediate() && DstRC != &AMDGPU::VReg_1RegClass)
7261 bool ImpDef = Def->isImplicitDef();
7262 while (!ImpDef && Def && Def->isCopy()) {
7263 if (Def->getOperand(1).getReg().isPhysical())
7266 ImpDef = Def && Def->isImplicitDef();
7268 if (!RI.isSGPRClass(DstRC) && !Copy->readsRegister(AMDGPU::EXEC, &RI) &&
7284 const auto *BoolXExecRC =
TRI->getWaveMaskRegClass();
7289 bool UseNewExecInstructions =
7298 if (UseNewExecInstructions) {
7333 for (
auto [Idx, ScalarOp] :
enumerate(ScalarOps)) {
7334 unsigned RegSize =
TRI->getRegSizeInBits(ScalarOp->getReg(), MRI);
7335 unsigned NumSubRegs =
RegSize / 32;
7336 Register VScalarOp = ScalarOp->getReg();
7339 TII.getRegClass(
TII.get(AMDGPU::V_READFIRSTLANE_B32), 1);
7341 if (NumSubRegs == 1) {
7344 TRI->getCommonSubClass(VScalarOpRC, RFLSrcRC);
7345 Common != VScalarOpRC) {
7352 BuildMI(LoopBB,
I,
DL,
TII.get(AMDGPU::V_READFIRSTLANE_B32), CurReg)
7355 if (UseNewExecInstructions) {
7357 TII.get(AMDGPU::V_CMPX_EQ_U32_nosdst_e32_term))
7360 if (
I == LoopBB.
end())
7365 BuildMI(LoopBB,
I,
DL,
TII.get(AMDGPU::V_CMP_EQ_U32_e64), NewCondReg)
7371 CondReg = NewCondReg;
7382 if (PhySGPRs.empty() || !PhySGPRs[Idx].isValid())
7383 ScalarOp->setReg(CurReg);
7386 BuildMI(*ScalarOp->getParent()->getParent(), ScalarOp->getParent(),
DL,
7387 TII.get(AMDGPU::COPY), PhySGPRs[Idx])
7389 ScalarOp->setReg(PhySGPRs[Idx]);
7391 ScalarOp->setIsKill();
7395 assert(NumSubRegs % 2 == 0 && NumSubRegs <= 32 &&
7396 "Unhandled register size");
7398 for (
unsigned Idx = 0; Idx < NumSubRegs; Idx += 2) {
7405 BuildMI(LoopBB,
I,
DL,
TII.get(AMDGPU::V_READFIRSTLANE_B32), CurRegLo)
7406 .
addReg(VScalarOp, VScalarOpUndef,
TRI->getSubRegFromChannel(Idx));
7409 BuildMI(LoopBB,
I,
DL,
TII.get(AMDGPU::V_READFIRSTLANE_B32), CurRegHi)
7410 .
addReg(VScalarOp, VScalarOpUndef,
7411 TRI->getSubRegFromChannel(Idx + 1));
7418 BuildMI(LoopBB,
I,
DL,
TII.get(AMDGPU::REG_SEQUENCE), CurReg)
7425 NumSubRegs <= 2 ? 0 :
TRI->getSubRegFromChannel(Idx, 2);
7427 if (UseNewExecInstructions) {
7429 TII.get(AMDGPU::V_CMPX_EQ_U64_nosdst_e32_term))
7431 .
addReg(VScalarOp, VScalarOpUndef, SubReg);
7432 if (
I == LoopBB.
end())
7436 BuildMI(LoopBB,
I,
DL,
TII.get(AMDGPU::V_CMP_EQ_U64_e64), NewCondReg)
7438 .
addReg(VScalarOp, VScalarOpUndef, SubReg);
7442 CondReg = NewCondReg;
7453 const auto *SScalarOpRC =
7459 BuildMI(LoopBB,
I,
DL,
TII.get(AMDGPU::REG_SEQUENCE), SScalarOp);
7460 unsigned Channel = 0;
7461 for (
Register Piece : ReadlanePieces) {
7462 Merge.addReg(Piece).addImm(
TRI->getSubRegFromChannel(Channel++));
7466 if (PhySGPRs.empty() || !PhySGPRs[Idx].isValid())
7467 ScalarOp->setReg(SScalarOp);
7469 BuildMI(*ScalarOp->getParent()->getParent(), ScalarOp->getParent(),
DL,
7470 TII.get(AMDGPU::COPY), PhySGPRs[Idx])
7472 ScalarOp->setReg(PhySGPRs[Idx]);
7474 ScalarOp->setIsKill();
7482 if (!UseNewExecInstructions) {
7494 if (UseNewExecInstructions) {
7518 assert((PhySGPRs.empty() || PhySGPRs.size() == ScalarOps.
size()) &&
7519 "Physical SGPRs must be empty or match the number of scalar operands");
7525 if (!Begin.isValid())
7527 if (!End.isValid()) {
7533 const auto *BoolXExecRC =
TRI->getWaveMaskRegClass();
7542 std::numeric_limits<unsigned>::max()) !=
7560 for (
auto I = Begin;
I != AfterMI;
I++) {
7561 for (
auto &MO :
I->all_uses())
7597 for (
auto &Succ : RemainderBB->
successors()) {
7622static std::tuple<unsigned, unsigned>
7630 TII.buildExtractSubReg(
MI, MRI, Rsrc, &AMDGPU::VReg_128RegClass,
7631 AMDGPU::sub0_sub1, &AMDGPU::VReg_64RegClass);
7638 uint64_t RsrcDataFormat =
TII.getDefaultRsrcDataFormat();
7655 .
addImm(AMDGPU::sub0_sub1)
7661 return std::tuple(RsrcPtr, NewSRsrc);
7672 if (ST.useRealTrue16Insts())
7702 if (
MI.getOpcode() == AMDGPU::PHI) {
7704 assert(!RI.isSGPRClass(VRC));
7707 for (
unsigned I = 1, E =
MI.getNumOperands();
I != E;
I += 2) {
7709 if (!
Op.isReg() || !
Op.getReg().isVirtual())
7725 if (
MI.getOpcode() == AMDGPU::REG_SEQUENCE) {
7728 if (RI.hasVGPRs(DstRC)) {
7732 for (
unsigned I = 1, E =
MI.getNumOperands();
I != E;
I += 2) {
7734 if (!
Op.isReg() || !
Op.getReg().isVirtual())
7752 if (
MI.getOpcode() == AMDGPU::INSERT_SUBREG) {
7757 if (DstRC != Src0RC) {
7766 if (
MI.getOpcode() == AMDGPU::SI_INIT_M0) {
7768 if (Src.isReg() && RI.hasVectorRegisters(MRI.
getRegClass(Src.getReg())))
7774 if (
MI.getOpcode() == AMDGPU::S_BITREPLICATE_B64_B32 ||
7775 MI.getOpcode() == AMDGPU::S_QUADMASK_B32 ||
7776 MI.getOpcode() == AMDGPU::S_QUADMASK_B64 ||
7777 MI.getOpcode() == AMDGPU::S_WQM_B32 ||
7778 MI.getOpcode() == AMDGPU::S_WQM_B64 ||
7779 MI.getOpcode() == AMDGPU::S_INVERSE_BALLOT_U32 ||
7780 MI.getOpcode() == AMDGPU::S_INVERSE_BALLOT_U64) {
7782 if (Src.isReg() && RI.hasVectorRegisters(MRI.
getRegClass(Src.getReg())))
7795 ? AMDGPU::OpName::rsrc
7796 : AMDGPU::OpName::srsrc;
7801 AMDGPU::OpName SampOpName =
7802 isMIMG(
MI) ? AMDGPU::OpName::ssamp : AMDGPU::OpName::samp;
7811 if (
MI.getOpcode() == AMDGPU::SI_CALL_ISEL) {
7819 if (
MI.getOpcode() == AMDGPU::S_SLEEP_VAR) {
7823 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
7833 if (
MI.getOpcode() == AMDGPU::TENSOR_LOAD_TO_LDS_d2 ||
7834 MI.getOpcode() == AMDGPU::TENSOR_LOAD_TO_LDS_d4 ||
7835 MI.getOpcode() == AMDGPU::TENSOR_STORE_FROM_LDS_d2 ||
7836 MI.getOpcode() == AMDGPU::TENSOR_STORE_FROM_LDS_d4) {
7838 if (Src.isReg() && RI.hasVectorRegisters(MRI.
getRegClass(Src.getReg())))
7845 bool isSoffsetLegal =
true;
7847 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::soffset);
7848 if (SoffsetIdx != -1) {
7852 isSoffsetLegal =
false;
7856 bool isRsrcLegal =
true;
7858 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::srsrc);
7859 if (RsrcIdx != -1) {
7861 if (Rsrc->
isReg() && !RI.isSGPRReg(MRI, Rsrc->
getReg()))
7862 isRsrcLegal =
false;
7866 if (isRsrcLegal && isSoffsetLegal)
7894 const auto *BoolXExecRC = RI.getWaveMaskRegClass();
7898 unsigned RsrcPtr, NewSRsrc;
7905 .
addReg(RsrcPtr, {}, AMDGPU::sub0)
7906 .addReg(VAddr->
getReg(), {}, AMDGPU::sub0)
7912 .
addReg(RsrcPtr, {}, AMDGPU::sub1)
7913 .addReg(VAddr->
getReg(), {}, AMDGPU::sub1)
7926 }
else if (!VAddr && ST.hasAddr64()) {
7930 "FIXME: Need to emit flat atomics here");
7932 unsigned RsrcPtr, NewSRsrc;
7958 MIB.
addImm(CPol->getImm());
7963 MIB.
addImm(TFE->getImm());
7983 MI.removeFromParent();
7988 .
addReg(RsrcPtr, {}, AMDGPU::sub0)
7989 .addImm(AMDGPU::sub0)
7990 .
addReg(RsrcPtr, {}, AMDGPU::sub1)
7991 .addImm(AMDGPU::sub1);
7994 if (!isSoffsetLegal) {
8005 if (!isSoffsetLegal) {
8014 if (InSet.insert(
MI).second)
8018 AMDGPU::getNamedOperandIdx(
MI->getOpcode(), AMDGPU::OpName::srsrc);
8019 if (RsrcIdx != -1) {
8020 DeferredList.insert(
MI);
8025 return DeferredList.contains(
MI);
8035 if (!ST.useRealTrue16Insts())
8038 unsigned Opcode =
MI.getOpcode();
8041 if (OpIdx >=
MI.getNumExplicitOperands() ||
8042 OpIdx >=
get(Opcode).getNumOperands() ||
8043 get(Opcode).operands()[OpIdx].RegClass == -1)
8047 if (!
Op.isReg() || !
Op.getReg().isVirtual() ||
Op.isDef())
8051 if (!RI.isVGPRClass(CurrRC))
8054 int16_t RCID = getOpRegClassID(
get(Opcode).operands()[OpIdx]);
8056 if (RI.getMatchingSuperRegClass(CurrRC, ExpectedRC, AMDGPU::lo16)) {
8058 if (
Op.getSubReg() == AMDGPU::NoSubRegister)
8059 Op.setSubReg(AMDGPU::lo16);
8064 RI.getSubRegisterClass(CurrRC,
Op.getSubReg());
8065 if (RI.getMatchingSuperRegClass(ExpectedRC, CurrSRC, AMDGPU::lo16)) {
8075 Op.setReg(NewDstReg);
8076 Op.setSubReg(AMDGPU::NoSubRegister);
8081 for (
unsigned OpIdx = 0; OpIdx <
MI.getNumExplicitOperands(); OpIdx++)
8089 assert(
MI->getOpcode() == AMDGPU::SI_CALL_ISEL &&
8090 "This only handle waterfall for SI_CALL_ISEL");
8097 while (Start->getOpcode() != AMDGPU::ADJCALLSTACKUP)
8100 while (End->getOpcode() != AMDGPU::ADJCALLSTACKDOWN)
8105 while (End !=
MBB.end() && End->isCopy() &&
8106 MI->definesRegister(End->getOperand(1).getReg(), &RI))
8116 while (!Worklist.
empty()) {
8122 moveToVALUImpl(Worklist, MDT, Inst, WaterFalls, V2SPhyCopiesToErase);
8128 moveToVALUImpl(Worklist, MDT, *Inst, WaterFalls, V2SPhyCopiesToErase);
8130 "Deferred MachineInstr are not supposed to re-populate worklist");
8133 for (std::pair<MachineInstr *, V2PhysSCopyInfo> &Entry : WaterFalls) {
8134 if (Entry.first->getOpcode() == AMDGPU::SI_CALL_ISEL)
8136 Entry.second.SGPRs);
8139 for (std::pair<MachineInstr *, bool> Entry : V2SPhyCopiesToErase)
8141 Entry.first->eraseFromParent();
8149 if (SubRegIndices.
size() <= 1) {
8152 get(AMDGPU::V_READFIRSTLANE_B32), NewDst)
8159 for (int16_t Indice : SubRegIndices) {
8162 get(AMDGPU::V_READFIRSTLANE_B32), NewDst)
8169 get(AMDGPU::REG_SEQUENCE), DstReg);
8170 for (
unsigned i = 0; i < SubRegIndices.size(); ++i) {
8172 MIB.
addImm(RI.getSubRegFromChannel(i));
8182 if (DstReg == AMDGPU::M0) {
8195 if (
I->getOpcode() == AMDGPU::SI_CALL_ISEL) {
8197 for (
unsigned i = 0; i <
UseMI->getNumOperands(); ++i) {
8198 if (
UseMI->getOperand(i).isReg() &&
8199 UseMI->getOperand(i).getReg() == DstReg) {
8203 V2SCopyInfo.MOs.push_back(MO);
8204 V2SCopyInfo.SGPRs.push_back(DstReg);
8208 }
else if (
I->getOpcode() == AMDGPU::SI_RETURN_TO_EPILOG &&
8209 I->getOperand(0).isReg() &&
8210 I->getOperand(0).getReg() == DstReg) {
8213 }
else if (
I->readsRegister(DstReg, &RI)) {
8215 V2SPhyCopiesToErase[&Inst] =
false;
8217 if (
I->findRegisterDefOperand(DstReg, &RI))
8239 case AMDGPU::S_ADD_I32:
8240 case AMDGPU::S_SUB_I32: {
8244 std::tie(
Changed, CreatedBBTmp) = moveScalarAddSub(Worklist, Inst, MDT);
8252 case AMDGPU::S_MUL_U64:
8253 if (ST.hasVMulU64Inst()) {
8254 NewOpcode = AMDGPU::V_MUL_U64_e64;
8258 splitScalarSMulU64(Worklist, Inst, MDT);
8262 case AMDGPU::S_MUL_U64_U32_PSEUDO:
8263 case AMDGPU::S_MUL_I64_I32_PSEUDO:
8266 splitScalarSMulPseudo(Worklist, Inst, MDT);
8270 case AMDGPU::S_AND_B64:
8271 splitScalar64BitBinaryOp(Worklist, Inst, AMDGPU::S_AND_B32, MDT);
8275 case AMDGPU::S_OR_B64:
8276 splitScalar64BitBinaryOp(Worklist, Inst, AMDGPU::S_OR_B32, MDT);
8280 case AMDGPU::S_XOR_B64:
8281 splitScalar64BitBinaryOp(Worklist, Inst, AMDGPU::S_XOR_B32, MDT);
8285 case AMDGPU::S_NAND_B64:
8286 splitScalar64BitBinaryOp(Worklist, Inst, AMDGPU::S_NAND_B32, MDT);
8290 case AMDGPU::S_NOR_B64:
8291 splitScalar64BitBinaryOp(Worklist, Inst, AMDGPU::S_NOR_B32, MDT);
8295 case AMDGPU::S_XNOR_B64:
8296 if (ST.hasDLInsts())
8297 splitScalar64BitBinaryOp(Worklist, Inst, AMDGPU::S_XNOR_B32, MDT);
8299 splitScalar64BitXnor(Worklist, Inst, MDT);
8303 case AMDGPU::S_ANDN2_B64:
8304 splitScalar64BitBinaryOp(Worklist, Inst, AMDGPU::S_ANDN2_B32, MDT);
8308 case AMDGPU::S_ORN2_B64:
8309 splitScalar64BitBinaryOp(Worklist, Inst, AMDGPU::S_ORN2_B32, MDT);
8313 case AMDGPU::S_BREV_B64:
8314 splitScalar64BitUnaryOp(Worklist, Inst, AMDGPU::S_BREV_B32,
true);
8318 case AMDGPU::S_NOT_B64:
8319 splitScalar64BitUnaryOp(Worklist, Inst, AMDGPU::S_NOT_B32);
8323 case AMDGPU::S_BCNT1_I32_B64:
8324 splitScalar64BitBCNT(Worklist, Inst);
8328 case AMDGPU::S_BFE_I64:
8329 splitScalar64BitBFE(Worklist, Inst);
8333 case AMDGPU::S_FLBIT_I32_B64:
8334 splitScalar64BitCountOp(Worklist, Inst, AMDGPU::V_FFBH_U32_e32);
8337 case AMDGPU::S_FF1_I32_B64:
8338 splitScalar64BitCountOp(Worklist, Inst, AMDGPU::V_FFBL_B32_e32);
8342 case AMDGPU::S_LSHL_B32:
8343 if (ST.hasOnlyRevVALUShifts()) {
8344 NewOpcode = AMDGPU::V_LSHLREV_B32_e64;
8348 case AMDGPU::S_ASHR_I32:
8349 if (ST.hasOnlyRevVALUShifts()) {
8350 NewOpcode = AMDGPU::V_ASHRREV_I32_e64;
8354 case AMDGPU::S_LSHR_B32:
8355 if (ST.hasOnlyRevVALUShifts()) {
8356 NewOpcode = AMDGPU::V_LSHRREV_B32_e64;
8360 case AMDGPU::S_LSHL_B64:
8361 if (ST.hasOnlyRevVALUShifts()) {
8363 ? AMDGPU::V_LSHLREV_B64_pseudo_e64
8364 : AMDGPU::V_LSHLREV_B64_e64;
8368 case AMDGPU::S_ASHR_I64:
8369 if (ST.hasOnlyRevVALUShifts()) {
8370 NewOpcode = AMDGPU::V_ASHRREV_I64_e64;
8374 case AMDGPU::S_LSHR_B64:
8375 if (ST.hasOnlyRevVALUShifts()) {
8376 NewOpcode = AMDGPU::V_LSHRREV_B64_e64;
8381 case AMDGPU::S_ABS_I32:
8382 lowerScalarAbs(Worklist, Inst);
8386 case AMDGPU::S_ABSDIFF_I32:
8387 lowerScalarAbsDiff(Worklist, Inst);
8391 case AMDGPU::S_CBRANCH_SCC0:
8392 case AMDGPU::S_CBRANCH_SCC1: {
8395 bool IsSCC = CondReg == AMDGPU::SCC;
8403 case AMDGPU::S_BFE_U64:
8404 case AMDGPU::S_BFM_B64:
8407 case AMDGPU::S_PACK_LL_B32_B16:
8408 case AMDGPU::S_PACK_LH_B32_B16:
8409 case AMDGPU::S_PACK_HL_B32_B16:
8410 case AMDGPU::S_PACK_HH_B32_B16:
8411 movePackToVALU(Worklist, MRI, Inst);
8415 case AMDGPU::S_XNOR_B32:
8416 lowerScalarXnor(Worklist, Inst);
8420 case AMDGPU::S_NAND_B32:
8421 splitScalarNotBinop(Worklist, Inst, AMDGPU::S_AND_B32);
8425 case AMDGPU::S_NOR_B32:
8426 splitScalarNotBinop(Worklist, Inst, AMDGPU::S_OR_B32);
8430 case AMDGPU::S_ANDN2_B32:
8431 splitScalarBinOpN2(Worklist, Inst, AMDGPU::S_AND_B32);
8435 case AMDGPU::S_ORN2_B32:
8436 splitScalarBinOpN2(Worklist, Inst, AMDGPU::S_OR_B32);
8444 case AMDGPU::S_ADD_CO_PSEUDO:
8445 case AMDGPU::S_SUB_CO_PSEUDO: {
8446 unsigned Opc = (Inst.
getOpcode() == AMDGPU::S_ADD_CO_PSEUDO)
8447 ? AMDGPU::V_ADDC_U32_e64
8448 : AMDGPU::V_SUBB_U32_e64;
8449 const auto *CarryRC = RI.getWaveMaskRegClass();
8471 addUsersToMoveToVALUWorklist(DestReg, MRI, Worklist);
8475 case AMDGPU::S_UADDO_PSEUDO:
8476 case AMDGPU::S_USUBO_PSEUDO: {
8482 unsigned Opc = (Inst.
getOpcode() == AMDGPU::S_UADDO_PSEUDO)
8483 ? AMDGPU::V_ADD_CO_U32_e64
8484 : AMDGPU::V_SUB_CO_U32_e64;
8496 addUsersToMoveToVALUWorklist(DestReg, MRI, Worklist);
8500 case AMDGPU::S_LSHL1_ADD_U32:
8501 case AMDGPU::S_LSHL2_ADD_U32:
8502 case AMDGPU::S_LSHL3_ADD_U32:
8503 case AMDGPU::S_LSHL4_ADD_U32: {
8507 unsigned ShiftAmt = (Opcode == AMDGPU::S_LSHL1_ADD_U32 ? 1
8508 : Opcode == AMDGPU::S_LSHL2_ADD_U32 ? 2
8509 : Opcode == AMDGPU::S_LSHL3_ADD_U32 ? 3
8523 addUsersToMoveToVALUWorklist(DestReg, MRI, Worklist);
8527 case AMDGPU::S_CSELECT_B32:
8528 case AMDGPU::S_CSELECT_B64:
8529 lowerSelect(Worklist, Inst, MDT);
8532 case AMDGPU::S_CMP_EQ_I32:
8533 case AMDGPU::S_CMP_LG_I32:
8534 case AMDGPU::S_CMP_GT_I32:
8535 case AMDGPU::S_CMP_GE_I32:
8536 case AMDGPU::S_CMP_LT_I32:
8537 case AMDGPU::S_CMP_LE_I32:
8538 case AMDGPU::S_CMP_EQ_U32:
8539 case AMDGPU::S_CMP_LG_U32:
8540 case AMDGPU::S_CMP_GT_U32:
8541 case AMDGPU::S_CMP_GE_U32:
8542 case AMDGPU::S_CMP_LT_U32:
8543 case AMDGPU::S_CMP_LE_U32:
8544 case AMDGPU::S_CMP_EQ_U64:
8545 case AMDGPU::S_CMP_LG_U64:
8546 case AMDGPU::S_CMP_LT_F32:
8547 case AMDGPU::S_CMP_EQ_F32:
8548 case AMDGPU::S_CMP_LE_F32:
8549 case AMDGPU::S_CMP_GT_F32:
8550 case AMDGPU::S_CMP_LG_F32:
8551 case AMDGPU::S_CMP_GE_F32:
8552 case AMDGPU::S_CMP_O_F32:
8553 case AMDGPU::S_CMP_U_F32:
8554 case AMDGPU::S_CMP_NGE_F32:
8555 case AMDGPU::S_CMP_NLG_F32:
8556 case AMDGPU::S_CMP_NGT_F32:
8557 case AMDGPU::S_CMP_NLE_F32:
8558 case AMDGPU::S_CMP_NEQ_F32:
8559 case AMDGPU::S_CMP_NLT_F32: {
8564 if (AMDGPU::getNamedOperandIdx(NewOpcode, AMDGPU::OpName::src0_modifiers) >=
8578 addSCCDefUsersToVALUWorklist(SCCOp, Inst, Worklist, CondReg);
8582 case AMDGPU::S_CMP_LT_F16:
8583 case AMDGPU::S_CMP_EQ_F16:
8584 case AMDGPU::S_CMP_LE_F16:
8585 case AMDGPU::S_CMP_GT_F16:
8586 case AMDGPU::S_CMP_LG_F16:
8587 case AMDGPU::S_CMP_GE_F16:
8588 case AMDGPU::S_CMP_O_F16:
8589 case AMDGPU::S_CMP_U_F16:
8590 case AMDGPU::S_CMP_NGE_F16:
8591 case AMDGPU::S_CMP_NLG_F16:
8592 case AMDGPU::S_CMP_NGT_F16:
8593 case AMDGPU::S_CMP_NLE_F16:
8594 case AMDGPU::S_CMP_NEQ_F16:
8595 case AMDGPU::S_CMP_NLT_F16: {
8617 addSCCDefUsersToVALUWorklist(SCCOp, Inst, Worklist, CondReg);
8621 case AMDGPU::S_CVT_HI_F32_F16: {
8624 if (ST.useRealTrue16Insts()) {
8629 .
addReg(TmpReg, {}, AMDGPU::hi16)
8645 addUsersToMoveToVALUWorklist(NewDst, MRI, Worklist);
8649 case AMDGPU::S_MINIMUM_F32:
8650 case AMDGPU::S_MAXIMUM_F32: {
8662 addUsersToMoveToVALUWorklist(NewDst, MRI, Worklist);
8666 case AMDGPU::S_MINIMUM_F16:
8667 case AMDGPU::S_MAXIMUM_F16: {
8669 ? &AMDGPU::VGPR_16RegClass
8670 : &AMDGPU::VGPR_32RegClass);
8681 addUsersToMoveToVALUWorklist(NewDst, MRI, Worklist);
8685 case AMDGPU::V_S_EXP_F16_e64:
8686 case AMDGPU::V_S_LOG_F16_e64:
8687 case AMDGPU::V_S_RCP_F16_e64:
8688 case AMDGPU::V_S_RSQ_F16_e64:
8689 case AMDGPU::V_S_SQRT_F16_e64: {
8691 ? &AMDGPU::VGPR_16RegClass
8692 : &AMDGPU::VGPR_32RegClass);
8703 addUsersToMoveToVALUWorklist(NewDst, MRI, Worklist);
8709 if (NewOpcode == AMDGPU::INSTRUCTION_LIST_END) {
8717 if (NewOpcode == Opcode) {
8724 V2SPhyCopiesToErase);
8732 RI.getCommonSubClass(NewDstRC, SrcRC)) {
8739 addUsersToMoveToVALUWorklist(DstReg, MRI, Worklist);
8745 RI.composeSubRegIndices(SrcSubReg, UseMO.getSubReg()));
8746 UseMO.setReg(NewDstReg);
8765 unsigned OpIdx =
UseMI.getOperandNo(&UseMO);
8778 if (ST.useRealTrue16Insts() && Inst.
isCopy() &&
8782 if (RI.getMatchingSuperRegClass(NewDstRC, SrcRegRC, AMDGPU::lo16)) {
8788 get(AMDGPU::REG_SEQUENCE), NewDstReg)
8795 addUsersToMoveToVALUWorklist(NewDstReg, MRI, Worklist);
8797 }
else if (RI.getMatchingSuperRegClass(SrcRegRC, NewDstRC,
8802 addUsersToMoveToVALUWorklist(NewDstReg, MRI, Worklist);
8810 addUsersToMoveToVALUWorklist(NewDstReg, MRI, Worklist);
8820 if (AMDGPU::getNamedOperandIdx(NewOpcode,
8821 AMDGPU::OpName::src0_modifiers) >= 0)
8825 NewInstr->addOperand(Src);
8828 if (Opcode == AMDGPU::S_SEXT_I32_I8 || Opcode == AMDGPU::S_SEXT_I32_I16) {
8831 unsigned Size = (Opcode == AMDGPU::S_SEXT_I32_I8) ? 8 : 16;
8833 NewInstr.addImm(
Size);
8834 }
else if (Opcode == AMDGPU::S_BCNT1_I32_B32) {
8838 }
else if (Opcode == AMDGPU::S_BFE_I32 || Opcode == AMDGPU::S_BFE_U32) {
8843 "Scalar BFE is only implemented for constant width and offset");
8851 if (AMDGPU::getNamedOperandIdx(NewOpcode,
8852 AMDGPU::OpName::src1_modifiers) >= 0)
8854 if (AMDGPU::getNamedOperandIdx(NewOpcode, AMDGPU::OpName::src1) >= 0)
8856 if (AMDGPU::getNamedOperandIdx(NewOpcode,
8857 AMDGPU::OpName::src2_modifiers) >= 0)
8859 if (AMDGPU::getNamedOperandIdx(NewOpcode, AMDGPU::OpName::src2) >= 0)
8861 if (AMDGPU::getNamedOperandIdx(NewOpcode, AMDGPU::OpName::clamp) >= 0)
8863 if (AMDGPU::getNamedOperandIdx(NewOpcode, AMDGPU::OpName::omod) >= 0)
8865 if (AMDGPU::getNamedOperandIdx(NewOpcode, AMDGPU::OpName::op_sel) >= 0)
8871 NewInstr->addOperand(
Op);
8878 if (
Op.getReg() == AMDGPU::SCC) {
8880 if (
Op.isDef() && !
Op.isDead())
8881 addSCCDefUsersToVALUWorklist(
Op, Inst, Worklist);
8883 addSCCDefsToVALUWorklist(NewInstr, Worklist);
8888 if (NewInstr->getOperand(0).isReg() && NewInstr->getOperand(0).isDef()) {
8889 Register DstReg = NewInstr->getOperand(0).getReg();
8902 addUsersToMoveToVALUWorklist(NewDstReg, MRI, Worklist);
8906std::pair<bool, MachineBasicBlock *>
8909 if (ST.hasAddNoCarryInsts()) {
8921 assert(
Opc == AMDGPU::S_ADD_I32 ||
Opc == AMDGPU::S_SUB_I32);
8923 unsigned NewOpc =
Opc == AMDGPU::S_ADD_I32 ?
8924 AMDGPU::V_ADD_U32_e64 : AMDGPU::V_SUB_U32_e64;
8935 addUsersToMoveToVALUWorklist(ResultReg, MRI, Worklist);
8936 return std::pair(
true, NewBB);
8939 return std::pair(
false,
nullptr);
8956 bool IsSCC = (CondReg == AMDGPU::SCC);
8964 for (MachineOperand &UseMO :
8966 MachineInstr &
UseMI = *UseMO.getParent();
8967 switch (
UseMI.getOpcode()) {
8968 case AMDGPU::V_CNDMASK_B16_fake16_e32:
8969 case AMDGPU::V_CNDMASK_B16_fake16_e64:
8970 case AMDGPU::V_CNDMASK_B16_t16_e32:
8971 case AMDGPU::V_CNDMASK_B16_t16_e64:
8972 case AMDGPU::V_CNDMASK_B32_e32:
8973 case AMDGPU::V_CNDMASK_B32_e64:
8974 case AMDGPU::V_CNDMASK_B64_PSEUDO:
8975 if (UseMO.isImplicit() ||
8977 UseMO.setReg(CondReg);
8991 bool CopyFound =
false;
8992 for (MachineInstr &CandI :
8995 if (CandI.findRegisterDefOperandIdx(AMDGPU::SCC, &RI,
false,
false) !=
8997 if (CandI.isCopy() && CandI.getOperand(0).getReg() == AMDGPU::SCC) {
8999 .
addReg(CandI.getOperand(1).getReg());
9011 ST.isWave64() ? AMDGPU::S_CSELECT_B64 : AMDGPU::S_CSELECT_B32;
9020 MachineInstr *NewInst;
9021 if (Inst.
getOpcode() == AMDGPU::S_CSELECT_B32) {
9022 NewInst =
BuildMI(
MBB, MII,
DL,
get(AMDGPU::V_CNDMASK_B32_e64), NewDestReg)
9037 addUsersToMoveToVALUWorklist(NewDestReg, MRI, Worklist);
9052 unsigned SubOp = ST.hasAddNoCarryInsts() ? AMDGPU::V_SUB_U32_e32
9053 : AMDGPU::V_SUB_CO_U32_e32;
9064 addUsersToMoveToVALUWorklist(ResultReg, MRI, Worklist);
9081 unsigned SubOp = ST.hasAddNoCarryInsts() ? AMDGPU::V_SUB_U32_e32
9082 : AMDGPU::V_SUB_CO_U32_e32;
9095 addUsersToMoveToVALUWorklist(ResultReg, MRI, Worklist);
9109 if (ST.hasDLInsts()) {
9119 addUsersToMoveToVALUWorklist(NewDest, MRI, Worklist);
9125 bool Src0IsSGPR = Src0.
isReg() &&
9127 bool Src1IsSGPR = Src1.
isReg() &&
9141 }
else if (Src1IsSGPR) {
9159 addUsersToMoveToVALUWorklist(NewDest, MRI, Worklist);
9165 unsigned Opcode)
const {
9189 addUsersToMoveToVALUWorklist(NewDest, MRI, Worklist);
9194 unsigned Opcode)
const {
9218 addUsersToMoveToVALUWorklist(NewDest, MRI, Worklist);
9233 const MCInstrDesc &InstDesc =
get(Opcode);
9236 &AMDGPU::SGPR_32RegClass;
9239 RI.getSubRegisterClass(Src0RC, AMDGPU::sub0);
9242 AMDGPU::sub0, Src0SubRC);
9247 RI.getSubRegisterClass(NewDestRC, AMDGPU::sub0);
9250 MachineInstr &LoHalf = *
BuildMI(
MBB, MII,
DL, InstDesc, DestSub0).
add(SrcReg0Sub0);
9253 AMDGPU::sub1, Src0SubRC);
9256 MachineInstr &HiHalf = *
BuildMI(
MBB, MII,
DL, InstDesc, DestSub1).
add(SrcReg0Sub1);
9270 Worklist.
insert(&LoHalf);
9271 Worklist.
insert(&HiHalf);
9277 addUsersToMoveToVALUWorklist(FullDestReg, MRI, Worklist);
9301 RI.getSubRegisterClass(Src0RC, AMDGPU::sub0);
9302 if (RI.isSGPRClass(Src0SubRC))
9303 Src0SubRC = RI.getEquivalentVGPRClass(Src0SubRC);
9305 RI.getSubRegisterClass(Src1RC, AMDGPU::sub0);
9306 if (RI.isSGPRClass(Src1SubRC))
9307 Src1SubRC = RI.getEquivalentVGPRClass(Src1SubRC);
9311 MachineOperand Op0L =
9313 MachineOperand Op1L =
9315 MachineOperand Op0H =
9317 MachineOperand Op1H =
9336 MachineInstr *Op1L_Op0H =
9342 MachineInstr *Op1H_Op0L =
9348 MachineInstr *Carry =
9353 MachineInstr *LoHalf =
9363 MachineInstr *HiHalf =
9386 addUsersToMoveToVALUWorklist(FullDestReg, MRI, Worklist);
9410 RI.getSubRegisterClass(Src0RC, AMDGPU::sub0);
9411 if (RI.isSGPRClass(Src0SubRC))
9412 Src0SubRC = RI.getEquivalentVGPRCla