diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2011-02-04 22:44:08 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2011-02-04 22:44:08 +0000 |
commit | d650b3048856a600e8e0642c0438c1b984c9645d (patch) | |
tree | 79637d3060d9428c9ee9626203bca9178b422cf4 /llvm/lib/CodeGen/RegAllocFast.cpp | |
parent | 80a2878b5d2d2c5df8b033130ed47a89037196e1 (diff) | |
download | bcm5719-llvm-d650b3048856a600e8e0642c0438c1b984c9645d.tar.gz bcm5719-llvm-d650b3048856a600e8e0642c0438c1b984c9645d.zip |
Mark that the return is using EAX so that we don't use it for some other
purpose. Fixes PR9080!
llvm-svn: 124903
Diffstat (limited to 'llvm/lib/CodeGen/RegAllocFast.cpp')
-rw-r--r-- | llvm/lib/CodeGen/RegAllocFast.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/RegAllocFast.cpp b/llvm/lib/CodeGen/RegAllocFast.cpp index 57934775e4d..15036e38b89 100644 --- a/llvm/lib/CodeGen/RegAllocFast.cpp +++ b/llvm/lib/CodeGen/RegAllocFast.cpp @@ -735,6 +735,27 @@ void RAFast::handleThroughOperands(MachineInstr *MI, void RAFast::AllocateBasicBlock() { DEBUG(dbgs() << "\nAllocating " << *MBB); + // FIXME: This should probably be added by instruction selection instead? + // If the last instruction in the block is a return, make sure to mark it as + // using all of the live-out values in the function. Things marked both call + // and return are tail calls; do not do this for them. The tail callee need + // not take the same registers as input that it produces as output, and there + // are dependencies for its input registers elsewhere. + if (!MBB->empty() && MBB->back().getDesc().isReturn() && + !MBB->back().getDesc().isCall()) { + MachineInstr *Ret = &MBB->back(); + + for (MachineRegisterInfo::liveout_iterator + I = MF->getRegInfo().liveout_begin(), + E = MF->getRegInfo().liveout_end(); I != E; ++I) { + assert(TargetRegisterInfo::isPhysicalRegister(*I) && + "Cannot have a live-out virtual register."); + + // Add live-out registers as implicit uses. + Ret->addRegisterKilled(*I, TRI, true); + } + } + PhysRegState.assign(TRI->getNumRegs(), regDisabled); assert(LiveVirtRegs.empty() && "Mapping not cleared form last block?"); |