Rename SplitEditor::rewrite to finish() and break it out into a couple of new
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 8 Oct 2010 23:42:21 +0000 (23:42 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 8 Oct 2010 23:42:21 +0000 (23:42 +0000)
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

lib/CodeGen/SplitKit.cpp
lib/CodeGen/SplitKit.h

index 19733e4e68d72427e617cef5c8b2a65ed3864859..30f96007bcd8eb08a3668cf15407319e3b6e8e55 100644 (file)
@@ -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();
 }
index e76cbc6ce3e4ec96ca9cb00d393ed93c53844533..dff3765ec38c41f500be1c72de195dfa0dac5b6f 100644 (file)
@@ -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 ---===