Use pool allocator for all the VNInfo's to improve memory access locality. This reduces coalescing time on siod Mac OS X PPC by 35%. Also remove the back ptr from VNInfo to LiveInterval and other tweaks.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41729 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp
index 25de7c3..2f93b76 100644
--- a/lib/CodeGen/LiveIntervalAnalysis.cpp
+++ b/lib/CodeGen/LiveIntervalAnalysis.cpp
@@ -62,6 +62,7 @@
 }
 
 void LiveIntervals::releaseMemory() {
+  VNInfoAllocator.Reset();
   mi2iMap_.clear();
   i2miMap_.clear();
   r2iMap_.clear();
@@ -448,13 +449,13 @@
 
           if (HasUse) {
             LiveRange LR(getLoadIndex(index), getUseIndex(index),
-                         nI.getNextValue(~0U, 0));
+                         nI.getNextValue(~0U, 0, VNInfoAllocator));
             DOUT << " +" << LR;
             nI.addRange(LR);
           }
           if (HasDef) {
             LiveRange LR(getDefIndex(index), getStoreIndex(index),
-                         nI.getNextValue(~0U, 0));
+                         nI.getNextValue(~0U, 0, VNInfoAllocator));
             DOUT << " +" << LR;
             nI.addRange(LR);
           }
@@ -500,9 +501,9 @@
     VNInfo *ValNo;
     unsigned SrcReg, DstReg;
     if (!tii_->isMoveInstr(*mi, SrcReg, DstReg))
-      ValNo = interval.getNextValue(defIndex, 0);
+      ValNo = interval.getNextValue(defIndex, 0, VNInfoAllocator);
     else
-      ValNo = interval.getNextValue(defIndex, SrcReg);
+      ValNo = interval.getNextValue(defIndex, SrcReg, VNInfoAllocator);
 
     assert(ValNo->id == 0 && "First value in interval is not 0?");
 
@@ -526,7 +527,7 @@
         LiveRange LR(defIndex, killIdx, ValNo);
         interval.addRange(LR);
         DOUT << " +" << LR << "\n";
-        interval.addKill(*ValNo, killIdx);
+        interval.addKill(ValNo, killIdx);
         return;
       }
     }
@@ -565,7 +566,7 @@
       LiveRange LR(getMBBStartIdx(Kill->getParent()),
                    killIdx, ValNo);
       interval.addRange(LR);
-      interval.addKill(*ValNo, killIdx);
+      interval.addKill(ValNo, killIdx);
       DOUT << " +" << LR;
     }
 
@@ -597,8 +598,8 @@
 
       // The new value number (#1) is defined by the instruction we claimed
       // defined value #0.
-      VNInfo *ValNo = interval.getNextValue(0, 0);
-      interval.copyValNumInfo(*ValNo, *OldValNo);
+      VNInfo *ValNo = interval.getNextValue(0, 0, VNInfoAllocator);
+      interval.copyValNumInfo(ValNo, OldValNo);
       
       // Value#0 is now defined by the 2-addr instruction.
       OldValNo->def = RedefIndex;
@@ -608,8 +609,8 @@
       LiveRange LR(DefIndex, RedefIndex, ValNo);
       DOUT << " replace range with " << LR;
       interval.addRange(LR);
-      interval.addKill(*ValNo, RedefIndex);
-      interval.removeKills(*ValNo, RedefIndex, OldEnd);
+      interval.addKill(ValNo, RedefIndex);
+      interval.removeKills(ValNo, RedefIndex, OldEnd);
 
       // If this redefinition is dead, we need to add a dummy unit live
       // range covering the def slot.
@@ -628,22 +629,22 @@
                "PHI elimination vreg should have one kill, the PHI itself!");
 
         // Remove the old range that we now know has an incorrect number.
-        VNInfo *VNI = interval.getFirstValNumInfo();
+        VNInfo *VNI = interval.getValNumInfo(0);
         MachineInstr *Killer = vi.Kills[0];
         unsigned Start = getMBBStartIdx(Killer->getParent());
         unsigned End = getUseIndex(getInstructionIndex(Killer))+1;
         DOUT << " Removing [" << Start << "," << End << "] from: ";
         interval.print(DOUT, mri_); DOUT << "\n";
         interval.removeRange(Start, End);
-        interval.addKill(*VNI, Start+1); // odd # means phi node
+        interval.addKill(VNI, Start+1); // odd # means phi node
         DOUT << " RESULT: "; interval.print(DOUT, mri_);
 
         // 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(~0, 0));
+        LiveRange LR(Start, End, interval.getNextValue(~0, 0, VNInfoAllocator));
         DOUT << " replace range with " << LR;
         interval.addRange(LR);
-        interval.addKill(*LR.valno, End);
+        interval.addKill(LR.valno, End);
         DOUT << " RESULT: "; interval.print(DOUT, mri_);
       }
 
@@ -655,14 +656,14 @@
       VNInfo *ValNo;
       unsigned SrcReg, DstReg;
       if (!tii_->isMoveInstr(*mi, SrcReg, DstReg))
-        ValNo = interval.getNextValue(defIndex, 0);
+        ValNo = interval.getNextValue(defIndex, 0, VNInfoAllocator);
       else
-        ValNo = interval.getNextValue(defIndex, SrcReg);
+        ValNo = interval.getNextValue(defIndex, SrcReg, VNInfoAllocator);
       
       unsigned killIndex = getInstructionIndex(&mbb->back()) + InstrSlots::NUM;
       LiveRange LR(defIndex, killIndex, ValNo);
       interval.addRange(LR);
-      interval.addKill(*ValNo, killIndex-1); // odd # means phi node
+      interval.addKill(ValNo, killIndex-1); // odd # means phi node
       DOUT << " +" << LR;
     }
   }
@@ -724,10 +725,10 @@
   // Already exists? Extend old live interval.
   LiveInterval::iterator OldLR = interval.FindLiveRangeContaining(start);
   VNInfo *ValNo = (OldLR != interval.end())
-    ? OldLR->valno : interval.getNextValue(start, SrcReg);
+    ? OldLR->valno : interval.getNextValue(start, SrcReg, VNInfoAllocator);
   LiveRange LR(start, end, ValNo);
   interval.addRange(LR);
-  interval.addKill(*LR.valno, end);
+  interval.addKill(LR.valno, end);
   DOUT << " +" << LR << '\n';
 }
 
@@ -792,9 +793,9 @@
     }
   }
 
-  LiveRange LR(start, end, interval.getNextValue(start, 0));
+  LiveRange LR(start, end, interval.getNextValue(start, 0, VNInfoAllocator));
   interval.addRange(LR);
-  interval.addKill(*LR.valno, end);
+  interval.addKill(LR.valno, end);
   DOUT << " +" << LR << '\n';
 }