diff options
author | Simon Dardis <simon.dardis@imgtec.com> | 2017-04-04 11:28:53 +0000 |
---|---|---|
committer | Simon Dardis <simon.dardis@imgtec.com> | 2017-04-04 11:28:53 +0000 |
commit | 0a47edb1539f6beaef49918ee3fbd7b28456f2d8 (patch) | |
tree | c8547ae3631f853ee1b92ef907f930676ca27de2 /llvm/lib/Target/Mips/MipsHazardSchedule.cpp | |
parent | d7f151289733c1a659401adeb02a61b69c09b280 (diff) | |
download | bcm5719-llvm-0a47edb1539f6beaef49918ee3fbd7b28456f2d8.tar.gz bcm5719-llvm-0a47edb1539f6beaef49918ee3fbd7b28456f2d8.zip |
[mips] Deal with empty blocks in the mips hazard scheduler
This patch teaches the hazard scheduler how to handle empty blocks
when search for the next real instruction when dealing with forbidden
slots.
Reviewers: slthakur
Differential Revision: https://reviews.llvm.org/D31293
llvm-svn: 299427
Diffstat (limited to 'llvm/lib/Target/Mips/MipsHazardSchedule.cpp')
-rw-r--r-- | llvm/lib/Target/Mips/MipsHazardSchedule.cpp | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/llvm/lib/Target/Mips/MipsHazardSchedule.cpp b/llvm/lib/Target/Mips/MipsHazardSchedule.cpp index 87446e38aca..f6fcf6ec938 100644 --- a/llvm/lib/Target/Mips/MipsHazardSchedule.cpp +++ b/llvm/lib/Target/Mips/MipsHazardSchedule.cpp @@ -103,23 +103,24 @@ static Iter getNextMachineInstrInBB(Iter Position) { // Find the next real instruction from the current position, looking through // basic block boundaries. -static Iter getNextMachineInstr(Iter Position, MachineBasicBlock *Parent) { +static std::pair<Iter, bool> getNextMachineInstr(Iter Position, MachineBasicBlock * Parent) { if (Position == Parent->end()) { - MachineBasicBlock *Succ = Parent->getNextNode(); - if (Succ != nullptr && Parent->isSuccessor(Succ)) { - Position = Succ->begin(); - Parent = Succ; - } else { - llvm_unreachable( - "Should have identified the end of the function earlier!"); - } + do { + MachineBasicBlock *Succ = Parent->getNextNode(); + if (Succ != nullptr && Parent->isSuccessor(Succ)) { + Position = Succ->begin(); + Parent = Succ; + } else { + return std::make_pair(Position, true); + } + } while (Parent->empty()); } Iter Instr = getNextMachineInstrInBB(Position); if (Instr == Parent->end()) { return getNextMachineInstr(Instr, Parent); } - return Instr; + return std::make_pair(Instr, false); } bool MipsHazardSchedule::runOnMachineFunction(MachineFunction &MF) { @@ -145,7 +146,9 @@ bool MipsHazardSchedule::runOnMachineFunction(MachineFunction &MF) { bool LastInstInFunction = std::next(I) == FI->end() && std::next(FI) == MF.end(); if (!LastInstInFunction) { - Inst = getNextMachineInstr(std::next(I), &*FI); + std::pair<Iter, bool> Res = getNextMachineInstr(std::next(I), &*FI); + LastInstInFunction |= Res.second; + Inst = Res.first; } if (LastInstInFunction || !TII->SafeInForbiddenSlot(*Inst)) { |