mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-20 16:17:38 +00:00
Be more clever about calculating live variables through new basic blocks.
When splitting a critical edge, the registers live through the edge are: - Used in a PHI instruction, or - Live out from the predecessor, and - Live in to the successor. This allows the coalescer to eliminate even more phi joins. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@89530 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -656,35 +656,45 @@ void LiveVariables::analyzePHINodes(const MachineFunction& Fn) {
|
||||
.push_back(BBI->getOperand(i).getReg());
|
||||
}
|
||||
|
||||
bool LiveVariables::VarInfo::isLiveIn(const MachineBasicBlock &MBB,
|
||||
unsigned Reg,
|
||||
MachineRegisterInfo &MRI) {
|
||||
unsigned Num = MBB.getNumber();
|
||||
|
||||
// Reg is live-through.
|
||||
if (AliveBlocks.test(Num))
|
||||
return true;
|
||||
|
||||
// Registers defined in MBB cannot be live in.
|
||||
const MachineInstr *Def = MRI.getVRegDef(Reg);
|
||||
if (Def && Def->getParent() == &MBB)
|
||||
return false;
|
||||
|
||||
// Reg was not defined in MBB, was it killed here?
|
||||
return findKill(&MBB);
|
||||
}
|
||||
|
||||
/// addNewBlock - Add a new basic block BB as an empty succcessor to DomBB. All
|
||||
/// variables that are live out of DomBB will be marked as passing live through
|
||||
/// BB.
|
||||
void LiveVariables::addNewBlock(MachineBasicBlock *BB,
|
||||
MachineBasicBlock *DomBB) {
|
||||
MachineBasicBlock *DomBB,
|
||||
MachineBasicBlock *SuccBB) {
|
||||
const unsigned NumNew = BB->getNumber();
|
||||
const unsigned NumDom = DomBB->getNumber();
|
||||
|
||||
// All registers used by PHI nodes in SuccBB must be live through BB.
|
||||
for (MachineBasicBlock::const_iterator BBI = SuccBB->begin(),
|
||||
BBE = SuccBB->end();
|
||||
BBI != BBE && BBI->getOpcode() == TargetInstrInfo::PHI; ++BBI)
|
||||
for (unsigned i = 1, e = BBI->getNumOperands(); i != e; i += 2)
|
||||
if (BBI->getOperand(i+1).getMBB() == BB)
|
||||
getVarInfo(BBI->getOperand(i).getReg()).AliveBlocks.set(NumNew);
|
||||
|
||||
// Update info for all live variables
|
||||
for (unsigned Reg = TargetRegisterInfo::FirstVirtualRegister,
|
||||
E = MRI->getLastVirtReg()+1; Reg != E; ++Reg) {
|
||||
VarInfo &VI = getVarInfo(Reg);
|
||||
|
||||
// Anything live through DomBB is also live through BB.
|
||||
if (VI.AliveBlocks.test(NumDom)) {
|
||||
if (!VI.AliveBlocks.test(NumNew) && VI.isLiveIn(*SuccBB, Reg, *MRI))
|
||||
VI.AliveBlocks.set(NumNew);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Variables not defined in DomBB cannot be live out.
|
||||
const MachineInstr *Def = MRI->getVRegDef(Reg);
|
||||
if (!Def || Def->getParent() != DomBB)
|
||||
continue;
|
||||
|
||||
// Killed by DomBB?
|
||||
if (VI.findKill(DomBB))
|
||||
continue;
|
||||
|
||||
// This register is defined in DomBB and live out
|
||||
VI.AliveBlocks.set(NumNew);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user