diff options
author | Vincent Lejeune <vljn@ovi.com> | 2013-04-30 00:14:00 +0000 |
---|---|---|
committer | Vincent Lejeune <vljn@ovi.com> | 2013-04-30 00:14:00 +0000 |
commit | 7c395f77de35e307291d83404edb144438772e3d (patch) | |
tree | 24c0217339a8a60b4772b3d6b811bb7eb1459a67 /llvm/lib | |
parent | 3f1d136b02f82f9eb4317923b28f7c063e6a252d (diff) | |
download | bcm5719-llvm-7c395f77de35e307291d83404edb144438772e3d.tar.gz bcm5719-llvm-7c395f77de35e307291d83404edb144438772e3d.zip |
R600: Take inner dependency into tex/vtx clauses
llvm-svn: 180757
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/R600/R600ControlFlowFinalizer.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/llvm/lib/Target/R600/R600ControlFlowFinalizer.cpp b/llvm/lib/Target/R600/R600ControlFlowFinalizer.cpp index 611d61ace02..e637641e687 100644 --- a/llvm/lib/Target/R600/R600ControlFlowFinalizer.cpp +++ b/llvm/lib/Target/R600/R600ControlFlowFinalizer.cpp @@ -48,6 +48,7 @@ private: static char ID; const R600InstrInfo *TII; + const R600RegisterInfo &TRI; unsigned MaxFetchInst; const AMDGPUSubtarget &ST; @@ -107,6 +108,35 @@ private: return TII->get(Opcode); } + bool isCompatibleWithClause(const MachineInstr *MI, + std::set<unsigned> &DstRegs, std::set<unsigned> &SrcRegs) const { + unsigned DstMI, SrcMI; + for (MachineInstr::const_mop_iterator I = MI->operands_begin(), + E = MI->operands_end(); I != E; ++I) { + const MachineOperand &MO = *I; + if (!MO.isReg()) + continue; + if (MO.isDef()) + DstMI = MO.getReg(); + if (MO.isUse()) { + unsigned Reg = MO.getReg(); + if (AMDGPU::R600_Reg128RegClass.contains(Reg)) + SrcMI = Reg; + else + SrcMI = TRI.getMatchingSuperReg(Reg, + TRI.getSubRegFromChannel(TRI.getHWRegChan(Reg)), + &AMDGPU::R600_Reg128RegClass); + } + } + if ((DstRegs.find(SrcMI) == DstRegs.end()) && + (SrcRegs.find(DstMI) == SrcRegs.end())) { + SrcRegs.insert(SrcMI); + DstRegs.insert(DstMI); + return true; + } else + return false; + } + ClauseFile MakeFetchClause(MachineBasicBlock &MBB, MachineBasicBlock::iterator &I) const { @@ -114,6 +144,7 @@ private: std::vector<MachineInstr *> ClauseContent; unsigned AluInstCount = 0; bool IsTex = TII->usesTextureCache(ClauseHead); + std::set<unsigned> DstRegs, SrcRegs; for (MachineBasicBlock::iterator E = MBB.end(); I != E; ++I) { if (IsTrivialInst(I)) continue; @@ -122,6 +153,8 @@ private: if ((IsTex && !TII->usesTextureCache(I)) || (!IsTex && !TII->usesVertexCache(I))) break; + if (!isCompatibleWithClause(I, DstRegs, SrcRegs)) + break; AluInstCount ++; ClauseContent.push_back(I); } @@ -176,6 +209,7 @@ private: public: R600ControlFlowFinalizer(TargetMachine &tm) : MachineFunctionPass(ID), TII (static_cast<const R600InstrInfo *>(tm.getInstrInfo())), + TRI(TII->getRegisterInfo()), ST(tm.getSubtarget<AMDGPUSubtarget>()) { const AMDGPUSubtarget &ST = tm.getSubtarget<AMDGPUSubtarget>(); if (ST.device()->getGeneration() <= AMDGPUDeviceInfo::HD4XXX) |