Index: lib/CodeGen/GlobalISel/InstructionSelect.cpp =================================================================== --- lib/CodeGen/GlobalISel/InstructionSelect.cpp +++ lib/CodeGen/GlobalISel/InstructionSelect.cpp @@ -57,15 +57,39 @@ #endif 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)) reportSelectionError(MI, "Cannot select"); - // FIXME: It would be nice to dump all inserted instructions. It's not - // obvious how, esp. considering select() can insert after MI. + + // Dump the range of instructions that MI expanded into. + DEBUG({ + auto InsertedBegin = ReachedBegin ? MBB->begin() : std::next(MII); + dbgs() << "Into:\n"; + for (auto &InsertedMI : make_range(InsertedBegin, AfterIt)) + dbgs() << InsertedMI; + dbgs() << '\n'; + }); } }