Fix two pretty serious bugs:
  1. Each time the loop extractor extracted a loop, we would leak a module.
  2. When we extracted a loop, we didn't add the new function to the list of
     miscompiled functions.  Thus if the bug was in a loop nest and we
     extracted it, we could actually *LOSE THE BUG*, which is very bad.

With these patches, bugpoint has successfully found a bug for me in a function
with several nested loops, and cut it down to just one of them. :) :)


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12605 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/bugpoint/Miscompilation.cpp b/tools/bugpoint/Miscompilation.cpp
index 6524f7a..043d0df 100644
--- a/tools/bugpoint/Miscompilation.cpp
+++ b/tools/bugpoint/Miscompilation.cpp
@@ -165,7 +165,7 @@
 
   // Delete the linked module & restore the original
   BD.swapProgramIn(OldProgram);
-  if (DeleteInputs) delete M1;
+  delete M1;
   return Broken;
 }
 
@@ -267,17 +267,22 @@
                 << ErrorMsg << "\n";
       exit(1);
     }
-    delete ToOptimizeLoopExtracted;
 
     // All of the Function*'s in the MiscompiledFunctions list are in the old
-    // module.  Make sure to update them to point to the corresponding functions
-    // in the new module.
-    for (unsigned i = 0, e = MiscompiledFunctions.size(); i != e; ++i) {
-      Function *OldF = MiscompiledFunctions[i];
-      Function *NewF = 
-        ToNotOptimize->getFunction(OldF->getName(), OldF->getFunctionType());
-      MiscompiledFunctions[i] = NewF;
+    // module.  Update this list to include all of the functions in the
+    // optimized and loop extracted module.
+    MiscompiledFunctions.clear();
+    for (Module::iterator I = ToOptimizeLoopExtracted->begin(),
+           E = ToOptimizeLoopExtracted->end(); I != E; ++I) {
+      if (!I->isExternal()) {
+        Function *OldF = I;
+        Function *NewF = 
+          ToNotOptimize->getFunction(OldF->getName(), OldF->getFunctionType());
+        assert(NewF && "Function not found??");
+        MiscompiledFunctions.push_back(NewF);
+      }
     }
+    delete ToOptimizeLoopExtracted;
 
     BD.setNewProgram(ToNotOptimize);
     MadeChange = true;