77#define DEBUG_TYPE "si-fix-sgpr-copies"
80 "amdgpu-enable-merge-m0",
81 cl::desc(
"Merge and hoist M0 initializations"),
94 unsigned NumSVCopies = 0;
99 unsigned NumReadfirstlanes = 0;
101 bool NeedToBeConvertedToVALU =
false;
107 unsigned SiblingPenalty = 0;
109 V2SCopyInfo() : Copy(nullptr),
ID(0){};
111 :
Copy(
C), NumReadfirstlanes(Width / 32),
ID(
Id){};
112#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
115 <<
"\n\tSV:" << NumSVCopies <<
"\n\tSP: " << SiblingPenalty
116 <<
"\nScore: " << Score <<
"\n";
121class SIFixSGPRCopies {
127 unsigned NextVGPRToSGPRCopyID = 0;
142 unsigned getNextVGPRToSGPRCopyId() {
return ++NextVGPRToSGPRCopyID; }
143 bool needToBeConvertedToVALU(V2SCopyInfo *
I);
171 &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
172 SIFixSGPRCopies Impl(MDT);
194char SIFixSGPRCopiesLegacy::
ID = 0;
199 return new SIFixSGPRCopiesLegacy();
202static std::pair<const TargetRegisterClass *, const TargetRegisterClass *>
206 Register DstReg = Copy.getOperand(0).getReg();
207 Register SrcReg = Copy.getOperand(1).getReg();
210 ?
MRI.getRegClass(SrcReg)
211 :
TRI.getPhysRegBaseClass(SrcReg);
217 ?
MRI.getRegClass(DstReg)
218 :
TRI.getPhysRegBaseClass(DstReg);
220 return std::pair(SrcRC, DstRC);
226 return SrcRC != &AMDGPU::VReg_1RegClass &&
TRI.isSGPRClass(DstRC) &&
227 TRI.hasVectorRegisters(SrcRC);
233 return DstRC != &AMDGPU::VReg_1RegClass &&
TRI.isSGPRClass(SrcRC) &&
234 TRI.hasVectorRegisters(DstRC);
241 auto &Src =
MI.getOperand(1);
247 for (
const auto &MO :
MRI.reg_nodbg_operands(DstReg)) {
248 const auto *
UseMI = MO.getParent();
261 MRI.setRegClass(DstReg,
TRI->getEquivalentSGPRClass(
MRI.getRegClass(DstReg)));
285 if (!
TRI->isSGPRClass(
MRI.getRegClass(DstReg)))
288 if (!
MRI.hasOneUse(DstReg))
310 if (
SubReg != AMDGPU::NoSubRegister)
313 MRI.setRegClass(DstReg, DstRC);
324 bool IsAGPR =
TRI->isAGPRClass(DstRC);
326 for (
unsigned I = 1,
N =
MI.getNumOperands();
I !=
N;
I += 2) {
328 TRI->getRegClassForOperandReg(
MRI,
MI.getOperand(
I));
330 "Expected SGPR REG_SEQUENCE to only have SGPR inputs");
333 Register TmpReg =
MRI.createVirtualRegister(NewSrcRC);
341 Register TmpAReg =
MRI.createVirtualRegister(NewSrcRC);
342 unsigned Opc = NewSrcRC == &AMDGPU::AGPR_32RegClass ?
343 AMDGPU::V_ACCVGPR_WRITE_B32_e64 : AMDGPU::COPY;
350 MI.getOperand(
I).setReg(TmpReg);
362 if (Copy->getOpcode() != AMDGPU::COPY)
365 if (!MoveImm->isMoveImmediate())
369 TII->getNamedOperand(*MoveImm, AMDGPU::OpName::src0);
374 if (Copy->getOperand(1).getSubReg())
377 switch (MoveImm->getOpcode()) {
380 case AMDGPU::V_MOV_B32_e32:
381 case AMDGPU::AV_MOV_B32_IMM_PSEUDO:
382 SMovOp = AMDGPU::S_MOV_B32;
384 case AMDGPU::V_MOV_B64_PSEUDO:
385 SMovOp = AMDGPU::S_MOV_B64_IMM_PSEUDO;
392template <
class UnaryPredicate>
402 while (!Worklist.
empty()) {
442 while (
I !=
MBB->
end() &&
TII->isBasicBlockPrologue(*
I))
458 using InitListMap = std::map<unsigned, std::list<MachineInstr *>>;
465 bool Changed =
false;
467 for (
auto &
MI :
MRI.def_instructions(Reg)) {
469 for (
auto &MO :
MI.operands()) {
470 if ((MO.isReg() && ((MO.isDef() && MO.getReg() != Reg) || !MO.isDef())) ||
471 (!MO.isImm() && !MO.isReg()) || (MO.isImm() && Imm)) {
479 Inits[Imm->getImm()].push_front(&
MI);
484 for (
auto &
Init : Inits) {
485 auto &Defs =
Init.second;
487 for (
auto I1 = Defs.begin(), E = Defs.end(); I1 != E; ) {
490 for (
auto I2 = std::next(I1); I2 != E; ) {
503 bool MayClobberTo =
isReachable(Clobber, &*To, MBBTo, MDT);
504 if (!MayClobberFrom && !MayClobberTo)
506 if ((MayClobberFrom && !MayClobberTo) ||
507 (!MayClobberFrom && MayClobberTo))
513 return !((MBBFrom == MBBTo &&
521 return C.first !=
Init.first &&
527 if (!interferes(MI2, MI1)) {
537 if (!interferes(MI1, MI2)) {
555 if (!interferes(MI1,
I) && !interferes(MI2,
I)) {
559 <<
"and moving from "
576 for (
auto &
Init : Inits) {
577 auto &Defs =
Init.second;
578 auto I = Defs.begin();
579 while (
I != Defs.end()) {
580 if (MergedInstrs.
count(*
I)) {
581 (*I)->eraseFromParent();
589 for (
auto &
Init : Inits) {
590 auto &Defs =
Init.second;
591 for (
auto *
MI : Defs) {
592 auto *
MBB =
MI->getParent();
597 if (!
TII->isBasicBlockPrologue(*
B))
600 auto R = std::next(
MI->getReverseIterator());
601 const unsigned Threshold = 50;
603 for (
unsigned I = 0; R !=
B &&
I < Threshold; ++R, ++
I)
604 if (R->readsRegister(Reg,
TRI) || R->definesRegister(Reg,
TRI) ||
615 MRI.clearKillFlags(Reg);
627 TRI =
ST.getRegisterInfo();
628 TII =
ST.getInstrInfo();
635 switch (
MI.getOpcode()) {
651 S2VCopies.push_back(&
MI);
655 if (lowerSpecialCase(
MI,
I))
658 analyzeVGPRToSGPRCopy(&
MI);
663 case AMDGPU::STRICT_WQM:
664 case AMDGPU::SOFT_WQM:
665 case AMDGPU::STRICT_WWM:
666 case AMDGPU::INSERT_SUBREG:
668 case AMDGPU::REG_SEQUENCE: {
669 if (
TRI->isSGPRClass(
TII->getOpRegClass(
MI, 0))) {
671 if (!MO.isReg() || !MO.getReg().isVirtual())
674 if (SrcRC == &AMDGPU::VReg_1RegClass)
677 if (
TRI->hasVectorRegisters(SrcRC)) {
679 TRI->getEquivalentSGPRClass(SrcRC);
680 Register NewDst =
MRI->createVirtualRegister(DestRC);
682 MI.isPHI() ?
MI.getOperand(MO.getOperandNo() + 1).getMBB()
688 if (!tryMoveVGPRConstToSGPR(MO, NewDst, BlockToInsertCopy,
689 PointToInsertCopy,
DL)) {
691 BuildMI(*BlockToInsertCopy, PointToInsertCopy,
DL,
692 TII->get(AMDGPU::COPY), NewDst)
695 analyzeVGPRToSGPRCopy(NewCopy);
696 PHISources.insert(NewCopy);
703 PHINodes.push_back(&
MI);
704 else if (
MI.isRegSequence())
705 RegSequences.push_back(&
MI);
709 case AMDGPU::V_WRITELANE_B32: {
712 if (
ST.getConstantBusLimit(
MI.getOpcode()) != 1)
722 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
724 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src1);
730 Src0.
getReg() != AMDGPU::M0) &&
732 Src1.
getReg() != AMDGPU::M0)) {
740 if (MO->getReg().isVirtual()) {
745 MO->getReg() ==
Def.getReg() &&
746 MO->getSubReg() ==
Def.getSubReg()) {
748 if (Copied.
isImm() &&
763 TII->get(AMDGPU::COPY), AMDGPU::M0)
774 lowerVGPR2SGPRCopies(MF);
777 for (
auto *
MI : S2VCopies) {
786 for (
auto *
MI : RegSequences) {
788 if (
MI->isRegSequence())
791 for (
auto *
MI : PHINodes) {
794 if (MF.getTarget().getOptLevel() > CodeGenOptLevel::None &&
EnableM0Merge)
797 SiblingPenalty.clear();
800 RegSequences.clear();
809 bool AllAGPRUses =
true;
816 bool HasUses =
false;
817 while (!worklist.
empty()) {
820 for (
const auto &
Use :
MRI->use_operands(Reg)) {
837 if (HasUses && AllAGPRUses && !
TRI->isAGPRClass(RC0)) {
839 MRI->setRegClass(PHIRes,
TRI->getEquivalentAGPRClass(RC0));
840 for (
unsigned I = 1,
N =
MI.getNumOperands();
I !=
N;
I += 2) {
847 if (
TRI->isVectorRegister(*
MRI, PHIRes) ||
848 RC0 == &AMDGPU::VReg_1RegClass) {
850 TII->legalizeOperands(
MI, MDT);
854 while (!PHIOperands.
empty()) {
859bool SIFixSGPRCopies::tryMoveVGPRConstToSGPR(
869 if (SrcConst->
isReg())
873 MRI->getRegClass(MaybeVGPRConstMO.
getReg());
874 unsigned MoveSize =
TRI->getRegSizeInBits(*SrcRC);
875 unsigned MoveOp = MoveSize == 64 ? AMDGPU::S_MOV_B64 : AMDGPU::S_MOV_B32;
876 BuildMI(*BlockToInsertTo, PointToInsertTo,
DL,
TII->get(MoveOp), DstReg)
878 if (
MRI->hasOneUse(MaybeVGPRConstMO.
getReg()))
880 MaybeVGPRConstMO.
setReg(DstReg);
893 if (DstReg == AMDGPU::M0 &&
894 TRI->hasVectorRegisters(
MRI->getRegClass(SrcReg))) {
896 MRI->createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass);
898 TII->get(AMDGPU::V_READFIRSTLANE_B32), TmpReg)
899 .
add(
MI.getOperand(1));
900 MI.getOperand(1).setReg(TmpReg);
901 }
else if (tryMoveVGPRConstToSGPR(
MI.getOperand(1), DstReg,
MI.getParent(),
902 MI,
MI.getDebugLoc())) {
904 MI.eraseFromParent();
911 TII->moveToVALU(worklist, MDT);
920 MI.getOperand(1).ChangeToImmediate(Imm);
921 MI.addImplicitDefUseOperands(*
MI.getParent()->getParent());
922 MI.setDesc(
TII->get(SMovOp));
929 if (PHISources.contains(
MI))
934 V2SCopyInfo
Info(getNextVGPRToSGPRCopyId(),
MI,
935 TRI->getRegSizeInBits(*DstRC));
941 while (!AnalysisWorklist.
empty()) {
945 if (!Visited.
insert(Inst).second)
965 SiblingPenalty[Inst].insert(
Info.ID);
973 !
I->findRegisterDefOperand(AMDGPU::SCC,
nullptr)) {
974 if (
I->readsRegister(AMDGPU::SCC,
nullptr))
979 if (
Reg.isVirtual() &&
TRI->isSGPRReg(*
MRI, Reg) && !
TII->isVALU(*Inst)) {
980 for (
auto &U :
MRI->use_instructions(Reg))
984 for (
auto *U :
Users) {
986 Info.SChain.insert(U);
995bool SIFixSGPRCopies::needToBeConvertedToVALU(V2SCopyInfo *Info) {
996 if (
Info->SChain.empty()) {
1002 return SiblingPenalty[A].size() < SiblingPenalty[B].size();
1004 Info->Siblings.remove_if([&](
unsigned ID) {
return ID ==
Info->ID; });
1011 for (
auto J :
Info->Siblings) {
1012 auto *InfoIt = V2SCopies.find(J);
1013 if (InfoIt != V2SCopies.end()) {
1023 Info->SiblingPenalty = SrcRegs.
size();
1026 Info->NumSVCopies +
Info->SiblingPenalty +
Info->NumReadfirstlanes;
1027 unsigned Profit =
Info->SChain.size();
1028 Info->Score = Penalty > Profit ? 0 : Profit - Penalty;
1029 Info->NeedToBeConvertedToVALU =
Info->Score < 3;
1030 return Info->NeedToBeConvertedToVALU;
1036 for (
auto &
C : V2SCopies) {
1037 if (needToBeConvertedToVALU(&
C.second))
1045 while (!LoweringWorklist.
empty()) {
1047 auto *CurInfoIt = V2SCopies.find(CurID);
1048 if (CurInfoIt != V2SCopies.end()) {
1049 V2SCopyInfo
C = CurInfoIt->second;
1051 for (
auto S :
C.Siblings) {
1052 auto *SibInfoIt = V2SCopies.find(S);
1053 if (SibInfoIt != V2SCopies.end()) {
1054 V2SCopyInfo &
SI = SibInfoIt->second;
1056 if (!
SI.NeedToBeConvertedToVALU) {
1057 SI.SChain.set_subtract(
C.SChain);
1058 if (needToBeConvertedToVALU(&SI))
1061 SI.Siblings.remove_if([&](
unsigned ID) {
return ID ==
C.ID; });
1065 <<
" is being turned to VALU\n");
1068 V2SCopies.erase(
C.ID);
1077 for (
auto C : V2SCopies) {
1083 <<
" is being turned to v_readfirstlane_b32"
1084 <<
" Score: " <<
C.second.Score <<
"\n");
1085 Register DstReg =
MI->getOperand(0).getReg();
1086 MRI->constrainRegClass(DstReg, &AMDGPU::SReg_32_XM0RegClass);
1088 Register SrcReg =
MI->getOperand(1).getReg();
1089 unsigned SubReg =
MI->getOperand(1).getSubReg();
1091 TRI->getRegClassForOperandReg(*
MRI,
MI->getOperand(1));
1092 size_t SrcSize =
TRI->getRegSizeInBits(*SrcRC);
1093 if (SrcSize == 16) {
1095 "We do not expect to see 16-bit copies from VGPR to SGPR unless "
1096 "we have 16-bit VGPRs");
1097 assert(
MRI->getRegClass(DstReg) == &AMDGPU::SReg_32RegClass ||
1098 MRI->getRegClass(DstReg) == &AMDGPU::SReg_32_XM0RegClass);
1100 MRI->setRegClass(DstReg, &AMDGPU::SReg_32_XM0RegClass);
1101 Register VReg32 =
MRI->createVirtualRegister(&AMDGPU::VGPR_32RegClass);
1112 }
else if (SrcSize == 32) {
1114 TII->get(AMDGPU::V_READFIRSTLANE_B32), DstReg);
1115 MIB.addReg(SrcReg, 0,
SubReg);
1118 TII->get(AMDGPU::REG_SEQUENCE), DstReg);
1119 int N =
TRI->getRegSizeInBits(*SrcRC) / 32;
1120 for (
int i = 0; i <
N; i++) {
1122 Result, *
MRI,
MI->getOperand(1), SrcRC,
1123 TRI->getSubRegFromChannel(i), &AMDGPU::VGPR_32RegClass);
1125 MRI->createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass);
1127 TII->get(AMDGPU::V_READFIRSTLANE_B32), PartialDst)
1129 Result.addReg(PartialDst).addImm(
TRI->getSubRegFromChannel(i));
1132 MI->eraseFromParent();
1147 if (SrcReg == AMDGPU::SCC) {
1149 MRI->createVirtualRegister(
TRI->getWaveMaskRegClass());
1152 TII->get(IsWave32 ? AMDGPU::S_CSELECT_B32
1153 : AMDGPU::S_CSELECT_B64),
1157 I =
BuildMI(*
MI.getParent(), std::next(
I),
I->getDebugLoc(),
1158 TII->get(AMDGPU::COPY), DstReg)
1160 MI.eraseFromParent();
1163 if (DstReg == AMDGPU::SCC) {
1164 unsigned Opcode = IsWave32 ? AMDGPU::S_AND_B32 : AMDGPU::S_AND_B64;
1165 Register Exec = IsWave32 ? AMDGPU::EXEC_LO : AMDGPU::EXEC;
1168 MI.getDebugLoc(),
TII->get(Opcode))
1172 MI.eraseFromParent();
1182 SIFixSGPRCopies Impl(&MDT);
1183 bool Changed = Impl.run(MF);
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Provides AMDGPU specific target descriptions.
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
BlockVerifier::State From
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
Analysis containing CSE Info
AMD GCN specific subclass of TargetSubtarget.
const HexagonInstrInfo * TII
iv Induction Variable Users
Register const TargetRegisterInfo * TRI
MachineInstr unsigned OpIdx
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
static std::pair< const TargetRegisterClass *, const TargetRegisterClass * > getCopyRegClasses(const MachineInstr &Copy, const SIRegisterInfo &TRI, const MachineRegisterInfo &MRI)
static cl::opt< bool > EnableM0Merge("amdgpu-enable-merge-m0", cl::desc("Merge and hoist M0 initializations"), cl::init(true))
static bool hoistAndMergeSGPRInits(unsigned Reg, const MachineRegisterInfo &MRI, const TargetRegisterInfo *TRI, MachineDominatorTree &MDT, const TargetInstrInfo *TII)
static bool foldVGPRCopyIntoRegSequence(MachineInstr &MI, const SIRegisterInfo *TRI, const SIInstrInfo *TII, MachineRegisterInfo &MRI)
bool searchPredecessors(const MachineBasicBlock *MBB, const MachineBasicBlock *CutOff, UnaryPredicate Predicate)
static bool isReachable(const MachineInstr *From, const MachineInstr *To, const MachineBasicBlock *CutOff, MachineDominatorTree &MDT)
static bool isVGPRToSGPRCopy(const TargetRegisterClass *SrcRC, const TargetRegisterClass *DstRC, const SIRegisterInfo &TRI)
static bool tryChangeVGPRtoSGPRinCopy(MachineInstr &MI, const SIRegisterInfo *TRI, const SIInstrInfo *TII)
static bool isSGPRToVGPRCopy(const TargetRegisterClass *SrcRC, const TargetRegisterClass *DstRC, const SIRegisterInfo &TRI)
static bool isSafeToFoldImmIntoCopy(const MachineInstr *Copy, const MachineInstr *MoveImm, const SIInstrInfo *TII, unsigned &SMovOp, int64_t &Imm)
static MachineBasicBlock::iterator getFirstNonPrologue(MachineBasicBlock *MBB, const TargetInstrInfo *TII)
bool useRealTrue16Insts() const
Return true if real (non-fake) variants of True16 instructions using 16-bit registers should be code-...
Class for arbitrary precision integers.
A container for analyses that lazily runs them and caches their results.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
Implements a dense probed hash-table based set.
NodeT * findNearestCommonDominator(NodeT *A, NodeT *B) const
Find nearest common dominator basic block for basic block A and B.
bool properlyDominates(const DomTreeNodeBase< NodeT > *A, const DomTreeNodeBase< NodeT > *B) const
properlyDominates - Returns true iff A dominates B and A != B.
FunctionPass class - This class is used to implement most global optimizations.
bool isSchedulingBoundary(const MachineInstr &MI, const MachineBasicBlock *MBB, const MachineFunction &MF) const override
Test if the given instruction should be considered a scheduling boundary.
unsigned getNumOperands() const
Return the number of declared MachineOperands for this MachineInstruction.
LLVM_ABI iterator getFirstNonPHI()
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
pred_iterator pred_begin()
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
LLVM_ABI instr_iterator getFirstInstrTerminator()
Same getFirstTerminator but it ignores bundles and return an instr_iterator instead.
iterator_range< pred_iterator > predecessors()
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
Analysis pass which computes a MachineDominatorTree.
Analysis pass which computes a MachineDominatorTree.
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
bool dominates(const MachineInstr *A, const MachineInstr *B) const
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.
virtual bool runOnMachineFunction(MachineFunction &MF)=0
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
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.
const MachineFunctionProperties & getProperties() const
Get the function properties.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
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.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
bool isImplicitDef() const
const MachineBasicBlock * getParent() const
unsigned getOperandNo(const_mop_iterator I) const
Returns the number of the operand iterator I points to.
bool isCompare(QueryType Type=IgnoreBundle) const
Return true if this instruction is a comparison.
const MCInstrDesc & getDesc() const
Returns the target instruction descriptor of this MachineInstr.
bool isRegSequence() const
LLVM_ABI unsigned getNumExplicitDefs() const
Returns the number of non-implicit definitions.
bool isMoveImmediate(QueryType Type=IgnoreBundle) const
Return true if this instruction is a move immediate (including conditional moves) instruction.
LLVM_ABI void eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
const MachineOperand & getOperand(unsigned i) const
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
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 ChangeToRegister(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isDebug=false)
ChangeToRegister - Replace this operand with a new register operand of the specified value.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
This class implements a map that also provides access to all stored values in a deterministic order.
virtual StringRef getPassName() const
getPassName - Return a nice clean name for a pass.
A set of analyses that are preserved following a run of a transformation pass.
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.
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
A vector that has set insertion semantics.
size_type size() const
Determine the number of elements in the SetVector.
bool empty() const
Determine if the SetVector is empty or not.
bool insert(const value_type &X)
Insert a new element into the SetVector.
value_type pop_back_val()
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
TargetInstrInfo - Interface to description of machine instruction set.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
A Use represents the edge between a Value definition and its users.
std::pair< iterator, bool > insert(const ValueT &V)
self_iterator getIterator()
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
@ Kill
The last use of a register.
@ Undef
Value of the register doesn't matter.
Reg
All possible values of the reg field in the ModR/M byte.
initializer< Ty > init(const Ty &Val)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
@ Resolved
Queried, materialization begun.
NodeAddr< InstrNode * > Instr
NodeAddr< DefNode * > Def
This is an optimization pass for GlobalISel generic memory operations.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
unsigned getDefRegState(bool B)
auto max_element(R &&Range)
Provide wrappers to std::max_element which take ranges instead of having to pass begin/end explicitly...
char & SIFixSGPRCopiesLegacyID
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
FunctionPass * createSIFixSGPRCopiesLegacyPass()
Utility to store machine instructions worklist.
void insert(MachineInstr *MI)