diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-07-12 21:41:32 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-07-12 21:41:32 +0000 |
commit | 786724a22ecff6afa9484714be8448429fdd021c (patch) | |
tree | c672bbed3539107738cf537e5aefc08937593127 /llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp | |
parent | 8950ad12adfdf6f13426171643a0b56e91dd7fd1 (diff) | |
download | bcm5719-llvm-786724a22ecff6afa9484714be8448429fdd021c.tar.gz bcm5719-llvm-786724a22ecff6afa9484714be8448429fdd021c.zip |
AMDGPU: Follow up to r275203
I meant to squash this into it.
llvm-svn: 275220
Diffstat (limited to 'llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp')
-rw-r--r-- | llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp | 51 |
1 files changed, 27 insertions, 24 deletions
diff --git a/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp b/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp index f989b5b9bb0..adb0919231c 100644 --- a/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp +++ b/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp @@ -76,7 +76,7 @@ private: bool shouldSkip(MachineBasicBlock *From, MachineBasicBlock *To); void Skip(MachineInstr &From, MachineOperand &To); - bool skipIfDead(MachineInstr &MI); + bool skipIfDead(MachineInstr &MI, MachineBasicBlock &NextBB); void If(MachineInstr &MI); void Else(MachineInstr &MI, bool ExecModified); @@ -89,6 +89,9 @@ private: void Kill(MachineInstr &MI); void Branch(MachineInstr &MI); + MachineBasicBlock *insertSkipBlock(MachineBasicBlock &MBB, + MachineBasicBlock::iterator I) const; + std::pair<MachineBasicBlock *, MachineBasicBlock *> splitBlock(MachineBasicBlock &MBB, MachineBasicBlock::iterator I); @@ -205,27 +208,22 @@ void SILowerControlFlow::Skip(MachineInstr &From, MachineOperand &To) { .addOperand(To); } -bool SILowerControlFlow::skipIfDead(MachineInstr &MI) { +bool SILowerControlFlow::skipIfDead(MachineInstr &MI, MachineBasicBlock &NextBB) { MachineBasicBlock &MBB = *MI.getParent(); + MachineFunction *MF = MBB.getParent(); - if (MBB.getParent()->getFunction()->getCallingConv() != CallingConv::AMDGPU_PS || + if (MF->getFunction()->getCallingConv() != CallingConv::AMDGPU_PS || !shouldSkip(&MBB, &MBB.getParent()->back())) return false; - LivePhysRegs RemainderLiveRegs(TRI); - RemainderLiveRegs.addLiveOuts(MBB); - - MachineBasicBlock *SkipBB; - MachineBasicBlock *RemainderBB; - std::tie(SkipBB, RemainderBB) = splitBlock(MBB, MI.getIterator()); + MachineBasicBlock *SkipBB = insertSkipBlock(MBB, MI.getIterator()); + SkipBB->addSuccessor(&NextBB); const DebugLoc &DL = MI.getDebugLoc(); // If the exec mask is non-zero, skip the next two instructions BuildMI(&MBB, DL, TII->get(AMDGPU::S_CBRANCH_EXECNZ)) - .addMBB(RemainderBB); - - MBB.addSuccessor(RemainderBB); + .addMBB(&NextBB); MachineBasicBlock::iterator Insert = SkipBB->begin(); @@ -244,15 +242,6 @@ bool SILowerControlFlow::skipIfDead(MachineInstr &MI) { // ... and terminate wavefront. BuildMI(*SkipBB, Insert, DL, TII->get(AMDGPU::S_ENDPGM)); - for (const MachineInstr &Inst : reverse(*RemainderBB)) - RemainderLiveRegs.stepBackward(Inst); - - const MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo(); - for (unsigned Reg : RemainderLiveRegs) { - if (MRI.isAllocatable(Reg)) - RemainderBB->addLiveIn(Reg); - } - return true; } @@ -495,6 +484,20 @@ void SILowerControlFlow::emitLoadM0FromVGPRLoop(MachineBasicBlock &LoopBB, .addMBB(&LoopBB); } +MachineBasicBlock *SILowerControlFlow::insertSkipBlock( + MachineBasicBlock &MBB, MachineBasicBlock::iterator I) const { + MachineFunction *MF = MBB.getParent(); + + MachineBasicBlock *SkipBB = MF->CreateMachineBasicBlock(); + MachineFunction::iterator MBBI(MBB); + ++MBBI; + + MF->insert(MBBI, SkipBB); + MBB.addSuccessor(SkipBB); + + return SkipBB; +} + std::pair<MachineBasicBlock *, MachineBasicBlock *> SILowerControlFlow::splitBlock(MachineBasicBlock &MBB, MachineBasicBlock::iterator I) { @@ -745,7 +748,7 @@ bool SILowerControlFlow::runOnMachineFunction(MachineFunction &MF) { if (--Depth == 0 && HaveKill) { HaveKill = false; - if (skipIfDead(MI)) { + if (skipIfDead(MI, *NextBB)) { NextBB = std::next(BI); BE = MF.end(); Next = MBB.end(); @@ -754,9 +757,9 @@ bool SILowerControlFlow::runOnMachineFunction(MachineFunction &MF) { EndCf(MI); break; - case AMDGPU::SI_KILL: + case AMDGPU::SI_KILL_TERMINATOR: if (Depth == 0) { - if (skipIfDead(MI)) { + if (skipIfDead(MI, *NextBB)) { NextBB = std::next(BI); BE = MF.end(); Next = MBB.end(); |