[llvm-commits] CVS: llvm/lib/CodeGen/LiveInterval.cpp LiveIntervalAnalysis.cpp
Chris Lattner
lattner at cs.uiuc.edu
Tue Aug 22 11:20:05 PDT 2006
Changes in directory llvm/lib/CodeGen:
LiveInterval.cpp updated: 1.27 -> 1.28
LiveIntervalAnalysis.cpp updated: 1.165 -> 1.166
---
Log message:
Improve the LiveInterval class to keep track of which machine instruction
defines each value# tracked by the interval. This will be used to improve
coallescing.
---
Diffs of the changes: (+40 -17)
LiveInterval.cpp | 16 +++++++++++++++-
LiveIntervalAnalysis.cpp | 41 +++++++++++++++++++++++++----------------
2 files changed, 40 insertions(+), 17 deletions(-)
Index: llvm/lib/CodeGen/LiveInterval.cpp
diff -u llvm/lib/CodeGen/LiveInterval.cpp:1.27 llvm/lib/CodeGen/LiveInterval.cpp:1.28
--- llvm/lib/CodeGen/LiveInterval.cpp:1.27 Fri Oct 21 01:41:30 2005
+++ llvm/lib/CodeGen/LiveInterval.cpp Tue Aug 22 13:19:46 2006
@@ -388,7 +388,7 @@
I->ValId = MergedDstValIdx;
else {
unsigned &NV = Dst2SrcIdxMap[I->ValId];
- if (NV == 0) NV = getNextValue();
+ if (NV == 0) NV = getNextValue(Other.getInstForValNum(I->ValId));
I->ValId = NV;
}
@@ -422,6 +422,20 @@
E = ranges.end(); I != E; ++I)
OS << *I;
}
+
+ // Print value number info.
+ if (NumValues) {
+ OS << " ";
+ for (unsigned i = 0; i != NumValues; ++i) {
+ if (i) OS << " ";
+ OS << i << "@";
+ if (InstDefiningValue[i] == ~0U) {
+ OS << "?";
+ } else {
+ OS << InstDefiningValue[i];
+ }
+ }
+ }
}
void LiveInterval::dump() const {
Index: llvm/lib/CodeGen/LiveIntervalAnalysis.cpp
diff -u llvm/lib/CodeGen/LiveIntervalAnalysis.cpp:1.165 llvm/lib/CodeGen/LiveIntervalAnalysis.cpp:1.166
--- llvm/lib/CodeGen/LiveIntervalAnalysis.cpp:1.165 Mon Aug 21 18:03:54 2006
+++ llvm/lib/CodeGen/LiveIntervalAnalysis.cpp Tue Aug 22 13:19:46 2006
@@ -328,7 +328,7 @@
// the spill weight is now infinity as it
// cannot be spilled again
nI.weight = float(HUGE_VAL);
- LiveRange LR(start, end, nI.getNextValue());
+ LiveRange LR(start, end, nI.getNextValue(~0U));
DEBUG(std::cerr << " +" << LR);
nI.addRange(LR);
added.push_back(&nI);
@@ -351,18 +351,16 @@
return added;
}
-void LiveIntervals::printRegName(unsigned reg) const
-{
+void LiveIntervals::printRegName(unsigned reg) const {
if (MRegisterInfo::isPhysicalRegister(reg))
std::cerr << mri_->getName(reg);
else
std::cerr << "%reg" << reg;
}
-void LiveIntervals::handleVirtualRegisterDef(MachineBasicBlock* mbb,
+void LiveIntervals::handleVirtualRegisterDef(MachineBasicBlock *mbb,
MachineBasicBlock::iterator mi,
- LiveInterval& interval)
-{
+ LiveInterval &interval) {
DEBUG(std::cerr << "\t\tregister: "; printRegName(interval.reg));
LiveVariables::VarInfo& vi = lv_->getVarInfo(interval.reg);
@@ -374,7 +372,7 @@
// Get the Idx of the defining instructions.
unsigned defIndex = getDefIndex(getInstructionIndex(mi));
- unsigned ValNum = interval.getNextValue();
+ unsigned ValNum = interval.getNextValue(defIndex);
assert(ValNum == 0 && "First value in interval is not 0?");
ValNum = 0; // Clue in the optimizer.
@@ -456,10 +454,22 @@
unsigned RedefIndex = getDefIndex(getInstructionIndex(mi));
// Delete the initial value, which should be short and continuous,
- // becuase the 2-addr copy must be in the same MBB as the redef.
+ // because the 2-addr copy must be in the same MBB as the redef.
interval.removeRange(DefIndex, RedefIndex);
- LiveRange LR(DefIndex, RedefIndex, interval.getNextValue());
+ // Two-address vregs should always only be redefined once. This means
+ // that at this point, there should be exactly one value number in it.
+ assert(interval.containsOneValue() && "Unexpected 2-addr liveint!");
+
+ // The new value number is defined by the instruction we claimed defined
+ // value #0.
+ unsigned ValNo = interval.getNextValue(DefIndex);
+
+ // Value#1 is now defined by the 2-addr instruction.
+ interval.setInstDefiningValNum(0, RedefIndex);
+
+ // Add the new live interval which replaces the range for the input copy.
+ LiveRange LR(DefIndex, RedefIndex, ValNo);
DEBUG(std::cerr << " replace range with " << LR);
interval.addRange(LR);
@@ -487,8 +497,9 @@
interval.removeRange(Start, End);
DEBUG(std::cerr << "RESULT: " << interval);
- // Replace the interval with one of a NEW value number.
- LiveRange LR(Start, End, interval.getNextValue());
+ // Replace the interval with one of a NEW value number. Note that this
+ // value number isn't actually defined by an instruction, weird huh? :)
+ LiveRange LR(Start, End, interval.getNextValue(~0U));
DEBUG(std::cerr << " replace range with " << LR);
interval.addRange(LR);
DEBUG(std::cerr << "RESULT: " << interval);
@@ -500,7 +511,7 @@
unsigned defIndex = getDefIndex(getInstructionIndex(mi));
LiveRange LR(defIndex,
getInstructionIndex(&mbb->back()) + InstrSlots::NUM,
- interval.getNextValue());
+ interval.getNextValue(defIndex));
interval.addRange(LR);
DEBUG(std::cerr << " +" << LR);
}
@@ -513,8 +524,7 @@
MachineBasicBlock::iterator mi,
LiveInterval& interval,
unsigned SrcReg, unsigned DestReg,
- bool isLiveIn)
-{
+ bool isLiveIn) {
// A physical register cannot be live across basic block, so its
// lifetime must end somewhere in its defining basic block.
DEBUG(std::cerr << "\t\tregister: "; printRegName(interval.reg));
@@ -591,8 +601,7 @@
}
}
-
- LiveRange LR(start, end, interval.getNextValue());
+ LiveRange LR(start, end, interval.getNextValue(start));
interval.addRange(LR);
DEBUG(std::cerr << " +" << LR << '\n');
}
More information about the llvm-commits
mailing list