forked from OSchip/llvm-project
[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:
parent
1e77aaca8a
commit
db273a1272
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue