diff options
author | Jim Grosbach <grosbach@apple.com> | 2010-07-08 00:38:54 +0000 |
---|---|---|
committer | Jim Grosbach <grosbach@apple.com> | 2010-07-08 00:38:54 +0000 |
commit | 6533f24370619009f93a93b74d90866df1da0883 (patch) | |
tree | 1e954b2e5ac42687879f1fdf9228ad408b217294 /llvm/lib/CodeGen | |
parent | efa3c824cc39bdc50177279119801ae15154df35 (diff) | |
download | bcm5719-llvm-6533f24370619009f93a93b74d90866df1da0883.tar.gz bcm5719-llvm-6533f24370619009f93a93b74d90866df1da0883.zip |
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
llvm-svn: 107847
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/PrologEpilogInserter.cpp | 14 | ||||
-rw-r--r-- | llvm/lib/CodeGen/RegisterScavenging.cpp | 12 |
2 files changed, 23 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp index d6ee03477de..d1112d3c14a 100644 --- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp +++ b/llvm/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; } diff --git a/llvm/lib/CodeGen/RegisterScavenging.cpp b/llvm/lib/CodeGen/RegisterScavenging.cpp index 3eefedadf29..8a1ef5adf79 100644 --- a/llvm/lib/CodeGen/RegisterScavenging.cpp +++ b/llvm/lib/CodeGen/RegisterScavenging.cpp @@ -242,8 +242,18 @@ unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RC) const { return 0; } +/// getRegsAvailable - Return all available registers in the register class +/// in Mask. +void RegScavenger::getRegsAvailable(const TargetRegisterClass *RC, + BitVector &Mask) { + for (TargetRegisterClass::iterator I = RC->begin(), E = RC->end(); + I != E; ++I) + if (!isAliasUsed(*I)) + Mask.set(*I); +} + /// findSurvivorReg - Return the candidate register that is unused for the -/// longest after MBBI. UseMI is set to the instruction where the search +/// longest after StargMII. UseMI is set to the instruction where the search /// stopped. /// /// No more than InstrLimit instructions are inspected. |