]> granicus.if.org Git - llvm/commitdiff
Big programs have tons of global variable initializers, and most passes don't care
authorChris Lattner <sabre@nondot.org>
Fri, 25 Apr 2003 00:53:05 +0000 (00:53 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 25 Apr 2003 00:53:05 +0000 (00:53 +0000)
about them.  Try to delete them if it doesn't affect the passes.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5918 91177308-0d34-0410-b5e6-96231b3b80d8

tools/bugpoint/CrashDebugger.cpp

index 2d224f3fbadbccd4504084dac13f914ee3689b16..fd711d99fc31ff4020779f96ed6f67e9be0aa25a 100644 (file)
@@ -244,6 +244,36 @@ bool BugDriver::debugCrash() {
             << getPassesString(PassesToRun) << "\n";
 
   EmitProgressBytecode("passinput");
+
+  // See if we can get away with nuking all of the global variable initializers
+  // in the program...
+  if (Program->gbegin() != Program->gend()) {
+    Module *M = CloneModule(Program);
+    bool DeletedInit = false;
+    for (Module::giterator I = M->gbegin(), E = M->gend(); I != E; ++I)
+      if (I->hasInitializer()) {
+        I->setInitializer(0);
+        I->setLinkage(GlobalValue::ExternalLinkage);
+        DeletedInit = true;
+      }
+    
+    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: ";
+      std::swap(Program, M);
+      if (runPasses(PassesToRun)) {  // Still crashes?
+        AnyReduction = true;
+        delete M;
+        std::cout << "\n*** Able to remove all global initializers!\n";
+      } else {                       // No longer crashes?
+        delete Program;              // Restore program.
+        Program = M;
+        std::cout << "  - Removing all global inits hides problem!\n";
+      }
+    }
+  }
   
   // Now try to reduce the number of functions in the module to something small.
   std::vector<Function*> Functions;