16 #define DEBUG_TYPE "r600mergeclause"
35 case AMDGPU::CF_ALU_PUSH_BEFORE:
55 void cleanPotentialDisabledCFAlu(
MachineInstr *CFAlu)
const;
67 const char *getPassName()
const;
72 unsigned R600ClauseMergePass::getCFAluSize(
const MachineInstr *MI)
const {
78 bool R600ClauseMergePass::isCFAluEnabled(
const MachineInstr *MI)
const {
84 void R600ClauseMergePass::cleanPotentialDisabledCFAlu(
MachineInstr *CFAlu)
86 int CntIdx =
TII->getOperandIdx(AMDGPU::CF_ALU, AMDGPU::OpName::COUNT);
90 while (I!= E && !isCFAlu(I))
95 if (isCFAluEnabled(MI))
102 bool R600ClauseMergePass::mergeIfPossible(
MachineInstr *RootCFAlu,
104 assert(isCFAlu(RootCFAlu) && isCFAlu(LatrCFAlu));
105 int CntIdx =
TII->getOperandIdx(AMDGPU::CF_ALU, AMDGPU::OpName::COUNT);
106 unsigned RootInstCount = getCFAluSize(RootCFAlu),
107 LaterInstCount = getCFAluSize(LatrCFAlu);
108 unsigned CumuledInsts = RootInstCount + LaterInstCount;
109 if (CumuledInsts >=
TII->getMaxAlusPerClause()) {
113 if (RootCFAlu->
getOpcode() == AMDGPU::CF_ALU_PUSH_BEFORE)
117 TII->getOperandIdx(AMDGPU::CF_ALU, AMDGPU::OpName::KCACHE_MODE0);
119 TII->getOperandIdx(AMDGPU::CF_ALU, AMDGPU::OpName::KCACHE_BANK0);
121 TII->getOperandIdx(AMDGPU::CF_ALU, AMDGPU::OpName::KCACHE_ADDR0);
133 TII->getOperandIdx(AMDGPU::CF_ALU, AMDGPU::OpName::KCACHE_MODE1);
135 TII->getOperandIdx(AMDGPU::CF_ALU, AMDGPU::OpName::KCACHE_BANK1);
137 TII->getOperandIdx(AMDGPU::CF_ALU, AMDGPU::OpName::KCACHE_ADDR1);
177 if ((!
TII->canBeConsideredALU(MI) && !isCFAlu(MI)) ||
182 cleanPotentialDisabledCFAlu(MI);
184 if (LatestCFAlu != E && mergeIfPossible(LatestCFAlu, MI)) {
195 const char *R600ClauseMergePass::getPassName()
const {
196 return "R600 Merge Clause Markers Pass";
203 return new R600ClauseMergePass(TM);
Interface definition for R600InstrInfo.
Interface definition for R600RegisterInfo.
const HexagonInstrInfo * TII
ID
LLVM Calling Convention Representation.
static cl::opt< bool > Enabled("stats", cl::desc("Enable statistics output from program (available with Asserts)"))
FunctionPass * createR600ClauseMergePass(TargetMachine &tm)
const MachineBasicBlock * getParent() const
bundle_iterator< MachineInstr, instr_iterator > iterator
const MachineOperand & getOperand(unsigned i) const
void setImm(int64_t immVal)
virtual const TargetInstrInfo * getInstrInfo() const
void setDesc(const MCInstrDesc &tid)
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
const TargetMachine & getTarget() const
BasicBlockListType::iterator iterator