diff options
author | Evan Cheng <evan.cheng@apple.com> | 2007-05-14 21:10:05 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2007-05-14 21:10:05 +0000 |
commit | 2f6cb2b14c5811b154b06163355b3c8bc8b73231 (patch) | |
tree | f4880a0a6fc2a80848f38eb009312ea161b75754 /lib/CodeGen/LiveIntervalAnalysis.cpp | |
parent | 47927b3e5ab07aab85cee7df52b260cd63fdfc56 (diff) | |
download | external_llvm-2f6cb2b14c5811b154b06163355b3c8bc8b73231.zip external_llvm-2f6cb2b14c5811b154b06163355b3c8bc8b73231.tar.gz external_llvm-2f6cb2b14c5811b154b06163355b3c8bc8b73231.tar.bz2 |
Fix for PR1406:
v1 =
r2 = move v1
= op r2<kill>
...
r2 = move v1
= op r2<kill>
Clear the first r2 kill if v1 and r2 are joined.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37050 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/LiveIntervalAnalysis.cpp')
-rw-r--r-- | lib/CodeGen/LiveIntervalAnalysis.cpp | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp index c816baf..a996aea 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -977,7 +977,7 @@ bool LiveIntervals::JoinCopy(MachineInstr *CopyMI, isDead = false; } else { MachineOperand *MOU; - MachineInstr *LastUse= lastRegisterUse(repSrcReg, SrcStart, CopyIdx, MOU); + MachineInstr *LastUse= lastRegisterUse(SrcStart, CopyIdx, repSrcReg, MOU); if (LastUse) { // Shorten the liveinterval to the end of last use. MOU->setIsKill(); @@ -1072,6 +1072,11 @@ bool LiveIntervals::JoinCopy(MachineInstr *CopyMI, // we have to update any aliased register's live ranges to indicate that they // have clobbered values for this range. if (MRegisterInfo::isPhysicalRegister(repDstReg)) { + // Unset unnecessary kills. + for (LiveInterval::Ranges::const_iterator I = SrcInt.begin(), + E = SrcInt.end(); I != E; ++I) + unsetRegisterKills(I->start, I->end, repDstReg); + // Update the liveintervals of sub-registers. for (const unsigned *AS = mri_->getSubRegisters(repDstReg); *AS; ++AS) getInterval(*AS).MergeInClobberRanges(SrcInt); @@ -1632,7 +1637,7 @@ bool LiveIntervals::differingRegisterClasses(unsigned RegA, /// cycles Start and End. It also returns the use operand by reference. It /// returns NULL if there are no uses. MachineInstr * -LiveIntervals::lastRegisterUse(unsigned Reg, unsigned Start, unsigned End, +LiveIntervals::lastRegisterUse(unsigned Start, unsigned End, unsigned Reg, MachineOperand *&MOU) { int e = (End-1) / InstrSlots::NUM * InstrSlots::NUM; int s = Start; @@ -1685,6 +1690,34 @@ void LiveIntervals::unsetRegisterKill(MachineInstr *MI, unsigned Reg) { } } +/// unsetRegisterKills - Unset IsKill property of all uses of specific register +/// between cycles Start and End. +void LiveIntervals::unsetRegisterKills(unsigned Start, unsigned End, + unsigned Reg) { + int e = (End-1) / InstrSlots::NUM * InstrSlots::NUM; + int s = Start; + while (e >= s) { + // Skip deleted instructions + MachineInstr *MI = getInstructionFromIndex(e); + while ((e - InstrSlots::NUM) >= s && !MI) { + e -= InstrSlots::NUM; + MI = getInstructionFromIndex(e); + } + if (e < s || MI == NULL) + return; + + for (unsigned i = 0, NumOps = MI->getNumOperands(); i != NumOps; ++i) { + MachineOperand &MO = MI->getOperand(i); + if (MO.isReg() && MO.isUse() && MO.isKill() && MO.getReg() && + mri_->regsOverlap(rep(MO.getReg()), Reg)) { + MO.unsetIsKill(); + } + } + + e -= InstrSlots::NUM; + } +} + /// hasRegisterDef - True if the instruction defines the specific register. /// bool LiveIntervals::hasRegisterDef(MachineInstr *MI, unsigned Reg) { |