diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2009-08-13 16:20:04 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2009-08-13 16:20:04 +0000 |
commit | 12de03ffc9cc2a1d12c865402179342872efc8f9 (patch) | |
tree | d403ee562d293a80730d3cf2bc291da7ccf2526a | |
parent | 0e73fdff6c3b2d3bc9a8ff513b7f9492e628d008 (diff) | |
download | bcm5719-llvm-12de03ffc9cc2a1d12c865402179342872efc8f9.tar.gz bcm5719-llvm-12de03ffc9cc2a1d12c865402179342872efc8f9.zip |
Track pristine registers as if they were live-in in the register scavenger.
llvm-svn: 78913
-rw-r--r-- | llvm/lib/CodeGen/RegisterScavenging.cpp | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/llvm/lib/CodeGen/RegisterScavenging.cpp b/llvm/lib/CodeGen/RegisterScavenging.cpp index f012ff882e8..323d3db39a3 100644 --- a/llvm/lib/CodeGen/RegisterScavenging.cpp +++ b/llvm/lib/CodeGen/RegisterScavenging.cpp @@ -69,12 +69,18 @@ void RegScavenger::initRegState() { // Reserved registers are always used. RegsAvailable ^= ReservedRegs; - // Live-in registers are in use. - if (!MBB || MBB->livein_empty()) + if (!MBB) return; + + // Live-in registers are in use. for (MachineBasicBlock::const_livein_iterator I = MBB->livein_begin(), E = MBB->livein_end(); I != E; ++I) setUsed(*I); + + // Pristine CSRs are also unavailable. + BitVector PR = MBB->getParent()->getFrameInfo()->getPristineRegs(MBB); + for (int I = PR.find_first(); I>0; I = PR.find_next(I)) + setUsed(I); } void RegScavenger::enterBasicBlock(MachineBasicBlock *mbb) { @@ -370,11 +376,10 @@ unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC, } } - // If we found an unused register that is defined by a later instruction, - // there is no reason to spill it. We have probably found a callee-saved - // register that has been saved in the prologue, but happens to be unused at - // this point. - if (!isAliasUsed(Reg) && UseMI != NULL) + // If we found an unused register there is no reason to spill it. We have + // probably found a callee-saved register that has been saved in the + // prologue, but happens to be unused at this point. + if (!isAliasUsed(Reg)) return Reg; if (Dist >= MaxDist) { @@ -391,13 +396,6 @@ unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC, // Avoid infinite regress ScavengedReg = SReg; - // Make sure SReg is marked as used. It could be considered available - // if it is one of the callee saved registers, but hasn't been spilled. - if (!isUsed(SReg)) { - MBB->addLiveIn(SReg); - setUsed(SReg); - } - // Spill the scavenged register before I. TII->storeRegToStackSlot(*MBB, I, SReg, true, ScavengingFrameIndex, RC); MachineBasicBlock::iterator II = prior(I); |