aboutsummaryrefslogtreecommitdiffstats
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2010-10-08 23:42:21 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2010-10-08 23:42:21 +0000
commit7466927b1af264b359c860cb9f7d1f3b275cc5cd (patch)
treec202d86800d760d377a81db5bf76de4299836844 /lib/CodeGen
parentd82de8341c99c1756624020000bd51a03a5f355c (diff)
downloadexternal_llvm-7466927b1af264b359c860cb9f7d1f3b275cc5cd.zip
external_llvm-7466927b1af264b359c860cb9f7d1f3b275cc5cd.tar.gz
external_llvm-7466927b1af264b359c860cb9f7d1f3b275cc5cd.tar.bz2
Rename SplitEditor::rewrite to finish() and break it out into a couple of new
functions: computeRemainder and rewrite. When the remainder breaks up into multiple components, remember to rewrite those uses as well. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116121 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/SplitKit.cpp81
-rw-r--r--lib/CodeGen/SplitKit.h15
2 files changed, 56 insertions, 40 deletions
diff --git a/lib/CodeGen/SplitKit.cpp b/lib/CodeGen/SplitKit.cpp
index 19733e4..30f9600 100644
--- a/lib/CodeGen/SplitKit.cpp
+++ b/lib/CodeGen/SplitKit.cpp
@@ -734,6 +734,36 @@ void SplitEditor::closeIntv() {
openli_.reset(0);
}
+/// rewrite - Rewrite all uses of reg to use the new registers.
+void SplitEditor::rewrite(unsigned reg) {
+ for (MachineRegisterInfo::reg_iterator RI = mri_.reg_begin(reg),
+ RE = mri_.reg_end(); RI != RE;) {
+ MachineOperand &MO = RI.getOperand();
+ MachineInstr *MI = MO.getParent();
+ ++RI;
+ if (MI->isDebugValue()) {
+ DEBUG(dbgs() << "Zapping " << *MI);
+ // FIXME: We can do much better with debug values.
+ MO.setReg(0);
+ continue;
+ }
+ SlotIndex Idx = lis_.getInstructionIndex(MI);
+ Idx = MO.isUse() ? Idx.getUseIndex() : Idx.getDefIndex();
+ LiveInterval *LI = 0;
+ for (unsigned i = firstInterval, e = intervals_.size(); i != e; ++i) {
+ LiveInterval *testli = intervals_[i];
+ if (testli->liveAt(Idx)) {
+ LI = testli;
+ break;
+ }
+ }
+ assert(LI && "No register was live at use");
+ MO.setReg(LI->reg);
+ DEBUG(dbgs() << " rewrite BB#" << MI->getParent()->getNumber() << '\t'
+ << Idx << '\t' << *MI);
+ }
+}
+
void
SplitEditor::addTruncSimpleRange(SlotIndex Start, SlotIndex End, VNInfo *VNI) {
// Build vector of iterator pairs from the intervals.
@@ -781,12 +811,7 @@ SplitEditor::addTruncSimpleRange(SlotIndex Start, SlotIndex End, VNInfo *VNI) {
}
}
-/// rewrite - after all the new live ranges have been created, rewrite
-/// instructions using curli to use the new intervals.
-void SplitEditor::rewrite() {
- assert(!openli_.getLI() && "Previous LI not closed before rewrite");
- assert(dupli_.getLI() && "No dupli for rewrite. Noop spilt?");
-
+void SplitEditor::computeRemainder() {
// First we need to fill in the live ranges in dupli.
// If values were redefined, we need a full recoloring with SSA update.
// If values were truncated, we only need to truncate the ranges.
@@ -827,6 +852,14 @@ void SplitEditor::rewrite() {
dupli_.addSimpleRange(LR.start, LR.end, LR.valno);
}
}
+}
+
+void SplitEditor::finish() {
+ assert(!openli_.getLI() && "Previous LI not closed before rewrite");
+ assert(dupli_.getLI() && "No dupli for rewrite. Noop spilt?");
+
+ // Complete dupli liveness.
+ computeRemainder();
// Get rid of unused values and set phi-kill flags.
dupli_.getLI()->RenumberValues(lis_);
@@ -843,6 +876,8 @@ void SplitEditor::rewrite() {
for (unsigned i = 1; i != NumComp; ++i)
intervals_.push_back(createInterval());
ConEQ.Distribute(&intervals_[firstComp]);
+ // Rewrite uses to the new regs.
+ rewrite(dupli_.getLI()->reg);
}
} else {
DEBUG(dbgs() << " dupli became empty?\n");
@@ -851,33 +886,7 @@ void SplitEditor::rewrite() {
}
// Rewrite instructions.
- const LiveInterval *curli = sa_.getCurLI();
- for (MachineRegisterInfo::reg_iterator RI = mri_.reg_begin(curli->reg),
- RE = mri_.reg_end(); RI != RE;) {
- MachineOperand &MO = RI.getOperand();
- MachineInstr *MI = MO.getParent();
- ++RI;
- if (MI->isDebugValue()) {
- DEBUG(dbgs() << "Zapping " << *MI);
- // FIXME: We can do much better with debug values.
- MO.setReg(0);
- continue;
- }
- SlotIndex Idx = lis_.getInstructionIndex(MI);
- Idx = MO.isUse() ? Idx.getUseIndex() : Idx.getDefIndex();
- LiveInterval *LI = 0;
- for (unsigned i = firstInterval, e = intervals_.size(); i != e; ++i) {
- LiveInterval *testli = intervals_[i];
- if (testli->liveAt(Idx)) {
- LI = testli;
- break;
- }
- }
- assert(LI && "No register was live at use");
- MO.setReg(LI->reg);
- DEBUG(dbgs() << " rewrite BB#" << MI->getParent()->getNumber() << '\t'
- << Idx << '\t' << *MI);
- }
+ rewrite(curli_->reg);
// Calculate spill weight and allocation hints for new intervals.
VirtRegAuxInfo vrai(vrm_.getMachineFunction(), lis_, sa_.loops_);
@@ -944,7 +953,7 @@ void SplitEditor::splitAroundLoop(const MachineLoop *Loop) {
// Done.
closeIntv();
- rewrite();
+ finish();
}
@@ -988,7 +997,7 @@ void SplitEditor::splitSingleBlocks(const SplitAnalysis::BlockPtrSet &Blocks) {
leaveIntvAfter(IP.second);
closeIntv();
}
- rewrite();
+ finish();
}
@@ -1061,5 +1070,5 @@ void SplitEditor::splitInsideBlock(const MachineBasicBlock *MBB) {
closeIntv();
}
- rewrite();
+ finish();
}
diff --git a/lib/CodeGen/SplitKit.h b/lib/CodeGen/SplitKit.h
index e76cbc6..dff3765 100644
--- a/lib/CodeGen/SplitKit.h
+++ b/lib/CodeGen/SplitKit.h
@@ -229,7 +229,7 @@ public:
/// - Mark the ranges where the new interval is used with useIntv*
/// - Mark the places where the interval is exited with exitIntv*.
/// - Finish the current interval with closeIntv and repeat from 2.
-/// - Rewrite instructions with rewrite().
+/// - Rewrite instructions with finish().
///
class SplitEditor {
SplitAnalysis &sa_;
@@ -271,6 +271,13 @@ class SplitEditor {
/// truncating any overlap with intervals_.
void addTruncSimpleRange(SlotIndex Start, SlotIndex End, VNInfo *VNI);
+ /// computeRemainder - Compute the dupli liveness as the complement of all the
+ /// new intervals.
+ void computeRemainder();
+
+ /// rewrite - Rewrite all uses of reg to use the new registers.
+ void rewrite(unsigned reg);
+
public:
/// Create a new SplitEditor for editing the LiveInterval analyzed by SA.
/// Newly created intervals will be appended to newIntervals.
@@ -307,9 +314,9 @@ public:
/// LiveInterval, and ranges can be trimmed.
void closeIntv();
- /// rewrite - after all the new live ranges have been created, rewrite
- /// instructions using curli to use the new intervals.
- void rewrite();
+ /// finish - after all the new live ranges have been created, compute the
+ /// remaining live range, and rewrite instructions to use the new registers.
+ void finish();
// ===--- High level methods ---===