22 #define DEBUG_TYPE "r600mergeclause"
27 switch (
MI.getOpcode()) {
29 case R600::CF_ALU_PUSH_BEFORE:
48 void cleanPotentialDisabledCFAlu(
MachineInstr &CFAlu)
const;
68 "R600 Clause Merge",
false,
false)
72 char R600ClauseMergePass::
ID = 0;
79 .getOperand(
TII->getOperandIdx(
MI.getOpcode(), R600::OpName::COUNT))
83 bool R600ClauseMergePass::isCFAluEnabled(
const MachineInstr &
MI)
const {
90 void R600ClauseMergePass::cleanPotentialDisabledCFAlu(
92 int CntIdx =
TII->getOperandIdx(R600::CF_ALU, R600::OpName::COUNT);
96 while (
I !=
E && !isCFAlu(*
I))
101 if (isCFAluEnabled(
MI))
104 MI.eraseFromParent();
108 bool R600ClauseMergePass::mergeIfPossible(
MachineInstr &RootCFAlu,
110 assert(isCFAlu(RootCFAlu) && isCFAlu(LatrCFAlu));
111 int CntIdx =
TII->getOperandIdx(R600::CF_ALU, R600::OpName::COUNT);
112 unsigned RootInstCount = getCFAluSize(RootCFAlu),
113 LaterInstCount = getCFAluSize(LatrCFAlu);
114 unsigned CumuledInsts = RootInstCount + LaterInstCount;
115 if (CumuledInsts >=
TII->getMaxAlusPerClause()) {
119 if (RootCFAlu.
getOpcode() == R600::CF_ALU_PUSH_BEFORE)
123 TII->getOperandIdx(R600::CF_ALU, R600::OpName::KCACHE_MODE0);
125 TII->getOperandIdx(R600::CF_ALU, R600::OpName::KCACHE_BANK0);
127 TII->getOperandIdx(R600::CF_ALU, R600::OpName::KCACHE_ADDR0);
139 TII->getOperandIdx(R600::CF_ALU, R600::OpName::KCACHE_MODE1);
141 TII->getOperandIdx(R600::CF_ALU, R600::OpName::KCACHE_BANK1);
143 TII->getOperandIdx(R600::CF_ALU, R600::OpName::KCACHE_ADDR1);
179 TII =
ST.getInstrInfo();
186 if ((!
TII->canBeConsideredALU(
MI) && !isCFAlu(
MI)) ||
187 TII->mustBeLastInClause(
MI.getOpcode()))
191 cleanPotentialDisabledCFAlu(
MI);
193 if (LatestCFAlu !=
E && mergeIfPossible(*LatestCFAlu,
MI)) {
194 MI.eraseFromParent();
196 assert(
MI.getOperand(8).getImm() &&
"CF ALU instruction disabled");
204 StringRef R600ClauseMergePass::getPassName()
const {
205 return "R600 Merge Clause Markers Pass";
209 return new R600ClauseMergePass();