diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-02-08 21:13:03 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-02-08 21:13:03 +0000 |
commit | 8a61da8a689ee95874c833af4c7aa965fab5c0a9 (patch) | |
tree | a3e549727d0b45c4be67261cc71c8a8211b3771e /lib/CodeGen/LiveIntervalAnalysis.cpp | |
parent | 124e423ccec42e54a8b069e1c2ef9adfaa1e553a (diff) | |
download | external_llvm-8a61da8a689ee95874c833af4c7aa965fab5c0a9.zip external_llvm-8a61da8a689ee95874c833af4c7aa965fab5c0a9.tar.gz external_llvm-8a61da8a689ee95874c833af4c7aa965fab5c0a9.tar.bz2 |
Add LiveIntervals::addKillFlags() to recompute kill flags after register allocation.
This is a lot easier than trying to get kill flags right during live range
splitting and rematerialization.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125113 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/LiveIntervalAnalysis.cpp')
-rw-r--r-- | lib/CodeGen/LiveIntervalAnalysis.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp index 4ff888a..3739d28 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -890,6 +890,29 @@ LiveIntervals::getLastSplitPoint(const LiveInterval &li, return mbb->getFirstTerminator(); } +void LiveIntervals::addKillFlags() { + for (iterator I = begin(), E = end(); I != E; ++I) { + unsigned Reg = I->first; + if (TargetRegisterInfo::isPhysicalRegister(Reg)) + continue; + if (mri_->reg_nodbg_empty(Reg)) + continue; + LiveInterval *LI = I->second; + + // Every instruction that kills Reg corresponds to a live range end point. + for (LiveInterval::iterator RI = LI->begin(), RE = LI->end(); RI != RE; + ++RI) { + // A LOAD index indicates an MBB edge. + if (RI->end.isLoad()) + continue; + MachineInstr *MI = getInstructionFromIndex(RI->end); + if (!MI) + continue; + MI->addRegisterKilled(Reg, NULL); + } + } +} + /// getReMatImplicitUse - If the remat definition MI has one (for now, we only /// allow one) virtual register operand, then its uses are implicitly using /// the register. Returns the virtual register. |