19#define DEBUG_TYPE "si-shrink-instructions"
22 "Number of 64-bit instruction reduced to 32-bit.");
24 "Number of literal constants folded into 32-bit instructions.");
30class SIShrinkInstructions {
38 bool foldImmediates(
MachineInstr &
MI,
bool TryToCommute =
true)
const;
42 bool isKImmOrKUImmOperand(
const MachineOperand &Src,
bool &IsUnsigned)
const;
61 SIShrinkInstructions() =
default;
70 SIShrinkInstructionsLegacy() : MachineFunctionPass(ID) {}
72 bool runOnMachineFunction(MachineFunction &MF)
override;
74 StringRef getPassName()
const override {
return "SI Shrink Instructions"; }
76 void getAnalysisUsage(AnalysisUsage &AU)
const override {
85 "SI Shrink Instructions",
false,
false)
87char SIShrinkInstructionsLegacy::
ID = 0;
90 return new SIShrinkInstructionsLegacy();
97 bool TryToCommute)
const {
100 int Src0Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
103 MachineOperand &Src0 =
MI.getOperand(Src0Idx);
107 MachineInstr *
Def =
MRI->getUniqueVRegDef(
Reg);
108 if (Def &&
Def->isMoveImmediate()) {
109 MachineOperand &MovSrc =
Def->getOperand(1);
110 bool ConstantFolded =
false;
112 if (
TII->isOperandLegal(
MI, Src0Idx, &MovSrc)) {
113 if (MovSrc.
isImm()) {
115 ConstantFolded =
true;
116 }
else if (MovSrc.
isFI()) {
118 ConstantFolded =
true;
122 ConstantFolded =
true;
126 if (ConstantFolded) {
127 if (
MRI->use_nodbg_empty(
Reg))
128 Def->eraseFromParent();
129 ++NumLiteralConstantsFolded;
137 if (TryToCommute &&
MI.isCommutable()) {
138 if (
TII->commuteInstruction(
MI)) {
139 if (foldImmediates(
MI,
false))
143 TII->commuteInstruction(
MI);
152bool SIShrinkInstructions::shouldShrinkTrue16(MachineInstr &
MI)
const {
153 for (
unsigned I = 0,
E =
MI.getNumExplicitOperands();
I !=
E; ++
I) {
154 const MachineOperand &MO =
MI.getOperand(
I);
158 "True16 Instructions post-RA");
171bool SIShrinkInstructions::isKImmOperand(
const MachineOperand &Src)
const {
173 !
TII->isInlineConstant(*Src.getParent(), Src.getOperandNo());
176bool SIShrinkInstructions::isKUImmOperand(
const MachineOperand &Src)
const {
178 !
TII->isInlineConstant(*Src.getParent(), Src.getOperandNo());
181bool SIShrinkInstructions::isKImmOrKUImmOperand(
const MachineOperand &Src,
182 bool &IsUnsigned)
const {
185 return !
TII->isInlineConstant(Src);
190 return !
TII->isInlineConstant(Src);
207 int32_t &ModifiedImm,
bool Scalar) {
208 if (
TII->isInlineConstant(Src))
210 int32_t SrcImm =
static_cast<int32_t
>(Src.getImm());
216 ModifiedImm = ~SrcImm;
217 if (
TII->isInlineConstant(
APInt(32, ModifiedImm,
true)))
218 return AMDGPU::V_NOT_B32_e32;
222 if (
TII->isInlineConstant(
APInt(32, ModifiedImm,
true)))
223 return Scalar ? AMDGPU::S_BREV_B32 : AMDGPU::V_BFREV_B32_e32;
230void SIShrinkInstructions::copyExtraImplicitOps(MachineInstr &NewMI,
231 MachineInstr &
MI)
const {
232 MachineFunction &MF = *
MI.getMF();
233 for (
unsigned i =
MI.getDesc().getNumOperands() +
234 MI.getDesc().implicit_uses().size() +
235 MI.getDesc().implicit_defs().size(),
236 e =
MI.getNumOperands();
238 const MachineOperand &MO =
MI.getOperand(i);
244void SIShrinkInstructions::shrinkScalarCompare(MachineInstr &
MI)
const {
250 if (!
MI.getOperand(0).isReg())
251 TII->commuteInstruction(
MI,
false, 0, 1);
254 const MachineOperand &Src0 =
MI.getOperand(0);
258 MachineOperand &Src1 =
MI.getOperand(1);
268 if (SOPKOpc == AMDGPU::S_CMPK_EQ_U32 || SOPKOpc == AMDGPU::S_CMPK_LG_U32) {
270 if (isKImmOrKUImmOperand(Src1, HasUImm)) {
272 SOPKOpc = (SOPKOpc == AMDGPU::S_CMPK_EQ_U32) ?
273 AMDGPU::S_CMPK_EQ_I32 : AMDGPU::S_CMPK_LG_I32;
277 MI.setDesc(
TII->get(SOPKOpc));
283 const MCInstrDesc &NewDesc =
TII->get(SOPKOpc);
294void SIShrinkInstructions::shrinkMIMG(MachineInstr &
MI)
const {
300 switch (
Info->MIMGEncoding) {
301 case AMDGPU::MIMGEncGfx10NSA:
302 NewEncoding = AMDGPU::MIMGEncGfx10Default;
304 case AMDGPU::MIMGEncGfx11NSA:
305 NewEncoding = AMDGPU::MIMGEncGfx11Default;
312 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vaddr0);
313 unsigned NewAddrDwords =
Info->VAddrDwords;
314 const TargetRegisterClass *RC;
316 if (
Info->VAddrDwords == 2) {
317 RC = &AMDGPU::VReg_64RegClass;
318 }
else if (
Info->VAddrDwords == 3) {
319 RC = &AMDGPU::VReg_96RegClass;
320 }
else if (
Info->VAddrDwords == 4) {
321 RC = &AMDGPU::VReg_128RegClass;
322 }
else if (
Info->VAddrDwords == 5) {
323 RC = &AMDGPU::VReg_160RegClass;
324 }
else if (
Info->VAddrDwords == 6) {
325 RC = &AMDGPU::VReg_192RegClass;
326 }
else if (
Info->VAddrDwords == 7) {
327 RC = &AMDGPU::VReg_224RegClass;
328 }
else if (
Info->VAddrDwords == 8) {
329 RC = &AMDGPU::VReg_256RegClass;
330 }
else if (
Info->VAddrDwords == 9) {
331 RC = &AMDGPU::VReg_288RegClass;
332 }
else if (
Info->VAddrDwords == 10) {
333 RC = &AMDGPU::VReg_320RegClass;
334 }
else if (
Info->VAddrDwords == 11) {
335 RC = &AMDGPU::VReg_352RegClass;
336 }
else if (
Info->VAddrDwords == 12) {
337 RC = &AMDGPU::VReg_384RegClass;
339 RC = &AMDGPU::VReg_512RegClass;
343 unsigned VgprBase = 0;
344 unsigned NextVgpr = 0;
346 bool IsKill = NewAddrDwords ==
Info->VAddrDwords;
348 const bool IsPartialNSA = NewAddrDwords > NSAMaxSize;
349 const unsigned EndVAddr = IsPartialNSA ? NSAMaxSize :
Info->VAddrOperands;
350 for (
unsigned Idx = 0; Idx < EndVAddr; ++Idx) {
351 const MachineOperand &
Op =
MI.getOperand(VAddr0Idx + Idx);
352 unsigned Vgpr =
TRI->getHWRegIndex(
Op.getReg());
353 unsigned Dwords =
TRI->getRegSizeInBits(
Op.getReg(), *
MRI) / 32;
354 assert(Dwords > 0 &&
"Un-implemented for less than 32 bit regs");
358 NextVgpr = Vgpr + Dwords;
359 }
else if (Vgpr == NextVgpr) {
360 NextVgpr = Vgpr + Dwords;
371 if (VgprBase + NewAddrDwords > 256)
376 int TFEIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::tfe);
377 int LWEIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::lwe);
378 unsigned TFEVal = (TFEIdx == -1) ? 0 :
MI.getOperand(TFEIdx).
getImm();
379 unsigned LWEVal = (LWEIdx == -1) ? 0 :
MI.getOperand(LWEIdx).
getImm();
381 if (TFEVal || LWEVal) {
383 for (
unsigned i = LWEIdx + 1, e =
MI.getNumOperands(); i != e; ++i) {
384 if (
MI.getOperand(i).isReg() &&
MI.getOperand(i).isTied() &&
385 MI.getOperand(i).isImplicit()) {
389 "found more than one tied implicit operand when expecting only 1");
391 MI.untieRegOperand(ToUntie);
397 Info->VDataDwords, NewAddrDwords);
398 MI.setDesc(
TII->get(NewOpcode));
400 MI.getOperand(VAddr0Idx).setIsUndef(IsUndef);
401 MI.getOperand(VAddr0Idx).setIsKill(IsKill);
403 for (
unsigned i = 1; i < EndVAddr; ++i)
404 MI.removeOperand(VAddr0Idx + 1);
408 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vdata),
409 ToUntie - (EndVAddr - 1));
414void SIShrinkInstructions::shrinkMadFma(MachineInstr &
MI)
const {
424 if (
TII->hasAnyModifiersSet(
MI))
427 const unsigned Opcode =
MI.getOpcode();
428 MachineOperand &Src0 = *
TII->getNamedOperand(
MI, AMDGPU::OpName::src0);
429 MachineOperand &Src1 = *
TII->getNamedOperand(
MI, AMDGPU::OpName::src1);
430 MachineOperand &Src2 = *
TII->getNamedOperand(
MI, AMDGPU::OpName::src2);
431 unsigned NewOpcode = AMDGPU::INSTRUCTION_LIST_END;
436 if (Src2.
isImm() && !
TII->isInlineConstant(Src2)) {
447 case AMDGPU::V_MAD_F32_e64:
448 NewOpcode = AMDGPU::V_MADAK_F32;
450 case AMDGPU::V_FMA_F32_e64:
451 NewOpcode = AMDGPU::V_FMAAK_F32;
453 case AMDGPU::V_MAD_F16_e64:
454 NewOpcode = AMDGPU::V_MADAK_F16;
456 case AMDGPU::V_FMA_F16_e64:
457 case AMDGPU::V_FMA_F16_gfx9_e64:
458 NewOpcode = AMDGPU::V_FMAAK_F16;
460 case AMDGPU::V_FMA_F16_gfx9_t16_e64:
461 NewOpcode = AMDGPU::V_FMAAK_F16_t16;
463 case AMDGPU::V_FMA_F16_gfx9_fake16_e64:
464 NewOpcode = AMDGPU::V_FMAAK_F16_fake16;
466 case AMDGPU::V_FMA_F64_e64:
468 NewOpcode = AMDGPU::V_FMAAK_F64;
475 if (Src1.
isImm() && !
TII->isInlineConstant(Src1))
477 else if (Src0.
isImm() && !
TII->isInlineConstant(Src0))
485 case AMDGPU::V_MAD_F32_e64:
486 NewOpcode = AMDGPU::V_MADMK_F32;
488 case AMDGPU::V_FMA_F32_e64:
489 NewOpcode = AMDGPU::V_FMAMK_F32;
491 case AMDGPU::V_MAD_F16_e64:
492 NewOpcode = AMDGPU::V_MADMK_F16;
494 case AMDGPU::V_FMA_F16_e64:
495 case AMDGPU::V_FMA_F16_gfx9_e64:
496 NewOpcode = AMDGPU::V_FMAMK_F16;
498 case AMDGPU::V_FMA_F16_gfx9_t16_e64:
499 NewOpcode = AMDGPU::V_FMAMK_F16_t16;
501 case AMDGPU::V_FMA_F16_gfx9_fake16_e64:
502 NewOpcode = AMDGPU::V_FMAMK_F16_fake16;
504 case AMDGPU::V_FMA_F64_e64:
506 NewOpcode = AMDGPU::V_FMAMK_F64;
511 if (NewOpcode == AMDGPU::INSTRUCTION_LIST_END)
520 MI.getOperand(0).getReg())
525 MI.eraseFromParent();
527 TII->removeModOperands(
MI);
528 MI.setDesc(
TII->get(NewOpcode));
537bool SIShrinkInstructions::shrinkScalarLogicOp(MachineInstr &
MI)
const {
538 unsigned Opc =
MI.getOpcode();
539 const MachineOperand *Dest = &
MI.getOperand(0);
540 MachineOperand *Src0 = &
MI.getOperand(1);
541 MachineOperand *Src1 = &
MI.getOperand(2);
542 MachineOperand *SrcReg = Src0;
543 MachineOperand *SrcImm = Src1;
545 if (!SrcImm->
isImm() ||
549 uint32_t
Imm =
static_cast<uint32_t
>(SrcImm->
getImm());
552 if (
Opc == AMDGPU::S_AND_B32) {
555 Opc = AMDGPU::S_BITSET0_B32;
558 Opc = AMDGPU::S_ANDN2_B32;
560 }
else if (
Opc == AMDGPU::S_OR_B32) {
563 Opc = AMDGPU::S_BITSET1_B32;
566 Opc = AMDGPU::S_ORN2_B32;
568 }
else if (
Opc == AMDGPU::S_XOR_B32) {
571 Opc = AMDGPU::S_XNOR_B32;
585 const bool IsUndef = SrcReg->
isUndef();
586 const bool IsKill = SrcReg->
isKill();
588 if (
Opc == AMDGPU::S_BITSET0_B32 ||
589 Opc == AMDGPU::S_BITSET1_B32) {
592 MI.getOperand(2).ChangeToRegister(Dest->
getReg(),
false,
595 MI.tieOperands(0, 2);
607bool SIShrinkInstructions::instAccessReg(
610 for (
const MachineOperand &MO : R) {
618 LaneBitmask Overlap =
TRI->getSubRegIndexLaneMask(
SubReg) &
627bool SIShrinkInstructions::instReadsReg(
const MachineInstr *
MI,
unsigned Reg,
632bool SIShrinkInstructions::instModifiesReg(
const MachineInstr *
MI,
unsigned Reg,
637TargetInstrInfo::RegSubRegPair
638SIShrinkInstructions::getSubRegForIndex(
Register Reg,
unsigned Sub,
640 if (
TRI->getRegSizeInBits(
Reg, *
MRI) != 32) {
644 Sub =
TRI->getSubRegFromChannel(
I +
TRI->getChannelFromSubReg(
Sub));
647 return TargetInstrInfo::RegSubRegPair(
Reg,
Sub);
650void SIShrinkInstructions::dropInstructionKeepingImpDefs(
651 MachineInstr &
MI)
const {
652 for (
unsigned i =
MI.getDesc().getNumOperands() +
653 MI.getDesc().implicit_uses().size() +
654 MI.getDesc().implicit_defs().size(),
655 e =
MI.getNumOperands();
657 const MachineOperand &
Op =
MI.getOperand(i);
661 TII->get(AMDGPU::IMPLICIT_DEF),
Op.getReg());
664 MI.eraseFromParent();
686MachineInstr *SIShrinkInstructions::matchSwap(MachineInstr &MovT)
const {
688 MovT.
getOpcode() == AMDGPU::V_MOV_B16_t16_e32 ||
700 unsigned Size =
TII->getOpSize(MovT, 0);
704 if (
Size == 2 &&
X.isVirtual())
710 const unsigned SearchLimit = 16;
712 bool KilledT =
false;
715 Iter !=
E &&
Count < SearchLimit && !KilledT; ++Iter) {
717 MachineInstr *MovY = &*Iter;
723 if ((MovY->
getOpcode() != AMDGPU::V_MOV_B32_e32 &&
724 MovY->
getOpcode() != AMDGPU::V_MOV_B16_t16_e32 &&
736 MachineInstr *MovX =
nullptr;
739 if (
I->isDebugInstr())
741 if (instReadsReg(&*
I,
X, Xsub) || instModifiesReg(&*
I,
Y, Ysub) ||
742 instModifiesReg(&*
I,
T, Tsub) ||
743 (MovX && instModifiesReg(&*
I,
X, Xsub))) {
747 if (!instReadsReg(&*
I,
Y, Ysub)) {
748 if (!MovX && instModifiesReg(&*
I,
X, Xsub)) {
755 (
I->getOpcode() != AMDGPU::V_MOV_B32_e32 &&
756 I->getOpcode() != AMDGPU::V_MOV_B16_t16_e32 &&
757 I->getOpcode() != AMDGPU::COPY) ||
758 I->getOperand(0).getReg() !=
X ||
759 I->getOperand(0).getSubReg() != Xsub) {
764 if (
Size > 4 && (
I->getNumImplicitOperands() > (
I->isCopy() ? 0U : 1U)))
773 LLVM_DEBUG(
dbgs() <<
"Matched v_swap:\n" << MovT << *MovX << *MovY);
776 SmallVector<MachineInstr *, 4> Swaps;
779 TII->get(AMDGPU::V_SWAP_B16))
788 for (
unsigned I = 0;
I <
Size / 4; ++
I) {
789 TargetInstrInfo::RegSubRegPair X1, Y1;
790 X1 = getSubRegForIndex(
X, Xsub,
I);
791 Y1 = getSubRegForIndex(
Y, Ysub,
I);
793 TII->get(AMDGPU::V_SWAP_B32))
804 for (MachineInstr *Swap : Swaps) {
805 Swap->removeOperand(Swap->getNumExplicitOperands());
810 dropInstructionKeepingImpDefs(*MovY);
813 if (
T.isVirtual() &&
MRI->use_nodbg_empty(
T)) {
814 dropInstructionKeepingImpDefs(MovT);
820 if (
Op.isKill() &&
TRI->regsOverlap(
X,
Op.getReg()))
832bool SIShrinkInstructions::tryReplaceDeadSDST(MachineInstr &
MI)
const {
836 MachineOperand *
Op =
TII->getNamedOperand(
MI, AMDGPU::OpName::sdst);
843 Op->setReg(ST->
isWave32() ? AMDGPU::SGPR_NULL : AMDGPU::SGPR_NULL64);
847bool SIShrinkInstructions::run(MachineFunction &MF) {
853 TRI = &
TII->getRegisterInfo();
856 unsigned VCCReg = ST->
isWave32() ? AMDGPU::VCC_LO : AMDGPU::VCC;
858 for (MachineBasicBlock &
MBB : MF) {
862 MachineInstr &
MI = *
I;
864 if (
MI.getOpcode() == AMDGPU::V_MOV_B32_e32) {
872 MachineOperand &Src =
MI.getOperand(1);
873 if (Src.isImm() && IsPostRA) {
877 if (ModOpcode != 0) {
878 MI.setDesc(
TII->get(ModOpcode));
879 Src.setImm(
static_cast<int64_t
>(ModImm));
885 if (ST->
hasSwap() && (
MI.getOpcode() == AMDGPU::V_MOV_B32_e32 ||
886 MI.getOpcode() == AMDGPU::V_MOV_B16_t16_e32 ||
887 MI.getOpcode() == AMDGPU::COPY)) {
888 if (
auto *NextMI = matchSwap(
MI)) {
889 Next = NextMI->getIterator();
895 if (
MI.getOpcode() == AMDGPU::S_ADD_I32 ||
896 MI.getOpcode() == AMDGPU::S_MUL_I32) {
897 const MachineOperand *Dest = &
MI.getOperand(0);
898 MachineOperand *Src0 = &
MI.getOperand(1);
899 MachineOperand *Src1 = &
MI.getOperand(2);
902 if (
TII->commuteInstruction(
MI,
false, 1, 2))
917 unsigned Opc = (
MI.getOpcode() == AMDGPU::S_ADD_I32) ?
918 AMDGPU::S_ADDK_I32 : AMDGPU::S_MULK_I32;
922 MI.tieOperands(0, 1);
928 if (
MI.isCompare() &&
TII->isSOPC(
MI)) {
929 shrinkScalarCompare(
MI);
934 if (
MI.getOpcode() == AMDGPU::S_MOV_B32) {
935 const MachineOperand &Dst =
MI.getOperand(0);
936 MachineOperand &Src =
MI.getOperand(1);
938 if (Src.isImm() && Dst.getReg().isPhysical()) {
942 MI.setDesc(
TII->get(AMDGPU::S_MOVK_I32));
946 MI.setDesc(
TII->get(ModOpc));
947 Src.setImm(
static_cast<int64_t
>(ModImm));
955 if (
MI.getOpcode() == AMDGPU::S_AND_B32 ||
956 MI.getOpcode() == AMDGPU::S_OR_B32 ||
957 MI.getOpcode() == AMDGPU::S_XOR_B32) {
958 if (shrinkScalarLogicOp(
MI))
962 if (IsPostRA &&
TII->isMIMG(
MI.getOpcode()) &&
968 if (!
TII->isVOP3(
MI))
971 if (
MI.getOpcode() == AMDGPU::V_MAD_F32_e64 ||
972 MI.getOpcode() == AMDGPU::V_FMA_F32_e64 ||
973 MI.getOpcode() == AMDGPU::V_MAD_F16_e64 ||
974 MI.getOpcode() == AMDGPU::V_FMA_F16_e64 ||
975 MI.getOpcode() == AMDGPU::V_FMA_F16_gfx9_e64 ||
976 MI.getOpcode() == AMDGPU::V_FMA_F16_gfx9_t16_e64 ||
977 MI.getOpcode() == AMDGPU::V_FMA_F16_gfx9_fake16_e64 ||
978 (
MI.getOpcode() == AMDGPU::V_FMA_F64_e64 &&
986 if (
TII->isVOP3(
MI.getOpcode())) {
987 tryReplaceDeadSDST(
MI);
988 if (!
TII->hasVALU32BitEncoding(
MI.getOpcode())) {
996 if (!
MI.isCommutable() || !
TII->commuteInstruction(
MI) ||
998 tryReplaceDeadSDST(
MI);
1005 if (
TII->isVOPC(Op32)) {
1006 MachineOperand &Op0 =
MI.getOperand(0);
1021 MRI->setRegAllocationHint(DstReg, 0, VCCReg);
1024 if (DstReg != VCCReg)
1029 if (Op32 == AMDGPU::V_CNDMASK_B32_e32) {
1032 const MachineOperand *Src2 =
1033 TII->getNamedOperand(
MI, AMDGPU::OpName::src2);
1037 if (
SReg.isVirtual()) {
1038 MRI->setRegAllocationHint(SReg, 0, VCCReg);
1046 const MachineOperand *SDst =
TII->getNamedOperand(
MI,
1047 AMDGPU::OpName::sdst);
1052 if (SDst->
getReg() != VCCReg) {
1054 MRI->setRegAllocationHint(SDst->
getReg(), 0, VCCReg);
1060 const MachineOperand *Src2 =
TII->getNamedOperand(
MI,
1061 AMDGPU::OpName::src2);
1062 if (Src2 && Src2->
getReg() != VCCReg) {
1064 MRI->setRegAllocationHint(Src2->
getReg(), 0, VCCReg);
1084 !shouldShrinkTrue16(
MI))
1090 MachineInstr *Inst32 =
TII->buildShrunkInst(
MI, Op32);
1091 ++NumInstructionsShrunk;
1094 copyExtraImplicitOps(*Inst32,
MI);
1097 if (SDst && SDst->
isDead())
1100 MI.eraseFromParent();
1101 foldImmediates(*Inst32);
1109bool SIShrinkInstructionsLegacy::runOnMachineFunction(MachineFunction &MF) {
1113 return SIShrinkInstructions().run(MF);
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Provides AMDGPU specific target descriptions.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
Analysis containing CSE Info
AMD GCN specific subclass of TargetSubtarget.
const HexagonInstrInfo * TII
Register const TargetRegisterInfo * TRI
Promote Memory to Register
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
static unsigned canModifyToInlineImmOp32(const SIInstrInfo *TII, const MachineOperand &Src, int32_t &ModifiedImm, bool Scalar)
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
bool hasTrue16BitInsts() const
Return true if the subtarget supports True16 instructions.
bool hasInv2PiInlineImm() const
Class for arbitrary precision integers.
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
Represents analyses that only rely on functions' control flow.
FunctionPass class - This class is used to implement most global optimizations.
bool hasOptNone() const
Do not optimize this function (-O0).
bool hasFmaakFmamkF64Insts() const
const SIInstrInfo * getInstrInfo() const override
bool hasGFX10_3Insts() const
bool has64BitLiterals() const
unsigned getNSAMaxSize(bool HasSampler=false) const
Generation getGeneration() const
bool hasVOP3Literal() const
instr_iterator instr_end()
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
MachineInstrBundleIterator< MachineInstr > iterator
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
const MachineFunctionProperties & getProperties() const
Get the function properties.
const MachineInstrBuilder & add(const MachineOperand &MO) const
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & setMIFlags(unsigned Flags) const
MachineInstr * getInstr() const
If conversion operators fail, use this method to get the MachineInstr explicitly.
const MachineInstrBuilder & addDef(Register RegNo, unsigned Flags=0, unsigned SubReg=0) const
Add a virtual register definition operand.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
unsigned getNumImplicitOperands() const
Returns the implicit operands number.
const MachineBasicBlock * getParent() const
bool isDebugInstr() const
LLVM_ABI void addOperand(MachineFunction &MF, const MachineOperand &Op)
Add the specified operand to the instruction.
LLVM_ABI unsigned getNumExplicitOperands() const
Returns the number of non-implicit operands.
bool killsRegister(Register Reg, const TargetRegisterInfo *TRI) const
Return true if the MachineInstr kills the specified register.
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
LLVM_ABI void eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
LLVM_ABI void removeOperand(unsigned OpNo)
Erase an operand from an instruction, leaving it with one fewer operand than it started with.
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI bool hasRegisterImplicitUseOperand(Register Reg) const
Returns true if the MachineInstr has an implicit-use operand of exactly the given register (not consi...
MachineOperand * findRegisterDefOperand(Register Reg, const TargetRegisterInfo *TRI, bool isDead=false, bool Overlap=false)
Wrapper for findRegisterDefOperandIdx, it returns a pointer to the MachineOperand rather than an inde...
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
const GlobalValue * getGlobal() const
LLVM_ABI void ChangeToFrameIndex(int Idx, unsigned TargetFlags=0)
Replace this operand with a frame index.
void setImm(int64_t immVal)
bool isReg() const
isReg - Tests if this is a MO_Register operand.
bool isRegMask() const
isRegMask - Tests if this is a MO_RegisterMask operand.
void setIsDead(bool Val=true)
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
LLVM_ABI void ChangeToImmediate(int64_t ImmVal, unsigned TargetFlags=0)
ChangeToImmediate - Replace this operand with a new immediate operand of the specified value.
LLVM_ABI void ChangeToGA(const GlobalValue *GV, int64_t Offset, unsigned TargetFlags=0)
ChangeToGA - Replace this operand with a new global address operand.
void setIsKill(bool Val=true)
unsigned getTargetFlags() const
bool isGlobal() const
isGlobal - Tests if this is a MO_GlobalAddress operand.
Register getReg() const
getReg - Returns the register number.
bool isFI() const
isFI - Tests if this is a MO_FrameIndex operand.
int64_t getOffset() const
Return the offset from the symbol in this operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Wrapper class representing virtual and physical registers.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
static bool sopkIsZext(unsigned Opcode)
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &)
void push_back(const T &Elt)
MCRegister getRegister(unsigned i) const
Return the specified register in the class.
self_iterator getIterator()
A range adaptor for a pair of iterators.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_READONLY int getSOPKOp(uint16_t Opcode)
LLVM_READONLY const MIMGInfo * getMIMGInfo(unsigned Opc)
int getMIMGOpcode(unsigned BaseOpcode, unsigned MIMGEncoding, unsigned VDataDwords, unsigned VAddrDwords)
LLVM_READONLY int getVOPe32(uint16_t Opcode)
bool isKImmOperand(const MCInstrDesc &Desc, unsigned OpNo)
Is this a KImm operand?
bool isTrue16Inst(unsigned Opc)
bool isInlinableLiteral32(int32_t Literal, bool HasInv2Pi)
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
NodeAddr< DefNode * > Def
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
FunctionAddr VTableAddr Count
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
iterator_range(Container &&) -> iterator_range< llvm::detail::IterOfRange< Container > >
@ Sub
Subtraction of integers.
FunctionAddr VTableAddr Next
DWARFExpression::Operation Op
constexpr int32_t SignExtend32(uint32_t X)
Sign-extend the number in the bottom B bits of X to a 32-bit integer.
constexpr T reverseBits(T Val)
Reverse the bits in Val.
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
FunctionPass * createSIShrinkInstructionsLegacyPass()
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
constexpr bool any() const
A pair composed of a register and a sub-register index.