[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
This commit is contained in:
Ahmed Bougacha 2016-11-08 19:27:10 +00:00
parent 1e77aaca8a
commit db273a1272
1 changed files with 22 additions and 5 deletions

View File

@ -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