* Reduce the number of useless bytecode files produced by bugpoint.
authorChris Lattner <sabre@nondot.org>
Fri, 28 Feb 2003 16:13:20 +0000 (16:13 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 28 Feb 2003 16:13:20 +0000 (16:13 +0000)
  - This also speeds it up as the bytecode writer isn't terribly fast.
* Add a new cleanup pass after everything else to run -funcresolve -globaldce

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

tools/bugpoint/BugDriver.h
tools/bugpoint/CrashDebugger.cpp
tools/bugpoint/ExtractFunction.cpp

index 3dbb84dab65ca14bd4d066eb5bcc27396ee56afc..f88d29ffb7730139da2882262dde4c34de628433 100644 (file)
@@ -125,6 +125,12 @@ private:
   ///
   Module *deleteInstructionFromProgram(Instruction *I, unsigned Simp) const;
 
+  /// performFinalCleanups - This method clones the current Program and performs
+  /// a series of cleanups intended to get rid of extra cruft on the module
+  /// before handing it to the user...
+  ///
+  Module *performFinalCleanups() const;
+
   /// initializeExecutionEnvironment - This method is used to set up the
   /// environment for executing LLVM programs.
   ///
index daf3915a5ebc83d978df1e53319ff44ef6e7e455..315e1823ce0afe67a23abe48b6c87c5e5461fb53 100644 (file)
@@ -84,6 +84,7 @@ static unsigned CountFunctions(Module *M) {
 ///
 bool BugDriver::debugPassCrash(const PassInfo *Pass) {
   EmitProgressBytecode(Pass, "passinput");
+  bool Reduced = false, AnyReduction = false;
 
   if (CountFunctions(Program) > 1) {
     // Attempt to reduce the input program down to a single function that still
@@ -106,7 +107,7 @@ bool BugDriver::debugPassCrash(const PassInfo *Pass) {
           // reduce the testcase...
           delete M;
 
-          EmitProgressBytecode(Pass, "reduced-"+I->getName());
+          Reduced = AnyReduction = true;
           break;
         }
         
@@ -122,6 +123,11 @@ bool BugDriver::debugPassCrash(const PassInfo *Pass) {
     }
   }
 
+  if (Reduced) {
+    EmitProgressBytecode(Pass, "reduced-function");
+    Reduced = false;
+  }
+
   // FIXME: This should attempt to delete entire basic blocks at a time to speed
   // up convergence...
 
@@ -159,8 +165,8 @@ bool BugDriver::debugPassCrash(const PassInfo *Pass) {
             if (runPass(Pass)) {
               // Yup, it does, we delete the old module, and continue trying to
               // reduce the testcase...
-              EmitProgressBytecode(Pass, "reduced-" + I->getName());
               delete M;
+              Reduced = AnyReduction = true;
               goto TryAgain;  // I wish I had a multi-level break here!
             }
             
@@ -171,6 +177,28 @@ bool BugDriver::debugPassCrash(const PassInfo *Pass) {
           }
       }
   } while (Simplification);
-  
+
+  // Try to clean up the testcase by running funcresolve and globaldce...
+  if (AnyReduction) {
+    std::cout << "\n*** Attempting to perform final cleanups: ";
+    Module *M = performFinalCleanups();
+    std::swap(Program, M);
+            
+    // Find out if the pass still crashes on the cleaned up program...
+    if (runPass(Pass)) {
+      // Yup, it does, keep the reduced version...
+      delete M;
+      Reduced = AnyReduction = true;
+    } else {
+      delete Program;   // Otherwise, restore the original module...
+      Program = M;
+    }
+  }
+
+  if (Reduced) {
+    EmitProgressBytecode(Pass, "reduced-simplified");
+    Reduced = false;
+  }
+
   return false;
 }
index 9b5440c0d4e84736a1870c46adc3b3172ed04857..c99c8f32b5ff316220d3bf4e9f4169bcfbbff6af 100644 (file)
@@ -81,3 +81,16 @@ Module *BugDriver::deleteInstructionFromProgram(Instruction *I,
   Passes.run(*Result);
   return Result;
 }
+
+/// performFinalCleanups - This method clones the current Program and performs
+/// a series of cleanups intended to get rid of extra cruft on the module
+/// before handing it to the user...
+///
+Module *BugDriver::performFinalCleanups() const {
+  PassManager CleanupPasses;
+  CleanupPasses.add(createFunctionResolvingPass());
+  CleanupPasses.add(createGlobalDCEPass());
+  Module *M = CloneModule(Program);
+  CleanupPasses.run(*M);
+  return M;
+}