Fix a memory leak in LiveIntervalAnalysis.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53779 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp
index 8c99831..f57cd2b 100644
--- a/lib/CodeGen/LiveIntervalAnalysis.cpp
+++ b/lib/CodeGen/LiveIntervalAnalysis.cpp
@@ -72,8 +72,11 @@
   r2iMap_.clear();
   // Release VNInfo memroy regions after all VNInfo objects are dtor'd.
   VNInfoAllocator.Reset();
-  for (unsigned i = 0, e = ClonedMIs.size(); i != e; ++i)
-    mf_->DeleteMachineInstr(ClonedMIs[i]);
+  while (!ClonedMIs.empty()) {
+    MachineInstr *MI = ClonedMIs.back();
+    ClonedMIs.pop_back();
+    mf_->DeleteMachineInstr(MI);
+  }
 }
 
 void LiveIntervals::computeNumbering() {
@@ -1586,8 +1589,9 @@
       // Remember how to remat the def of this val#.
       ReMatOrigDefs[VN] = ReMatDefMI;
       // Original def may be modified so we have to make a copy here.
-      // FIXME: This is a memory leak. vrm should delete these!
-      ReMatDefs[VN] = mf_->CloneMachineInstr(ReMatDefMI);
+      MachineInstr *Clone = mf_->CloneMachineInstr(ReMatDefMI);
+      ClonedMIs.push_back(Clone);
+      ReMatDefs[VN] = Clone;
 
       bool CanDelete = true;
       if (VNI->hasPHIKill) {
diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp
index b672cd9..65e5976 100644
--- a/lib/CodeGen/MachineInstr.cpp
+++ b/lib/CodeGen/MachineInstr.cpp
@@ -312,16 +312,14 @@
 
 /// MachineInstr ctor - Copies MachineInstr arg exactly
 ///
-MachineInstr::MachineInstr(MachineFunction &MF, const MachineInstr &MI) {
-  TID = &MI.getDesc();
-  NumImplicitOps = MI.NumImplicitOps;
+MachineInstr::MachineInstr(MachineFunction &MF, const MachineInstr &MI)
+  : TID(&MI.getDesc()), NumImplicitOps(0), Parent(0) {
   Operands.reserve(MI.getNumOperands());
 
   // Add operands
-  for (unsigned i = 0; i != MI.getNumOperands(); ++i) {
-    Operands.push_back(MI.getOperand(i));
-    Operands.back().ParentMI = this;
-  }
+  for (unsigned i = 0; i != MI.getNumOperands(); ++i)
+    addOperand(MI.getOperand(i));
+  NumImplicitOps = MI.NumImplicitOps;
 
   // Add memory operands.
   for (alist<MachineMemOperand>::const_iterator i = MI.memoperands_begin(),