Re-added the part where it tries to remove all global variables first.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31225 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/bugpoint/CrashDebugger.cpp b/tools/bugpoint/CrashDebugger.cpp
index b86bb8f..a67d992 100644
--- a/tools/bugpoint/CrashDebugger.cpp
+++ b/tools/bugpoint/CrashDebugger.cpp
@@ -357,22 +357,47 @@
   if (BD.getProgram()->global_begin() != BD.getProgram()->global_end()) {
     // Now try to reduce the number of global variable initializers in the
     // module to something small.
-    std::vector<GlobalVariable*> GVs;
+    Module *M = CloneModule(BD.getProgram());
+    bool DeletedInit = false;
 
-    for (Module::global_iterator I = BD.getProgram()->global_begin(),
-           E = BD.getProgram()->global_end(); I != E; ++I)
-      if (I->hasInitializer())
-        GVs.push_back(I);
+    for (Module::global_iterator I = M->global_begin(), E = M->global_end();
+         I != E; ++I)
+      if (I->hasInitializer()) {
+        I->setInitializer(0);
+        I->setLinkage(GlobalValue::ExternalLinkage);
+        DeletedInit = true;
+      }
 
-    if (GVs.size() > 1 && !BugpointIsInterrupted) {
-      std::cout << "\n*** Attempting to reduce the number of global variables "
-                << "in the testcase\n";
+    if (!DeletedInit) {
+      delete M;  // No change made...
+    } else {
+      // See if the program still causes a crash...
+      std::cout << "\nChecking to see if we can delete global inits: ";
 
-      unsigned OldSize = GVs.size();
-      ReduceCrashingGlobalVariables(BD, TestFn).reduceList(GVs);
+      if (TestFn(BD, M)) {      // Still crashes?
+        BD.setNewProgram(M);
+        std::cout << "\n*** Able to remove all global initializers!\n";
+      } else {                  // No longer crashes?
+        std::cout << "  - Removing all global inits hides problem!\n";
+        delete M;
 
-      if (GVs.size() < OldSize)
-        BD.EmitProgressBytecode("reduced-global-variables");
+        std::vector<GlobalVariable*> GVs;
+
+        for (Module::global_iterator I = BD.getProgram()->global_begin(),
+               E = BD.getProgram()->global_end(); I != E; ++I)
+          if (I->hasInitializer())
+            GVs.push_back(I);
+
+        if (GVs.size() > 1 && !BugpointIsInterrupted) {
+          std::cout << "\n*** Attempting to reduce the number of global "
+                    << "variables in the testcase\n";
+
+          unsigned OldSize = GVs.size();
+          ReduceCrashingGlobalVariables(BD, TestFn).reduceList(GVs);
+
+          if (GVs.size() < OldSize)
+            BD.EmitProgressBytecode("reduced-global-variables");
+        }
     }
   }