[llvm-commits] CVS: llvm/lib/CodeGen/LiveIntervalAnalysis.cpp
Bill Wendling
isanbard at gmail.com
Wed Nov 15 18:42:04 PST 2006
Changes in directory llvm/lib/CodeGen:
LiveIntervalAnalysis.cpp updated: 1.195 -> 1.196
---
Log message:
Added a new method "CreateNewLiveInterval" which, given a list of
LiveRanges, creates a new LiveInterval from them. The LiveRanges should
have existed already in another LiveInterval, but removed.
---
Diffs of the changes: (+49 -0)
LiveIntervalAnalysis.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 49 insertions(+)
Index: llvm/lib/CodeGen/LiveIntervalAnalysis.cpp
diff -u llvm/lib/CodeGen/LiveIntervalAnalysis.cpp:1.195 llvm/lib/CodeGen/LiveIntervalAnalysis.cpp:1.196
--- llvm/lib/CodeGen/LiveIntervalAnalysis.cpp:1.195 Wed Nov 15 14:54:11 2006
+++ llvm/lib/CodeGen/LiveIntervalAnalysis.cpp Wed Nov 15 20:41:50 2006
@@ -251,6 +251,55 @@
}
}
+/// CreateNewLiveInterval - Create a new live interval with the given live
+/// ranges. The new live interval will have an infinite spill weight.
+LiveInterval&
+LiveIntervals::CreateNewLiveInterval(const LiveInterval *LI,
+ const std::vector<LiveRange> &LRs) {
+ const TargetRegisterClass *RC = mf_->getSSARegMap()->getRegClass(LI->reg);
+
+ // Create a new virtual register for the spill interval.
+ unsigned NewVReg = mf_->getSSARegMap()->createVirtualRegister(RC);
+
+ // Replace the old virtual registers in the machine operands with the shiny
+ // new one.
+ for (std::vector<LiveRange>::const_iterator
+ I = LRs.begin(), E = LRs.end(); I != E; ++I) {
+ unsigned Index = getBaseIndex(I->start);
+ unsigned End = getBaseIndex(I->end - 1) + InstrSlots::NUM;
+
+ for (; Index != End; Index += InstrSlots::NUM) {
+ // Skip deleted instructions
+ while (Index != End && !getInstructionFromIndex(Index))
+ Index += InstrSlots::NUM;
+
+ if (Index == End) break;
+
+ MachineInstr *MI = getInstructionFromIndex(Index);
+
+ for (unsigned J = 0; J != MI->getNumOperands(); ++J) {
+ MachineOperand &MOp = MI->getOperand(J);
+ if (MOp.isRegister() && rep(MOp.getReg()) == LI->reg)
+ MOp.setReg(NewVReg);
+ }
+ }
+ }
+
+ LiveInterval &NewLI = getOrCreateInterval(NewVReg);
+
+ // The spill weight is now infinity as it cannot be spilled again
+ NewLI.weight = float(HUGE_VAL);
+
+ for (std::vector<LiveRange>::const_iterator
+ I = LRs.begin(), E = LRs.end(); I != E; ++I) {
+ DEBUG(std::cerr << " Adding live range " << *I << " to new interval\n");
+ NewLI.addRange(*I);
+ }
+
+ DEBUG(std::cerr << "Created new live interval " << NewLI << "\n");
+ return NewLI;
+}
+
std::vector<LiveInterval*> LiveIntervals::
addIntervalsForSpills(const LiveInterval &li, VirtRegMap &vrm, int slot) {
// since this is called after the analysis is done we don't know if
More information about the llvm-commits
mailing list