summaryrefslogtreecommitdiff
path: root/lib/CodeGen/PrologEpilogInserter.cpp
diff options
context:
space:
mode:
authorJim Grosbach <grosbach@apple.com>2010-07-08 00:38:54 +0000
committerJim Grosbach <grosbach@apple.com>2010-07-08 00:38:54 +0000
commitd9642faf7c66273eb3a8d99e5fa6b542da5374dd (patch)
tree046f3eaf0f3e02ebbc6ad7d174cce551c72b4817 /lib/CodeGen/PrologEpilogInserter.cpp
parent0238f8c430050d23ef861169bb4c4f930af0ef97 (diff)
downloadllvm-d9642faf7c66273eb3a8d99e5fa6b542da5374dd.tar.gz
llvm-d9642faf7c66273eb3a8d99e5fa6b542da5374dd.tar.bz2
llvm-d9642faf7c66273eb3a8d99e5fa6b542da5374dd.tar.xz
When processing frame index virtual registers, consider all available registers
(if there are any) and use the one which remains available for the longest rather than just using the first one. This should help enable better re-use of the loaded frame index values. rdar://7318760 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@107847 91177308-0d34-0410-b5e6-96231b3b80d8
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;
}