mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-27 00:21:03 +00:00
Don't add live ranges for sub-registers when clobbering a physical register.
Both coalescing and register allocation already check aliases for interference, so these extra segments are only slowing us down. This speeds up both linear scan and the greedy register allocator. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129283 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -578,13 +578,6 @@ void LiveIntervals::handleRegisterDef(MachineBasicBlock *MBB,
|
||||
CopyMI = MI;
|
||||
handlePhysicalRegisterDef(MBB, MI, MIIdx, MO,
|
||||
getOrCreateInterval(MO.getReg()), CopyMI);
|
||||
// Def of a register also defines its sub-registers.
|
||||
for (const unsigned* AS = tri_->getSubRegisters(MO.getReg()); *AS; ++AS)
|
||||
// If MI also modifies the sub-register explicitly, avoid processing it
|
||||
// more than once. Do not pass in TRI here so it checks for exact match.
|
||||
if (!MI->definesRegister(*AS))
|
||||
handlePhysicalRegisterDef(MBB, MI, MIIdx, MO,
|
||||
getOrCreateInterval(*AS), 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -208,15 +208,14 @@ bool SimpleRegisterCoalescing::AdjustCopiesBackFrom(const CoalescerPair &CP,
|
||||
if (ValLR+1 != BLR) return false;
|
||||
|
||||
// If a live interval is a physical register, conservatively check if any
|
||||
// of its sub-registers is overlapping the live interval of the virtual
|
||||
// register. If so, do not coalesce.
|
||||
if (TargetRegisterInfo::isPhysicalRegister(IntB.reg) &&
|
||||
*tri_->getSubRegisters(IntB.reg)) {
|
||||
for (const unsigned* SR = tri_->getSubRegisters(IntB.reg); *SR; ++SR)
|
||||
if (li_->hasInterval(*SR) && IntA.overlaps(li_->getInterval(*SR))) {
|
||||
// of its aliases is overlapping the live interval of the virtual register.
|
||||
// If so, do not coalesce.
|
||||
if (TargetRegisterInfo::isPhysicalRegister(IntB.reg)) {
|
||||
for (const unsigned *AS = tri_->getAliasSet(IntB.reg); *AS; ++AS)
|
||||
if (li_->hasInterval(*AS) && IntA.overlaps(li_->getInterval(*AS))) {
|
||||
DEBUG({
|
||||
dbgs() << "\t\tInterfere with sub-register ";
|
||||
li_->getInterval(*SR).print(dbgs(), tri_);
|
||||
dbgs() << "\t\tInterfere with alias ";
|
||||
li_->getInterval(*AS).print(dbgs(), tri_);
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
Reference in New Issue
Block a user