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 | c57ef561423f1ac7f2db5b1840d5681f18a4c0c8 (patch) | |
tree | cdb1e6a017957b6c78638636a56e6a31e8711e7b /lib/CodeGen | |
parent | 63935420ef1c323b9d9276eadc0ab74ee86a25b5 (diff) | |
download | external_llvm-c57ef561423f1ac7f2db5b1840d5681f18a4c0c8.zip external_llvm-c57ef561423f1ac7f2db5b1840d5681f18a4c0c8.tar.gz external_llvm-c57ef561423f1ac7f2db5b1840d5681f18a4c0c8.tar.bz2 |
Mark that the return is using EAX so that we don't use it for some other
purpose. Fixes PR9080!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@124903 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/RegAllocFast.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/lib/CodeGen/RegAllocFast.cpp b/lib/CodeGen/RegAllocFast.cpp index 5793477..15036e3 100644 --- a/lib/CodeGen/RegAllocFast.cpp +++ b/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?"); |