mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-28 23:38:59 +00:00
Remove special-casing of return blocks for liveness.
Now that return value registers are return instruction uses, there is no need for special treatment of return blocks. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174416 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
baa3c50a7b
commit
b45e4deb10
@ -151,23 +151,7 @@ void AggressiveAntiDepBreaker::StartBlock(MachineBasicBlock *BB) {
|
||||
std::vector<unsigned> &KillIndices = State->GetKillIndices();
|
||||
std::vector<unsigned> &DefIndices = State->GetDefIndices();
|
||||
|
||||
// Determine the live-out physregs for this block.
|
||||
if (IsReturnBlock) {
|
||||
// In a return block, examine the function live-out regs.
|
||||
for (MachineRegisterInfo::liveout_iterator I = MRI.liveout_begin(),
|
||||
E = MRI.liveout_end(); I != E; ++I) {
|
||||
for (MCRegAliasIterator AI(*I, TRI, true); AI.isValid(); ++AI) {
|
||||
unsigned Reg = *AI;
|
||||
State->UnionGroups(Reg, 0);
|
||||
KillIndices[Reg] = BB->size();
|
||||
DefIndices[Reg] = ~0u;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// In a non-return block, examine the live-in regs of all successors.
|
||||
// Note a return block can have successors if the return instruction is
|
||||
// predicated.
|
||||
// Examine the live-in regs of all successors.
|
||||
for (MachineBasicBlock::succ_iterator SI = BB->succ_begin(),
|
||||
SE = BB->succ_end(); SI != SE; ++SI)
|
||||
for (MachineBasicBlock::livein_iterator I = (*SI)->livein_begin(),
|
||||
|
@ -57,23 +57,7 @@ void CriticalAntiDepBreaker::StartBlock(MachineBasicBlock *BB) {
|
||||
|
||||
bool IsReturnBlock = (BBSize != 0 && BB->back().isReturn());
|
||||
|
||||
// Determine the live-out physregs for this block.
|
||||
if (IsReturnBlock) {
|
||||
// In a return block, examine the function live-out regs.
|
||||
for (MachineRegisterInfo::liveout_iterator I = MRI.liveout_begin(),
|
||||
E = MRI.liveout_end(); I != E; ++I) {
|
||||
for (MCRegAliasIterator AI(*I, TRI, true); AI.isValid(); ++AI) {
|
||||
unsigned Reg = *AI;
|
||||
Classes[Reg] = reinterpret_cast<TargetRegisterClass *>(-1);
|
||||
KillIndices[Reg] = BBSize;
|
||||
DefIndices[Reg] = ~0u;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// In a non-return block, examine the live-in regs of all successors.
|
||||
// Note a return block can have successors if the return instruction is
|
||||
// predicated.
|
||||
// Examine the live-in regs of all successors.
|
||||
for (MachineBasicBlock::succ_iterator SI = BB->succ_begin(),
|
||||
SE = BB->succ_end(); SI != SE; ++SI)
|
||||
for (MachineBasicBlock::livein_iterator I = (*SI)->livein_begin(),
|
||||
|
@ -99,15 +99,6 @@ bool DeadMachineInstructionElim::runOnMachineFunction(MachineFunction &MF) {
|
||||
// Start out assuming that reserved registers are live out of this block.
|
||||
LivePhysRegs = MRI->getReservedRegs();
|
||||
|
||||
// Also add any explicit live-out physregs for this block.
|
||||
if (!MBB->empty() && MBB->back().isReturn())
|
||||
for (MachineRegisterInfo::liveout_iterator LOI = MRI->liveout_begin(),
|
||||
LOE = MRI->liveout_end(); LOI != LOE; ++LOI) {
|
||||
unsigned Reg = *LOI;
|
||||
if (TargetRegisterInfo::isPhysicalRegister(Reg))
|
||||
LivePhysRegs.set(Reg);
|
||||
}
|
||||
|
||||
// Add live-ins from sucessors to LivePhysRegs. Normally, physregs are not
|
||||
// live across blocks, but some targets (x86) can have flags live out of a
|
||||
// block.
|
||||
|
@ -619,29 +619,6 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &mf) {
|
||||
MBB);
|
||||
}
|
||||
|
||||
// Finally, if the last instruction in the block is a return, make sure to
|
||||
// mark it as using all of the live-out values in the function.
|
||||
// Things marked both call and return are tail calls; do not do this for
|
||||
// them. The tail callee need not take the same registers as input
|
||||
// that it produces as output, and there are dependencies for its input
|
||||
// registers elsewhere.
|
||||
if (!MBB->empty() && MBB->back().isReturn()
|
||||
&& !MBB->back().isCall()) {
|
||||
MachineInstr *Ret = &MBB->back();
|
||||
|
||||
for (MachineRegisterInfo::liveout_iterator
|
||||
I = MF->getRegInfo().liveout_begin(),
|
||||
E = MF->getRegInfo().liveout_end(); I != E; ++I) {
|
||||
assert(TargetRegisterInfo::isPhysicalRegister(*I) &&
|
||||
"Cannot have a live-out virtual register!");
|
||||
HandlePhysRegUse(*I, Ret);
|
||||
|
||||
// Add live-out registers as implicit uses.
|
||||
if (!Ret->readsRegister(*I))
|
||||
Ret->addOperand(MachineOperand::CreateReg(*I, false, true));
|
||||
}
|
||||
}
|
||||
|
||||
// MachineCSE may CSE instructions which write to non-allocatable physical
|
||||
// registers across MBBs. Remember if any reserved register is liveout.
|
||||
SmallSet<unsigned, 4> LiveOuts;
|
||||
|
@ -418,11 +418,11 @@ void SchedulePostRATDList::StartBlockForKills(MachineBasicBlock *BB) {
|
||||
// Start with no live registers.
|
||||
LiveRegs.reset();
|
||||
|
||||
// Determine the live-out physregs for this block.
|
||||
if (!BB->empty() && BB->back().isReturn()) {
|
||||
// In a return block, examine the function live-out regs.
|
||||
for (MachineRegisterInfo::liveout_iterator I = MRI.liveout_begin(),
|
||||
E = MRI.liveout_end(); I != E; ++I) {
|
||||
// Examine the live-in regs of all successors.
|
||||
for (MachineBasicBlock::succ_iterator SI = BB->succ_begin(),
|
||||
SE = BB->succ_end(); SI != SE; ++SI) {
|
||||
for (MachineBasicBlock::livein_iterator I = (*SI)->livein_begin(),
|
||||
E = (*SI)->livein_end(); I != E; ++I) {
|
||||
unsigned Reg = *I;
|
||||
LiveRegs.set(Reg);
|
||||
// Repeat, for all subregs.
|
||||
@ -430,20 +430,6 @@ void SchedulePostRATDList::StartBlockForKills(MachineBasicBlock *BB) {
|
||||
LiveRegs.set(*SubRegs);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// In a non-return block, examine the live-in regs of all successors.
|
||||
for (MachineBasicBlock::succ_iterator SI = BB->succ_begin(),
|
||||
SE = BB->succ_end(); SI != SE; ++SI) {
|
||||
for (MachineBasicBlock::livein_iterator I = (*SI)->livein_begin(),
|
||||
E = (*SI)->livein_end(); I != E; ++I) {
|
||||
unsigned Reg = *I;
|
||||
LiveRegs.set(Reg);
|
||||
// Repeat, for all subregs.
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
LiveRegs.set(*SubRegs);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool SchedulePostRATDList::ToggleKillFlag(MachineInstr *MI,
|
||||
|
@ -177,7 +177,6 @@ namespace {
|
||||
unsigned VirtReg, unsigned Hint);
|
||||
void spillAll(MachineBasicBlock::iterator MI);
|
||||
bool setPhysReg(MachineInstr *MI, unsigned OpNum, unsigned PhysReg);
|
||||
void addRetOperands(MachineBasicBlock *MBB);
|
||||
};
|
||||
char RAFast::ID = 0;
|
||||
}
|
||||
@ -774,59 +773,6 @@ void RAFast::handleThroughOperands(MachineInstr *MI,
|
||||
UsedInInstr.insert(PartialDefs[i]);
|
||||
}
|
||||
|
||||
/// addRetOperand - ensure that a return instruction has an operand for each
|
||||
/// value live out of the function.
|
||||
///
|
||||
/// Things marked both call and return are tail calls; do not do this for them.
|
||||
/// The tail callee need not take the same registers as input that it produces
|
||||
/// as output, and there are dependencies for its input registers elsewhere.
|
||||
///
|
||||
/// FIXME: This should be done as part of instruction selection, and this helper
|
||||
/// should be deleted. Until then, we use custom logic here to create the proper
|
||||
/// operand under all circumstances. We can't use addRegisterKilled because that
|
||||
/// doesn't make sense for undefined values. We can't simply avoid calling it
|
||||
/// for undefined values, because we must ensure that the operand always exists.
|
||||
void RAFast::addRetOperands(MachineBasicBlock *MBB) {
|
||||
if (MBB->empty() || !MBB->back().isReturn() || MBB->back().isCall())
|
||||
return;
|
||||
|
||||
MachineInstr *MI = &MBB->back();
|
||||
|
||||
for (MachineRegisterInfo::liveout_iterator
|
||||
I = MBB->getParent()->getRegInfo().liveout_begin(),
|
||||
E = MBB->getParent()->getRegInfo().liveout_end(); I != E; ++I) {
|
||||
unsigned Reg = *I;
|
||||
assert(TargetRegisterInfo::isPhysicalRegister(Reg) &&
|
||||
"Cannot have a live-out virtual register.");
|
||||
|
||||
bool hasDef = PhysRegState[Reg] == regReserved;
|
||||
|
||||
// Check if this register already has an operand.
|
||||
bool Found = false;
|
||||
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
|
||||
MachineOperand &MO = MI->getOperand(i);
|
||||
if (!MO.isReg() || !MO.isUse())
|
||||
continue;
|
||||
|
||||
unsigned OperReg = MO.getReg();
|
||||
if (!TargetRegisterInfo::isPhysicalRegister(OperReg))
|
||||
continue;
|
||||
|
||||
if (OperReg == Reg || TRI->isSuperRegister(OperReg, Reg)) {
|
||||
// If the ret already has an operand for this physreg or a superset,
|
||||
// don't duplicate it. Set the kill flag if the value is defined.
|
||||
if (hasDef && !MO.isKill())
|
||||
MO.setIsKill();
|
||||
Found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!Found)
|
||||
MachineInstrBuilder(*MF, MI)
|
||||
.addReg(Reg, llvm::RegState::Implicit | getKillRegState(hasDef));
|
||||
}
|
||||
}
|
||||
|
||||
void RAFast::AllocateBasicBlock() {
|
||||
DEBUG(dbgs() << "\nAllocating " << *MBB);
|
||||
|
||||
@ -1109,9 +1055,6 @@ void RAFast::AllocateBasicBlock() {
|
||||
MBB->erase(Coalesced[i]);
|
||||
NumCopies += Coalesced.size();
|
||||
|
||||
// addRetOperands must run after we've seen all defs in this block.
|
||||
addRetOperands(MBB);
|
||||
|
||||
DEBUG(MBB->dump());
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user