35#define DEBUG_TYPE "gcn-create-vopd"
36STATISTIC(NumVOPDCreated,
"Number of VOPD Insts Created.");
44 class VOPDCombineInfo {
46 VOPDCombineInfo() =
default;
48 : FirstMI(
First), SecondMI(Second) {}
66 return "GCN Create VOPD Instructions";
69 bool doReplace(
const SIInstrInfo *SII, VOPDCombineInfo &CI) {
70 auto *FirstMI = CI.FirstMI;
71 auto *SecondMI = CI.SecondMI;
72 unsigned Opc1 = FirstMI->getOpcode();
73 unsigned Opc2 = SecondMI->getOpcode();
74 unsigned EncodingFamily =
80 "Should have previously determined this as a possible VOPD\n");
82 auto VOPDInst =
BuildMI(*FirstMI->getParent(), FirstMI,
83 FirstMI->getDebugLoc(), SII->get(NewOpcode))
84 .
setMIFlags(FirstMI->getFlags() | SecondMI->getFlags());
86 namespace VOPD = AMDGPU::VOPD;
91 for (
auto CompIdx : VOPD::COMPONENTS) {
92 auto MCOprIdx = InstInfo[CompIdx].getIndexOfDstInMCOperands();
93 VOPDInst.add(
MI[CompIdx]->getOperand(MCOprIdx));
96 for (
auto CompIdx : VOPD::COMPONENTS) {
97 auto CompSrcOprNum = InstInfo[CompIdx].getCompSrcOperandsNum();
98 for (
unsigned CompSrcIdx = 0; CompSrcIdx < CompSrcOprNum; ++CompSrcIdx) {
99 auto MCOprIdx = InstInfo[CompIdx].getIndexOfSrcInMCOperands(CompSrcIdx);
100 VOPDInst.add(
MI[CompIdx]->getOperand(MCOprIdx));
105 for (
auto CompIdx : VOPD::COMPONENTS)
106 VOPDInst.copyImplicitOps(*
MI[CompIdx]);
109 << *CI.FirstMI <<
"\tY: " << *CI.SecondMI <<
"\n");
111 for (
auto CompIdx : VOPD::COMPONENTS)
112 MI[CompIdx]->eraseFromParent();
127 bool Changed =
false;
131 for (
auto &
MBB : MF) {
134 auto *FirstMI = &*MII;
138 if (FirstMI->isDebugInstr())
140 auto *SecondMI = &*MII;
141 unsigned Opc = FirstMI->getOpcode();
142 unsigned Opc2 = SecondMI->getOpcode();
147 if (FirstCanBeVOPD.
X && SecondCanBeVOPD.
Y)
148 CI = VOPDCombineInfo(FirstMI, SecondMI);
149 else if (FirstCanBeVOPD.
Y && SecondCanBeVOPD.
X)
150 CI = VOPDCombineInfo(SecondMI, FirstMI);
161 for (
auto &CI : ReplaceCandidates) {
162 Changed |= doReplace(SII, CI);
171char GCNCreateVOPD::ID = 0;
Provides AMDGPU specific target descriptions.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
AMD GCN specific subclass of TargetSubtarget.
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Interface definition for SIInstrInfo.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Represent the analysis usage information of a pass.
void setPreservesCFG()
This function should be called by the pass, iff they do not:
bool skipFunction(const Function &F) const
Optional passes call this function to check whether the pass should be skipped.
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.
Function & getFunction()
Return the LLVM function that this machine code represents.
const MachineInstrBuilder & setMIFlags(unsigned Flags) const
Representation of each machine instruction.
virtual StringRef getPassName() const
getPassName - Return a nice clean name for a pass.
const GCNSubtarget & getSubtarget() const
void fixImplicitOperands(MachineInstr &MI) const
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.
CanBeVOPD getCanBeVOPD(unsigned Opc)
unsigned getVOPDOpcode(unsigned Opc)
unsigned getVOPDEncodingFamily(const MCSubtargetInfo &ST)
int getVOPDFull(unsigned OpX, unsigned OpY, unsigned EncodingFamily)
VOPD::InstInfo getVOPDInstInfo(const MCInstrDesc &OpX, const MCInstrDesc &OpY)
bool hasVOPD(const MCSubtargetInfo &STI)
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This is an optimization pass for GlobalISel generic memory operations.
IterT next_nodbg(IterT It, IterT End, bool SkipPseudoOp=true)
Increment It, then continue incrementing it while it points to a debug instruction.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
bool checkVOPDRegConstraints(const SIInstrInfo &TII, const MachineInstr &FirstMI, const MachineInstr &SecondMI)