Make the allocation of LiveIntervals explicit, rather than holding them in the r2iMap_ by value.  This will prevent references to them from being invalidated
if the map is changed.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54763 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp
index 4be06a3..db8a5a0 100644
--- a/lib/CodeGen/LiveIntervalAnalysis.cpp
+++ b/lib/CodeGen/LiveIntervalAnalysis.cpp
@@ -71,6 +71,11 @@
 }
 
 void LiveIntervals::releaseMemory() {
+  // Free the live intervals themselves.
+  for (std::map<unsigned, LiveInterval*>::iterator I = r2iMap_.begin(),
+       E = r2iMap_.end(); I != E; ++I)
+    delete I->second;
+  
   MBB2IdxMap.clear();
   Idx2MBBMap.clear();
   mi2iMap_.clear();
@@ -130,8 +135,8 @@
   
   if (!OldI2MI.empty())
     for (iterator OI = begin(), OE = end(); OI != OE; ++OI) {
-      for (LiveInterval::iterator LI = OI->second.begin(),
-           LE = OI->second.end(); LI != LE; ++LI) {
+      for (LiveInterval::iterator LI = OI->second->begin(),
+           LE = OI->second->end(); LI != LE; ++LI) {
         
         // Remap the start index of the live range to the corresponding new
         // number, or our best guess at what it _should_ correspond to if the
@@ -174,8 +179,8 @@
         }
       }
       
-      for (LiveInterval::vni_iterator VNI = OI->second.vni_begin(),
-           VNE = OI->second.vni_end(); VNI != VNE; ++VNI) { 
+      for (LiveInterval::vni_iterator VNI = OI->second->vni_begin(),
+           VNE = OI->second->vni_end(); VNI != VNE; ++VNI) { 
         VNInfo* vni = *VNI;
         
         // Remap the VNInfo def index, which works the same as the
@@ -245,7 +250,7 @@
 
   DOUT << "********** INTERVALS **********\n";
   for (iterator I = begin(), E = end(); I != E; ++I) {
-    I->second.print(DOUT, tri_);
+    I->second->print(DOUT, tri_);
     DOUT << "\n";
   }
 
@@ -258,7 +263,7 @@
 void LiveIntervals::print(std::ostream &O, const Module* ) const {
   O << "********** INTERVALS **********\n";
   for (const_iterator I = begin(), E = end(); I != E; ++I) {
-    I->second.print(O, tri_);
+    I->second->print(O, tri_);
     O << "\n";
   }
 
@@ -729,10 +734,10 @@
 }
 
 
-LiveInterval LiveIntervals::createInterval(unsigned reg) {
+LiveInterval* LiveIntervals::createInterval(unsigned reg) {
   float Weight = TargetRegisterInfo::isPhysicalRegister(reg) ?
                        HUGE_VALF : 0.0F;
-  return LiveInterval(reg, Weight);
+  return new LiveInterval(reg, Weight);
 }
 
 /// getVNInfoSourceReg - Helper function that parses the specified VNInfo
diff --git a/lib/CodeGen/RegAllocLinearScan.cpp b/lib/CodeGen/RegAllocLinearScan.cpp
index ad830b2..9e5087b 100644
--- a/lib/CodeGen/RegAllocLinearScan.cpp
+++ b/lib/CodeGen/RegAllocLinearScan.cpp
@@ -323,11 +323,11 @@
          "interval sets should be empty on initialization");
 
   for (LiveIntervals::iterator i = li_->begin(), e = li_->end(); i != e; ++i) {
-    if (TargetRegisterInfo::isPhysicalRegister(i->second.reg)) {
-      reginfo_->setPhysRegUsed(i->second.reg);
-      fixed_.push_back(std::make_pair(&i->second, i->second.begin()));
+    if (TargetRegisterInfo::isPhysicalRegister(i->second->reg)) {
+      reginfo_->setPhysRegUsed(i->second->reg);
+      fixed_.push_back(std::make_pair(i->second, i->second->begin()));
     } else
-      unhandled_.push(&i->second);
+      unhandled_.push(i->second);
   }
 }
 
@@ -385,11 +385,11 @@
   MachineFunction::iterator EntryMBB = mf_->begin();
   SmallVector<MachineBasicBlock*, 8> LiveInMBBs;
   for (LiveIntervals::iterator i = li_->begin(), e = li_->end(); i != e; ++i) {
-    LiveInterval &cur = i->second;
+    LiveInterval &cur = *i->second;
     unsigned Reg = 0;
     bool isPhys = TargetRegisterInfo::isPhysicalRegister(cur.reg);
     if (isPhys)
-      Reg = i->second.reg;
+      Reg = cur.reg;
     else if (vrm_->isAssignedReg(cur.reg))
       Reg = attemptTrivialCoalescing(cur, vrm_->getPhys(cur.reg));
     if (!Reg)
diff --git a/lib/CodeGen/SimpleRegisterCoalescing.cpp b/lib/CodeGen/SimpleRegisterCoalescing.cpp
index 933465b..b3e3409 100644
--- a/lib/CodeGen/SimpleRegisterCoalescing.cpp
+++ b/lib/CodeGen/SimpleRegisterCoalescing.cpp
@@ -2091,7 +2091,7 @@
     joinIntervals();
     DOUT << "********** INTERVALS POST JOINING **********\n";
     for (LiveIntervals::iterator I = li_->begin(), E = li_->end(); I != E; ++I){
-      I->second.print(DOUT, tri_);
+      I->second->print(DOUT, tri_);
       DOUT << "\n";
     }
   }
@@ -2164,7 +2164,7 @@
   }
 
   for (LiveIntervals::iterator I = li_->begin(), E = li_->end(); I != E; ++I) {
-    LiveInterval &LI = I->second;
+    LiveInterval &LI = *I->second;
     if (TargetRegisterInfo::isVirtualRegister(LI.reg)) {
       // If the live interval length is essentially zero, i.e. in every live
       // range the use follows def immediately, it doesn't make sense to spill