From db273a1272eb972d5fc361262841c762636cae95 Mon Sep 17 00:00:00 2001 From: Ahmed Bougacha Date: Tue, 8 Nov 2016 19:27:10 +0000 Subject: [PATCH] [GlobalISel] Permit select() to erase. Erasing reverse_iterators is problematic; iterate manually. While there, keep track of the range of inserted instructions. It can miss instructions inserted elsewhere, but those are harder to track. Differential Revision: http://reviews.llvm.org/D22924 llvm-svn: 286272 --- llvm/lib/CodeGen/GlobalISel/InstructionSelect.cpp | 27 ++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/llvm/lib/CodeGen/GlobalISel/InstructionSelect.cpp b/llvm/lib/CodeGen/GlobalISel/InstructionSelect.cpp index be20355..653c242 100644 --- a/llvm/lib/CodeGen/GlobalISel/InstructionSelect.cpp +++ b/llvm/lib/CodeGen/GlobalISel/InstructionSelect.cpp @@ -89,11 +89,28 @@ bool InstructionSelect::runOnMachineFunction(MachineFunction &MF) { bool Failed = false; for (MachineBasicBlock *MBB : post_order(&MF)) { - for (MachineBasicBlock::reverse_iterator MII = MBB->rbegin(), - End = MBB->rend(); - MII != End;) { - MachineInstr &MI = *MII++; - DEBUG(dbgs() << "Selecting: " << MI << '\n'); + if (MBB->empty()) + continue; + + // Select instructions in reverse block order. We permit erasing so have + // to resort to manually iterating and recognizing the begin (rend) case. + bool ReachedBegin = false; + for (auto MII = std::prev(MBB->end()), Begin = MBB->begin(); + !ReachedBegin;) { + // Keep track of the insertion range for debug printing. + const auto AfterIt = std::next(MII); + + // Select this instruction. + MachineInstr &MI = *MII; + + // And have our iterator point to the next instruction, if there is one. + if (MII == Begin) + ReachedBegin = true; + else + --MII; + + DEBUG(dbgs() << "Selecting: \n " << MI); + if (!ISel->select(MI)) { if (TPC.isGlobalISelAbortEnabled()) // FIXME: It would be nice to dump all inserted instructions. It's -- 2.7.4