aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/PrologEpilogInserter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/PrologEpilogInserter.cpp')
-rw-r--r--lib/CodeGen/PrologEpilogInserter.cpp14
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;
}