diff options
Diffstat (limited to 'lib/CodeGen/PrologEpilogInserter.cpp')
| -rw-r--r-- | lib/CodeGen/PrologEpilogInserter.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/CodeGen/PrologEpilogInserter.cpp b/lib/CodeGen/PrologEpilogInserter.cpp index d6ee03477d..d1112d3c14 100644 --- a/lib/CodeGen/PrologEpilogInserter.cpp +++ b/lib/CodeGen/PrologEpilogInserter.cpp @@ -885,10 +885,20 @@ void PEI::scavengeFrameVirtualRegs(MachineFunction &Fn) { // Scavenge a new scratch register CurrentVirtReg = Reg; const TargetRegisterClass *RC = Fn.getRegInfo().getRegClass(Reg); - CurrentScratchReg = RS->FindUnusedReg(RC); - if (CurrentScratchReg == 0) + const TargetRegisterInfo *TRI = Fn.getTarget().getRegisterInfo(); + BitVector Candidates(TRI->getNumRegs()); + RS->getRegsAvailable(RC, Candidates); + + // If there are any registers available, use the one that's + // unused for the longest after this instruction. That increases + // the ability to reuse the value. + if (Candidates.any()) { + MachineBasicBlock::iterator UMI; + CurrentScratchReg = RS->findSurvivorReg(I, Candidates, 25, UMI); + } else { // No register is "free". Scavenge a register. CurrentScratchReg = RS->scavengeRegister(RC, I, SPAdj); + } PrevValue = Value; } |
