mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-16 11:24:39 +00:00
Miscellaneous clean-ups based on Evan's feedback:
- Cleaned up how the prologue-epilogue inserter loops over the instructions. - Instead of restarting the processing of an instruction if we remove an implicit kill, just update the end iterator and make sure that the iterator isn't incremented. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47870 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -517,53 +517,63 @@ void PEI::replaceFrameIndices(MachineFunction &Fn) {
|
||||
for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); ) {
|
||||
MachineInstr *MI = I;
|
||||
|
||||
if (I->getOpcode() == FrameSetupOpcode ||
|
||||
I->getOpcode() == FrameDestroyOpcode) {
|
||||
// Remember how much SP has been adjustment to create the call frame.
|
||||
int Size = I->getOperand(0).getImm();
|
||||
if ((!StackGrowsDown && I->getOpcode() == FrameSetupOpcode) ||
|
||||
(StackGrowsDown && I->getOpcode() == FrameDestroyOpcode))
|
||||
Size = -Size;
|
||||
SPAdj += Size;
|
||||
MachineBasicBlock::iterator PrevI = prior(I);
|
||||
TRI.eliminateCallFramePseudoInstr(Fn, *BB, I);
|
||||
// Visit the instructions created by eliminateCallFramePseudoInstr().
|
||||
I = next(PrevI);
|
||||
MI = NULL;
|
||||
} else if (I->getOpcode() == TargetInstrInfo::DECLARE) {
|
||||
if (I->getOpcode() == TargetInstrInfo::DECLARE) {
|
||||
// Ignore it.
|
||||
++I;
|
||||
} else {
|
||||
bool DoIncr = true;
|
||||
|
||||
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i)
|
||||
if (MI->getOperand(i).isFrameIndex()) {
|
||||
// Some instructions (e.g. inline asm instructions) can have
|
||||
// multiple frame indices and/or cause eliminateFrameIndex to insert
|
||||
// more than one instruction. We need the register scavenger to go
|
||||
// through all of these instructions so that it can update its
|
||||
// register information. We keep the iterator at the point before
|
||||
// insertion so that we can revisit them in full.
|
||||
bool AtBeginning = (I == BB->begin());
|
||||
if (!AtBeginning) --I;
|
||||
|
||||
// If this instruction has a FrameIndex operand, we need to use that
|
||||
// target machine register info object to eliminate it.
|
||||
TRI.eliminateFrameIndex(MI, SPAdj, RS);
|
||||
|
||||
// Reset the iterator if we were at the beginning of the BB.
|
||||
if (AtBeginning) {
|
||||
I = BB->begin();
|
||||
DoIncr = false;
|
||||
}
|
||||
|
||||
MI = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (DoIncr) ++I;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (I->getOpcode() == FrameSetupOpcode ||
|
||||
I->getOpcode() == FrameDestroyOpcode) {
|
||||
// Remember how much SP has been adjusted to create the call
|
||||
// frame.
|
||||
int Size = I->getOperand(0).getImm();
|
||||
|
||||
if ((!StackGrowsDown && I->getOpcode() == FrameSetupOpcode) ||
|
||||
(StackGrowsDown && I->getOpcode() == FrameDestroyOpcode))
|
||||
Size = -Size;
|
||||
|
||||
SPAdj += Size;
|
||||
|
||||
MachineBasicBlock::iterator PrevI = prior(I);
|
||||
TRI.eliminateCallFramePseudoInstr(Fn, *BB, I);
|
||||
|
||||
// Visit the instructions created by eliminateCallFramePseudoInstr().
|
||||
I = next(PrevI);
|
||||
continue;
|
||||
}
|
||||
|
||||
bool DoIncr = true;
|
||||
|
||||
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i)
|
||||
if (MI->getOperand(i).isFrameIndex()) {
|
||||
// Some instructions (e.g. inline asm instructions) can have
|
||||
// multiple frame indices and/or cause eliminateFrameIndex
|
||||
// to insert more than one instruction. We need the register
|
||||
// scavenger to go through all of these instructions so that
|
||||
// it can update its register information. We keep the
|
||||
// iterator at the point before insertion so that we can
|
||||
// revisit them in full.
|
||||
bool AtBeginning = (I == BB->begin());
|
||||
if (!AtBeginning) --I;
|
||||
|
||||
// If this instruction has a FrameIndex operand, we need to
|
||||
// use that target machine register info object to eliminate
|
||||
// it.
|
||||
TRI.eliminateFrameIndex(MI, SPAdj, RS);
|
||||
|
||||
// Reset the iterator if we were at the beginning of the BB.
|
||||
if (AtBeginning) {
|
||||
I = BB->begin();
|
||||
DoIncr = false;
|
||||
}
|
||||
|
||||
MI = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (DoIncr) ++I;
|
||||
|
||||
// Update register states.
|
||||
if (RS && MI) RS->forward(MI);
|
||||
}
|
||||
|
Reference in New Issue
Block a user