mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Fix Regression/CodeGen/Generic/2006-09-02-LocalAllocCrash.ll on X86.
Just because an alias of a register is available, it doesn't mean that we can arbitrarily evict the register. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30064 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6cfca76349
commit
5e50349070
@ -103,8 +103,8 @@ namespace {
|
||||
}
|
||||
|
||||
void MarkPhysRegRecentlyUsed(unsigned Reg) {
|
||||
if(PhysRegsUseOrder.empty() ||
|
||||
PhysRegsUseOrder.back() == Reg) return; // Already most recently used
|
||||
if (PhysRegsUseOrder.empty() ||
|
||||
PhysRegsUseOrder.back() == Reg) return; // Already most recently used
|
||||
|
||||
for (unsigned i = PhysRegsUseOrder.size(); i != 0; --i)
|
||||
if (areRegsEqual(Reg, PhysRegsUseOrder[i-1])) {
|
||||
@ -408,10 +408,15 @@ unsigned RA::getReg(MachineBasicBlock &MBB, MachineInstr *I,
|
||||
} else {
|
||||
// If one of the registers aliased to the current register is
|
||||
// compatible, use it.
|
||||
for (const unsigned *AliasSet = RegInfo->getAliasSet(R);
|
||||
*AliasSet; ++AliasSet) {
|
||||
if (RC->contains(*AliasSet)) {
|
||||
PhysReg = *AliasSet; // Take an aliased register
|
||||
for (const unsigned *AliasIt = RegInfo->getAliasSet(R);
|
||||
*AliasIt; ++AliasIt) {
|
||||
if (RC->contains(*AliasIt) &&
|
||||
// If this is pinned down for some reason, don't use it. For
|
||||
// example, if CL is pinned, and we run across CH, don't use
|
||||
// CH as justification for using scavenging ECX (which will
|
||||
// fail).
|
||||
PhysRegsUsed[*AliasIt] != 0) {
|
||||
PhysReg = *AliasIt; // Take an aliased register
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user